Blog
Datadogで外部システムのデータを可視化する
アドテク本部の成尾です。
アドテクスタジオでは数多くのプロダクトで、モニタリングツールとして datadog を利用しています。
datadog では様々なミドルウェアに対応したインテグレーションや
機械学習を利用した Anomaly 監視などがあり
モニター( Zabbix 等でいうトリガー )も作りやすいのですが
今回はモニターではなく、ダッシュボードについて書いていこうと思います。
ダッシュボードでのメトリクスの可視化は
指定した時間枠で一括表示するトラブルシューティング向けの TimeBoard と
各種ステータスを見やすく配置して共有できる ScreenBoard に分かれています。
datadog agent や datadog のインテグレーションで 取得できる値だけで
表示したい項目がすべてが揃っている場合には必要ないのですが
そういったものがない他のサービスの値と組み合わせて、ダッシュボードを作りたいという要件がありました。
例えば、
- 外形監視に別なサービスを利用していてステータスを datadog の ScreenBoard で表示したい
- パブリック/プライベートクラウドのコストを同じく datadog の ScreenBoard で表示したい
といったケースです。
datadog では API が用意されています。
datadog dashboard ログイン後の Integrations -> API Keys という項目で
API Key と Application Key を利用して API server にリクエストを送ります。
公式ドキュメントにもありますが
Shell を利用し curl で送る場合には以下のように値を送るだけでメトリクスが追加できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/sh # Make sure you replace the API and/or APP key below # with the ones for your account currenttime=$(date +%s) curl -X POST -H "Content-type: application/json" \ -d "{ \"series\" : [{\"metric\":\"test.metric\", \"points\":[[$currenttime, 20]], \"type\":\"gauge\", \"host\":\"test.example.com\", \"tags\":[\"environment:test\"]} ] }" \ 'https://app.datadoghq.com/api/v1/series?api_key=9775a026f1ca7d1c6c5af9d94d9595a4' |
引用:https://docs.datadoghq.com/api/?lang=console#metrics
ドキュメント上に書かれている
Current is defined as not more than 10 minutes in the future or more than 1 hour in the past.
にある通り、10分以上未来や1時間以上過去のメトリクスとして送信しても受け付けてもらえません。
パブリッククラウドのコストを送ろうとした時など
数日前のデータとして送りたいと思っても使えないので、残念ですが気を付けてください。
アドテクスタジオでは外形監視として updown.io を一部で利用しています。
シンプルで使いやすいサイトなのですが、1か所へのSlack通知くらいしか連携できないため
監視しているURLに合わせて通知先を変えるといった事をしたいと思っていました。
updown.io では Webhook endpoint URLs という設定項目があり
監視している URL のステータスが変わった際に POST してくれるという機能があり
とい事を Golang の Gin フレームワークを利用して実装しています。
公式ドキュメントでは Shell, Python, Ruby についてサンプルコードが出ていますが
Golang でも go-datadog-api というのを公開してくれている人がいましたので、利用させてもらいました。
POST されたデータの中身を確認し Event に応じて datadog に送る値を変更し通知
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
func Updown(c *gin.Context) { var status float64 var res []UpdownWebhookJson json.NewDecoder(c.Request.Body).Decode(&res) for _, p := range res { switch p.Event { case "check.up": status = 1 case "check.down": status = 0 default: status = 0 } SendMetricsDatadog(product_api_key, product_app_key, p.Check.Url, status) } |
※コードは一部省略して載せています。
実際に datadog の API に対してメトリクスを送信する部分は以下のような形
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
func SendMetricsDatadog(api_key string, app_key string, url string, value float64) { client := datadog.NewClient(api_key, app_key) postdata := datadog.Metric{ Metric: datadog.String("url_monit"), Points: []datadog.DataPoint{ datadog.DataPoint{float64(time.Now().Unix()), value}, }, Type: datadog.String("gauge"), Tags: []string{"url:" + url}, } err := client.PostMetrics([]datadog.Metric{postdata}) if err != nil { panic(fmt.Sprintf("[Error]: %s", err)) } } |
※コードは一部省略して載せています。
このように API を使うことによって、他のシステムのデータと連携できるので
通常の監視のための可視化だけでなく、情報共有として利用できます。
例えば、
Deploy Version を Tag にしてデータを送り、
特定のデプロイ時点からシステム稼働率、コスト、売り上げなどに変化があったか、といった表示や
外形監視と組み合わせてサービスダウンがどれくらいインパクトがあるのかといった可視化もできると思います。
Author