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

通过OpenTelemetry gRPC上报Span至Jaeger时追踪不可见的问题

问题解决方法

导致Jaeger提示"No trace results"的核心原因是时间戳单位错误,同时补充几个优化点可确保Span正常显示:

  • 修正时间戳为纳秒级:OpenTelemetry要求start_time_unix_nano和end_time_unix_nano必须是纳秒时间戳,你当前代码计算的是微秒(time.time()*1000000),比实际时间小1000倍,导致Span被标记为过去极早的时间,超出Jaeger默认查询范围。修正代码如下:

    import time
    current_nano = int(time.time() * 10**9)  # 秒转纳秒
    span.start_time_unix_nano = current_nano - 10**6  # 开始时间提前1毫秒
    span.end_time_unix_nano = current_nano
    
  • 确保Trace/Span ID格式合规:trace_id必须是16字节(对应32位十六进制字符串),span_id必须是8字节(对应16位十六进制字符串),你当前的ID格式是正确的,后续自定义生成时要注意长度要求。

  • 可选:明确Span状态:添加状态标记可避免Jaeger误判Span异常,增强兼容性:

    span.status.code = trace_pb2.StatusCode.STATUS_CODE_OK
    

修正后的完整call_trace方法

def call_trace(self, message):
    import time
    t = otelp_trace.ExportTraceServiceRequest()
    tt = t.resource_spans.add()
    attr = tt.resource.attributes.add()
    attr.key = "service.name"
    attr.value.string_value = "testapp2"
    scope_span = tt.scope_spans.add()
    scope_span.scope.name = "scope_name_lala"
    span = scope_span.spans.add()
    span.trace_id = bytes.fromhex("7bba9f33312b3dbb8b2c2c62bb7abe2d")
    span.span_id = bytes.fromhex("086e83747d0e381e")
    span.parent_span_id = b""
    span.name = "SpanName_lolo"
    # 修正时间戳为纳秒级
    current_nano = int(time.time() * 10**9)
    span.start_time_unix_nano = current_nano - 10**6
    span.end_time_unix_nano = current_nano
    span.kind = trace_pb2.Span.SPAN_KIND_SERVER
    # 设置Span状态为OK
    span.status.code = trace_pb2.StatusCode.STATUS_CODE_OK
    print(t)

    resp = self.stub.Export(t)

    return resp

修正后,Span的时间会落在Jaeger默认查询的时间范围内,即可正常显示追踪数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:23:16