OpenTelemetry Collector をセットアップする

概要

OpenTelemetry Collector を使用すると、アプリケーションからのテレメトリーデータをベンダーに依存しない方法で収集、処理、エクスポートできます。Datadog ExporterDatadog Connector を設定すると、Datadog Agent を使用せずにトレース、ログ、およびメトリクスを Datadog に送信できます。

  • Datadog Exporter: OpenTelemetry SDK が生成するトレース、メトリクス、ログデータを Datadog (Datadog Agent 不要) に転送する
  • Datadog Connector: 収集したスパンデータからトレースメトリクスを計算する
図: コード内の OpenTelemetry SDK が OTLP を通じてデータを、Datadog Exporter を組み込んだ OpenTelemetry Collector が稼働するホストへ送信し、さらに Datadog の Observability Platform へ転送する様子を示す図。
このセットアップでサポートされる Datadog 機能を確認するには、機能の互換性テーブルFull OTel を参照してください。

インストールと設定

1 - OpenTelemetry Collector をダウンロードする

OpenTelemetry Collector Contribute の最新リリースをプロジェクトのリポジトリからダウンロードします。

2 - Datadog Exporter と Connector を設定する

Datadog Exporter と Datadog Connector を使用するには、OpenTelemetry Collector の設定に組み込みます。

  1. collector.yaml という名前の設定ファイルを作成します。
  2. 次のサンプルファイルを使用して始めることができます。
  3. Datadog の API キーを DD_API_KEY 環境変数として設定してください。
The following examples use 0.0.0.0 as the endpoint address for convenience. This allows connections from any network interface. For enhanced security, especially in local deployments, consider using localhost instead. For more information on secure endpoint configuration, see the OpenTelemetry security documentation.
receivers:
  otlp:
    protocols:
      http:
        endpoint: 0.0.0.0:4318
      grpc:
        endpoint: 0.0.0.0:4317
  # Datadogで正確なインフラストラクチャメトリクスを取得するには、hostmetrics レシーバーが必要です。
  hostmetrics:
    collection_interval: 10s
    scrapers:
      paging:
        metrics:
          system.paging.utilization:
            enabled: true
      cpu:
        metrics:
          system.cpu.utilization:
            enabled: true
      disk:
      filesystem:
        metrics:
          system.filesystem.utilization:
            enabled: true
      load:
      memory:
      network:
      processes:
  # prometheus レシーバーは、OpenTelemetry Collector ダッシュボードに必要なメトリクスをスクレイプします。
  prometheus:
    config:
      scrape_configs:
      - job_name: 'otelcol'
        scrape_interval: 10s
        static_configs:
        - targets: ['0.0.0.0:8888']

  filelog:
    include_file_path: true
    poll_interval: 500ms
    include:
      - /var/log/**/*example*/*.log

processors:
  batch:
    send_batch_max_size: 100
    send_batch_size: 10
    timeout: 10s

connectors:
  datadog/connector:

exporters:
  datadog/exporter:
    api:
      site: 
      key: ${env:DD_API_KEY}

service:
  pipelines:
    metrics:
      receivers: [hostmetrics, prometheus, otlp, datadog/connector]
      processors: [batch]
      exporters: [datadog/exporter]
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [datadog/connector, datadog/exporter]
    logs:
      receivers: [otlp, filelog]
      processors: [batch]
      exporters: [datadog/exporter]

この基本的な設定では、HTTP および gRPC 経由で OTLP データを受信できるようになり、バッチプロセッサが設定されます。

Datadog Exporter の設定オプションの完全なリストについては、ドキュメント化されたサンプル設定ファイルを参照してください。デプロイ方法によっては、api::sitehost_metadata といった追加オプションが必要になる場合があります。

バッチプロセッサの設定

本番環境 (開発環境以外) では、バッチプロセッサが必要です。具体的な設定はワークロードや扱うシグナルタイプによって異なります。

Datadog のインテーク上限に合わせてバッチプロセッサを設定してください:

バッチプロセッサでまとめるテレメトリーデータが多すぎる場合、413 - Request Entity Too Large エラーが発生することがあります。

3 - アプリケーションを設定する

トレースのメタデータを充実させ、Datadog とのインテグレーションを円滑に行うには

  • リソース検出システムを使用する: 言語 SDK で提供されている場合、コンテナ情報をリソース属性としてアタッチします。例えば、Go の場合、WithContainer() リソースオプションを使用します。

  • **統合サービスタグ付け**を適用する: 統合サービスタグ付けに適切なリソース属性をアプリケーションに構成していることを確認してください。これは、Datadog のテレメトリーを、サービス名、デプロイ環境、サービスバージョンなどのタグで結びつけます。アプリケーションはこれらのタグを OpenTelemetry のセマンティック規則 (service.namedeployment.environmentservice.version) を使用して設定する必要があります。

4 - アプリケーションのロガーを設定する

コレクター内の filelog レシーバーにデータを送信するホスト、コンテナ、アプリケーション、コレクター内の Datadog Exporter が Datadog バックエンドにデータを送信する様子を示した図

OpenTelemetry SDK のログ機能はまだ完全にはサポートされていません (詳細は OpenTelemetry のドキュメントでご利用の言語の項目を参照) 。Datadog では、アプリケーション用の標準的なロギングライブラリの使用を推奨しています。言語別のログ収集ドキュメントに従い、アプリケーションに適切なロガーを設定してください。Datadog では、カスタムパーシングルールを回避するため、ロギングライブラリを JSON 出力するように強く推奨しています。

filelog レシーバーの構成

演算子を使って、filelog レシーバーを構成します。例えば、checkoutservice というサービスがあり、それが /var/log/pods/services/checkout/0.log にログを書き込んでいるとしたら、ログのサンプルは以下のようになります。

{"level":"info","message":"order confirmation email sent to \"jack@example.com\"","service":"checkoutservice","span_id":"197492ff2b4e1c65","timestamp":"2022-10-10T22:17:14.841359661Z","trace_id":"e12c408e028299900d48a9dd29b0dc4c"}

filelog の構成例

filelog:
   include:
     - /var/log/pods/**/*checkout*/*.log
   start_at: end
   poll_interval: 500ms
   operators:
     - id: parse_log
       type: json_parser
       parse_from: body
     - id: trace
       type: trace_parser
       trace_id:
         parse_from: attributes.trace_id
       span_id:
         parse_from: attributes.span_id
   attributes:
     ddtags: env:staging
  • include: レシーバーが追跡するファイルのリスト
  • start_at: end: 追記された新しいログを読み込む指定
  • poll_internal: ポーリングの頻度
  • 演算子:
    • json_parser: JSON ログをパースします。デフォルトでは、filelog レシーバーは各ログ行をログレコードに変換し、それがログのデータモデルbody となります。次に、json_parser が JSON の本文をデータモデルの属性に変換します。
    • trace_parser: ログから trace_idspan_id を抽出し、Datadog 内でログとトレースを関連付ける。

OTel の service.name 属性をログの service に再マップする

Datadog Exporter バージョン 0.83.0 以降では、OTel ログの service フィールドは OTel のセマンティック規約である service.name を参照しています。ただし service.name は Datadog のログ前処理で使われるサービス属性のデフォルト項目には含まれていません。

ログの service フィールドを正しく反映させるためには、log service remapper プロセッサを設定し、service.name をログの service 取り込み元として指定することができます。

Kubernetes インフラクチャーに OpenTelemetry Collector と Datadog Exporter をデプロイする方法は複数存在します。filelog レシーバーを動作させるためには、Agent/DaemonSet のデプロイメントを推奨します。

コンテナ化された環境では、アプリケーションは通常 stdoutstderr にログを書き出し、Kubernetes がそれを標準的なパスに出力します。そのため、filelog レシーバーでそれらを取り込むには、ホストノード上のディレクトリを Collector にマウントする必要があります。下記はログ送信に必要なマウントを含む拡張設定例です。

apiVersion: apps/v1
metadata:
  name: otel-agent
  labels:
    app: opentelemetry
    component: otel-collector
spec:
  template:
    metadata:
      labels:
        app: opentelemetry
        component: otel-collector
    spec:
      containers:
        - name: collector
          command:
            - "/otelcol-contrib"
            - "--config=/conf/otel-agent-config.yaml"
          image: otel/opentelemetry-collector-contrib:0.71.0
          env:
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            # k8s.pod.ip は k8sattributes でポッドを関連付けるために使用されます
            - name: OTEL_RESOURCE_ATTRIBUTES
              value: "k8s.pod.ip=$(POD_IP)"
          ports:
            - containerPort: 4318 # OpenTelemetry HTTP レシーバーのデフォルトポート
              hostPort: 4318
            - containerPort: 4317 # OpenTelemetry gRPC レシーバーのデフォルトポート
              hostPort: 4317
            - containerPort: 8888 # メトリクス取得用のデフォルトエンドポイント
          volumeMounts:
            - name: otel-agent-config-vol
              mountPath: /conf
            - name: varlogpods
              mountPath: /var/log/pods
              readOnly: true
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
      volumes:
        - name: otel-agent-config-vol
          configMap:
            name: otel-agent-conf
            items:
              - key: otel-agent-config
                path: otel-agent-config.yaml
        # ノード上のログファイルディレクトリをマウント
        - name: varlogpods
          hostPath:
            path: /var/log/pods
        - name: varlibdockercontainers
          hostPath:
            path: /var/lib/docker/containers

すぐに使える Datadog Exporter の構成

OpenTelemetry Collector Contrib プロジェクトの exporter/datadogexporter/examples フォルダーには、Datadog Exporter の標準的な設定例が掲載されています。完全な設定例としては ootb-ec2.yaml を参照してください。それぞれのコンポーネントを環境に合わせて設定してください。


参考資料

PREVIEWING: guacbot/translation-pipeline