.NET Web API接入OpenTelemetry后含traceparent请求无追踪记录问题
排查.NET Web API OpenTelemetry 追踪丢失问题(带traceparent时无记录)
1. 先查traceparent格式合法性
OpenTelemetry严格遵循W3C Trace Context规范,traceparent必须是00-32位十六进制TraceId-16位十六进制ParentId-01这类格式。你提到上游传递的是类GUID值,大概率是带连字符的标准GUID(比如xxxxxx-xxxx-xxxx-xxxx-xxxxxx),这不符合要求——标准GUID是36位,去掉连字符后才是32位的合法TraceId。如果格式不对,OpenTelemetry会直接忽略这个请求头,甚至跳过整个追踪流程。可以在自定义中间件里打个日志,输出请求头里的traceparent值,确认格式是否合规。
2. 检查采样策略配置
默认采样器可能会拒绝外部传入的追踪请求:
- 看看你是否自定义了采样规则,比如用了基于TraceId的采样器,刚好把上游传的TraceId判定为不采样
- 必须使用
ParentBasedSampler,它会继承父追踪的采样决定,这是跨服务追踪的基础。配置示例:
services.AddOpenTelemetry() .WithTracing(builder => builder .SetSampler(new ParentBasedSampler(new AlwaysOnSampler())) // 其他配置(比如添加HttpClient、AspNetCore instrumentation) );
3. 排查请求头是否被拦截或修改
- 检查API内的自定义中间件、网关或反向代理(比如IIS、Nginx)有没有修改或删除
traceparent头。有些反向代理会过滤未知请求头,得确保traceparent被允许传递 - 如果用了ASP.NET Core的
ForwardedHeaders中间件,要确认配置正确,保证traceparent能被正确转发到后端API
4. 确认OpenTelemetry中间件的注册顺序
OpenTelemetry的追踪中间件必须在业务中间件之前注册,否则抓不到请求上下文:
- 确保
app.UseOpenTelemetryTracing()在app.UseRouting()、app.UseAuthorization()这些中间件之前。正确注册顺序示例:
var app = builder.Build(); app.UseOpenTelemetryTracing(); // 其他中间件比如CORS、静态文件等 app.UseRouting(); app.UseAuthorization(); app.MapControllers();
5. 检查代码是否破坏了追踪上下文
- 看看业务代码里有没有手动修改
Activity.Current的地方,这会直接导致追踪上下文丢失 - 异步代码里要注意上下文传递,比如别在非异步方法里乱用
Task.Run,否则可能丢失追踪上下文
6. 排查Tempo接收端问题
- 查看Tempo的配置,是否设置了TraceId过滤规则,会不会把上游传的TraceId对应的追踪给过滤掉了
- 检查Tempo的日志,确认它有没有收到API发送的追踪数据,说不定数据已经发出去,但被Tempo丢弃了
内容的提问来源于stack exchange,提问作者MK_Gii
相关产品推荐
相关产品推荐

