OpenTelemetry メトリクスエクスポーターとバックエンド連携
OpenTelemetryで収集されたメトリクスデータは、アプリケーションから直接、またはOpenTelemetry Collectorを介して、様々な監視バックエンドに送信されます。この「エクスポート」のプロセスは、メトリクスデータを実際に活用するために不可欠です。本記事では、OpenTelemetryメトリクスを各種バックエンドにエクスポートする方法、主要なエクスポーターの設定、および連携のベストプラクティスについて解説します。
メトリクスエクスポートの基本
メトリクスエクスポートは、OpenTelemetry SDKによって収集されたメトリクスデータを、指定されたフォーマットで外部システム(監視バックエンド、時系列データベースなど)に送信する機能です。通常、エクスポートは定期的にバッチ処理で行われます。
エクスポーターの種類
OpenTelemetryは、様々なバックエンドに対応するための多様なエクスポーターを提供しています。
- OTLP (OpenTelemetry Protocol) Exporter: OpenTelemetryのネイティブプロトコル。Collectorを介して任意のOTLP互換バックエンドに送信する際の標準的な選択肢です。
- Prometheus Exporter: Prometheus形式でメトリクスを公開し、Prometheusサーバーがスクレイピング(pull型)で収集できるようにします。
- Cloud Vendor Exporters: AWS CloudWatch、Google Cloud Monitoring、Azure Monitorなど、特定のクラウドプロバイダーの監視サービスに直接メトリクスを送信します。
- その他のベンダーエクスポーター: Datadog、New Relic、Dynatraceなど、商用監視ソリューション向けのエクスポーターも存在します。
1. OTLP Exporter (OpenTelemetry Protocol)
OTLPは、OpenTelemetryが推奨するデータ転送プロトコルです。トレース、メトリクス、ログのすべてのシグナルに対応しており、gRPCまたはHTTP/protobufを介してデータを送信します。OpenTelemetry Collectorと連携する際の標準的な方法です。
OTLP Exporterの設定
OTLP Exporterは、通常、OpenTelemetry SDKまたはCollectorの設定で指定します。
SDKでの設定例 (Python)
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
# OTLP Exporterの設定
otlp_exporter = OTLPMetricExporter(endpoint="http://localhost:4317", insecure=True)
metric_reader = PeriodicExportingMetricReader(otlp_exporter, export_interval_millis=5000)
# MeterProviderに登録
meter_provider = MeterProvider(resource=resource, metric_readers=[metric_reader])
metrics.set_meter_provider(meter_provider)OpenTelemetry Collectorでの設定例 (YAML)
アプリケーションはOTLPでCollectorにメトリクスを送信し、Collectorがさらに別のバックエンドにエクスポートする構成が一般的です。
receivers:
otlp:
protocols:
grpc:
exporters:
otlp:
endpoint: "backend:4317"
# 複数のエクスポーターを設定可能(詳細は公式ドキュメント参照)
service:
pipelines:
metrics:
receivers: [otlp]
exporters: [otlp]2. Prometheus Exporter
Prometheusは、メトリクス収集においてデファクトスタンダードとなっている監視システムです。OpenTelemetryのPrometheus Exporterを使うと、アプリケーションがPrometheus形式でメトリクスを公開できます。Prometheusサーバーは、HTTPエンドポイントからメトリクスをスクレイピング(pull)して収集します。
Prometheus Exporterの設定
Prometheus Exporterは、通常、アプリケーション内でHTTPサーバーを起動し、指定されたパスでメトリクスを公開します。
SDKでの設定例 (Python)
from opentelemetry.exporter.prometheus import PrometheusMetricReader
from prometheus_client import start_http_server
# Prometheus Exporterの設定
prometheus_reader = PrometheusMetricReader()
meter_provider = MeterProvider(resource=resource, metric_readers=[prometheus_reader])
metrics.set_meter_provider(meter_provider)
# HTTPサーバーを起動(ポート8000でメトリクスを公開)
start_http_server(port=8000, addr="localhost")Prometheusサーバーでの設定例 (YAML)
Prometheusサーバーの prometheus.yml に、アプリケーションの公開エンドポイントをスクレイピングターゲットとして追加します。
scrape_configs:
- job_name: 'my-application'
scrape_interval: 15s
static_configs:
- targets: ['localhost:8000'] # アプリケーションがメトリクスを公開するアドレスとポート3. Cloud Vendor Exporters (Google Cloud Monitoringの例)
クラウド環境でアプリケーションを運用している場合、各クラウドプロバイダーが提供する監視サービスに直接メトリクスを送信するエクスポーターが便利です。ここではGoogle Cloud Monitoring (旧Stackdriver) を例に挙げます。
Google Cloud Monitoring Exporterの設定
Google Cloud Monitoring Exporterは、OpenTelemetry Collectorを介して設定するのが一般的です。
OpenTelemetry Collectorでの設定例 (YAML)
receivers:
otlp:
protocols:
grpc:
exporters:
googlecloud:
project: "my-gcp-project-id"
# 詳細な設定(認証、プレフィックス等)は公式ドキュメント参照
service:
pipelines:
metrics:
receivers: [otlp]
exporters: [googlecloud]エクスポートのベストプラクティス
1. OpenTelemetry Collectorの活用
ほとんどの場合、アプリケーションから直接バックエンドにエクスポートするのではなく、OpenTelemetry Collectorを介してエクスポートすることを強く推奨します。
Collectorを使用するメリット:
- バッファリングとリトライ: バックエンドが一時的に利用できない場合でもデータを失わない。
- データ変換と処理: メトリクスデータのフィルタリング、サンプリング、属性の追加/削除、集約など。
- 複数のバックエンドへの送信: 一つのCollectorから複数の監視バックエンドにデータを複製して送信できる。
- アプリケーションの負荷軽減: エクスポートロジックをアプリケーションから分離し、アプリケーションのパフォーマンスへの影響を最小限に抑える。
2. 適切なエクスポート間隔の設定
メトリクスをエクスポートする間隔は、監視の要件とバックエンドの能力に合わせて調整します。
- リアルタイム性: 重要なシステムでは短い間隔(例: 5秒〜15秒)
- コストと負荷: 頻繁なエクスポートはネットワーク帯域とバックエンドのストレージコストを増加させるため、バランスを考慮する。
- Prometheus: Prometheusはpull型なので、Prometheusサーバーのスクレイピング間隔に合わせる。
3. 認証とセキュリティ
エクスポート先のバックエンドへの認証情報を適切に管理し、セキュアな通信(TLS/SSL)を使用することが不可欠です。
- APIキー/トークン: 環境変数やシークレット管理サービスを利用する。
- TLS/SSL: OTLP Exporterでは
insecure=Falseを設定し、適切な証明書を使用する。 - IAMロール/サービスアカウント: クラウド環境では、Collectorが動作するVMに適切なIAMロールやサービスアカウントを付与する。
4. エラーハンドリングとロギング
エクスポートが失敗した場合に備えて、適切なエラーハンドリングとロギングを設定します。これにより、メトリクスデータが失われる原因を特定しやすくなります。
まとめ
OpenTelemetryメトリクスを効果的に活用するためには、適切なエクスポーターを選択し、監視バックエンドと連携させることが重要です。
| エクスポーター | 特徴 | 主な用途 |
|---|---|---|
| OTLP Exporter | OpenTelemetryネイティブプロトコル | Collector経由での汎用的なデータ送信 |
| Prometheus Exporter | Prometheus互換フォーマットで公開 | Prometheusサーバーによるスクレイピング |
| Cloud Vendor Exporter | 各クラウドプロバイダーの監視サービスに直接送信 | クラウドネイティブな監視環境 |
OpenTelemetry Collectorを介したエクスポートは、柔軟性、信頼性、およびパフォーマンスの観点から最も推奨されるアプローチです。これらのベストプラクティスを適用することで、メトリクスデータを効率的かつセキュアに収集し、システムの可観測性を高めることができます。
関連記事: OpenTelemetry メトリクス計測器の種類と活用関連記事: メトリクスと時系列データベース(TSDB)の連携設計関連記事: メトリクスのクエリと分析パターン関連記事: メトリクスに基づいたアラーティング設計