OpenTelemetryを使ったログ管理の統合
ファイルログと同様に、OpenTelemetryログは重要なイベント、ステータス情報、エラーメッセージを記録し、開発者や運用チームがアプリケーションの動作を理解しトラブルシューティングを行うのに役立ちます。ただし、OpenTelemetryログは標準化されたログフォーマットを採用しているため、ログの解析や分析、処理が容易です。さらに、Trace ID、タグ、属性などの豊富なコンテキスト情報をログに付加できる点も特徴です。
本ページでは、EMQXとOpenTelemetryログハンドラーを統合して高度なログ管理を実現する方法を詳しく解説します。OpenTelemetry Collectorのセットアップ、EMQXでのOpenTelemetryログハンドラーの設定およびログのエクスポート方法、ログ過負荷の管理について説明します。この統合により、EMQXのログイベントをOpenTelemetryログデータモデルに準拠した形式で出力し、設定したOpenTelemetry Collectorやバックエンドにエクスポートできるため、監視やデバッグの効率が向上します。
OpenTelemetry Collectorのセットアップ
EMQXのOpenTelemetryログを有効にする前に、OpenTelemetry CollectorおよびOpenTelemetry対応のログ収集システムをデプロイし設定する必要があります。本ガイドでは、OpenTelemetry Collectorのデプロイ方法と、debugエクスポーターを使ってログをstdout
にリダイレクトする設定手順を説明します。
otel-logs-collector-config.yaml
という名前でOpenTelemetry Collectorの設定ファイルを作成します。yamlreceivers: otlp: protocols: grpc: exporters: logging: verbosity: detailed processors: batch: extensions: health_check: service: extensions: [health_check] pipelines: logs: receivers: [otlp] processors: [batch] exporters: [logging]
同じディレクトリにDocker Composeファイル
docker-compose-otel-logs.yaml
を作成します。yamlversion: '3.9' services: # Collector otel-collector: image: otel/opentelemetry-collector:0.90.0 restart: always command: ["--config=/etc/otel-collector-config.yaml", "${OTELCOL_ARGS}"] volumes: - ./otel-logs-collector-config.yaml:/etc/otel-collector-config.yaml ports: - "13133:13133" # ヘルスチェック拡張 - "4317:4317" # OTLP gRPCレシーバー
Docker Composeを使ってCollectorを起動します。
bashdocker compose -f docker-compose-otel-logs.yaml up
起動後、OpenTelemetry Collectorはhttp://localhost:4317でアクセス可能になります。
EMQXでOpenTelemetryログハンドラーを有効化
EMQXの
cluster.hocon
ファイルに以下の設定を追加します(EMQXがローカルで動作している想定です)。bashopentelemetry { exporter {endpoint = "http://localhost:4317"} logs {enable = true, level = warning} }
または、ダッシュボードの Management -> Monitoring にある Integration タブからOpenTelemetryログ統合を設定することも可能です。
補足
opentelemetry.logs.level
の設定は、EMQXログハンドラーで設定されたデフォルトのログレベルにより上書きされます。例えば、OpenTelemetryのログレベルがinfo
でも、EMQXのコンソールログレベルがerror
の場合は、error
以上のレベルのイベントのみがエクスポートされます。EMQXノードを起動します。
ダッシュボードからアクセスできないHTTPサービスへのブリッジ作成など、EMQXのログイベントを発生させます。
数秒以内(デフォルトは約1秒)に、Otel CollectorがHTTPブリッジ接続失敗などのEMQXログイベントを受信していることを確認できます。
ログ過負荷の管理
EMQXはログイベントを蓄積し、一定間隔でバッチ処理としてエクスポートします。
このエクスポートの頻度はopentelemetry.logs.scheduled_delay
パラメータで制御され、デフォルトは1秒です。
バッチ処理のログハンドラーは過負荷保護機構を備えており、蓄積できるイベント数に上限を設けています。デフォルトの上限は2048件です。以下の設定でこの上限を変更できます。
opentelemetry {
logs { max_queue_size = 2048 }
}
max_queue_size
の上限に達すると、新しいログイベントは現在のキューがエクスポートされるまで破棄されます。
補足
OpenTelemetryログの過負荷保護は、デフォルトのEMQXログハンドラーの過負荷保護とは独立して動作します。
そのため、設定によっては同じログイベントがOpenTelemetryハンドラーで破棄される一方、EMQXのデフォルトログハンドラーでは記録される場合や、その逆もあり得ます。