我什么时候可以获得 Application Insights 操作 ID?
When can I get an Application Insights operation id?
我有一个写入 EventHub 的 AspNetCore 网络应用程序和一个从中读取的网络作业。我希望此事务的两个部分的遥测在 Application Insights 中具有相同的操作 ID。
因此,当我要将数据发送到 EventHub 时,我尝试从 TelemetryClient 中提取操作 ID,例如
var myOperationId = MyTelemetryClient.Context.Operation.Id;
但这总是给我空值。我找到了这个 article 并尝试使用
var request.HttpContext.Items["Microsoft.ApplicationInsights.RequestTelemetry"] as RequestTelemetry;
但还是空的。关于我可以在需要时提取此值的方式的任何指示?
我的代码如下所示:
public class Startup
{
public void ConfigureServices( IServiceCollection IServices )
{
var builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder;
builder.Use((next) => new MyTelemetryProcessor(next));
builder.Build();
var aiOptions = new Microsoft.ApplicationInsights.AspNetCore.Extensions.ApplicationInsightsServiceOptions();
aiOptions.EnableQuickPulseMetricStream = true;
IServices.AddApplicationInsightsTelemetry( Configuration, aiOptions);
IServices.AddMvc();
IServices.AddOptions();
TelemetryClient AppTelemetry = new TelemetryClient();
AppTelemetry.InstrumentationKey = InsightsInstrumentationKey;
IServices.AddSingleton(typeof(TelemetryClient), AppTelemetry);
}
public void Configure( IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory )
{
app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();
app.UseMvc();
var configuration = app.ApplicationServices.GetService<TelemetryConfiguration>();
configuration.TelemetryInitializers.Add(new MyTelemetryInitializer());
}
}
[Route("[controller]")]
public class MyController
{
private readonly TelemetryClient mTelemetryClient;
public MyController(
TelemetryClient TelemetryClientArg)
{
mTelemetryClient = TelemetryClientArg;
}
[HttpPost]
public async Task<IActionResult> Post([FromBody]MyPostDataClass MyPostData)
{
string telemetryId = mTelemetryClient.Context.Operation.Id; // this is null
return Ok();
}
}
Asp.Net 核心包有一个 OperationIdTelemetryInitializer
(see github),它试图从请求中设置它。假设如果您有请求跟踪并且此遥测初始化程序已打开,则该请求中发生的所有事情 应该 有一个 Operation.Id 集。
如果这对您不起作用,您可以创建自己的自定义 TelemetryInitializer
以根据需要进行设置,或者,在您发现它为 null 的地方,您可以直接设置它在那里,然后该上下文中的所有事物都应该具有该 ID。
您可以通过发送一段遥测数据然后从遥测对象中读回操作 ID 来获取此值。不优雅,但它有效。
[HttpPost]
public async Task<IActionResult> Post([FromBody]MyPostDataClass MyPostData)
{
var dummyTrace = new TraceTelemetry("hello", SeverityLevel.Verbose);
mTelemetryClient.TrackTrace(dummyTrace);
string opId = dummyTrace.Context.Operation.Id;
return Ok();
}
我想我终于在没有创建不需要的遥测的情况下破解了这个问题。以下是针对 AspNetCore 的,但只要操作 id 初始值设定项可用就应该翻译:
var operationId = default(string);
try
{
var telemetry = new RequestTelemetry();
TelemetryConfiguration
.Active
.TelemetryInitializers
.OfType<OperationIdTelemetryInitializer>()
.Single()
.Initialize(telemetry);
operationId = telemetry.Context.Operation.Id;
}
catch { }
我的 TelemetryConfiguration .Active.TelemetryInitializers
中没有 OperationIdTelemetryInitializer
。
但这为我提供了当前操作 ID:
System.Diagnostics.Activity.Current.RootId
https://github.com/Microsoft/ApplicationInsights-aspnetcore/issues/504
我有一个写入 EventHub 的 AspNetCore 网络应用程序和一个从中读取的网络作业。我希望此事务的两个部分的遥测在 Application Insights 中具有相同的操作 ID。
因此,当我要将数据发送到 EventHub 时,我尝试从 TelemetryClient 中提取操作 ID,例如
var myOperationId = MyTelemetryClient.Context.Operation.Id;
但这总是给我空值。我找到了这个 article 并尝试使用
var request.HttpContext.Items["Microsoft.ApplicationInsights.RequestTelemetry"] as RequestTelemetry;
但还是空的。关于我可以在需要时提取此值的方式的任何指示?
我的代码如下所示:
public class Startup
{
public void ConfigureServices( IServiceCollection IServices )
{
var builder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder;
builder.Use((next) => new MyTelemetryProcessor(next));
builder.Build();
var aiOptions = new Microsoft.ApplicationInsights.AspNetCore.Extensions.ApplicationInsightsServiceOptions();
aiOptions.EnableQuickPulseMetricStream = true;
IServices.AddApplicationInsightsTelemetry( Configuration, aiOptions);
IServices.AddMvc();
IServices.AddOptions();
TelemetryClient AppTelemetry = new TelemetryClient();
AppTelemetry.InstrumentationKey = InsightsInstrumentationKey;
IServices.AddSingleton(typeof(TelemetryClient), AppTelemetry);
}
public void Configure( IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory )
{
app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();
app.UseMvc();
var configuration = app.ApplicationServices.GetService<TelemetryConfiguration>();
configuration.TelemetryInitializers.Add(new MyTelemetryInitializer());
}
}
[Route("[controller]")]
public class MyController
{
private readonly TelemetryClient mTelemetryClient;
public MyController(
TelemetryClient TelemetryClientArg)
{
mTelemetryClient = TelemetryClientArg;
}
[HttpPost]
public async Task<IActionResult> Post([FromBody]MyPostDataClass MyPostData)
{
string telemetryId = mTelemetryClient.Context.Operation.Id; // this is null
return Ok();
}
}
Asp.Net 核心包有一个 OperationIdTelemetryInitializer
(see github),它试图从请求中设置它。假设如果您有请求跟踪并且此遥测初始化程序已打开,则该请求中发生的所有事情 应该 有一个 Operation.Id 集。
如果这对您不起作用,您可以创建自己的自定义 TelemetryInitializer
以根据需要进行设置,或者,在您发现它为 null 的地方,您可以直接设置它在那里,然后该上下文中的所有事物都应该具有该 ID。
您可以通过发送一段遥测数据然后从遥测对象中读回操作 ID 来获取此值。不优雅,但它有效。
[HttpPost]
public async Task<IActionResult> Post([FromBody]MyPostDataClass MyPostData)
{
var dummyTrace = new TraceTelemetry("hello", SeverityLevel.Verbose);
mTelemetryClient.TrackTrace(dummyTrace);
string opId = dummyTrace.Context.Operation.Id;
return Ok();
}
我想我终于在没有创建不需要的遥测的情况下破解了这个问题。以下是针对 AspNetCore 的,但只要操作 id 初始值设定项可用就应该翻译:
var operationId = default(string);
try
{
var telemetry = new RequestTelemetry();
TelemetryConfiguration
.Active
.TelemetryInitializers
.OfType<OperationIdTelemetryInitializer>()
.Single()
.Initialize(telemetry);
operationId = telemetry.Context.Operation.Id;
}
catch { }
我的 TelemetryConfiguration .Active.TelemetryInitializers
中没有 OperationIdTelemetryInitializer
。
但这为我提供了当前操作 ID:
System.Diagnostics.Activity.Current.RootId
https://github.com/Microsoft/ApplicationInsights-aspnetcore/issues/504