概要

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

  • Datadog Exporter: OpenTelemetry SDK が生成するトレース、メトリクス、ログデータを Datadog に (Datadog Agent なしで) 転送します
  • Datadog Connector: 収集したスパンデータからトレースメトリクスを計算します
図: コード内の OpenTelemetry SDK が OpenTelemetry Collector と Datadog Exporter を実行しているホストに OTLP を介してデータを送信し、このホストは Datadog の監視可能性プラットフォームにデータを転送します。
このセットアップでサポートされている Datadog 機能を確認するには、フル OTel の下の機能互換性テーブルを参照してください。

インストールと構成

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

OpenTelemetry Collector Contrib ディストリビューションの最新リリースを プロジェクトのリポジトリ からダウンロードします。

2 - Datadog Exporter と Datadog コネクタを構成します

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.
AWS EKS Fargate は、現時点では OpenTelemetry Collector をサポートする環境ではありません。EKS Fargate にコレクターをデプロイすると、インフラストラクチャー ホストの請求が不正確になります。
receivers:
  otlp:
    protocols:
      http:
        endpoint: 0.0.0.0:4318
      grpc:
        endpoint: 0.0.0.0:4317
  # The hostmetrics receiver is required to get correct infrastructure metrics in Datadog.
  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:
  # The prometheus receiver scrapes metrics needed for the OpenTelemetry Collector Dashboard.
  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 エクスポーターの構成オプションの完全なリストについては、完全にドキュメント化されたサンプル構成ファイル を参照してください。デプロイメントによっては、api::sitehost_metadata の設定などの追加オプションが意味を持つ場合があります。

バッチプロセッサーの構成

バッチプロセッサーは、開発環境以外では必須です。正確な構成は、特定のワークロードと信号タイプに依存します。

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

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

3 - アプリケーションを構成する

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

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

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

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

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

OpenTelemetry SDK のロギング機能は完全にはサポートされていないため (詳細はご自分の言語の OpenTelemetry ドキュメント を参照)、Datadog はアプリケーションに標準のロギングライブラリを使用することを推奨します。言語固有の ログ収集ドキュメント に従って、アプリケーションに適切なロガーを設定してください。Datadog は、カスタムのパースルール の使用を避けるために、ログを JSON 形式で出力するようにロギングライブラリをセットアップすることを強くお勧めします。

filelog レシーバーの構成

operators を使用して 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: ポーリング頻度を設定
  • Operators:
    • json_parser: JSON ログを解析します。デフォルトでは、filelog レシーバーは各ログ行をログレコードに変換します。これはログの データモデルbody です。次に、json_parser は JSON ボディをデータモデルの属性に変換します。
    • trace_parser: Datadog でログとトレースを相関させるために、ログから trace_idspan_id を抽出します。

OTel の service.name 属性をログの service にマップし直す

Datadog エクスポーターのバージョン 0.83.0 以降、OTel ログの service フィールドは OTel のセマンティック規約 である service.name に基づいて設定されます。ただし、service.name は Datadog のログ前処理におけるデフォルトの サービス属性 の 1 つではありません。

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

AWS EKS Fargate は、現時点では OpenTelemetry Collector をサポートする環境ではありません。EKS Fargate にコレクターをデプロイすると、インフラストラクチャー ホストの請求が不正確になります。

Kubernetes インフラストラクチャーに OpenTelemetry Collector と Datadog Exporter をデプロイする方法はいくつかあります。filelog レシーバーが機能するためには、Agent/DaemonSet としてデプロイする 方法が推奨されます。

コンテナ化された環境では、アプリケーションはログを stdout または stderr に書き込みます。Kubernetes はログを収集し、標準の場所に書き込みます。filelog レシーバーのために、ホストノードの場所をコレクターにマウントする必要があります。以下は、ログを送信するために必要なマウント設定を追加した 拡張例 です。

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
            # The k8s.pod.ip is used to associate pods for k8sattributes
            - name: OTEL_RESOURCE_ATTRIBUTES
              value: "k8s.pod.ip=$(POD_IP)"
          ports:
            - containerPort: 4318 # default port for OpenTelemetry HTTP receiver.
              hostPort: 4318
            - containerPort: 4317 # default port for OpenTelemetry gRPC receiver.
              hostPort: 4317
            - containerPort: 8888 # Default endpoint for querying metrics.
          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
        # Mount nodes log file location.
        - name: varlogpods
          hostPath:
            path: /var/log/pods
        - name: varlibdockercontainers
          hostPath:
            path: /var/lib/docker/containers

すぐに使える Datadog エクスポーターの構成

OpenTelemetry Collector の Contrib プロジェクトの exporter/datadogexporter/examples フォルダー に、Datadog エクスポーターのすぐに使える構成の実例があります。完全な構成例のファイル ootb-ec2.yaml を参照してください。: この例は、EC2 ホスト上で直接実行されるアプリケーション用です。コンテナ化されたアプリケーションについては、デプロイメントのドキュメント を参照してください。

以下の各コンポーネントをニーズに合わせて構成してください。


Fleet Automation でコレクター設定を検証する

Datadog 拡張機能を有効にして、Fleet Automation で OpenTelemetry Collector 構成を検査およびトラブルシューティングします。

参考資料