使用 Microsoft.Diagnostics.EventFlow 区分向 AI 发出事件的应用程序

Distinguish applications emitting events to AI using Microsoft.Diagnostics.EventFlow

我在 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 项添加一些自定义 属性。比如,"Service A" 或 "Service B"。理想情况下,我还应该能够添加该服务实例的 PartiotionId 和 ReplicaOrInstanceId,但这是一个额外的好处,没有它我还可以生存。

更新:

作为@cijothomas ,我们可以使用 ITelemetryInitializer。这是可行的,因为 EventFlow 使用 TelemetryConfiguration.Active。我们可以在服务的构造函数中执行此操作:

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

下面是 TelemetryInitializer 的定义 class:

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;
    }
}

如果多个应用程序使用相同的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"