OpenTelemetryベースのエンドツーエンドMQTTトレーシング
現代の分散システムにおいて、リクエストの流れを追跡しパフォーマンスを分析することは、信頼性と可観測性を確保するために不可欠です。エンドツーエンドトレーシングは、リクエストの開始から終了までの全経路をキャプチャすることを目的とした概念であり、システムの挙動やパフォーマンスに関する深い洞察を得ることができます。
EMQXはバージョン5.8.3以降、MQTTプロトコルに特化したOpenTelemetryベースのエンドツーエンドトレーシング機能を統合しています。この機能により、特にマルチノードクラスター環境において、メッセージのパブリッシュ、ルーティング、配信を明確にトレースできます。これにより、システムパフォーマンスの最適化だけでなく、迅速な障害箇所の特定やシステム信頼性の向上にも役立ちます。
本ページでは、MQTTメッセージのフローを包括的に可視化するために、EMQXでエンドツーエンドトレーシング機能を有効化する方法を詳しく解説します。
OpenTelemetry Collectorのセットアップ
設定の詳細については、OpenTelemetry Collectorのセットアップを参照してください。
EMQXでエンドツーエンドトレーシングを有効化する
TIP
エンドツーエンドトレーシングはシステムパフォーマンスに影響を与える可能性があるため、必要な場合のみ有効化してください。
このセクションでは、EMQXでOpenTelemetryベースのエンドツーエンドトレーシングを有効化する手順と、マルチノード環境でのMQTT分散トレーシング機能のデモを紹介します。
ダッシュボードからエンドツーエンドトレーシングを設定する
ダッシュボードの左メニューから Management -> Monitoring をクリックします。
Monitoringページで Integration タブを選択します。
以下の設定を行います:
- Monitoring platform:
OpenTelemetry
を選択します。 - Feature Selection:
Traces
を選択します。 - Endpoint: トレースデータのエクスポート先アドレスを設定します。デフォルトは
http://localhost:4317
です。 - Enable TLS: 必要に応じてTLS暗号化を有効にします。通常、本番環境のセキュリティ要件に合わせて設定します。
- Trace Mode:
End-to-End
を選択し、エンドツーエンドトレーシング機能を有効化します。 - Cluster Identifier: span属性に追加するプロパティ値を設定し、どのEMQXクラスターからのデータかを識別できるようにします。プロパティキーは
cluster.id
です。通常はシンプルで識別しやすい名前やクラスター名を設定します。デフォルトはemqxcl
です。 - Traces Export Interval: トレースデータのエクスポート間隔を秒単位で設定します。デフォルトは
5
秒です。 - Max Queue Size: トレースデータキューの最大サイズを設定します。デフォルトは
2048
エントリです。
- Monitoring platform:
必要に応じて Trace Advanced Configuration をクリックし、詳細設定を行います。
- Trace Configuration: クライアント接続やメッセージ送受信、ルールエンジンの実行など、特定イベントのトレース有無を設定できます。
- Follow Traceparent:
traceparent
を追跡するかどうかを設定します。true
に設定すると、EMQXはクライアントから送信されたUser-Property
内のtraceparent
識別子を取得し、エンドツーエンドトレーシングに紐付けます。false
の場合は新規トレースを生成します。デフォルトはtrue
です。
- Follow Traceparent:
- Client ID White List: トレース対象とするクライアント接続やメッセージを制限するホワイトリストを設定できます。不要なトレースを避け、システムリソースの消費を抑制できます。
- Topic White List: トピックのホワイトリストを設定し、マッチするトピックのみをトレース対象とします。クライアントホワイトリストと同様にトレース範囲の制御に役立ちます。
設定後、Confirm をクリックして設定を保存しウィンドウを閉じます。
- Trace Configuration: クライアント接続やメッセージ送受信、ルールエンジンの実行など、特定イベントのトレース有無を設定できます。
Save Changes をクリックして設定を保存します。

設定ファイルからエンドツーエンドトレーシングを設定する
EMQXがローカルで稼働している前提で、cluster.hocon
ファイルに以下の設定を追加します。
設定オプションの詳細は、EMQXダッシュボード監視統合のOpenTelemetry項目を参照してください。
opentelemetry {
exporter { endpoint = "http://localhost:4317" }
traces {
enable = true
# エンドツーエンドトレーシングモード
trace_mode = e2e
# エンドツーエンドトレーシングオプション
e2e_tracing_options {
## クライアント接続/切断イベントをトレース
client_connect_disconnect = true
## クライアントのサブスクライブ/アンインサブスクライブイベントをトレース
client_subscribe_unsubscribe = true
## クライアントのメッセージングイベントをトレース
client_messaging = true
## ルールエンジンの実行をトレース
trace_rule_engine = true
## クライアントIDホワイトリストの最大長
clientid_match_rules_max = 30
## トピックフィルターホワイトリストの最大長
topic_match_rules_max = 30
## クラスター識別子
cluster_identifier = emqxcl
## メッセージトレースレベル(QoS)
msg_trace_level = 2
## ホワイトリスト外イベントのサンプリング率
## 注:トレースが有効な場合のみサンプリングが適用されます
sample_ratio = "100%"
## traceparentの追跡
## クライアントから渡された`traceparent`をエンドツーエンドトレーシングで追跡するか
follow_traceparent
}
}
max_queue_size = 50000
scheduled_delay = 1000
}
}
EMQXでのエンドツーエンドトレーシングのデモ
EMQXノードを起動します。例として、
emqx@172.19.0.2
とemqx@172.19.0.3
の2ノードクラスターを起動し、分散トレーシング機能をデモします。MQTTX CLIをクライアントとして使用し、異なるノードで同じトピックをサブスクライブします。
emqx@172.19.0.2
ノードでサブスクライブ:bashmqttx sub -t t/1 -h 172.19.0.2 -p 1883
emqx@172.19.0.3
ノードでサブスクライブ:bashmqttx sub -t t/1 -h 172.19.0.3 -p 1883
約5秒後(EMQXのトレースデータエクスポートのデフォルト間隔)、http://localhost:16686 のJaeger WEB UIにアクセスし、トレースデータを確認します。
emqx
サービスを選択し、Find Traces をクリックします。emqx
サービスがすぐに表示されない場合は、少し待ってページを更新してください。クライアント接続およびサブスクライブイベントのトレースが確認できます:メッセージをパブリッシュします:
bashmqttx pub -t t/1 -h 172.19.0.2 -p 1883
少し待つと、Jaeger WEB UIでMQTTメッセージの詳細なトレースが確認できます。
トレースをクリックすると、詳細なspan情報とトレースタイムラインが表示されます。サブスクライバー数、ノード間のメッセージルーティング、QoSレベル、
msg_trace_level
設定により、MQTTメッセージのトレースに含まれるspan数は異なります。以下は、2クライアントがQoS 2でサブスクライブし、パブリッシャーがQoS 2のメッセージを送信、
msg_trace_level
が2に設定されている場合のトレースタイムラインとspan情報の例です。特に、クライアント
mqttx_9137a6bb
がパブリッシャーとは異なるEMQXノードに接続しているため、ノード間の送信を表す2つの追加span(message.forward
とmessage.handle_forward
)が表示されています。また、メッセージやイベントがルールエンジンの実行をトリガーする場合、ルールエンジンのトラッキングオプションが有効であれば、ルールおよびアクションの実行トラッキング情報も取得可能です。
TIP
ルールエンジンの実行を含むエンドツーエンドトレーシング機能は、EMQXバージョン5.9.0以降でサポートされています。
重要なお知らせ
この機能は慎重に有効化してください。メッセージやイベントが複数のルールやアクションをトリガーすると、単一のトレースで大量のspanが生成され、システム負荷が増加します。
メッセージ量やルール・アクション数に応じて適切なサンプリング率を見積もってください。
トレースspanのオーバーロード管理
EMQXはトレースspanを蓄積し、定期的にバッチでエクスポートします。エクスポート間隔は opentelemetry.trace.scheduled_delay
パラメータで制御され、デフォルトは5秒です。バッチトレースspanプロセッサにはオーバーロード保護機能があり、最大蓄積数(デフォルト2048span)を超えると新規spanは破棄されます。以下の設定でこの制限を調整可能です。
opentelemetry {
traces {
max_queue_size = 50000
scheduled_delay = 1000
}
}
max_queue_size
の上限に達すると、現在のキューがエクスポートされるまで新規トレースspanは破棄されます。
補足
トレース対象メッセージが多数のサブスクライバーに配信される場合や、メッセージ量が多くサンプリング率が高い場合、オーバーロード保護により多くのspanが破棄され、エクスポートされるspanはごく一部になる可能性があります。
エンドツーエンドトレーシングモードでは、メッセージ量やサンプリング率に応じて max_queue_size
を増やし、scheduled_delay
を短縮してspanのエクスポート頻度を上げることを検討してください。これによりオーバーロード保護によるspanの損失を抑制できます。
ただし、エクスポート頻度の増加やキューサイズの拡大はシステムリソース消費を増加させるため、メッセージTPSや利用可能なシステムリソースを十分に見積もった上で適切に設定してください。