I want to set the trace ID (operation ID) of the request to an ASP.NET Core application based on a custom HTTP header (correlation-id
).
According to the docs, this should be possible using ITelemetryInitializer
in the Application Insights SDK:
I'm looking for similar functionality for the Azure.Monitor.OpenTelemetry.AspNetCore
package.
All of our upstream services are currently using our custom correlation-id
header, so I would like to use this header for the operation ID instead of rewriting each of those client applications to use traceparent OTEL header:
How can I set the operation ID for the incoming request based on the value of a custom HTTP header?
It's not possible to set the trace ID using options:
builder.Services.Configure<AspNetCoreTraceInstrumentationOptions>(options =>
{
options.RecordException = true;
options.Filter = (httpContext) =>
{
// only collect telemetry about HTTP GET requests
return HttpMethods.IsGet(httpContext.Request.Method);
};
});
I want to set the trace ID (operation ID) of the request to an ASP.NET Core application based on a custom HTTP header (correlation-id
).
According to the docs, this should be possible using ITelemetryInitializer
in the Application Insights SDK:
https://learn.microsoft/en-us/azure/azure-monitor/app/api-filtering-sampling?tabs=dotnet%2Cjavascriptwebsdkloaderscript
I'm looking for similar functionality for the Azure.Monitor.OpenTelemetry.AspNetCore
package.
All of our upstream services are currently using our custom correlation-id
header, so I would like to use this header for the operation ID instead of rewriting each of those client applications to use traceparent OTEL header:
https://learn.microsoft/en-us/azure/azure-monitor/app/distributed-trace-data#correlation-headers-using-w3c-tracecontext
How can I set the operation ID for the incoming request based on the value of a custom HTTP header?
It's not possible to set the trace ID using options:
builder.Services.Configure<AspNetCoreTraceInstrumentationOptions>(options =>
{
options.RecordException = true;
options.Filter = (httpContext) =>
{
// only collect telemetry about HTTP GET requests
return HttpMethods.IsGet(httpContext.Request.Method);
};
});
Share
Improve this question
edited Feb 17 at 17:54
Shuzheng
asked Feb 17 at 14:09
ShuzhengShuzheng
14k29 gold badges115 silver badges227 bronze badges
1 Answer
Reset to default 1OpenTelemetry follows the W3C trace context specification, and therefore doesn't really have a mechanism for you to change the trace ID.
The TraceId (set within the initial Activity
created by the ASP.NET Core runtime) is set using the DistributedContextPropagator that's part of ASP.NET Core, not OpenTelemetry. While you can override this, it's not advisable.
Here's a post about how you can override the propagator https://martinjt.me/2023/07/07/trace-propagation-and-public-api-endpoints-in-net-part-1-disable-all/
I would highly advise against going against the W3C standards for context propagation though, it will likely cause lots of issues in downstream applications.