我正在尝试为每一段遥测添加一堆自定义数据字段,这些数据在单个操作中是一致的,但因操作而异。 我有一个自定义的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);
}
}
但这非常笨重,容易出错(例如,如果在调用此函数之前发送了一段遥测数据),我不确定这是否是线程安全的。
传递此类数据的目的是什么?
答案 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中的上下文对于每个线程是唯一的。我想得到团队的确认,这是合理的。