c# - ApplicationInsights - CustomProperties 不会在请求之间更新
问题描述
我想通过 Azure-ApplicationInsights 为每条路线报告一些属性,如下图所示:
问题是,即使我在同一路线或不同路线上打第二个电话,这些值也不会改变。只有在第三次调用时,值才会改变,但即便如此也不是当前值。例子:
- 我做https://localhost:5001/api/testobject/ 7 “专有自定义” = “valoare custom 7 ”
- 我做https://localhost:5001/api/testobject/ 8 “专有自定义” = “valoare custom 7 ”
- 我做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";
}
}
知道如何保持准确吗?
解决方案
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());
}