はじめに
Datadog はサーバー、アプリケーション、セキュリティ、システム構成などさまざまな状態を可視化できる監視モニタリング基盤(プラットフォーム)です。
その中でも「カスタムメトリクス」は、Datadog標準メトリクスでは収集できない独自の数値, 時系列データ, をダッシュボードで可視化できる仕組みです。
この記事では、Datadogユーザー会 JDDUG のオンライン勉強会 で学習した「Datadogでカスタムメトリクスを取得する代表的な3つの方式」を図解で解説します。
- DogStatsD
- Agent Check
- HTTP API
なお、単数の場合[メトリック]、複数の場合[メトリクス]と書きます。
1. カスタムメトリクスとは?
Datadog が標準で収集するメトリクス「CPU, メモリ, ネットワークなど」に加えて、独自の数値をDatadogダッシュボードに送信して、ダッシュボードにグラフなどで分かりやすく可視化できる仕組みです。
例:
- アプリケーション内部の実行回数
- バッチ処理の成功数
- 独自のビジネス指標(注文数など)
😅 こんな使い方する人はいないだろうけれど、過去に「図解で、うちのワンコ🐶を真夏の暑さから守る(Datadogで)」という記事を書きました。酷暑の日に万が一、エアコンが故障したら室内でも熱中症になるくらい暑くなります。そんなときにアラート通知が届くソリューション: ラズパイに接続した温度センサーによる室温監視 なんてこともできちゃいます。
2. Datadog カスタムメトリクス
用途によって6つのいずれかの方式を選定します。この記事では #1 ~ #3 まで計装します。
| # | 用途 | 推奨方法 | 理由 |
|---|---|---|---|
| 1 | アプリから送信 | DogStatsD | コードに計装 |
| 2 | サーバーの状態監視 | Agent Check | Agentが直接収集 |
| 3 | サーバレス環境 | HTTP API | Agent不要 |
| 4 | ログを分析 | Logs pipeline | コーディング不要 |
| 5 | アプリの性能 | APM | 自動抽出 |
| 6 | WEBのKPI | RUM | ユーザー行動を可視化したいとき |
3. 今回のインフラ構成
パブリックIPアドレスを持つ仮想サーバー1台に Datadog Agent をインストールします。KAGOYAのVPS(仮想サーバー)は月額770円ととてもリーズナブル。
4. Datadog Agent インストール
カスタムメトリクスを収集するには Agentあり/なし を選べますが、方式1 DogStatsD では Agent が必要なので、ここでインストールしておきます。
インストール先のOSを選び、インストールコマンドを取得します。インストール手順はこちら。
ドキュメント Agent がサーバーに与える影響は、よく質問を受けるので目を通しておいた方がよいです。
Agent 操作コマンド
LinuxでAgentの再起動や動作状態を確認するには下記のコマンドを使います。ドキュメントはこちら
Ubuntuの場合
| 操作 | コマンド |
|---|---|
| Agent 起動 | sudo systemctl start datadog-agent |
| Agent 停止 | sudo systemctl stop datadog-agent |
| Agent 再起動 | sudo systemctl restart datadog-agent |
| Agent サービスの状態確認 | sudo systemctl status datadog-agent |
| Agent の有効なcheck確認 | sudo datadog-agent status |
| サポート用フレアを送信する | sudo datadog-agent flare |
| ヘルプ | sudo datadog-agent --help |
| check毎に確認する | sudo datadog-agent check |
5. 標準メトリクス
Agent をインストールするだけで観測できるメトリック
- CPU
- メモリ
- ディスク
- NIC送受信
- ロードアベレージ
コンフィグに追加するだけで観測できるメトリック
- ログ収集
- プロセスのリソース(CPU / メモリ など)
- ポートの有効性
6. カスタムメトリクスの設定
方式1:DogStatsD(アプリのメトリクス収集)
図解(しくみ)
アプリケーション → Agent → ダッシュボード
- アプリケーションが UDP/TCP 8125 ポートへメトリクス送信
- Agent 8125 ポートで受信・集約して Datadog インテークサーバーへ送信
計装手順(Python例)
1. Datadogライブラリをインストール
pip install datadog
2. アプリに組み込む DogStatsD へ送信するコード
- options にはAgentのホストとポート番号を指定
- statsd.gauge(name, value, tags=[]) 内に、自由に命名したメトリクス名、現在値、タグを渡す
from datadog import initialize, statsd
import random
import time
options = { 'statsd_host':'127.0.0.1', 'statsd_port':8125 }
initialize(**options)
while True:
value = random.randint(1, 100)
statsd.gauge('jddug.metric-dogstatsd.value', value, tags=["env:dev"])
time.sleep(5)
その他 statsd の関数
| 関数 | 機能 |
|---|---|
| statsd.gauge(name, value, tags=[]) | 自由に命名したメトリクス名、現在値、タグを渡す |
| statsd.count(name, value, tags=[]) | エラー回数, リクエスト数などカウントを送る |
| statsd.histogram(name, value, tags=[]) | レスポンスタイムやサイズなど分布統計 |
| statsd.distribution(name, value, tags=[]) | 複数ホストにまたがるレイテンシーなど分布メトリクス |
| statsd.set(name, value, tags=[]) | ユーザ数、IP数などユニーク値を送る |
| statsd.service_check(name, value, tags=[]) | 外形監視などサービス状態[OK |
| statsd.event(EventObject) | 障害通知などカスタムイベントを送る |
3. Agent の設定
Datadog Agent のコンフィグで、dogstatsd を有効化します
dogstatsd_metrics_stats_enable: true
ダッシュボード例
Metrics > Explorer
メトリクス欄に、カスタムメトリクス名を入れて値が表示されることを検査します。表示できるようになるまで60秒以上かかります。
DogStatsD できること / できないこと
できること
- 高頻度メトリクスの送信
- タグを柔軟に付与
- アプリケーション内部の状態を可視化
できないこと
- Agent がない環境では使えない
- UDP ロスの可能性
方式2: Agent Check(Agent によるメトリクス収集)
図解(しくみ)
Agent → ダッシュボード
- Agent が Python スクリプトを定期実行
- サーバー内部の状態を直接収集
計装手順
Linux の場合は下記フォルダのコンフィグとチェックの2つのファイルを用意します。
コンフィグはディレクトリ内にテンプレートがあるので複製して拡張子を.yamlに変更しておき、Agentを再起動すると.yamlファイルが読み込まれて、チェックが有効になります。
チェックはpythonで記述された検査プログラムであり、コンフィグと同名の.pyファイルが起動されます。標準チェックの場合は、チェックファイルが不要ですが、カスタムチェックの場合は検査プログラムを記述します。
下記に、カスタム Agent Check のサンプルを紹介します。ファイル名は重複しない自由なファイル名を記述できます。ここでは<kano.yaml>と<kano.py>を設置してみます。
1. コンフィグ配置
最小限のコンフィグは、Check検査プログラムを実行する間隔 interval を指定します。下記は15秒置きに実行するものです。
init_config:
instances:
- min_collection_interval: 15
2. Python スクリプト配置
Check 検査プログラムを記述します。カスタムメトリクス名 kano.metric-check に1から100までの乱数をゲージ値として送信するコードです。
from datadog_checks.base import AgentCheck
import random
class KanoCheck(AgentCheck):
def check(self, instance):
value = random.randint(1, 100)
self.gauge("kano.metric-check", value)
3. Agent 再起動
Agentを再起動して、コンフィグを読み込ませます。成功したら15秒置きに kano.py が実行されます。
sudo systemctl restart datadog-agent
ダッシュボード例
Metrics > Explorer
メトリクス欄に、カスタムメトリクス名を入れて値が表示されることを検査します。
Datadog Agent Check できること / できないこと
できること
- サーバー内部(OSやミドルウェア)の独自メトリクスを収集
- Python コードで自由にロジックを記述できる。値さえあればメトリクス化が可能
- 独自メトリクスでも Agent の標準メトリクスと同じ手法で実行するため安定
できないこと
- Free プランではカスタムメトリクスは使えない
- やらないほうがいいこと:毎回異なる値のタグ付け(ユーザーIDやIPアドレスなど)は課金が増加する
方式3:Datadog HTTP API(Agent レスによるメトリクス収集)
図解(しくみ)
- HTTPメソッド(POST)でメトリクス送信
- AWS Lambda など外部サービスから使いやすい
計装手順
Bash コマンドライン例
下記は curl での送信サンプル。Datadog API に POST メソッドで直接、メトリクスを送信できます。
この例では、カスタムメトリクス kano.metric-api.value に値 44 を送信します。
Agent不要なので、HTTPメソッドをアプリのコードに組み込むだけで使えます。
curl -X POST \
-H "Content-Type: application/json" \
-H "DD-API-KEY: <YOUR_API_KEY>" \
-d '{
"series": [{
"metric": "kano.metric-api.value",
"points": [[ '"$(date +%s)"', 44 ]]
}]
}' \
"https://api.datadoghq.com/api/v1/series"
APIキー
APIキーはDatadogダッシュボードで作成・取得します。
ダッシュボード例
下図ではカスタムメトリクス jddug.metric_api.value を作って、時系列で値 44 を取得しています。
Datadog HTTP API できること / できないこと
できること
- サーバレス(Agent がない環境)でメトリクス送信
- AWS Lambda / Azure Functions / など、外部サービスから直接送信
- API Key があれば、どこからでも送信可能
できないこと
- Agent や DogStatsD は、時間毎の集計, Rate / Count などできるが HTTP API ではやらない
- タグ(host, env など)は自動付与されない。必要なら自分で tags に host:<ホスト名> などを追加する
- Free プランでは保存されない
7. カスタムメトリクスの課金体系
基本料金
Datadog Infrastructure の pro プランでは、100 個のカスタムメトリクスが料金に含まれています。
超過分が従量課金
101 個目から 100メトリクス毎に追加料金 月額$1 が発生します。
カスタムメトリクスが高額になる使い方
タグが固定になる dogstatsd.gauge('kano.metric-js-dogstatsd.value', randint(20, 45), [ 'env:prod', 'service:jddug_online']); の場合は、何回送信しても、異なる値を送信しても、月額は変わりません。
しかし、タグが変動する dogstatsd.gauge('kano.metric-js-dogstatsd.value', randint(20, 45), [ 'id:' + userid ]); 場合は、Datadog内部では新しい"時系列(time series)"が生成されるため、送信する都度、カスタムメトリクス数が増加し、月額が増加します。
8. まとめ
| 方式 | 特徴 | おすすめ用途 |
|---|---|---|
| DogStatsD | アプリから高速送信 | Webアプリの内部状態 |
| Agent Check | Agent が Python で収集 | サーバー内部の独自メトリクス |
| HTTP API | Agent 不要 | サーバレス・外部サービス |
Datadog のカスタムメトリクスは、
「標準メトリクスでは収集できない値」を可視化・観測するためのすばらしい手段です。
この記事の 3 方式を理解すれば、
どんな環境でも好きなメトリクスを送信できるようになります。









