Asp.net core mvc 将操作的自定义数据添加到Application Insights遥测

Asp.net core mvc 将操作的自定义数据添加到Application Insights遥测,asp.net-core-mvc,azure-application-insights,Asp.net Core Mvc,Azure Application Insights,我试图在我能做的每一项遥测中添加一组自定义数据字段,这些数据在单个操作中是一致的,但在不同的操作中是不同的。 我有一个自定义ITelemetryInitializer,在其中我可以执行以下操作: public class MyInitializer : ITelemetryInitializer { public void Initialize(Microsoft.ApplicationInsights.Channel.ITelemetry 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);
   }
}
[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
    }
 }
然后在控制器级别,我做了如下操作:

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);
   }
}
[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
    }
 }
但这非常笨拙,而且容易出错(例如,如果在调用此函数之前发送了一段遥测数据),我不确定这是否是线程安全的


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

我想我现在已经解决了这个问题,解决方案是在控制器中写入遥测客户端的属性,如下所示:

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);
   }
}
[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请求之前调用了控制器构造函数,并且遥测客户端中的上下文在每个线程中都是唯一的。我希望得到团队的确认,这是合理的。

我想我现在已经解决了这个问题,解决方案是在控制器中写入遥测客户端的属性,如下所示:

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);
   }
}
[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请求之前调用了控制器构造函数,并且遥测客户端中的上下文在每个线程中都是唯一的。我希望得到团队的确认,这是合理的