仕組みから学ぶ Web
応用読了目安 14#ログ#監視#メトリクス#オブザーバビリティ

ログと監視 — 誰より先に、壊れていることに気づく

ログは調査のため、メトリクスは検知のため、トレースは特定のため。3つの役割を分けて設計する。

この記事の進み方

What — 3つの役割を分ける

Compareログ・メトリクス・トレース

数値の時系列。集計済みなので軽く、長期保存できる。異常の検知に使う。

http_requests_total{status="500"} 42
http_request_duration_seconds{quantile="0.99"} 1.8
db_connections_active 47

→ グラフにできる
→ 閾値でアラートを出せる
→ 個々のリクエストの詳細は分からない
答える問い
異常が起きているか
データ量
小さい(集計済み)
保存期間
年単位も可能
個別の調査
できない
サービス横断
  • 「いつもと違う」を検知するのが役割。原因は分からない。
  • カーディナリティ(ラベルの組み合わせ数)が爆発すると、コストが跳ね上がる。user_id をラベルにしてはいけない。

役割が違うので、どれか1つでは足りない。「何が起きているか」を検知するのはメトリクス、「なぜ」を調べるのはログ、「どこで」を特定するのはトレース。

構造化ログ

// 文字列を連結する:後から検索・集計できない
logger.info(`ユーザー ${userId} が注文 ${orderId} を作成(${ms}ms)`);

// 構造化する:フィールドで検索・集計できる
logger.info('注文を作成', { userId, orderId, durationMs: ms, traceId });

構造化しておくと、こういう問い合わせができます。

  • durationMs > 1000 のログだけを抽出する
  • userId ごとのエラー件数を集計する
  • 特定の traceId に関するログを全部集める

文字列連結で書くと、これらは正規表現との戦いになります。

何をログに出してはいけないか

// 絶対に出さない
logger.info('ログイン', { password, creditCard, sessionToken });

// 個人情報も慎重に
logger.info('注文', { email, phone, address });   // ← 保存期間と閲覧権限を考える

ログは複数の場所にコピーされます。 ログ基盤、バックアップ、開発者のローカル、監視 SaaS。一度出力すると回収できません。

確認 — ここまで読めたか

1日200件のアラートが届く状態は、何が起きていますか?

まず選ぶ(解答例は a〜d の記号で説明します)

Why — なぜアラートは「少ないほど良い」のか

監視の目的は「異常に気づくこと」です。しかし気づくのは人間なので、人間が処理できる量を超えると機能しなくなります。

冒頭の事故は、監視の不足ではなく過剰が原因でした。

アラートの設計で守るべき原則は1つです。

アラートは、人間が今すぐ行動すべきときにだけ鳴らす。

  • CPU 使用率が 80% を超えた → 行動できない(放っておけば戻る)
  • エラー率が 5% を超え、5分継続した → 行動すべき
  • ディスク使用率が 95% → 行動すべき(数時間以内に埋まる)

「知っておくといい情報」はダッシュボードに置きます。アラートにはしません。

症状で監視する

監視の対象は、原因ではなく症状にします。

❌ 原因ベース: CPU が高い / メモリが多い / ディスク I/O が多い
   → 高くても利用者が困っていないことがある
   → 低くても利用者が困っていることがある

✅ 症状ベース: エラー率が高い / レスポンスが遅い / 処理が滞留している
   → 利用者が困っていることと直結する

利用者が困っていないなら、CPU が 90% でも問題ではありません。 逆に、CPU が 20% でもエラーが出ていれば問題です。

Google の SRE では「4つのゴールデンシグナル」として次が挙げられます。

シグナル意味
レイテンシ応答にかかる時間。成功と失敗を分けて見る
トラフィックどれだけの要求が来ているか
エラー失敗している割合
サチュレーションどれだけ余裕がないか(キューの長さなど)

SLO で判断を機械化する

SLO: 直近30日で、リクエストの 99.9% が成功する

エラーバジェット = 0.1% = 30日で約 43 分の失敗が許容される

この数字があると、判断が機械的になります。

  • バジェットが余っている → 新機能のリリースを進めてよい
  • バジェットを使い切った → 機能開発を止めて安定性に投資する

「安定性と開発速度のどちらを優先するか」という議論を、数字で決着させられます。

確認 — ここまで読めたか

CPU 使用率が 90% を超えたら通知する設定。何が弱点ですか?

まず選ぶ(解答例は a〜d の記号で説明します)

演習 — まず自分で判断する

解説を読む前に、まず自分で判断してみてください。ここで一度詰まっておくと、 次の節の判断軸が「なるほど」ではなく「そう来たか」に変わります。

演習 — 設計判断を問う

この監視設定を、どう作り直しますか?

与えられた条件
  • EC サイト。現在の監視設定は以下(すべて Slack に通知)
  • ① CPU 使用率が 70% を超えたら通知(1日30件ほど鳴る)
  • ② メモリ使用率が 80% を超えたら通知(1日10件ほど)
  • ③ 500 エラーが1件でも出たら通知(1日150件ほど。大半はボットのアクセス)
  • ④ 平均レスポンスタイムが 500ms を超えたら通知(週1回ほど)
  • ⑤ ディスク使用率が 90% を超えたら通知(月1回ほど)
  • 運用は3人。夜間のオンコール当番あり
  • 先月、決済機能の停止に3時間気づかなかった
この軸で考える
  • · 鳴ったときに「今すぐ何をするか」が書けるのはどれか
  • · 利用者が困っていることを直接表しているのはどれか
  • · 決済停止を検知するには、何が足りなかったか
まず選ぶ(解答例は a〜d の記号で説明します)

演習 — 説明できるか

「アラートチャンネルがミュートされている」という状況を、どう立て直すか説明してください

与えられた条件
  • 現在1日200件の通知が出ている
  • 過去に本番停止を3時間気づけなかった
  • 何を残し何を消すかの基準を示したい

読み終わりましたか?

読了にすると、これを前提とする記事がロードマップで開放されます。

この記事を前提にしている記事