Различать приложения, отправляющие события в AI, используя Microsoft.Diagnostics.EventFlow - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть две службы, работающие в Azure Service Fabric.Теперь я хочу захватить некоторые события из обоих и перенаправить их на один и тот же экземпляр AI.

Мой eventFlowConfig.json выглядит следующим образом:

{
    "inputs": [
        {
            "type": "EventSource",
            "sources": [
                {
                    "providerName": "My-Provider-Name"
                }
            ]
        }
    ],
    "outputs": [
        {
            "type": "ApplicationInsights",
            "instrumentationKey": "AI_INSTRUMENTATION_KEY"
        }
    ],
    "schemaVersion": "2016-08-11"
}

Это работает просто отлично.Однако есть одна проблема: в AI я не могу определить, пришел ли конкретный элемент трассировки из службы A или из службы B. Итак, мне нужен способ добавить какое-либо пользовательское свойство для элементов AI, поступающих из определенного приложения (службы).Например, «Сервис А» или «Сервис Б».В идеале я также должен иметь возможность добавить PartiotionId и ReplicaOrInstanceId этого экземпляра службы, но это бонус, без которого я могу жить.

ОБНОВЛЕНИЕ:

как @cijothomas предложил , мы можем использовать ITelemetryInitializer.Это работает, потому что EventFlow использует TelemetryConfiguration.Active.Мы можем сделать это в конструкторе нашего сервиса:

TelemetryConfiguration.Active.TelemetryInitializers.Add(new TelemetryInitializer("Service A", context.TraceId));

А вот определение для класса TelemetryInitializer:

class TelemetryInitializer : ITelemetryInitializer
{
    private readonly string _roleName;
    private readonly string _roleInstance;

    public TelemetryInitializer(string roleName, string roleInstance)
    {
        _roleName = roleName;
        _roleInstance = roleInstance;
    }

    public void Initialize(ITelemetry telemetry)
    {
        telemetry.Context.Cloud.RoleName = _roleName;
        telemetry.Context.Cloud.RoleInstance = _roleInstance;
    }
}

1 Ответ

1 голос
/ 25 сентября 2019

Если один и тот же ikey используется для нескольких приложений, их можно различить, используя их cloudRoleInstance.Если он не заполняется автоматически, вы можете написать собственный инициализатор телеметрии, чтобы заполнить его правильно.https://docs.microsoft.com/en-us/azure/azure-monitor/app/api-filtering-sampling#add-properties-itelemetryinitializer

item.Context.Cloud.RoleInstance = "service A or B"

...