メインコンテンツへスキップ
  1. 記事一覧/

開発者が本当に使ってくれるモニタリングの作り方

· loading · loading ·
仁才徳
著者
仁才徳
韓国ソウル在住のリーダー兼ソフトウェアエンジニア

「手元では動く」と「本番で動く」の間にはギャップがあって、モニタリングはそれを埋めるためにあるはずです。ところが大抵は埋まりません。開発者が障害時に手を伸ばすツールとしてではなく、運用チーム向けのツールとして作られてしまうからです。

最近フリーランスとしてDevOpsやインフラの仕事を始めたのですが、新しい現場に入ってまず見るもののひとつがモニタリングの構成です。READMEよりよほどチームの実態が分かります。そして失敗パターンはほぼ毎回同じです。ツールは揃っているのに、開発者の実際の仕事の流れとつながっていない。本番ログが見られれば5分で片付くバグに誰かが3時間溶かす。障害はアラートではなくサポートチケットで発覚する。あるいは逆に、1日200件のアラートのほとんどがノイズで、全員がすべてを無視するようになり、インシデントのたびに最初の30分を「直す」のではなく「何が壊れたのか」の特定に費やす、という具合です。

メトリクス・ログ・トレースはつながってこそ
#

メトリクスは「何かがおかしい」ことを教えてくれます(エラー率の急上昇、レイテンシの跳ね上がり)。ログは「何が起きたか」(スタックトレース、リクエストペイロード、エラーメッセージ)。トレースは「どこで起きたか」(どのサービス、どのエンドポイント、どのDBコール)。ここまでは常識です。重要なのは、この3つがリンクされているかどうか。アラートが鳴ったら、メトリクスから該当ログ、そしてトレースへとクリックだけでたどれるべきです。開発者が3つのツールを行き来してタイムスタンプを手作業で突き合わせているなら、個々のツールがどれだけ立派でも、その構成は失敗しています。

ダッシュボードにも同じテストが使えます。CPU、メモリ、ディスクI/Oはキャパシティプランニングには大事ですが、500エラーのデバッグには役立ちません。開発者が自発的に開くダッシュボードには、技術メトリクスの隣にビジネスメトリクス(エラー率の横に毎時サインアップ数)、タイムラインに重ねた直近のデプロイ、直近1時間のエラートップ5(ログへのリンク付き)、そして平均値ではなくレイテンシのパーセンタイル(p50、p95、p99)が並んでいます。誰にも自発的に開かれないダッシュボードは、存在価値を証明できていません。

アラートも同じ発想です。すべてのアラートは「何が壊れたのか」「どこから調べればいいのか」の2つに答えるべきです。

ダメなアラート:「web-server-3のCPUが高い」

良いアラート:「14:32以降、/api/paymentsのエラー率が5%超。最終デプロイ:14:15、@sarah。[ログを見る] [トレースを見る]」

後者に近づけるコツはいくつかあります。恣意的な閾値ではなくベースラインからの逸脱で発報する。オーナーシップでルーティングする(決済のエラーは組織全体ではなく決済チームへ)。関連エラーは50件の個別通知ではなく1つのSlackメッセージにまとめる。そしてフィードバックループは短く。「何かが壊れた」から「開発者が知る」までは1分以内が目安で、そのためには5分ごとのバッチではなくリアルタイムのログストリーミング、全ダッシュボードへのデプロイマーカー、サービス境界をまたいでも切れない分散トレーシングが必要です。

使う人のために作る
#

運用チームがやりがちな最大の失敗は、自分たちのためにモニタリングを作ってしまうことです。対策は別に高度なものではありません。デバッグ中の開発者の隣に座って、どこで詰まるかを観察する。インシデント中にどんな質問が飛び交うかを聞く。「どのサービス?」「何が変わった?」「リクエストの中身は?」。プロダクトにとって本当に重要なメトリクスを突き止める。それはまずCPUではなく、チェックアウト完了率やアップロード成功率のようなものです。

次に摩擦を取り除きます。新しいサービスの計装に丸1日かかるなら、誰もやりません。使っているフレームワーク(Django、Express、Spring)を自動計装するライブラリ、コピペで使えるダッシュボードとアラートのテンプレート、チケットを切らずに自分でメトリクスを追加できるセルフサービスの仕組みを用意しましょう。そして全体をコードとして扱うこと。設定はバージョン管理に入れ、アラートルールは「鳴るべきときに鳴る」ことをテストし、マルチリージョンに向かうつもりなら早めに織り込んでおきます。

AWSの小規模チームならまずCloudWatch
#

エンジニア50人以下でAWSに乗っているなら、CloudWatchが正しい出発点です。初日から高級なツールを買いたくなる気持ちは抑えたほうがいい。EC2、Lambda、RDS、ECSは自動でCloudWatchにレポートするので、計装コードを書かなくても可視性が手に入ります。小規模チームなら月額10〜50ドル程度で固定のプラットフォーム料金はなし。メトリクス、ログ、トレース(X-Ray経由)、アラームが一箇所に揃います。意味のあるアラートとダッシュボードなら、数週間ではなく午後のうちに作れます。

過小評価されがちなのがCloudWatch Logs Insightsです。Elasticsearchを立てなくてもログにクエリを投げられます:

fields @timestamp, @message
| filter @message like /ERROR/
| stats count() by bin(5m)

そのほかのポイント:

  • 複合アラームでノイズを減らす。エラー率が高く「かつ」レスポンスタイムが劣化しているときに発報する。条件ごとに個別ではなく。
  • 本当の価値はカスタムメトリクスにあります。CloudWatch SDKでビジネスメトリクス(サインアップ、トランザクション、機能の利用状況)をインフラメトリクスと並べて送りましょう。
  • CloudWatch Syntheticsは、ユーザージャーニーをなぞるカナリアテストをスケジュール実行してくれます。チェックアウトが壊れていることに、ユーザーより先に気づけます。
  • X-Rayなら最小限のセットアップで分散トレーシングが手に入ります。大半のマイクロサービス構成にはこれで十分です。

卒業のタイミングも分かりやすいです。マルチクラウドになったとき、本格的な異常検出が欲しくなったとき、ダッシュボードのカスタマイズがつらくなったとき、あるいはチームが50人を超えて本格的なコラボレーション機能が必要になったときです。

大きめのチームならDataDog
#

DataDogは高いです。大きな組織なら年間2万〜10万ドル超は普通ですが、スケールすれば元は取れます。AWS、Azure、GCP、オンプレ、コンテナ、サーバーレス、データベース、フロントエンドを1つのビューで監視できます。Watchdogが手動の閾値設定なしで異常パターンを検出してくれるのも大きい。数千のサービスを人間が目視で見張ることはできませんから。さらにCloudWatchにはないコラボレーションの層が揃っています。チーム別ダッシュボード、RBAC、共有の調査ノートブック、PagerDuty/Opsgenie連携、複数条件アラート、閾値突破の予測、メンテナンスウィンドウ、そしてコードレベルのプロファイリングまで潜れるAPMと自動生成のサービスマップです。

導入はだいたいこの順番でやります。まず重要なサービスから計装し、初日からチームと環境でタグ付けを徹底する。命名規則、ダッシュボードのテンプレート、アラートの重要度レベル、SLOの定義は早い段階で合意しておく(標準の後付けは本当に苦行です)。CI/CDのデプロイマーカー、インシデント管理、Slackと連携させる。トレーニングの時間も確保すること。DataDogは強力ですが、直感だけでは使いこなせません。そして請求額には目を光らせる。ノイズの多いメトリクスをフィルタし、大量トラフィックのサービスではトレースをサンプリングし、実際に使っている機能を定期的に棚卸ししましょう。

契約前に見ておく価値があるのは、New Relic(似た構成で、大量トレーシングなら安いことも)、Dynatrace(AIOpsが強く金融系で人気)、Splunk(ログ分析は最強クラス、セキュリティ部門がすでに使っているならなおさら)、Grafana Cloud(すでにPrometheus/Lokiなら自然な選択)あたりです。

実際のところ、多くのチームはハイブリッドに落ち着きます。AWSネイティブなサービスは自動で安いCloudWatch、アプリケーション層はDataDog、そしてCloudWatchのメトリクスをDataDogに取り込んで統一ビューにする。地味ですが、ちゃんと機能します。

ゼロから始めるなら
#

私ならこの順番でやります。まず開発者に、インシデント中に何がつらいかを聞く。重要なフローのSLOを定義する(ログイン、チェックアウト、検索にとって「動いている」とは何か)。そのクリティカルパスから計装する。次に分散トレーシングを入れる(マイクロサービス構成ではデバッグ効率への投資対効果が一番高い)。すべてのアラートにランブックを書き、午前3時の自分が何を確認すべきか分かるようにする。そして四半期ごとのレビューをカレンダーに入れ、古いアラートを消し、ずれた閾値を直し、ダッシュボードが今のアーキテクチャを反映しているか確認する。

チームを引き上げてきた落とし穴も挙げておきます。ツールの入れすぎ(連携する3つは連携しない6つに勝る)。ベースラインのないグラフ(500 rpsは平常なのか10倍のスパイクなのか?)。ユーザーに関係ないものの監視(ステートレスなコンテナのディスクI/Oなど)。そしてモニタリング自体の冗長性の欠如。インシデントの最中にアラート基盤が落ちたら、一番見えなくてはいけない瞬間に何も見えなくなります。

どれも最高級のツールは必要ありません。必要なのは、開発者が必要な情報を、実際に見る場所で、素早く手にできることです。