首页 > 解决方案 > ApplicationInsights - CustomProperties 不会在请求之间更新

问题描述

我想通过 Azure-ApplicationInsights 为每条路线报告一些属性,如下图所示: 在此处输入图像描述

问题是,即使我在同一路线或不同路线上打第二个电话,这些值也不会改变。只有在第三次调用时,值才会改变,但即便如此也不是当前值。例子:

  1. 我做https://localhost:5001/api/testobject/ 7 “专有自定义” = “valoare custom 7
  2. 我做https://localhost:5001/api/testobject/ 8 “专有自定义” = “valoare custom 7
  3. 我做https://localhost:5001/api/testobject/ 9 “专有自定义” = “valoare custom 8

后面的代码如下所示:

[Route("api/[controller]")]
[ApiController]
public class TestObjectController
{
    private TelemetryClient telemetryClient;

    public TestObjectController(TelemetryClient telemetryClient)
    {
        this.telemetryClient = telemetryClient;
    }

    // GET api/values/5
    [HttpGet("{id}")]
    public ActionResult<string> Get(int id)
    {
        telemetryClient.Context.Properties.Clear(); 
        telemetryClient.Context.GlobalProperties["TestObjectController"] = "nok";
        telemetryClient.Context.Properties["proprietate custom"] = $"valoare custom {id}";
        return "value";
    }
}

知道如何保持准确吗?

标签: c#azureasp.net-coreazure-application-insights

解决方案


telemetryClient.Context.Properties仅在遥测客户端实例上设置上下文。这意味着在新的上下文生效之前,可能会使用先前的上下文创建多个遥测项(如果遥测项是在上下文更新之前创建的)。

这似乎是这种情况 - 请求遥测项目是在方法调用时创建的,并且仅在稍后在方法内部更新客户端以具有新的上下文。

我建议TelemetryInitializer改用更新遥测项目级别的上下文,而不是遥测客户端:

using System;
using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.DataContracts;
using Microsoft.ApplicationInsights.Extensibility;

namespace MvcWebRole.Telemetry
{
  /*
   * Custom TelemetryInitializer that overrides the default SDK
   * behavior of treating response codes >= 400 as failed requests
   *
   */
  public class MyTelemetryInitializer : ITelemetryInitializer
  {
    public void Initialize(ITelemetry telemetry)
    {
        var requestTelemetry = telemetry as RequestTelemetry;
        // Is this a TrackRequest() ?
        if (requestTelemetry == null) return;
        int code;
        bool parsed = Int32.TryParse(requestTelemetry.ResponseCode, out code);
        if (!parsed) return;
        if (code >= 400 && code < 500)
        {
            // If we set the Success property, the SDK won't change it:
            requestTelemetry.Success = true;
            // Allow us to filter these requests in the portal:
            requestTelemetry.Context.Properties["Overridden400s"] = "true";
        }
        // else leave the SDK to set the Success property      
    }
  }
}

然后,通过 ApplicationInsights.config 或在代码中将此初始化程序添加到 AI:

<ApplicationInsights>
  <TelemetryInitializers>
    <!-- Fully qualified type name, assembly name: -->
    <Add Type="MvcWebRole.Telemetry.MyTelemetryInitializer, MvcWebRole"/>
    ...
  </TelemetryInitializers>
</ApplicationInsights>

protected void Application_Start()
{
    // ...
    TelemetryConfiguration.Active.TelemetryInitializers
    .Add(new MyTelemetryInitializer());
}

推荐阅读