DatadogAPIを使ったモニターの動作確認
はじめに
こんにちは🙌
アプリケーション監視において、Datadogモニター(監視)を導入している場合、どうやって動作の確認をしていますでしょうか。
UIからだと通知をテストする機能はあって、どういったメッセージが表示されるのか確認することは可能です。ただ、本当に正しいクエリになっているのかを確かめるにはどうするべきでしょうか。
もちろん実際にアプリを動かしてエラーを発生させてみるといった方法も考えられるかと思います。
ただ、現実的にエラーを出すことが難しい場合も結構あります。
そこでDatadogAPIを用いて擬似的なアラートを発生させるメトリクス、イベント、ログのインジェストを試してみて、アラートがトリガーされるところまで確認をしてみます。
ゴール
- DatadogAPIを使って、メトリクス、イベント、ログが送れて、作成したモニターがトリガーされていることを確認する。
説明しないこと
- Datadogの使い方(モニター作成、Explorerの見方)
- APIリクエストツールの使い方
DatadogAPI
試してみる前にDatadogAPIについてです。
詳しく知りたいという方は、公式のドキュメントにあたっていただければと思います。
APIへの認証には、 APIキー
とアプリケーションキー
が必要となります。
準備が出来ていない場合には、DatadogUIから作成して取得をしてください。
公式ドキュメントにも載っていますが、PostmanのコレクションがDatadogから用意されているため、今回はそれを利用しています。
Datadog API Collectionをフォークしてご利用ください。
Datadogでは、クライアントライブラリも用意されており、各言語からライブラリを使ってアクセスすることも可能です。
アプリケーションからカスタムメトリクス等を送りたい場合、クライアントライブラリを利用するのが良い選択になるかと思います。
実際に試してみる
ということで、早速試してみたいと思います。
まず簡単にモニターを作成しておきます。
ログ監視
メトリクス監視
イベント監視
ここからログ、メトリクス、イベントを送ってみます。が、実際に過去に同じようなデータが無いとエラーを再現することは結構大変かなと思います。
このあたりはいい感じに過去のデータをコピーしながらリクエストボディを作成する必要があります。
Postmanでコレクションをフォークする
DatadogAPI公式ドキュメントから、 Run in Postman
ボタンをクリックすると、DatadogAPIのコレクションページに飛びます。コレクションをフォークすると、既に整備されているAPIを試すことができるため非常に楽です。(感謝)
概要にも書いてありますが、リクエストを送るためにはAPIキーが必要となります。
変数タブから自身のAPIキーを入力してください。
必要に応じてsiteも書き換えてください。
ということで、準備ができたので、早速使っていきます。
ログ
-
既存のエラーログをJSON形式でコピーします。
エラーログを再現して送りたいので、既存のログ形式を参考にしながら進めていきます。
-
Logsフォルダに含まれている、
Post Send logs
を使います。
リクエストのボディに含めます。ただし、そのまま貼り付けても既存のログとは同じものとはならないので、何回か送りながら調整が必要となります。
(ここが若干面倒で良い解決策があれば知りたい...)
ちなみに、タグを設定したい場合は、パラメータddtags
の値に含めます!
{
"host": "test-host",
"service": "api-service",
"message": "リクエスト処理中にエラーが発生しました",
"severity": "ERROR",
"error_name": "Error",
"headers": {
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"accept-language": "ja,en-US;q=0.9,en;q=0.8",
"sec-fetch-user": "?1",
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"sec-ch-ua": "\"Not A(Brand\";v=\"8\", \"Chromium\";v=\"132\", \"Google Chrome\";v=\"132\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"macOS\"",
"host": "localhost:3000",
"upgrade-insecure-requests": "1",
"connection": "keep-alive",
"accept-encoding": "gzip, deflate, br, zstd",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
"sec-fetch-dest": "document"
},
"method": "GET",
"url": "/api/error-test",
"stack": "Error: これはテスト用のエラーです\n at level3 (/app/dist/app.js:145:15)\n at level2 (/app/dist/app.js:148:9)\n at level1 (/app/dist/app.js:151:9)\n at /app/dist/app.js:154:5\n at Generator.next (<anonymous>)\n at /app/dist/app.js:8:71\n at new Promise (<anonymous>)\n at __awaiter (/app/dist/app.js:4:12)\n at Object.<anonymous> (/app/dist/app.js:142:34)\n at preHandlerCallback (/app/node_modules/fastify/lib/handleRequest.js:139:37)",
"hostname": "test-host",
"level": "error",
"pid": 19,
"stackArray": [
"Error: これはテスト用のエラーです",
"at level3 (/app/dist/app.js:145:15)",
"at level2 (/app/dist/app.js:148:9)",
"at level1 (/app/dist/app.js:151:9)",
"at /app/dist/app.js:154:5",
"at Generator.next (<anonymous>)",
"at /app/dist/app.js:8:71",
"at new Promise (<anonymous>)",
"at __awaiter (/app/dist/app.js:4:12)",
"at Object.<anonymous> (/app/dist/app.js:142:34)",
"at preHandlerCallback (/app/node_modules/fastify/lib/handleRequest.js:139:37)"
],
"env": "production",
"status": "error"
}
-
問題なくログが送れると、
202 Accepted
が返ってきます。 -
Live Tailでアラートに設定したクエリを入力して待っていると、ログが出てきました。
-
もちろんアラートもトリガーされた状態になっています!
メトリクス
- Metricsフォルダに含まれている、
Submit metrics
を使います。
既にサンプルとして入っているボディとドキュメントを参考にしながら作成していきます。
参考までに、以下のように作ってみました。
{
"series": [
{
"metric": "aws.rds.cpuutilization",
"type": 3,
"points": [
{
"timestamp": 1741482210,
"value": 95
}
],
"resources": [
{
"name": "dummy_instance",
"type": "database_instance"
}
]
}
]
}
{
"errors": []
}
- type
typeは、0(COUNT)のままでも、Datadog側でGAUGEとして判断をしてくれる?ようではあるのですが、Metric Summaryから確認してaws.rds.cpuutilization
はGAUGEであるため、それに合わせて"type": 3
としています。 - timestamp
カスタムメトリクスドキュメントにある通り、timestampで受け入れられる時間には、ある程度制限がありますので、ご注意ください。
メトリクスのタイムスタンプは、未来は 10 分、過去は 1 時間を超えることはできません。
-
問題なくメトリクスが送れると、
202 Accepted
が返ってきます。 -
メトリクスエクスプローラーからも受信していることが確認できます。
-
モニターもアラート状態になっています!
イベント
-
Eventsフォルダに含まれている、
Posts an event
を使います。 -
ログと同様に既存のイベントがあれば、JSONをコピーして参考にします。
- 公式ドキュメントも参考にしながらリクエストを作成していきます。
参考までに以下のように作ってみました。
{
"alert_type": "error",
"tags": [
"engine:aurora-postgresql",
"event_type:failure",
"hostname:database-1-instance-1.xxxxxxxxxx.us-east-1.rds.amazonaws.com",
"availability-zone:us-east-1b",
"dbinstanceidentifier:database-1-instance-1",
"region:us-east-1",
"source:amazon_rds",
"dbinstanceclass:db.serverless",
"event_source:db-instance",
"name:database-1-instance-1",
"engineversion:16.4"
],
"message": "Creation failed for custom engine version name. message",
"source_type_name": "amazon rds",
"source_type_id": 93,
"priority": "normal",
"title": "RDS: A(n) notification event has been triggered on your db-instance: database-1-instance-1"
}
-
カスタムイベントが想定通り、Datadogに送れていることが確認できます。
-
アラートがトリガーされています!
これで一通り、アラートの動作確認をすることが出来ました。
おわりに
リクエストボディを作るのが少し大変ではありますが、各所と調整をしながらエラーを出したりするよりもAPIにリクエストするだけで、確認を進めていくことが出来るので役立つ場面がありそうです。
Datadogは、UIが頻繁に変わったり、新しい機能が追加されていたりするので、日々発見があって面白いなと思います。是非皆さまもAPIを有効活用していただければと思います。
最後まで読んでいただきまして、ありがとうございました。
若干手探り感もあり、誤り等あれば後日修正します。コメントも頂けますと幸いです。
Discussion