從非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中文網其他相關文章!