将自定义维度添加到应用程序服务的默认请求遥测的最简单方法是什么?

What is the easiest way to add custom dimensions to default Request Telemetry for App service?

我只是利用默认的 Application Insights 日志记录来记录请求遥测,而无需任何自定义代码。 请求遥测看起来像这样:

timestamp [UTC]     2019-12-19T00:22:10.2563938Z
id                  |a758472d124b6e4688a33b2ad9755f33.b3979544_
name                GET MyMethod [type]
url                 https://xxxx
success             True
resultCode          200
duration            153.2676
performanceBucket   <250ms
itemType            request
customDimensions 
    AppId                           xxxx-xxxx-xxxx-xxxx-xxxxxx
    AspNetCoreEnvironment:          west us
   _MS.ProcessedByMetricExtractors (Name:'Requests', Ver:'1.1')

现在我想向请求遥测中的 customDimensions 添加一个新的 属性,例如 correlationId。最简单的方法是什么?我只想扩展现有的请求遥测,不想创建新事件。

要添加自定义维度,您可以使用 ITelemetryInitializer

这是 .NET 核心 Web 项目的示例:

1.Add一个class命名为MyTelemetryInitializer的项目,代码如下:

public class MyTelemetryInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as RequestTelemetry;

        //if it's not a request, just return.
        if (requestTelemetry == null) return;

        if (!requestTelemetry.Properties.ContainsKey("correlationId"))
        {
            requestTelemetry.Properties.Add("correlationId", "id_123456");
        }
    }

 }

2.In Startup.cs -> ConfigureServices方法,使用如下代码:

    public void ConfigureServices(IServiceCollection services)
    {
       //your other code           

        //register the class MyTelemetryInitializer.
        services.AddSingleton<ITelemetryInitializer, MyTelemetryInitializer>();
    }

测试结果:

如果您使用其他编程语言,请按照官方文档并使用正确的方法 ITelemetryInitializer

如果您对按摩数据感兴趣(即根据遥测项目本身的可用内容进行修改),那么 Ivan 的答案是正确的。

如果您想向现有请求中添加内容,则需要执行以下操作:

1) 在请求中使用 Activity.Tags 属性 包

Activity.Current?.AddTag("TagName", "TagValue");

2) 拥有将标签作为自定义维度的遥测初始化器(在下一个版本中,我们可能会将其添加为默认初始化器,并且不再需要此步骤)

/// <summary>
/// Helper class to workaround AI SDK not collecting activity tags by default.
/// This initializer allows the business logic to have no AI references.
/// </summary>
public class ActivityTagsTelemetryInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        var activity = Activity.Current;
        var requestTelemetry = telemetry as ISupportProperties;

        if (requestTelemetry == null || activity == null) return;

        foreach (var tag in activity.Tags)
        {
            requestTelemetry.Properties[tag.Key] = tag.Value;
        }
    }
}

3) 在启动中注册

services.AddSingleton<ITelemetryInitializer, ActivityTagsTelemetryInitializer>();

您不需要创建自己的 TelemetryInitializer,但可以在任何可以引用 httpContext 的地方执行此操作:

var requestTelemetry = httpContext.Features.Get<RequestTelemetry>();
if (requestTelemetry != null)
{
    requestTelemetry.Properties["YourCustomDimension"] = someValue;
}

以这种方式添加的属性将添加到 Application Insights 中的 requests table。

要添加 dependenciestraces table,您可以使用

System.Diagnostics.Activity.Current.AddBaggage("YourCustomDimension" someValue);

要在写入日志条目时添加到 traces,只需将对象传递给 LogXXX 方法,并在日志消息中使用占位符,例如

_logger.LogWarning("hello {YourCustomDimension}", someValue);

someValue 将被序列化为 json,因此如果您愿意,可以是一个复杂的对象。