こんにちは。 システム本部CTO室のakasakasです。
今回は、Datadog Log Management を使ってアプリケーション稼働モニタリングをしている話をしたいと思います。
- 一休のモニタリング周りの話
- モニタリング観点で一休が抱えていた課題
- Datadog Log Management
- Datadog Log Management からダッシュボード作成
- Datadog Log Management からアラート作成
- 必要なメトリクスはカスタムメトリクスを作る
- graph_snapshot API を使って、デイリーレポート
- まとめ
- 最後に
一休のモニタリング周りの話
Datadog Log Management とアプリケーション稼働モニタリングの話をする前に、一休でどのような監視をしているのか?という話を簡単にします。
一休ではDatadogをモニタリングツールとして使っています。 主な用途は2つあります。
- インフラのリソースモニタリング
- 外形監視
インフラのリソースモニタリング
インフラメトリクスのダッシュボードとアラートの設定は運用として乗っています。 具体的には、サービス(宿泊・レストランetc)毎のアプリケーションサーバやDBサーバのモニタリングをしています。
CPUで閾値を超えたら、Slack通知が飛び、エンジニアが対応するという形をとっています。
外形監視
Datadog Synthetics API Tests を使って、外形監視をしています。 こちらも同様に、外形監視で異常が起きたら、Slackに通知が飛び、エンジニアが対応します。
モニタリング観点で一休が抱えていた課題
インフラレイヤーでのモニタリングはできているが、アプリケーションレイヤーでのモニタリングはできていないというのが課題感としてありました。
ここでいうアプリケーションレイヤーでのモニタリングとは
- 予約が正常にできているかどうか
- エラーが多発してないか?
- 予約通知メールが正常に送られているかどうか
- メール送信件数が適切か?異常に多い、少ないということはないか?
- 検索導線でのリクエスト数がどの程度あるのか?エラーがどの程度あるのか?
というサービスの状態がヘルシーかどうかという観点です。
※レイテンシーやエラーレートといったAPMとは異なります。Datadog APMは一部のサービスで運用しています。
これらを時系列で監視し(e.g. 10分毎の予約件数/1日ごとのメール送信件数) 異変があれば、アラートを飛ばすという仕組みがあれば、いち早く障害に気づけると考えました。
Datadog Log Management
このアプリケーション観点の監視をするために、Datadog Log Managementが有効だと考えました。
Datadog Log Management は Datadog 上でログを管理するサービスです。
一休では昨年ログ管理サービスをLogentriesからDatadog Log Management に完全移行しました。
導入方法や詳細な使い方は割愛します。
Datadog Log Management を使って、アプリケーションログ・アクセスログをベースに時系列の予約状況・検索数の推移・メール送信件数etcを集計&ダッシュボードでグラフ化&アラートの設定ができれば、アプリケーション稼働モニタリングが実現できると考えました。
Datadog Log Management からダッシュボード作成
実際にDatadog Log Management から作成したアプリケーションモニタリングのダッシュボードがこちらです。
グラフの作成方法は
- LogEvents を選択
- タグで絞り込み
のみで、簡単です。
Datadog Log Management からアラート作成
予約状況の監視もアラートで検知することもできます。
New Monitor から Logs を選択し、検索クエリを指定すれば、Monitorが作成できます。
必要なメトリクスはカスタムメトリクスを作る
Datadog Log Management では取得できないメトリクスもあると思います。 その場合は、Datadog API を使って、カスタムメトリクスを作ります。
メトリクス API については下記をご覧ください。 docs.datadoghq.com
Datadog API を扱う際はRubyとPythonでそれぞれ API Clientがあるので、そちらを使うのがいいと思います。
GitHub - DataDog/datadogpy: The Datadog Python library
GitHub - DataDog/dogapi-rb: Ruby client for Datadog's API
カスタムメトリクスを作る例として、一休では検索にSolrを使っています。 SolrのIndex数を監視したいという場合は、SolrからIndex数を取得し、APIを使ってカスタムメトリクスを作成しDatadogに送信します。
具体的には下記のようなスクリプトをLambdaで定期実行するイメージです。
from datadog import initialize, api import time import requests options = { 'api_key': '<DATADOG_API_KEY>' } initialize(**options) # Solrにリクエスト r = requests.get('<Solr Endpoint>') # Index数取得 index_count = r.json()['index_count'] now = time.time() # Solrのindex数をカスタムメトリクスにして、Datadogに送信 api.Metric.send(metric="solr.index.count", points=(now, index_count), type="count")
カスタムメトリクスが作成できれば、Datadog上でダッシュボードとアラートが設定できます。
Datadog Log Management から取得できないが、監視したい項目については カスタムメトリクスを作るのもアリだと思います。
graph_snapshot API を使って、デイリーレポート
ただ、単純に
- ダッシュボード作りました
- アラート作りました
だけだと、せっかく作ったダッシュボードやアラートがエンジニアから忘れ去られそうという懸念がありました。
なので、「アプリケーションちゃんと動いているよ!エラーちょっと多いよ!」というのを伝える意味も込めて、デイリーレポートをslackに投稿するようにしました。
下記のようなイメージです。
デイリーレポートをすることで、「エラーちょっと多いから確認した方がよくない?」みたいなことになり、調査&対応するという方向でエンジニアが動いてくれます。
これは graph_snapshot API を使って、キャプチャを作り、Slackに投稿するスクリプトをLambdaで日時で動かしています。
graph_snapshot API については下記をご覧ください。
graph_snapshot API については細かいところを含めて、いくつか注意点があるので書いときます。
1.デフォルトの Rate Limitiing がけっこう厳しい
https://docs.datadoghq.com/ja/api/?lang=bash#rate-limiting に記載がある通り、
graph_snapshot API 呼び出しのレート制限値は、60/時間/Organization です。これは、オンデマンドで増やすことができます。
とあるので、無邪気にAPIを叩いていると、すぐに引っかかります。
2. graph_snapshot API のタイムゾーンがUTC固定
graph_snapshot API のタイムゾーンはUTCになっていて、任意のタイムゾーンに変更できません。
3. API リクエストで渡すパラメータがちょっと複雑
graph_snapshot API でグラフを作成する場合のAPIリクエストでJSONを扱う場合があるので、ちょっと面倒です。
DashBoardと同様のグラフを作りたい場合は、該当するグラフのJSONをリクエストにつめる必要があります。
GitHub - DataDog/datadogpy: The Datadog Python library を使ったサンプル例が以下になりますが、JSONが長くなってしまうのが少し煩わしく感じるかもしれません。
from datadog import initialize, api import time options = { 'api_key': '<DATADOG_API_KEY>', 'app_key': '<DATADOG_APPLICATION_KEY>' } initialize(**options) # Take a graph snapshot end = int(time.time()) start = end - (60 * 60) resp = api.Graph.create( graph_def='{\ "viz": "timeseries", \ "requests": [ \ { \ "q": "xxxxxxxxxxx", \ "type": "bars", \ "style": { \ "palette": "dog_classic", \ "type": "solid", \ "width": "normal" \ } \ } \ ], \ "yaxis": { \ "scale": "linear", \ "min": "auto", \ "max": "auto", \ "includeZero": true, \ "label": "" \ }, \ "markers": [] \ }', start=start, end=end ) print(resp["snapshot_url"])
まとめ
今回は、Datadog Log Management を使って、アプリケーション稼働モニタリングを実現した話をしました。
単純なログ管理ツールとして使うだけでも、Datadog Log Management は便利ですが、 ダッシュボードやアラートなどを組み合わせることで、アプリケーションの状態が一目でわかるというのはいいと思いました。
最後に
Datadogのサポートの皆様にはいつも助けられています。 どんな問い合わせに対しても、いつも丁寧にサポート頂いているDatadogの皆様に御礼申し上げます。