来自 HTTP header 的 Application Insights Operation.Id

Application Insights Operation.Id from an HTTP header

我的项目使用 ApplicationInsightsHttpModule 从客户端 UI 应用程序设置的 Microsoft.ApplicationInsights.RequestTelemetry HTTP 值初始化 Operation.Id。现在我希望我的 API 被第三方使用,第三方将提供 X-Operation-Id HTTP header 来关联我们的活动。如果 header 出现在请求中,我如何让 Application Insights 初始化 Operation.Id

表示标准上下文由 AI 自动管理,因此我需要一个代码示例来展示如何使用自定义值正确初始化 Operation.Id。以下代码无效,header 值被忽略:

var operationInitializer = TelemetryConfiguration.Active.TelemetryInitializers.OfType<Microsoft.ApplicationInsights.Web.OperationCorrelationTelemetryInitializer>().FirstOrDefault();

if (operationInitializer != null)
{
      operationInitializer.RootOperationIdHeaderName = "X-Operation-Id";
}

您问题中包含的代码乍一看应该可以正常工作:您正在寻找正确的初始化程序并覆盖正确的 属性。但是,可能有多种原因导致它无法按预期工作,并且很难调试它,因为它需要您实际进入 Application Insights 代码(如果您决定,the sources for every release are archived on GH)。

在你的情况下,我的建议是采取不同的方法 - 而不是试图覆盖这个 属性,创建并注册你自己的遥测初始化程序以从你的 [=16= 设置 Operation.ID ].如果设置此 属性,OperationCorrelationTelemetryInitializer 将忽略它而不覆盖。这样你确认你的headers可以被正确读取,你可以很容易地在Initialize方法中设置断点进行调试。

目前提问的AI SDK是2.2版本。最近我已经升级到最新的 2.4 版,它现在可以正常工作了。因此,如果您在 X-Operation-Id HTTP header 中传递 'HELLO'(您仍然需要在 Application_Start() 中的问题中使用该代码),然后在 [=13= 中请求遥测](或任何 HttpContext 可用的地方):

    RequestTelemetry telemetry = HttpContext.Current.GetRequestTelemetry();

telemetry.Id 将包含类似 |HELLO.d0b9d5b7_ 的内容。 如果您在下一个请求中传递 'HELLO',则该十六进制后缀会增加,因此 Id 始终是唯一的。不过,我不知道是否可以覆盖它。