从非 HTTP 上下文中的跟踪 ID 构造 Span
在非 HTTP 上下文中使用标头传播跟踪时,您需要手动构造使用提供的跟踪和跨度 ID 进行跨度。以下是实现此目的的方法:
订阅者端:
在处理带有跟踪和跨度标头的传入消息的函数内部:
示例:
<code class="go">func handleIncomingMessage(request NewRequest) { traceID, err := trace.TraceIDFromHex(request.TraceID) if err != nil { fmt.Println("error: ", err) return } spanID, err := trace.SpanIDFromHex(request.SpanID) if err != nil { fmt.Println("error: ", err) return } spanContext := trace.NewSpanContext(trace.SpanContextConfig{ TraceID: traceID, SpanID: spanID, TraceFlags: 01, Remote: false, }) ctx := context.Background() ctx = trace.ContextWithSpanContext(ctx, spanContext) _, span := otel.Tracer("requestInLoop").Start(ctx, "requestInLoopSpan") span.AddEvent("processing....") }</code>
在此示例中,NewRequest 是一个自定义类型,包含跟踪和跨度 ID。 handleIncomingMessage 函数采用 NewRequest 结构作为输入,并使用提供的跟踪和跨度 ID 创建一个跨度。
注意: 如果提供的 Span 的 IsRemote 字段,请确保不会创建新的 Span context 设置为 true,因为这表明该跨度已经远程导出。
以上是如何在非 HTTP 上下文中从跟踪 ID 构造 Span?的详细内容。更多信息请关注PHP中文网其他相关文章!