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

时间:2016-08-30 16:12:36

标签: asp.net-core-mvc azure-application-insights

我正在尝试为每一段遥测添加一堆自定义数据字段,这些数据在单个操作中是一致的,但因操作而异。 我有一个自定义的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);
   }
}

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

传递此类数据的目的是什么?

1 个答案:

答案 0 :(得分:0)

我想我现在已经解决了这个问题,解决方法是在控制器内写入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中的上下文对于每个线程是唯一的。我想得到团队的确认,这是合理的。