通过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
相关产品推荐
相关产品推荐

