2016-08-30 71 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內的上下文每個線程都是唯一的。我想從團隊得到證實這是合理的。