2016-08-30 42 views
0

我试图给每一块遥测器添加一堆自定义数据字段,而且这些数据在单个操作中是一致的,但是因操作而异。 我有一个自定义ITelemetryInitializer,并在我可以这样做:将操作的自定义数据添加到Application Insights遥测

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); 
    } 
} 

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

传递这种数据的目的是什么?

回答

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内的上下文每个线程都是唯一的。我想从团队得到证实这是合理的。

相关问题