OMOソリューション本部プロダクト開発部の髙田です。
最近新しくできたAPIサーバに外形監視を設定する機会があり、Datadog Syntheticの利用を検討しました。
Datadogは公式ドキュメントが充実しているので目を通すだけで概要を把握することは容易なのですが、いざ導入するとなるとよく分からない設定や検証が必要だったので、同じように利用を検討する人のためになればと思い残します。
Syntheticとは
Synthetic Monitaring(合成監視)とは、アプリケーション監視手法の一つで実際のユーザーの動きを想定したリクエストを実行し、その応答結果を確認することでそのアプリケーションが問題なく稼働しているかを監視するものです。
実現方法はサービスによりけりで、例えばAPIサーバだったらビジネスに重要なエンドポイントを叩くようにしたり、ECサイトのようなものであればログイン→商品閲覧→カートに入れるといったよく行われる処理をSelenium等のブラウザ操作ツールによって行います。
Synthetic Monitaringが使われるケースとしては、デプロイパイプラインの中や外形監視が挙げられます。
Datadog SyntheticではSynthetic Monitaringの設定方法として「API Test」「Multistep API Test」「Browser Test」の三種類が提供されています。今回はAPI Testのみを使うので、他の二つについては触れません。
設定方法と内容
UX Monitoring > Synthetics Testから設定画面にアクセスし、以下の項目を設定します。
- Define request
- メソッドやヘッダー、ボディなどリクエストの設定
- リクエストを実行するロケーション(AWSのリージョン、Private Location)も複数選択できます
- Define assertions
- ステータスコードやレスポンス時間など、正常なレスポンスの閾値の設定
- 「Define request」で設定した内容を検証できる機能が良かったです。その実行結果をもとにデフォルト値が入る仕様にもなっています(▼画像参照)
- ステータスコードやレスポンス時間など、正常なレスポンスの閾値の設定
- Specify test frequency
- テストを実行する間隔の設定
- Define alert conditions
- テストを実行する中でアラート通知条件とリトライ数の設定
- Notify your team
- アラートの通知メッセージや通知先の設定
- 自チームの場合SlackとPagerDutyに設定し、非常時に電話が鳴るようにしています。
APIで細かく設定する
管理画面から見るとSpecify test frequencyは1m,5m,15m...1wと選択式になっています。またリトライ回数を指定することはできてもどのくらいの間隔で行われるのかが分かりません。
AWSでもよくある話ですが、こういった値はDatadogが提供しているAPIからより細かい値を指定することができました。
ちなみに管理画面から設定した時のリトライ間隔は300msになるようです。
今回の要件の場合リトライ間隔をもう少し空けたかったので、Terraformでコード化して設定を適用し管理させることにしました。
resource "datadog_synthetics_test" "sample" { name = "Test on ${var.api}" type = "api" subtype = "http" request = { method = "GET" url = "${var.path}" timeout = "30" } request_headers = { Authorization = "Bearer ${var.token}" } tags = ["env:prd"] assertion { type = "responseTime" operator = "lessThan" target = "1000" # ms } assertion { type = "statusCode" operator = "is" target = "200" } assertion { type = "header" property = "content-type" operator = "is" target = "application/json; charset=utf-8" } locations = ["aws:ap-northeast-2"] options_list { follow_redirects = true tick_every = 300 # seconds ※コンソールからは確認できない retry { count = 2 interval = 60000 # ms } monitor_options { renotify_interval = 5 # minutes ※コンソールからは確認できない } } message = <<-EOT @slack-${var.slack} @pagerduty-${var.pagerduty} <!here> 外形監視 障害が起きている可能性があります。 EOT status = "paused" }
通知に関して
念の為リトライ閾値を超えた際Slackへの通知が瞬時に行われるかも確認しましたが、1min以内に届いたので問題無さそうでした。
テスト結果のメトリクスでDashboardを作る
Synthetics API Testで設定したテストの結果は以下のように表示されます。
▼全体
▼エンドポイントごと
ですがこれ以外にも、syntheticsモニタリングテストによって生成されるレスポンスタイムやサイズといったメトリクスを使って自分好みの形でDashboardも作れます。
▼例えばDNSルックアップまでの時間をtimeseriesで見れるようにする。
これはリクエストタイプがSSLのAPI Testの実行で取得されるsynthetics.ssl.dns.time
メトリクスを表示しています。
その他にもAPI Testの結果を元にSLOウィジェットも作れるようでした。
料金
2021.01時点では月10000リクエストにつき年間契約$5 、オンデマンド$7.20となっています。
オンデマンドで1エンドポイントに対して1分間に1リクエストを31日間(44640min)行う場合、約$32
になります。
テストするエンドポイントの数と頻度、それから実行させるリージョン数によって変動します。
参考:AWS CloudWatch Synthetics
参考程度にAWS CloudWatchを使った見積もりもしてみました。
上記と同じ条件を想定して見積もると以下のような計算になります。
1 Canary * 月44640回実行 = 44640 Canary実行
1 Canary実行あたり0.0012 USDなので、約$53
になります。
上記に加えて、Canary実行ごとにLambdaの料金が加算され、アラートがなったらその分の料金が加算され、ログと結果の保存のためにCloudWatch LogsとS3の料金の分も加算される形になるので、$53よりもう少し増えます。
裏側で動いているものの料金は大したコストにはならないにせよ、Datadogと比べると割高なように思えました。ただCanaryというのがスケジュールに従って実行される設定可能なスクリプトなので、要件によってはCloudWatch Syntheticsの方がコスパが良くなるケースもあるかもしれません。
おわりに
設定は楽なのですが、契約変更周りの処理が1番大変でした笑(慣れない作業のため)