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

# やりたいこと
ローカルのPrometheusのデータをDatadogに送信させたい。

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

# Prometheus Integration
DataDogとPrometheusのIntegration[^1]の手順を説明する。

## Integrationをインストール
[Integrations] → [Integrations] → [Prometheus] → [Install] の順でDatadog上でPrometheus連携を有効化する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266454/a47f71f0-0ebe-e56d-5d61-7b41801e81e9.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266454/f0fc582d-7bb2-d73e-cfbc-1ed0a98dd0a7.png)


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

```yml: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
```

```ini:.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連携設定[^3]は下記のように設定した。
`namespace`はDataDog上のメトリクス名のプレフィックスで使用される。チーム固有の自明な`namespace`を設定するといいと思う。
取得できるメトリクス数の上限はデフォルトで2000に限定されているため、必要に応じて`max_returned_metrics`を設定し、上限を調整する。
取得したメトリクスは全て使用する場合は`metrics`を`*`に設定する。


```yaml:./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のFederation[^2]エンドポイントを利用します。
このFederationエンドポイントは、取得したいPrometheusのメトリクスのラベルを、クエリパラメータで指定します。PromQLを利用するため、正規表現が使用できます。クエリパラメータで渡すため、URLエンコーディングでエンコードした値を使用する必要があります[^4]。

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

---

## DataDog Agentの起動
agentを起動させる。

```bash
docker-compose up -d
```

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266454/368ed670-0c50-c62e-3bb4-de48302fb828.png)

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

# 参考資料
参考になったサイト。
- [prometheusのmetricsをdatadogに送る](https://cross-black777.hatenablog.com/entry/2019/10/23/185212)
- [Agent 環境変数](https://docs.datadoghq.com/ja/agent/guide/environment-variables/)


[^1]: [DataDog Prometheus](https://docs.datadoghq.com/ja/integrations/prometheus/) `このインテグレーションによって取得されたメトリクスはすべて、カスタムメトリクスと見なされます。`

[^2]: [Prometheus Federation](https://prometheus.io/docs/prometheus/latest/federation/)

[^3]: [GitHub DataDog Agent Prometheus Configuration Example](https://github.com/DataDog/integrations-core/blob/master/prometheus/datadog_checks/prometheus/data/conf.yaml.example)

[^4]: [Federated Prometheus URLs aren't working #6091](https://github.com/DataDog/integrations-core/issues/6091#issuecomment-644077189)

[^5]: [カスタムメトリクスの課金](https://docs.datadoghq.com/ja/account_management/billing/custom_metrics/?tab=countrategauge)