🐱 うさねこ教室 Python と可観測性の教室

Collector でパイプラインを組む

🐱 この章の目次

Collector のアーキテクチャ

OTel Collector は、テレメトリーデータの受信・加工・転送を担うスタンドアロンのプロセスです。 アプリケーションとバックエンドの間に配置することで、エクスポート先の切り替えやデータ加工をアプリ側に影響なく行えます。

Collector の内部は 4 つのコンポーネントで構成されます。

コンポーネント役割
Receiverデータの受信(OTLP, Prometheus, Jaeger など)
Processorバッチ化、フィルタリング、属性の追加・削除
Exporterバックエンドへのデータ送信
PipelineReceiver → Processor → Exporter の接続定義

設定ファイル

Collector の設定は YAML で記述します。 以下はトレースを OTLP で受信し、Jaeger と Collector のログに出力する最小構成です。

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:
    timeout: 5s
    send_batch_size: 512
  memory_limiter:
    check_interval: 1s
    limit_mib: 512

exporters:
  otlp/jaeger:
    endpoint: jaeger:4317
    tls:
      insecure: true
  prometheus:
    endpoint: 0.0.0.0:8889
  otlp/loki:
    endpoint: loki:3100
    tls:
      insecure: true

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [otlp/jaeger]
    metrics:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [prometheus]
    logs:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [otlp/loki]

Processor の役割

batch プロセッサー は、個別のテレメトリーをまとめて送信することでネットワーク効率を高めます。 send_batch_sizetimeout のいずれかの条件を満たすとバッチが送出されます。

memory_limiter プロセッサー は、Collector のメモリ使用量を制限し、OOM を防止します。 上限に達するとデータの受信を一時的に拒否し、バックプレッシャーをかけます。 本番環境では必ず先頭に配置してください。

Docker Compose での起動

ローカル開発では Docker Compose で Collector を起動するのが手軽です。

services:
  otel-collector:
    image: otel/opentelemetry-collector-contrib:0.104.0
    command: ["--config", "/etc/otel/config.yaml"]
    volumes:
      - ./otel-collector-config.yaml:/etc/otel/config.yaml
    ports:
      - "4317:4317"   # OTLP gRPC
      - "4318:4318"   # OTLP HTTP
      - "8889:8889"   # Prometheus metrics

contrib イメージには多数の Receiver/Exporter が同梱されているため、開発・検証用途に適しています。 本番では必要なコンポーネントだけを含むカスタムビルドを推奨します。