伝搬

コンテキスト伝搬により、シグナルは、生成される場所に関係なく、相互に関連付けることができます。 トレーシングに限定されませんが、コンテキスト伝搬により、トレースは、プロセスとネットワークの境界を越えて任意に分散されたサービス間で、システムに関する因果関係の情報を構築できます。

大多数のユースケースでは、OpenTelemetryをネイティブにサポートするライブラリまたは計装ライブラリが、自動的にサービス間でトレースコンテキストを伝搬します。 手動でコンテキストを伝搬する必要があるのは、まれなケースのみです。

詳細については、コンテキスト伝搬を参照してください。

自動コンテキスト伝搬

分散トレースは単一のサービスを超えて広がるため、スパン間の親子関係を作成するためにサービス間でコンテキストを伝搬する必要があります。 これにはサービス間のコンテキスト伝搬が必要です。 これは、トレースの識別子をリモートプロセスに送信する仕組みです。

Phoenix、Cowboy、Elli などの HTTP フレームワークおよびサーバーの計装ライブラリや、Tesla などのクライアントは、グローバルに登録されたプロパゲーターを使用してコンテキストを自動的に注入または抽出します。 デフォルトで使用されるグローバルプロパゲーターは、W3C Trace Context と Baggage フォーマットです。

OTP アプリケーション環境変数 text_map_propagators を使用して、グローバルプロパゲーターを設定できます。

%% sys.config
...
{text_map_propagators, [baggage,
                        trace_context]},
...
## runtime.exs
...
text_map_propagators: [:baggage, :trace_context],
...

環境変数 OTEL_PROPAGATORS を使用して、カンマ区切りのリストを渡すこともできます。 どちらの設定方法でも、trace_context、baggage、b3、b3multi の値を受け付けます。

手動コンテキスト伝搬

コンテキストを手動で注入または抽出するには、otel_propagator_text_map モジュールを使用します。

%% プロセスディクショナリのコンテキストを使用して、空のヘッダーリストに追加する
Headers = otel_propagator_text_map:inject([]),

%% ヘッダーからプロセスディクショナリにコンテキストを作成する
otel_propagator_text_map:extract(Headers),
# プロセスディクショナリのコンテキストを使用して、空のヘッダーリストに追加する
headers = :otel_propagator_text_map.inject([])

# ヘッダーからプロセスディクショナリにコンテキストを作成する
:otel_propagator_text_map.extract(headers)

otel_propagator_text_map:inject/1 と otel_propagator_text_map:extract/1 は、グローバルに登録されたプロパゲーターを使用します。 特定のプロパゲーターを使用するには、otel_propagator_text_map:inject/2 と otel_propagator_text_map:extract/2 を使用し、第一引数に呼び出すプロパゲーターモジュールの名前を指定します。

次のステップ

伝搬について詳しくは、Propagators API 仕様を参照してください。