Mule Runtime での OpenTelemetry のサポート

OpenTelemetry は、仕様、API、SDK で構成されるオブザーバビリティ標準です。テレメトリーデータ (メトリクス、ログ、トレースなど) を計測、生成、収集、エクスポートしてソフトウェアの動作を分析するのに役立ちます。

OpenTelemetry を使用すると、Mule Runtime Engine で Mule アプリケーションの動作に関するオブザーバビリティを提供できます。また、分散トレースを使用すると、Mule でこの標準を活用する Mule アプリケーションと非 Mule コンポーネント間のインタラクションに関するオブザーバビリティを提供できます。

Mule では、OpenTelemetry 分散トレースの生成およびエクスポートがサポートされています。ただし、メトリクスとログはまだ OpenTelemetry でサポートされていません。

始める前に

OpenTelemetry Mule 機能を使用するには、以下に精通している必要があります。

オブザーバビリティ標準で開始するには、以下が必要です。

  • Mule Runtime 4.6.0 以降 (フロートレースの場合)。

  • HTTP 用 Anypoint Connector (HTTP Connector) 1.8 (分散トレースの場合)。

  • 設定済みの Telemetry Exporter。

Mule アプリケーションのトレース

Mule は OpenTelemetry を利用して、以下を提供します。

  • アプリケーション実行オブザーバビリティ

    オブザーバビリティには、アプリケーションの各コンポーネントの動作が含まれます。Mule アプリケーションに関連するメインスパンはフロースパンです。メッセージ処理に関連する各 Mule コンポーネント実行は、対応するフローの子スパンとして表されます。

  • 分散トレース

    トレースにより、Mule アプリケーションのインタラクションを追跡できます。複数のシステムおよびサービスが関連する場合、分散トレースで分散環境に流れるアプリケーション要求を追跡し、アプリケーションの実行の包括的なビューを提供します。

たとえば、HTTP Listener で W3C トレースコンテキスト​ヘッダーを受信する場合、Mule のフロースパンでクライアントのリモート親スパン (HTTP コールの発生元のスパン) を取得します。HTTP Requester コンポーネントを使用している場合、Mule は自動的に現在のスパンをサーバーエンドポイントに伝播します。

コンテキストの受信および伝播でサポートされているスパンコンテキスト形式は、 W3C トレースコンテキスト​形式です。

Mule スパンデータ

トレースは、分散システムの完全な操作を表す一連のスパンです。スパンは、ネストされることがあり、作業または操作の単位を表します。各スパンには、以下が含まれます。

カテゴリ 説明 値の例

Name (名前)

スパンの名前

mule:set-variable

Parent Span ID (親スパン ID)

現在のスパンの親のスパン ID

86838830d494d679

Start and End Timestamps (開始および終了タイムスタンプ)

スパンの最も早いおよび最も遅いタイムスタンプ

2021-10-22 16:04:01.209458162 +0000 UTC

Span Context (スパンコンテキスト)

スパンを一意に識別するデータ: トレース ID、スパン ID、トレースフラグ、トレース状態

Attributes (属性)

メタデータが含まれるキー-値ペア。このメタデータを使用してアノテーションをスパンに付加し、追跡対象の操作に関する情報を伝えます。

{ “location”: “flow/processors/2”, “correlation.id”: “1234abcd” }

Span Events (スパンイベント)

スパンの期間中の意味のある一意の時点を示すために使用される、スパンの構造化されたログメッセージまたはアノテーション。

{ "name": "", "message": "OK", "timestamp": "2021-10-22 16:04:01.209512872 +0000 UTC" }

Span Links (スパンリンク)

あるスパンを 1 つ以上の他のスパンに関連付けるリンク (因果関係を示す)。

Span Status (スパン状況)

スパンに関連付けられた状況。アプリケーションコードで例外などの不明なエラーが発生したときのスパン状況を設定できます。

ERROR​、​OK​、​UNSET

Span Kind (スパンの種類)

トレースの編成方法に関する情報。

CLIENT​、​INTERNAL​、​PRODUCER

フロートレース機能の例

フロー実行をトレースする場合、メッセージの処理に関連する各 Mule コンポーネント実行はスパンとして表されます。コンポーネントスパンは、実行の関連する側面を表します。Set Payload などのシンプルなコンポーネントでは 1 つのスパンですが、Batch Job などではより複雑な構造になります。

バッチインスタンス

Mule Runtime は Batch Job などの複雑なコンポーネントを追跡します。

Listener および Set Payload コンポーネントが含まれるより複雑な構造のバッチフロー
生成されるスパン

トレースは、Batch Job の最初のステップでどのように各バッチレコードが処理されるのかを表示します。各レコードスパンには、Logger コンポーネントで実行される作業の単位を表す子スパンが含まれます。 次に、For Each コンポーネントおよびその内部のプロセッサー (Transform Message や Logger など) と共に Batch Aggregator スパンを表示します。 その後、他の 2 つのバッチステップとそれぞれのコンポーネントを表示します。 最後に、フローの Batch Job の後に表示される Logger コンポーネントと共に Batch On Complete スパンを表示します。

分散トレース機能の例

次の例では、ある Mule アプリケーションが別の Mule アプリケーションに要求を送信しています。

HTTP アプリケーションの Listener、Logger、Request コンポーネントが含まれるフロー
非同期アプリケーションのプロセスフローが表示されているフロー

Mule および HTTP Connector で OpenTelemetry が計測されるため、分散トレースでは、同じトレースの一部として両方のフローが取得されます。

トレースのエラー

スパンで表される実行作業単位でエラーが発生すると、スパンの状況が ​[Error (エラー)]​ に設定されます。MuleSoft は、1 つ以上の​例外​イベントをスパンに追加する OpenTelemetry によって定義されるセマンティック規則に準拠します。

  • exception.type​: Mule エラー種別

  • exception.message​: Mule エラーメッセージ

  • exception.stacktrace​: Mule フロースタックの文字列表現

次の例では、エラーが発生したときに、Raise error コンポーネントに対応するスパンで Lightstep プラットフォームのエラー状況が表示されます。

エラー処理が含まれるテレメトリーフローのフロー

この状況は、親スパン (フロースパンなど) に伝播します。スパンの詳細ビューにエラー状況と例外イベントが表示されます。

HTTP 規則

HTTP Listener および HTTP Request 操作により、スパンに属性が追加され、HTTP インタラクションをトレースするためのより多くのコンテキストが提供されます。

HTTP Listener が含まれるフローでは以下のようになります。

  • Span name (スパン名): HTTP メソッドとパスの組み合わせ。例: POST /api​。

  • Span kind (スパンの種類): SERVER​。

フロースパンに関連付けられた HTTP Listener の追加属性:

属性 説明

net.host.name

HTTP Listener のホストアドレス

net.host.port

HTTP Listener のポート

http.user_agent

受信した要求のユーザーエージェント

http.route

HTTP Listener のパス

http.method

HTTP メソッド

http.flavor

HTTP バージョン

HTTP Request が含まれるフローでは以下のようになります。

  • Span name (スパン名): HTTP メソッド。例: GET​。

  • Span kind (スパンの種類): CLIENT​。

フロースパンに関連付けられた HTTP Request の追加属性:

属性 説明

http.url

対象 URL

net.host.port

HTTP Request のポート

net.peer.name

対象 IP アドレス

http.route

HTTP Request のパス

http.flavor

HTTP バージョン