応用読了目安 14 分#ログ#監視#メトリクス#オブザーバビリティ
ログと監視 — 誰より先に、壊れていることに気づく
ログは調査のため、メトリクスは検知のため、トレースは特定のため。3つの役割を分けて設計する。
この記事の進み方
What — 3つの役割を分ける
数値の時系列。集計済みなので軽く、長期保存できる。異常の検知に使う。
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件のアラートが届く状態は、何が起きていますか?
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% を超えたら通知する設定。何が弱点ですか?
演習 — まず自分で判断する
解説を読む前に、まず自分で判断してみてください。ここで一度詰まっておくと、 次の節の判断軸が「なるほど」ではなく「そう来たか」に変わります。
演習 — 設計判断を問う
この監視設定を、どう作り直しますか?
与えられた条件
- EC サイト。現在の監視設定は以下(すべて Slack に通知)
- ① CPU 使用率が 70% を超えたら通知(1日30件ほど鳴る)
- ② メモリ使用率が 80% を超えたら通知(1日10件ほど)
- ③ 500 エラーが1件でも出たら通知(1日150件ほど。大半はボットのアクセス)
- ④ 平均レスポンスタイムが 500ms を超えたら通知(週1回ほど)
- ⑤ ディスク使用率が 90% を超えたら通知(月1回ほど)
- 運用は3人。夜間のオンコール当番あり
- 先月、決済機能の停止に3時間気づかなかった
この軸で考える
- · 鳴ったときに「今すぐ何をするか」が書けるのはどれか
- · 利用者が困っていることを直接表しているのはどれか
- · 決済停止を検知するには、何が足りなかったか
演習 — 説明できるか
「アラートチャンネルがミュートされている」という状況を、どう立て直すか説明してください
与えられた条件
- 現在1日200件の通知が出ている
- 過去に本番停止を3時間気づけなかった
- 何を残し何を消すかの基準を示したい
読み終わりましたか?
読了にすると、これを前提とする記事がロードマップで開放されます。