ホームページ  >  記事  >  バックエンド開発  >  OpenTelemetry を使用してさまざまなサービスのスコープを統合する

OpenTelemetry を使用してさまざまなサービスのスコープを統合する

WBOY
WBOY転載
2024-02-13 23:00:11480ブラウズ

使用 OpenTelemetry 统一不同服务的范围

php エディタ Xiaoxin は本日、開発者がさまざまなサービスで統一されたスコープ管理を実現できる強力なツール OpenTelemetry を紹介します。最新の分散システムでは、多くの場合、アプリケーションは複数のマイクロサービスで構成されており、それぞれが独自のログ、メトリクス、トレース情報を持っています。 OpenTelemetry は、この情報を統合および管理するためのシンプルかつ強力な方法を提供し、開発者がシステム全体のパフォーマンスと動作をより深く理解し、デバッグできるようにします。ローカル開発環境でも本番環境でも、OpenTelemetry は開発者がアプリケーションをより深く理解し、最適化するのに役立ちます。

質問の内容

私は opentelemetry を使い始めたばかりで、そのための 2 つの (マイクロ) サービス、standardgeomap を作成しました。

エンド ユーザーは standard サービスにリクエストを送信し、サービスは情報を取得するために geomap にリクエストを送信し、結果をエンド ユーザーに返します。すべての通信には grpc を使用します。

私は自分の関数でこの検出を行いました:

規格の場合:

リーリー

地理地図 の場合: リーリー

両方のサービスは、スパンを jaeger バックエンドに送信し、ほぼ同じ主な機能を共有するように構成されています (わずかな違いはコメントに記載されています):

リーリー

エンド ユーザーの

標準 サービスへのリクエストによって生成されたトレースを見ると、予想どおり、geomap サービスを呼び出していることがわかります。 ただし、サブ範囲に追加されたプロパティやイベントが表示されません (

geomapgetcountry 関数/em> をインストルメント化するときに、1 つのプロパティと 2 つのイベントを追加しました) 。 ただし、これらのプロパティは別の別のトレース (jaeger の「geomap」サービスで利用可能) で利用可能であることに気付きました。そのスパン ID は標準サービスのサブスパンとはまったく無関係です。 ここで私が期待しているのは、トレースを取得し、

standard

スコープ内のサブスコープの

geomap に関連するすべてのプロパティ/イベントを確認することです。ここから期待どおりの結果を得るにはどうすればよいですか? 回避策

スパン コンテキスト (「

サービス インストルメンテーションと用語

」で説明されているトラッキング ID とスパン ID を含む) を親スパンから子スパンに伝播する必要があります。これにより、それらは同じトレースの一部になります。

opentelemetry を使用すると、これは通常、grpc などのさまざまなライブラリに提供されるプラグインを使用してコードをインストルメントすることによって自動的に行われます。 ただし、あなたの場合、伝播が適切に機能していないようです。

コードでは、
getstandard

関数で新しいスコープを開始し、

getcountry リクエストを行うときにそのコンテキスト (newctx) を使用します。新しいコンテキストには親スパンのスパン コンテキスト (getstandard) が含まれている必要があるため、これは正しいです。 ただし、問題は createclient 関数に関連している可能性があります:
リーリー あなたは正しく使用しています

otelgrpc.unaryclientinterceptor

ここでは、これによりコンテキストが正しく伝播されることが保証されますが、この関数がいつ呼び出されるのかは明確ではありません。 getstandard 関数を呼び出す前にこの関数が呼び出された場合、クライアントの作成に使用されるコンテキストには、getstandard からのスパン コンテキストが含まれません。 テストの場合は、getstandard 関数の呼び出し後にクライアントが作成されていること、およびリクエスト全体で同じコンテキストが使用されていることを確認してください。

これを行うには、

getstandard 関数の修正バージョンに示すように、newctx

getcountry 関数に直接渡します。 リーリー クライアントの作成と getcountry リクエストの作成に使用されるコンテキストには、getstandard からのスパン コンテキストが含まれるようになり、それらは jaeger の同じトレースの一部として表示されるはずです。

(いつものように、createclientgetcountry などの関数によって返されるエラーを確認してください。簡潔にするためにここでは示していません)。

###また:###

プロパゲータも確認してください。同じ Context プロパゲータを使用していることを確認してください。 どちらのサービスでも、最適なのは

w3c tracecontextpropagator

(デフォルトでは opentelemetry) です。

    次のようにプロパゲータを明示的に設定できます:
  • リーリー

    両方のサービスの main a> 関数の先頭に上記の行を追加します。

    メタデータが渡されていることを確認します。 grpc インターセプターは、リクエストのメタデータからトレース コンテキストを自動的に挿入/抽出しますが、それが適切に動作していることを再確認してください。

    getcountry 関数でスパンを開始した後、トラッキング ID とスパン ID をログに記録できます:

    ctx, span := otel.tracer(name).start(ctx, "getcountry")
    sc := trace.spancontextfromcontext(ctx)
    log.printf("trace id: %s, span id: %s", sc.traceid(), sc.spanid())
    defer span.end()
    

    并在 getstandard 函数中执行相同的操作:

    newCtx, span1 := otel.Tracer(name).Start(ctx, "GetStandard")
    sc := trace.SpanContextFromContext(newCtx)
    log.Printf("Trace ID: %s, Span ID: %s", sc.TraceID(), sc.SpanID())
    defer span1.End()
    

    如果上下文正确传播,两个服务中的跟踪 id 应该匹配。

以上がOpenTelemetry を使用してさまざまなサービスのスコープを統合するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。