首先,我尝试了此Q& A:HttpContext and TelemetryInitializer中的代码,该部分显示“我可以创建一个动作过滤器,每次都设置上下文,但这感觉非常糟糕。”
使用链接代码,我使用调试器断点进行测试,以查看Active字段是否存在全局问题。我只用两个传入的Web请求就完成了这个。
似乎是TelemetryConfiguration.Active.TelemetryInitializers.OfType()。Single()对于每个请求而不是全局请求是不同的。这就是我想要的。但是在生产中我看到了一个竞争条件,即错误的标题被附加到错误的请求上。这是通过检查依赖关系表中的Azure Log Analytics来完成的,特别是操作_与来自我附加到customDimensions的UI的HTTP标头。
鉴于链接的Stackoverflow Q& A评级较低,我决定尝试替代代码,并在此处的官方文档中找到一些代码:https://github.com/Microsoft/ApplicationInsights-aspnetcore/wiki/Configure#add-request-level-properties-for-all-telemetry-items。
我仍然在customDimensions中应用了不正确的标头。这可能是由于遥测采样还是其他一些我不知道的原因?
我的ITelemetryInitializer的一般形式:
public class TrackingTelemetryInitializer : ITelemetryInitializer
{
private readonly IHttpContextAccessor _httpContextAccessor;
public TrackingTelemetryInitializer(IHttpContextAccessor httpContextAccessor)
{
this._httpContextAccessor = httpContextAccessor;
}
public void Initialize(ITelemetry telemetry)
{
if (_httpContextAccessor.HttpContext == null)
{
return;
}
var headers = _httpContextAccessor.HttpContext.Request.Headers;
if (headers.ContainsKey("Foobar"))
{
telemetry.Context.Properties["Foobar"] = headers["Foobar"];
}
}
}