非同期処理システムのモニタリングを責務単位で再設計した話
株式会社ナレッジワークのSREのtomです。
非同期処理の監視は、同期APIのように「リクエスト → レスポンス」の関係が明確ではないため、可視化の粒度と範囲をどう設計するかが課題になります。
とりあえずメトリクスを並べてダッシュボードを作ったものの、実際の運用では「どの指標が重要なのか」が曖昧で、異常検知や影響範囲の把握の難しさに課題を感じている方も多いのではないでしょうか。
特に非同期処理の複雑さの前では、監視ダッシュボードは「見えているようで何も見えていない」状態であることがしばしばあります。
本記事では、非同期システムのモニタリングを改善した際の取り組みを紹介します。「責務ごとにセクションを分けてダッシュボードを再設計した」ことで、認知負荷を下げ、トラブルシュートを容易にした実践例になります。
非同期処理の複雑さと可視化の課題
ナレッジワークでは、ユーザーがアップロードしたファイルを変換するシステムを運用しています。MIMEタイプによって処理する内容が異なるため、複数のリソースを監視する必要があります。
主にイベント駆動の非同期構成のため、障害時に「どの段階で問題が起きたのか」を特定するのが難しく、Datadogのダッシュボードも複数の処理をまたいで混在していました。
そこで、責務単位で区切ったモニタリング構成に変更することにしました。ここでいう「責務単位」とは、1つの処理工程や役割ごとに監視を分ける考え方です。
Step1. インフラ構成図で可視化する

Google SRE本のサービス信頼性階層では、モニタリングが信頼性の土台に位置づけられています。しかし私は、そのさらに下に「インフラ構成図」があると考えています。
というのも、「どのリソースのどんなメトリクスを監視するのか」を設計する際には、対象のインフラ構成を正確に把握した上で精査する必要があるからです。つまり、モニタリングの基盤にはインフラ構成図が欠かせません。
まず最初に行ったのは、全体の責務と依存関係をインフラ構成図で可視化することです。この段階で、「どのリソースがどの責務を持つか」を整理しました。

この構成図から責務単位でセクション化を行いました(グレーの枠が各セクションになります)。今回のシステムでは、以下のように区分しています。
- ウィルススキャン
- MIMEタイプごとの処理
- Office系ファイル
- SharePoint
- 動画・音声
- 処理結果の登録
Step2. Datadogダッシュボードをグルーピング

Datadogのダッシュボードを、上記の責務単位に対応する形で分割しました。Widgetグループを構成し、Step3で定義する関連メトリクスやログをまとめます。
この構成により、障害発生時も「どの責務セクションで異常が起きているか」が一目で分かるようになりました。たとえばOffice系ファイルの処理で異常が発生しても、PDFや動画ファイルの処理は正常であることが明確になり、影響範囲の判断が容易になりました。
また、各セクションに対応するインフラ構成図へのリンクを設け、クリックすると該当する構成図に遷移できるようにしています。これにより、新規メンバーなどシステム理解が浅い人でも素早く状況を把握できます。

Step3. 各セクションのメトリクス設計
次に、各責務に応じて観測すべきメトリクスを整理しました。Pub/Subリソースやファイル変換サーバーのメトリクス・ログを収集し、過去のインシデント発生時のデータをもとに、異常を再現できる指標かどうかを検証しました。
最終的に、以下のメトリクスを主要指標として可視化しました。
- Pub/Sub
- Undelivered Messages
- Oldest Unacked Message Age
- OutStanding Messages
- 処理サーバー
- インスタンス数
- CPU
- メモリ
- エラーログ数
- エラーログの詳細
- 処理結果登録セクションのみ
- 処理成功率(カスタムメトリクス)
- 処理成功以外のステータス詳細(カスタムメトリクス)
セクションごとに必要なメトリクスは異なりますが、インフラ構成図と照らし合わせることで自然に必要指標が見えてきます。

また、ダッシュボード最上部にはDatadogモニター(アラート)の状態をまとめて配置し、異常なセクションを一目で判別できるようにしています。SLOを設定している場合は、そのステータスも併記するといいですね。

まとめ
モニタリングはサービス信頼性を向上させる土台です。しかし、ただメトリクスを集めて可視化するだけでは、システムの健全性は見えてきません。
今回の取り組みでは、インフラ構成図に基づいてメトリクスを精査し、Datadogダッシュボードを責務単位でグルーピングすることで、「どこで何が起きているのか」が瞬時に分かるダッシュボードを実現できました。
モニタリングに正解はありませんが、一つの事例として参考になれば幸いです。
Discussion