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) ​

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がさらに別のバックエンドにエクスポートする構成が一般的です。

yaml
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) ​

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 に、アプリケーションの公開エンドポイントをスクレイピングターゲットとして追加します。

yaml
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) ​

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 ExporterOpenTelemetryネイティブプロトコルCollector経由での汎用的なデータ送信
Prometheus ExporterPrometheus互換フォーマットで公開Prometheusサーバーによるスクレイピング
Cloud Vendor Exporter各クラウドプロバイダーの監視サービスに直接送信クラウドネイティブな監視環境

OpenTelemetry Collectorを介したエクスポートは、柔軟性、信頼性、およびパフォーマンスの観点から最も推奨されるアプローチです。これらのベストプラクティスを適用することで、メトリクスデータを効率的かつセキュアに収集し、システムの可観測性を高めることができます。


関連記事: OpenTelemetry メトリクス計測器の種類と活用関連記事: メトリクスと時系列データベース(TSDB)の連携設計関連記事: メトリクスのクエリと分析パターン関連記事: メトリクスに基づいたアラーティング設計