ホームページ >バックエンド開発 >Golang >分散システムで文字列 TraceID から OpenTelemetry スパンを作成する方法

分散システムで文字列 TraceID から OpenTelemetry スパンを作成する方法

DDD
DDDオリジナル
2024-10-29 06:28:021106ブラウズ

How to Create OpenTelemetry Spans from a String TraceID in a Distributed System?

文字列 TraceID から OpenTelemetry スパンを作成する

分散システムを扱う場合、コンテキストを維持し、コンポーネント間の関係を追跡することが重要です。この場合、パブリッシャーがメッセージ ヘッダーを使用してトレース情報を伝播するため、サブスクライバー側で、受信した TraceID 文字列を使用して OpenTelemetry スパンを構築できます。

ヘッダー値からの SpanContext の構築

To親が正しくリンクされたスパンを作成するには、リクエスト ヘッダーから抽出されたtraceIDおよびspanID文字列を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 オブジェクトと scanID オブジェクトを使用して、SpanContext を構築できます。 Remote フラグを false に設定して、このスパンがリモート システムにエクスポートされていないことを示す必要があります。

<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 を使用した新しいスパンの作成

新しいスパンを作成するにはこの構築された 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>

This childスパンはパブリッシャー側の親スパンにリンクされ、分散システム全体に適切なコンテキストの伝播が可能になります。

以上が分散システムで文字列 TraceID から OpenTelemetry スパンを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。