将操作的自定义数据添加到 Application Insights 遥测

Adding custom data for an operation to Application Insights telemetry

我正在尝试将一堆自定义数据字段添加到我能做的每一个遥测数据中,并且这些数据在单个操作中是一致的,但因操作而异。 我有一个自定义的 ITelemetryInitializer,在其中我可以做类似的事情:

public class MyInitializer : ITelemetryInitializer
{
    public void Initialize(Microsoft.ApplicationInsights.Channel.ITelemetry telemetry)
    {
            telemetry.Context.Properties[ "platform" ] = "PC";
    }
}

但我不明白我应该如何将此数据推送到此初始化程序中。

我添加了这样的内容:

public class MyInitializer : ITelemetryInitializer
{
    private string mPlatform = "unknown";

    public void Initialize(Microsoft.ApplicationInsights.Channel.ITelemetry telemetry)
    {
            telemetry.Context.Properties[ "platform" ] = mPlatform;
    }

    public void SetPlatform(string platform)
    {
       mPlatform = platform
    }
}

然后在控制器级别我做这样的事情:

foreach (var init in TelemetryConfiguration.Active.TelemetryInitializers)
{
   var customInit = init as MyInitializer;

   if (customInit != null)
   {
      customInit.SetPlatform(requestPlatform);
   }
}

但这非常笨拙,而且容易出错(例如,如果在调用此函数之前发送了一段遥测数据),我不确定这是否是线程安全的。

传递此类数据的预期方式是什么?

我想我现在已经解决了这个问题,解决方案是像这样在控制器中写入 TelemetryClient 的属性:

[Route( "[controller]" )]
public class MyController : Controller
{
    private readonly TelemetryClient        mTelemetryClient;

    public MyController( 
        TelemetryClient             TelemetryClientArg )
    {
        mTelemetryClient = TelemetryClientArg;
        mTelemetryClient.Context.Properties.Remove("platform");
    }

    [HttpPost]
    [Produces( "application/json" )]
    public IActionResult Post( [FromBody] RequestClass RequestData )
    {
       mTelemetryClient.TrackTrace("Test trace 1"); // doesn't have platform set
       mTelemetryClient.Context.Properties["platform"] = RequestData.platform;
       mTelemetryClient.TrackTrace("Test trace 2"); // has platform set correctly
    }
 }

这似乎是安全的,因为控制器构造函数似乎在处理每个 http 请求之前被调用,并且 TelemetryClient 中的上下文对于每个线程都是唯一的。我想得到团队的确认,这是合理的。