在處理分散式系統時,維護組件之間的上下文和追蹤關係至關重要。在這種情況下,發布者使用訊息標頭來傳播追蹤訊息,我們仍然可以使用接收到的 TraceID 字串在訂閱者端建立 OpenTelemetry Span。
至建立一個與其父級正確連結的span,我們需要將從請求標頭中提取的traceID和spanID字串轉換為trace.TraceID和trace.TraceID和trace.SpanID物件。我們使用以下函數來實現這一點:
<code class="go">var traceID trace.TraceID traceID, err = trace.TraceIDFromHex(request.TraceID) var spanID trace.SpanID spanID, err = trace.SpanIDFromHex(request.SpanID)</code>
使用traceID和spanID對象,我們可以建構一個SpanContext。我們需要將Remote 標誌設為false,表示該Span 不會匯出到遠端系統:
<code class="go">var spanContextConfig trace.SpanContextConfig spanContextConfig.TraceID = traceID spanContextConfig.SpanID = spanID spanContextConfig.TraceFlags = 01 spanContextConfig.Remote = false spanContext = trace.NewSpanContext(spanContextConfig)</code>
建立新SpanContext,我們首先需要用它豐富一個新的上下文:
<code class="go">requestContext := context.Background() requestContext = trace.ContextWithSpanContext(requestContext, spanContext)</code>
然後,我們可以使用豐富的上下文啟動一個新的子範圍:
<code class="go">var requestInLoopSpan trace.Span childContext, requestInLoopSpan := otel.Tracer("inboundmessage").Start(requestContext, "requestInLoopSpan")</code>
這個子元素span 將鏈接到發布者端的父span,從而允許在整個分散式系統中進行正確的上下文傳播。
以上是如何在分散式系統中從字串 TraceID 建立 OpenTelemetry Span?的詳細內容。更多資訊請關注PHP中文網其他相關文章!