日々のあれこれφ(..)

もっぱら壁打ち

Datadogで外形監視の設定をした

はじめに

Datadog の Synthetic MonitoringAPI Testsを使って、APIサーバに外形監視を設定しました。

要件

今回の監視の目的は「問題があったときに素早く気づけ、エスカレーションできるようにすること」なのでとりわけ社外に公開しているエンドポイントを対象に、DBなど周辺コンポーネントをカバーできるエンドポイントをいくつかピックアップしました。

料金

2020.12.28の時点ではAPI Testsは以下のような料金体系になっています。

料金プラン | Datadog

10000リクエストで $7.20/月。年間請求にすると$5/月

1ヶ月を31日(44640min)として、1min間隔で監視を入れるとしたら年間請求計算で

1エンドポイントで44640/10000 * $5 = $22.5(1ロケーションの場合※)

のようになります。

API Testsではエンドポイントを実行するサーバの場所を指定することができます。例えば1min間隔でSingapore、Sydneyロケーションからエンドポイントチェックを行うとなると、2リクエストになります。このロケーションは書いてあるとおりAWS環境なので、サービスと同じリージョンで動かすとリージョン障害で外形が起動せず障害に気づけないといったことも起こりうるかと思います。グローバルで展開しているシステムでなくても、予算に余裕があれば2つ以上のロケーションで行いたいものです。

設定手順

UX Monitoring > Synthetics Tests でAPI Testsの設定が行えます。

f:id:reiichii:20201228190358p:plain

Define requestではurlとヘッダーやリクエストボディの内容を細かく設定できるようになっています。

{{ }} で囲うことで任意の変数を作成することができます。(他のAPI Testsを設定するときにも使いまわせるのかと思いきやできなそうだった)変数の値は入力した文字列以外にも日付や指定した数の文字列といった関数も用意されていました。

入力内容した内容を「Test URL」ボタンを押下することでテストを行うことができます。またそのレスポンス結果をもとに成功の定義が入力されるのがちょっとした感動ポイントでした笑

f:id:reiichii:20201228191416p:plain

入力フォームの右側にTest URLのレスポンス結果が出て、「2. Define assertions」にresponse timeとstatus codeとcontent-typeの成功値のデフォルトが入ります。条件を変えて再度テストするとDefine assertionsの各項目の右側にpassしたかfailedしたかが表示されるので試しながら調節できます。

f:id:reiichii:20201228192011p:plain

「3. Specify test frequency」 で指定された範囲でリクエストの頻度を指定できます。

「4. Define alert conditions」 でDefine alert conditionsで通知を出すタイミングとリトライの設定ができます。例えば画像のような設定だと、1つのロケーション中1つでfailedが出たらすぐにアラートを飛ばすようになっています。またfailedが起きたら3回リトライを行うようにもなっています。

「5. Notify your team」 では通知の設定を指定できます。Monitorsなどと同じように連携設定をしているSlackやPagerDutyも指定できます。(見た目は同じだけど操作感が若干異なるような)

設定を保存すると、保存された直後からリクエストが行われるようになりました。

f:id:reiichii:20201228192956p:plain

f:id:reiichii:20201228193007p:plain

画像にはありませんが、設定画面の右上でリクエストを一時停止したり、Test URLを意図的に実行させるなどもできました。

Datadogへの通知に関しても、failedしてから0minで届いたのが確認できました。

f:id:reiichii:20201228193827p:plain

f:id:reiichii:20201228193837p:plain

failed時の再通知の設定条件も5. Notify your teamの項目で行わなかったり、10分置きに通知するようにしたりなど設定できます。

また今回はやっていませんが、この辺りの設定もTerraformでコード化できるようでした。

datadog_synthetics_test | Resources | DataDog/datadog | Terraform Registry

おわりに

Mackerelなど他のツールは使ったことないので比較はできませんでしたが、とはいえ使い勝手は良さそうでした。リトライ時のリクエストの感覚も指定できるようになったら嬉しいなー