php エディタ Xiaoxin は本日、開発者がさまざまなサービスで統一されたスコープ管理を実現できる強力なツール OpenTelemetry を紹介します。最新の分散システムでは、多くの場合、アプリケーションは複数のマイクロサービスで構成されており、それぞれが独自のログ、メトリクス、トレース情報を持っています。 OpenTelemetry は、この情報を統合および管理するためのシンプルかつ強力な方法を提供し、開発者がシステム全体のパフォーマンスと動作をより深く理解し、デバッグできるようにします。ローカル開発環境でも本番環境でも、OpenTelemetry は開発者がアプリケーションをより深く理解し、最適化するのに役立ちます。
私は opentelemetry を使い始めたばかりで、そのための 2 つの (マイクロ) サービス、standard と geomap を作成しました。
エンド ユーザーは standard サービスにリクエストを送信し、サービスは情報を取得するために geomap にリクエストを送信し、結果をエンド ユーザーに返します。すべての通信には grpc を使用します。
私は自分の関数でこの検出を行いました:
規格の場合:
リーリー地理地図 の場合: リーリー
両方のサービスは、スパンを jaeger バックエンドに送信し、ほぼ同じ主な機能を共有するように構成されています (わずかな違いはコメントに記載されています):リーリー
エンド ユーザーの標準 サービスへのリクエストによって生成されたトレースを見ると、予想どおり、geomap サービスを呼び出していることがわかります。 ただし、サブ範囲に追加されたプロパティやイベントが表示されません (
geomapgetcountry 関数/em> をインストルメント化するときに、1 つのプロパティと 2 つのイベントを追加しました) 。 ただし、これらのプロパティは別の別のトレース (jaeger の「geomap」サービスで利用可能) で利用可能であることに気付きました。そのスパン ID は標準サービスのサブスパンとはまったく無関係です。 ここで私が期待しているのは、トレースを取得し、standard
スコープ内のサブスコープのgeomap に関連するすべてのプロパティ/イベントを確認することです。ここから期待どおりの結果を得るにはどうすればよいですか? 回避策
スパン コンテキスト (「opentelemetry を使用すると、これは通常、grpc などのさまざまなライブラリに提供されるプラグインを使用してコードをインストルメントすることによって自動的に行われます。 ただし、あなたの場合、伝播が適切に機能していないようです。
コードでは、
getstandard
getcountry リクエストを行うときにそのコンテキスト (
newctx) を使用します。新しいコンテキストには親スパンのスパン コンテキスト (
getstandard) が含まれている必要があるため、これは正しいです。
ただし、問題は createclient
関数に関連している可能性があります:
リーリー
あなたは正しく使用しています
ここでは、これによりコンテキストが正しく伝播されることが保証されますが、この関数がいつ呼び出されるのかは明確ではありません。 getstandard
関数を呼び出す前にこの関数が呼び出された場合、クライアントの作成に使用されるコンテキストには、getstandard からのスパン コンテキストが含まれません。
テストの場合は、getstandard 関数の呼び出し後にクライアントが作成されていること、およびリクエスト全体で同じコンテキストが使用されていることを確認してください。
getstandard 関数の修正バージョンに示すように、
newctx
getcountry 関数に直接渡します。
リーリー
クライアントの作成と getcountry
リクエストの作成に使用されるコンテキストには、getstandard
からのスパン コンテキストが含まれるようになり、それらは jaeger の同じトレースの一部として表示されるはずです。
(いつものように、createclient
や getcountry
などの関数によって返されるエラーを確認してください。簡潔にするためにここでは示していません)。
プロパゲータも確認してください。同じ
Context プロパゲータを使用していることを確認してください。
どちらのサービスでも、最適なのは
(デフォルトでは 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 サイトの他の関連記事を参照してください。