You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ServiceStack集成OpenTelemetry:自定义子Span未在JaegerUI显示的问题排查

问题原因及修复方案

核心问题

你的自定义Span未显示且未关联父Span,主要是Tracer获取方式错误以及可能的上下文传递失效导致的,具体如下:

1. 错误使用TracerProvider.Default

你当前通过TracerProvider.Default.GetTracer()获取Tracer,但TracerProvider.Default是全局默认实例,和你在ConfigureServices中配置的自定义TracerProvider并非同一个,导致自定义Span无法被你配置的Jaeger/Console导出器捕获。

2. 请求上下文传递可能中断

如果Activity.Current(.NET OpenTelemetry的上下文载体)在SetupUser方法中为null,自定义Span无法找到AspNetCore请求的父Span进行关联。


修复步骤

步骤1:修正Tracer的获取方式

不要使用TracerProvider.Default,改为从依赖注入容器中获取你配置好的TracerProvider:

修改SetupDiagnostics方法:

private void SetupDiagnostics(Container container)
{
    // 从DI获取我们配置的TracerProvider实例
    var tracerProvider = container.Resolve<TracerProvider>();
    var diag = new Diagnostics()
    {
        Tracer = tracerProvider.GetTracer(Diagnostics.ServiceName)
    };
    container.AddSingleton<IDiagnostics>(diag);
}

步骤2:确保Span上下文正确关联

在SetupUser方法中,显式确认父上下文存在并关联(可选,但能快速排查问题):

public void SetupUser(string email) 
{
    // 检查当前是否存在父Activity(AspNetCore的请求Span)
    var parentActivity = Activity.Current;
    if (parentActivity == null)
    {
        // 说明不在请求上下文内,需排查请求处理流程
        return;
    }

    // 自动关联父Span,或显式指定父上下文
    using var span = Diagnostics.Tracer.StartActiveSpan(
        "read user store", 
        SpanKind.Internal, 
        parentActivity.Context);
        
    // 执行操作
}

步骤3:验证配置一致性

确保Diagnostics.ServiceName的值和你在AddSource(Diagnostics.ServiceName)中传入的完全一致,拼写错误会导致导出器忽略该Source的Span。

步骤4:添加Activity格式配置(可选)

在Program.cs开头添加以下代码,确保W3C格式的TraceId/SpanId被正确使用:

Activity.DefaultIdFormat = ActivityIdFormat.W3C;
Activity.ForceDefaultIdFormat = true;

额外排查点

  • 确认UserManager的SetupUser方法是在AspNetCore请求处理流程中被调用的,而非后台线程或脱离请求上下文的场景。
  • 检查Console导出器的输出,若自定义Span能被打印但Jaeger中没有,需排查Jaeger导出器的配置(比如Endpoint地址是否正确)。

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 08:20:02