プロキシ配下からDatadogにPrometheusのデータを送信する


やりたいこと

ローカルのPrometheusのデータをDatadogに送信させたい。

状況設定

下記の状況を想定して実施する。
- DataDogに接続するためには、プロキシを経由する必要がある。
- 送信先のDataDogアカウントは、複数のインフラチームが利用しており、余計なメトリクス等の送信は控える。
- Dockerコンテナ環境で実施する。
- Prometheusはプライベート証明書によるHTTPS接続になる。

Prometheus Integration

DataDogとPrometheusのIntegration1の手順を説明する。

Integrationをインストール

[Integrations] → [Integrations] → [Prometheus] → [Install] の順でDatadog上でPrometheus連携を有効化する。

DataDog API Keyの取得

[Integrations] → [APIs] → [API Keys] → [New API Key] の順で、新規にDataDog API Keyを発行する。

DataDog Agentのインストール

docker-composeを利用してインストールする。

docker-compose.yml
version: '3.3'
services:
    agent:
        image: 'datadog/agent:7'
        container_name: dd-agent
        restart: always
        volumes:
            - '/var/run/docker.sock:/var/run/docker.sock:ro'
            # 余計なメトリクスを送信しないように、デフォルトのvolumeオプションをコメントアウトした
            # - '/proc/:/host/proc/:ro'
            # - '/sys/fs/cgroup/:/host/sys/fs/cgroup:ro'
            - './prometheus.d:/etc/datadog-agent/conf.d/prometheus.d' # Prometheus連携用設定ファイルをホストからマウントさせる
        environment:
            - DD_API_KEY=$DD_API_KEY
            - DD_SITE=$DD_SITE
            - DD_HOSTNAME=$DD_HOSTNAME # デフォルトではDataDog agentが自動で設定するが、docker版agentの場合はOSのhostnameが取得できない可能性があるため、手動で設定した
            - DD_PROXY_HTTP=$DD_PROXY_HTTP
            - DD_PROXY_HTTPS=$DD_PROXY_HTTPS
            - DD_PROXY_NO_PROXY=$DD_PROXY_NO_PROXY
.env
DD_API_KEY=YOUR_DD_API_KEY
DD_SITE=datadoghq.com
DD_HOSTNAME=YOUR_DD_HOST_NAME
DD_PROXY_HTTP=YOUR_PROXY_URL
DD_PROXY_HTTPS=YOUR_PROXY_URL
DD_PROXY_NO_PROXY="localhost,127.0.0.1,YOUR_PROMETHEUS_FQDN" # Prometheusに接続する場合はプロキシを経由する必要がないため、NO_PROXYに設定した

DataDog agentのPrometheus連携設定2は下記のように設定した。
namespaceはDataDog上のメトリクス名のプレフィックスで使用される。チーム固有の自明なnamespaceを設定するといいと思う。
取得できるメトリクス数の上限はデフォルトで2000に限定されているため、必要に応じてmax_returned_metricsを設定し、上限を調整する。
取得したメトリクスは全て使用する場合はmetrics*に設定する。

./prometheus.d/conf.yaml
init_config:

instances:
  - prometheus_url: 'https://YOUR_PROMETHEUS_FQDN/federate?match[]=%7Bjob%3D~%22.%2B%22%7D'
    namespace: 'YOUR_NAMESPACE'
    metrics:
      - '*'
    ssl_ca_cert: false # プライベート証明書のため、SSL検証を無効化する。本来であれば、プライベート証明書を発行したCAのルート証明書を指定することが望ましい。
    max_returned_metrics: 20000

prometheus_urlについて補足します。
DataDogにPrometheusのメトリクスデータを送信する際、DataDog agentはPrometheusのFederation3エンドポイントを利用します。
このFederationエンドポイントは、取得したいPrometheusのメトリクスのラベルを、クエリパラメータで指定します。PromQLを利用するため、正規表現が使用できます。クエリパラメータで渡すため、URLエンコーディングでエンコードした値を使用する必要があります4

エンコード前 エンコード後
{job=~".+"} %7Bjob%3D~%22.%2B%22%7D

DataDog Agentの起動

agentを起動させる。

docker-compose up -d

DataDog上で確認

[Metrics] → [Summary]から検索メニューでYOUR_NAMESPACEで検索してみると、DataDogにカスタムメトリクスとしてPrometheusのデータが送信されていることがわかる。

不明点

カスタムメトリクスの料金5についてちょっと調べてみた。
カスタムメトリクスは、Pro Plan($15/1host*month)では 100metrics/1host というサービス上限が存在する。今回は、DataDogの無料トライアルを利用し、1hostのみ使用した。ドキュメントの通り読むと、カスタムメトリクスは100metricsが最大なのだが、上記のキャプチャーをみると、メトリクス数が1046 となっている…。
これはどういうことだろう…。
無料トライアルだと青天井なのかな…?

参考資料

参考になったサイト。
- prometheusのmetricsをdatadogに送る
- Agent 環境変数


  1. DataDog Prometheus このインテグレーションによって取得されたメトリクスはすべて、カスタムメトリクスと見なされます。 

  2. GitHub DataDog Agent Prometheus Configuration Example 

  3. Prometheus Federation 

  4. Federated Prometheus URLs aren't working #6091 

  5. カスタムメトリクスの課金