はじめに
Datadog はクラウドのサーバー監視・分析ができるツールで、インフラからアプリケーションレイヤーまでのログやメトリクスを収集しリアルタイムで可視化・分析できる便利なサービスです。
Datadog にメトリクスを取り込むため、外部エンドポイントからメトリクスを取得しようとしたことありませんか?
本記事では Kubernetes 上で動作する Datadog Agent を使って、外部の OpenMetrics/Prometheus エンドポイントからメトリクスを取得しようとした際にハマったポイントを共有していきたいと思います。
やろうとしていたこと
外部サービスが提供する Prometheus 互換のメトリクスエンドポイントから、Datadog Agent の OpenMetrics Integration を使ってメトリクスを収集したいと考えていました。
# 想定していた設定
openmetrics_endpoint: https://api.example.com/v1/prometheus
外部エンドポイントを叩く時に発生した問題
Kubernetes 環境で外部エンドポイントからメトリクスを取得する場合、cluster_check: trueと設定する必要があります。
cluster_check: falseにした場合、以下の問題が発生するためです。
- 全ノードの Agent が同時に同じ外部エンドポイントにアクセスしてしまう
- 重複したメトリクスが送信される
- 外部 API のレートリミットに引っかかる可能性がある
これを避けるために cluster_check: true を設定するわけですが、ここに落とし穴がありました。
発生したエラー
cluster_check: true にしたものの、以下のようなエラーが出ていました。
No available node to dispatch openmetrics:xxxxxxxxxxxxxxxx on, will retry later
agent status で確認しても、メトリクスは取得されていませんでした。
Instance ID: openmetrics:example:xxxxxxxxxxxxxxxx [OK]
Configuration Source: file:/etc/datadog-agent/conf.d/openmetrics.yaml
Total Runs: 4
Metric Samples: Last Run: 0, Total: 0 # ← 0 のまま
Events: Last Run: 0, Total: 0
Service Checks: Last Run: 1, Total: 4
ステータスは [OK] と表示されているのに、Metric Samples が 0 のまま......。
解決策
Datadog Agent の Helm Chart で clusterChecksRunner を有効にすることで解決しました。
datadog:
clusterChecks:
enabled: true
clusterChecksRunner:
enabled: true # これを有効にする
replicas: 2
Cluster Checks Runner は、外部エンドポイントへの check を実行する Pod です。これを有効にすることで:
- Cluster Agent が check のスケジューリングを管理
- Cluster Checks Runner が実際に check を実行
- 重複なくメトリクスを収集できる
という構成が実現できます。
まとめ
- 外部エンドポイントを叩く場合は
cluster_check: trueにして、重複アクセスを防ぐ -
cluster_check: trueを使う場合は、Cluster Checks Runner を有効にしないと check が実行されない
同じようなところでハマっている方の参考になれば幸いです。
