Application Insights-如何将自定义度量添加到您的请求信息中

本文关键字:请求 信息 添加 度量 Insights- 自定义 Application | 更新日期: 2023-09-27 17:59:10

这个问题与我想知道的非常相似。我在配置了ApplicationInsights的azure云服务上有一个WebAPI服务。在自动生成的请求信息门户上,我想将作为请求一部分的自定义http头添加到每个请求所记录的信息中。问题是我该怎么做?

我尝试过使用下面这样的遥测初始化器,但失败了(就像在中一样,我在门户网站上看不到信息)。我还在global.asax中添加了这个TelemetryConfiguration.Active.TelemetryInitializers.Add(propertyTelemetryInitializer);

public class PropertyTelemetryInitializer : ITelemetryInitializer
{
    private readonly HttpContext httpContext;
    public PropertyTelemetryInitializer(HttpContext httpContext)
    {
        this.httpContext = httpContext;
    }
    public void Initialize(ITelemetry telemetry)
    {
        this.AddTelemetryContextPropertFromContextHeader(telemetry, "xyz");
        this.AddTelemetryContextPropertFromContextHeader(telemetry, "abc");
        this.AddTelemetryContextPropertFromContextHeader(telemetry, "123");
    }
    private void AddTelemetryContextPropertFromContextHeader(ITelemetry telemetry, string headerKey)
    {
        var requestTelemetry = telemetry as RequestTelemetry;
        telemetry.Context.Properties[headerKey] = this.httpContext.Request.Headers[headerKey] ?? string.Empty;
        telemetry.Context.Properties[headerKey] = this.httpContext.Request.Headers[headerKey] ?? string.Empty;
    }
}

还有没有一种方法可以从控制器方法本身做到这一点?类似以下内容(注意:以下内容不起作用)?

    [Route("api/Something")]
    [HttpGet]
    [ResponseType(typeof(Something))]
    public async Task<Something> GetSomething()
    {
        var requestTelemetry = new RequestTelemetry();
        this.AddCustomHeadersToRequestTelemetry(requestTelemetry);
        var result = await this.Service.GetSomethingAsync();
        requestTelemetry.Properties["result"] = result.ToString();
        return TypeMapper.Map<Model.Something, Something>(result);
    }

    /// <summary>
    /// Adds the custom headers to request telemetry.
    /// </summary>
    /// <param name="controller">The controller.</param>
    /// <param name="requestTelemetry">The request telemetry.</param>
    public static void AddCustomHeadersToRequestTelemetry(this ApiController controller, RequestTelemetry requestTelemetry)
    {
        if (controller == null)
        {
            throw new ArgumentNullException("controller");
        }
        if (requestTelemetry == null)
        {
            throw new ArgumentNullException("requestTelemetry");
        }
        requestTelemetry.Context.Properties["abc"] = controller.Request.GetABCFromHeader();
        requestTelemetry.Context.Properties["xyz"] = controller.Request.GetXYZFromHeader();
        requestTelemetry.Context.Properties["123"] = controller.Request.Get123FromHeader();
    }

Application Insights-如何将自定义度量添加到您的请求信息中

使用TelemetryInitializers是正确的解决方案。一些评论:

  • var requestTelemetry = telemetry as RequestTelemetry;:在那之后就不使用requestTelemetry了。我想你想检查一下是否为空
  • 在活动配置中添加遥测初始值设定项应该可以。您也可以考虑将其移动到applicationinsights.config
  • 自定义属性不会立即显示在门户中。您是否尝试在一段时间后重新打开IE并再次检查您的请求
  • 你能调试吗?你看到你在你的体温计初始值设定项中得到了吗?你在搜索中看到任何特定于人工智能的痕迹吗

关于你的第二个问题。目前,遥测初始化程序是获取自动生成的RequestTelemetry(实际上在HttpContext中)的唯一(官方)方法。有计划将网络中的大多数类公开,并最终开源。但目前还没有ETA。如果您自己创建和跟踪请求,您可以添加您提到的自定义属性。

更新:从2.0.0-beta3开始,可以通过HttpContext扩展方法System访问自动生成的请求遥测。网状物HttpContextExtension。GetRequestTelemetry