ホームページ >バックエンド開発 >Golang >非 HTTP コンテキストでトレース ID からスパンを構築するにはどうすればよいですか?

非 HTTP コンテキストでトレース ID からスパンを構築するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-28 03:06:31936ブラウズ

How to Construct Spans from Trace IDs in Non-HTTP Contexts?

非 HTTP コンテキストでのトレース ID からのスパンの構築

非 HTTP コンテキストでヘッダーを使用してトレースを伝播する場合、手動で構築する必要があります提供されたトレース ID とスパン ID を使用してスパンを確認します。これを実現する方法は次のとおりです。

サブスクライバ側:

トレース ヘッダーとスパン ヘッダーを持つ受信メッセージを処理する関数内:

  1. 抽出ヘッダーからのトレース ID とスパン ID。
  2. trace.TraceIDFromHex() 関数とtrace.SpanIDFromHex() 関数を使用して、文字列 ID を適切な型に変換します。
  3. 次のようにして、trace.SpanContext を構築します。抽出されたトレース ID、スパン ID、およびトレース フラグを提供します。
  4. context.Background() に続いて、trace.ContextWithSpanContext() を使用して、新しく作成されたスパン コンテキストで現在のコンテキストを強化します。
  5. 適切な名前のエンリッチされたコンテキストを使用して、新しいスパンを開始します。

例:

<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 とスパン ID。 handleIncomingMessage 関数は、NewRequest 構造体を入力として受け取り、指定されたトレース ID とスパン ID を使用してスパンを作成します。

注: 指定されたスパンの IsRemote フィールドが指定されている場合は、新しいスパンが作成されないことを確認してください。 context は true に設定されます。これは、スパンがすでにリモートでエクスポートされていることを示します。

以上が非 HTTP コンテキストでトレース ID からスパンを構築するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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