Datadogを使ってKubernetesリソースから効率よくメトリクスを取得する
はじめに
マイクロサービスアーキテクチャを採用するシステムにおいて、各サービスの健全性や性能をモニタリングすることは非常に重要です。特にGoで書かれたアプリケーションのgoroutine数やメモリ使用量などのメトリクスを効率的に収集することは、システムの安定性を保つために欠かせません。
直近の業務でこれらメトリクスを使用しないと原因を突き止められないバグに遭遇したので、未来の自分のためにもKubernetes環境でDatadogを利用してGoアプリケーションのメトリクスを収集する方法と、その背後にある仕組みについて軽くまとめておきます。
Datadogによるメトリクス収集の仕組み
Datadogは、Kubernetesクラスタ内で実行されているアプリケーションからメトリクスを収集するためにオートディスカバリー機能を提供しています。この機能は、クラスタ内のポッドを自動的に検出し、設定されたアノテーションに基づいてメトリクスの収集を行います。
オートディスカバリーの仕組み
Datadogエージェントは、Kubernetesクラスタ内で動作し、ポッドのアノテーションを監視します。特定のアノテーションが付与されたポッドを見つけると、そのポッドが公開しているエンドポイントからメトリクスを収集します。これにより、新しいサービスが追加されても自動的にモニタリングの対象となります。
Goアプリケーションからメトリクスを収集する方法
GoアプリケーションはExpvar機能を通じて、goroutine数、メモリ使用量、GC統計などの内部メトリクスを公開できます。Datadogは、Go Expvarインテグレーションを使ってこれらのメトリクスを収集します。自分の勤務先では専用のライブラリを利用してメトリクスを公開していますが、一般的にはexpvarを使用することになるでしょう。公式の実装方法ブログ
Kubernetes環境での実装手順
1. メトリクスエンドポイントの公開
まず、Goアプリケーション内でメトリクスを公開するエンドポイントを設定します。
import (
"net/http"
_ "expvar" // expvarをインポートすることで/debug/varsエンドポイントが自動的に公開される
)
func main() {
// アプリケーションの設定...
// メトリクスエンドポイントの提供
http.ListenAndServe(":8080", nil)
}
2. Kubernetesマニフェストにアノテーションを追加
次に、ポッドがDatadogエージェントによって検出されるように、適切なアノテーションを追加します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-go-app
spec:
template:
metadata:
annotations:
ad.datadoghq.com/my-go-app.check_names: '["go_expvar"]'
ad.datadoghq.com/my-go-app.init_configs: '[{}]'
ad.datadoghq.com/my-go-app.instances: '[{"expvar_url": "http://%%host%%:8080/debug/vars", "tags": ["service:my-go-app"]}]'
spec:
containers:
- name: my-go-app
image: my-go-app:latest
ports:
- containerPort: 8080
3. 認証が必要なエンドポイントの場合
セキュリティ要件により、メトリクスエンドポイントに認証が必要な場合は、以下のようにアノテーションを追加します。
ad.datadoghq.com/my-go-app.instances: '[{"expvar_url": "http://%%host%%:8080/debug/vars", "tags": ["service:my-go-app"], "username": "datadog", "password": "%%env_DATADOG_PASSWORD%%"}]'
上記の例では、環境変数 DATADOG_PASSWORD から認証情報を取得しています。
メトリクス収集の原理を深掘り
Datadogエージェントの動作
Datadogエージェントは、ポッドのアノテーションを定期的にスキャンします。設定されたインターバルで、指定されたエンドポイントにHTTPリクエストを送信し、JSON形式で返されるメトリクスデータを収集します。
メトリクスデータの流れ
収集されたメトリクスは、Datadogエージェントによって処理され、Datadog APIを通じてDatadogのバックエンドに送信されます。そこでデータは保存され、ダッシュボードやアラートなどの機能を通じて可視化・活用できるようになります。
パフォーマンスへの影響と最適化
メトリクス収集はアプリケーションのパフォーマンスに影響を与える可能性があります。以下のポイントに注意することで、その影響を最小限に抑えることができます:
- 収集頻度は必要最小限に設定する(デフォルトは15秒間隔)
- 返却するメトリクスは本当に必要なものに絞る
- 高負荷時にメトリクス収集が問題を引き起こさないよう、タイムアウト設定を適切に行う
トラブルシューティング
メトリクスが正しく収集されない場合のトラブルシューティング手順:
- Datadogエージェントのログを確認する(エラーメッセージなどが記録されていないか)
- アノテーションの構文が正しいか確認する(特にJSON形式の部分)
- エンドポイントに手動でアクセスし、メトリクスが正しく返されるか確認する
- ネットワークポリシーがDatadogエージェントからのアクセスを許可しているか確認する
まとめ
KubernetesとDatadogを組み合わせることで、Goアプリケーションのメトリクスを効率的に収集・監視できますし、オートディスカバリー機能を活用することで、新しいサービスの追加時にも設定を最小限に抑えられます。Dadadogさまさまです🙏
Discussion