Agent における OTLP 取り込みは、OpenTelemetry SDK でインスツルメントされたアプリケーションから Datadog Agent へテレメトリデータを直接送信する方法です。バージョン 6.32.0 および 7.32.0 以降、Datadog Agent は gRPC または HTTP 経由で OTLP トレースと OTLP メトリクス を取り込めます。バージョン 6.48.0 および 7.48.0 以降、Datadog Agent は gRPC または HTTP 経由で OTLP ログを取り込めます。

Agent における OTLP 取り込みにより、Datadog Agent の各種可観測性機能を利用できます。OpenTelemetry SDK でインスツルメントされたアプリケーションのデータは、App and API Protection、Continuous Profiler、Ingestion Rules といった Datadog 独自製品では使用できない場合があります。OpenTelemetry ランタイムメトリクスは、一部の言語でサポートされています

図: OpenTelemetry SDK が Datadog エクスポーターを使用しているコレクターに OTLP プロトコルを介してデータを送信し、このコレクターが Datadog のプラットフォームにデータを転送します。
このセットアップでサポートされる Datadog 機能については、OTel to Datadog Agent (OTLP) にある機能互換性表を参照してください。

初期セットアップ

開始するには、まず OpenTelemetry SDK で アプリケーションをインスツルメント します。次に、テレメトリデータを OTLP 形式で Datadog Agent にエクスポートします。構成手順は、以下のページで説明するように、サービスがデプロイされているインフラストラクチャーの種類によって異なります。最新の OTLP バージョンとの互換性を目指していますが、Agent における OTLP 取り込みがすべての OTLP バージョンに対応しているわけではありません。Datadog Agent と互換性のある OTLP バージョンは、OpenTelemetry コレクターの OTLP レシーバーでもサポートされているバージョンと同じです。サポートされている正確なバージョンを確認するには、Agent の go.mod ファイルで go.opentelemetry.io/collector バージョンを確認してください。

インスツルメンテーションの送信先として Agent を指定する方法は、OpenTelemetry のインスツルメンテーションドキュメントを参照してください。以下に記載する receiver セクションは、OpenTelemetry コレクター OTLP レシーバー構成スキーマ に準拠します。

サポートされるセットアップ方法は、OpenTelemetry データを生成する各ホストに取り込み用 Agent をデプロイするものです。1 つのホストで動作するコレクターやインスツルメント済みアプリから、別ホストの Agent に OpenTelemetry テレメトリを送信することはできません。ただし、Agent がコレクターまたは SDK インスツルメント済みアプリに対してローカルである場合は、複数のパイプラインを設定できます。

Datadog Agent で OTLP 取り込みを有効にする

OTLP 取り込みはデフォルトで無効です。datadog.yaml ファイルの構成を更新するか、環境変数を設定して有効化できます。以下の datadog.yaml の構成は、デフォルトポートでエンドポイントを有効にします。有効にすると、メトリクスとトレースの取り込みがデフォルトで有効になります。ログの取り込みは、予定外のログへの課金を防ぐためにデフォルトで無効になっています。

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.

gRPC の場合、デフォルトは 4317 番ポートです。

otlp_config:
  receiver:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
  logs:
    enabled: false

HTTP の場合、デフォルトは 4318 番ポートです。

otlp_config:
  receiver:
    protocols:
      http:
        endpoint: 0.0.0.0:4318
  logs:
    enabled: false

または、環境変数でポートを指定して、エンドポイントを構成します。

  • gRPC の場合 (localhost:4317): DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT
  • HTTP の場合 (localhost:4318): DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT

これらは、コア Agent とトレース Agent の両方のプロセスに渡す必要があります。コンテナ化された環境で実行している場合は、ローカル以外のインターフェイスでもサーバーを使用できるよう、localhost の代わりに 0.0.0.0 を使用してください。

この機能には、gRPC または HTTP のいずれかを構成してください。こちらに 両方の構成を示すアプリケーション例 があります。

  1. Datadog Docker Agent のセットアップ に従います。

  2. Datadog Agent コンテナでは、以下のエンドポイント環境変数を設定し、対応するポートを公開します。

    • gRPC の場合: DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT0.0.0.0:4317 に設定し、ポート 4317 を公開します。
    • HTTP の場合: DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT0.0.0.0:4318 に設定し、ポート 4318 を公開します。
既知の問題: Agent バージョン 7.61.0 以降、Docker 環境では、OTLP 取り込みパイプラインが次のエラーを出して起動に失敗することがあります。Error running the OTLP ingest pipeline: failed to register process metrics: process does not exist

影響を受けるバージョンを使用している場合は、次のいずれかの回避策を使用できます。

1. Agent Docker コンテナで、環境変数 HOST_PROC/proc に設定します。
2. Agent Docker コンテナで、 /proc/:/host/proc/:ro から volumes を削除します。
3. Agent Docker コンテナで、 pidhost に設定します。

これらの構成は、 docker コマンドまたは Docker Compose ファイルのいずれかを使用して適用できます。
  1. 基本インストール用の Kubernetes Agent のセットアップ に従います。

  2. Operator の datadog-agent.yaml マニフェストで gRPC または HTTP のうち、使用するプロトコルを有効にします。

    gRPC の場合:

    apiVersion: datadoghq.com/v2alpha1
    kind: DatadogAgent
    metadata:
      name: datadog
    spec:
      # (...)
      features:
        otlp:
          receiver:
            protocols:
              grpc:
                enabled: true
    

    For HTTP:

    apiVersion: datadoghq.com/v2alpha1
    kind: DatadogAgent
    metadata:
      name: datadog
    spec:
      # (...)
      features:
        otlp:
          receiver:
            protocols:
              http:
                enabled: true
    

After making your changes, apply the new configuration by using the following command:

kubectl apply -n $DD_NAMESPACE -f datadog-agent.yaml

これは、各プロトコルをデフォルトのポート (OTLP/gRPC は 4317、OTLP/HTTP は 4318) で有効にするものです。メトリクスとトレースはデフォルトで有効になっています。

  1. 基本インストール用の Kubernetes Agent のセットアップ に従います。

  2. Helm の datadog-values.yaml ファイルで gRPC または HTTP のうち、使用するプロトコルを有効にします。

    gRPC の場合:

    datadog:
      # (...)
      otlp:
        receiver:
          protocols:
            grpc:
              enabled: true
    

    For HTTP:

    datadog:
      # (...)
      otlp:
        receiver:
          protocols:
            http:
              enabled: true
    

After making your changes, upgrade your Datadog Helm chart using the following command:

helm upgrade -f datadog-values.yaml <RELEASE NAME> datadog/datadog

これは、各プロトコルをデフォルトのポート (OTLP/gRPC は 4317、OTLP/HTTP は 4318) で有効にするものです。メトリクスとトレースはデフォルトで有効になっています。

  1. 基本インストール用の Kubernetes の手動インストールガイド に従います。

  2. trace-agent コンテナとコア agent コンテナの両方で、以下の環境変数を構成します。

    gRPC の場合:

    name: DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT # enables gRPC receiver on port 4317
    value: "0.0.0.0:4317"
    

    For HTTP:

    name: DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT # enables HTTP receiver on port 4318
    value: "0.0.0.0:4318"
    
  3. コンテナポート 4317 または 4318 をコア agent コンテナのホストポートにマッピングします。

    gRPC の場合:

    ports:
      - containerPort: 4317
        hostPort: 4317
        name: traceportgrpc
        protocol: TCP
    

    For HTTP

    ports:
      - containerPort: 4318
        hostPort: 4318
        name: traceporthttp
        protocol: TCP
    

AWS Lambda と Datadog で OpenTelemetry を使用するための詳細な手順は、次のとおりです。

  • OpenTelemetry を使用して Lambda 関数をインスツルメントする
  • Datadog SDK 内での OpenTelemetry API サポートを使用する
  • OpenTelemetry トレースを Datadog Lambda Extension に送信する

詳細は、Serverless ドキュメントの AWS Lambda および OpenTelemetry を参照してください。

OTLP ログの取り込みを有効にする

OTLP ログの取り込みは、予定外の課金を防ぐためにデフォルトで無効になっています。これを有効にするには、ログ収集と OTLP ログの取り込みの両方を明示的に有効にする必要があります。

  1. ホスト Agent のログ収集のセットアップ に従って、ログ収集を有効にします。

    logs_enabled: true
    
  2. otlp_config.logs.enabledを true に設定します。

    otlp_config:
      logs:
        enabled: true
    

Datadog Agent コンテナで次の環境変数を設定します。

  • DD_LOGS_ENABLED=true
  • DD_OTLP_CONFIG_LOGS_ENABLED=true

datadog-agent.yaml ファイルで、次のように設定します。

spec:
  # (...)
  features:
    otlp:
      #(... enable gRPC or HTTP ingestion...)
    logCollection:
      enabled: true
  override:
    nodeAgent:
      containers:
        agent:
          env:
            - name: DD_OTLP_CONFIG_LOGS_ENABLED
              value: "true"

After making your changes, apply the new configuration by using the following command:

kubectl apply -n $DD_NAMESPACE -f datadog-agent.yaml

datadog-values.yaml ファイルで、次のように設定します。

datadog:
  # (...)
  otlp:
    #(... enable gRPC or HTTP ingestion...)
    logs:
      enabled: true
  logs:
    enabled: true

After making your changes, upgrade your Datadog Helm chart using the following command:

helm upgrade -f datadog-values.yaml <RELEASE NAME> datadog/datadog

コア Agent コンテナで次の環境変数を設定します。

- name: DD_LOGS_ENABLED
  value: "true"
- name: DD_OTLP_CONFIG_LOGS_ENABLED
  value: "true"

詳細は、DaemonSet によるログの収集 を参照してください。

Datadog Agent では、ほかにも多くの環境変数と設定がサポートされています。それらすべての概要については、構成テンプレート を参照してください。

OpenTelemetry のトレース、メトリクス、ログを Datadog Agent に送信する

Datadog Agent で OTLP 取り込みを有効にしたら、テレメトリデータを Agent の OTLP エンドポイントにエクスポートするように OpenTelemetry でインスツルメントされたアプリケーションを構成します。Agent にデータを転送するように、ご使用のアプリケーション環境で OTEL_EXPORTER_OTLP_ENDPOINT 環境変数を設定します。このように設定されていない場合、Agent の OTLP レシーバーが有効になっていても、アプリケーションから Agent にテレメトリデータが送信されません。

ご使用のアプリケーションの環境で OTEL_EXPORTER_OTLP_ENDPOINT 環境変数を設定します。

gRPC の場合:

export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4317"

HTTP の場合:

export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4318"
  1. アプリケーションコンテナで、Datadog Agent コンテナを指すように環境変数 OTEL_EXPORTER_OTLP_ENDPOINT を設定します。たとえば、次のようにします。

    OTEL_EXPORTER_OTLP_ENDPOINT=http://<datadog-agent>:4318
    
  2. 両方のコンテナは同じブリッジネットワーク内に定義されている必要があります。これは、Docker Compose を使用している場合は自動的に処理されます。そうでない場合は、Docker アプリケーションのトレース の Docker の例に従って、ブリッジネットワークに適切なポートを設定してください。

アプリケーションのデプロイメントファイルで、環境変数 OTEL_EXPORTER_OTLP_ENDPOINT を使用して OpenTelemetry クライアントがトレースを送信するエンドポイントを構成します。

gRPC の場合:

env:
 - name: HOST_IP
   valueFrom:
     fieldRef:
       fieldPath: status.hostIP
 - name: OTEL_EXPORTER_OTLP_ENDPOINT
   value: "http://$(HOST_IP):4317" # sends to gRPC receiver on port 4317

HTTP の場合:

env:
 - name: HOST_IP
   valueFrom:
     fieldRef:
       fieldPath: status.hostIP
 - name: OTEL_EXPORTER_OTLP_ENDPOINT
   value: "http://$(HOST_IP):4318" # sends to HTTP receiver on port 4318

: Custom Metrics のコンテナタグを充実させるには、OTLP メトリクスを生成するアプリケーションコード内で適切なリソース属性を設定します。たとえば、container.id リソース属性に Pod の UID を設定します。

トレースの送信先エンドポイントを構成する際は、ご使用の OTLP ライブラリに必要となる、正しいパスを使用してください。ライブラリによっては、トレースの送信先として /v1/traces パスを指定する必要があるものもあれば、ルートパス /に変更します。

参考資料