レベルを使い分ける
Laravel(中の Monolog)は、重い順に emergency・alert・critical・error・warning・notice・info・debug の 8 段階。出し先(チャンネル)ごとに、残す最低のレベルを決められる。
Log::error('決済に失敗しました', ['order' => $order->id]);作って出したら終わり、ではありません。見張って、壊れたら直して、少しずつ良くする。
その「運用」の考え方と、障害が起きたときの動き方をまとめました。
運用は「見張る・気づく・直す・良くする」のくり返しです。これをエンジニアリングで支える考え方が SRE です。
ログ・メトリクス・トレース。同じ「決済が遅い」を、それぞれで見るとどう見えるかを切り替えてみてください(中身は作り物の例です)。
障害のとき、最初に頼りになるのはログです。あとで「探せる」「読める」形で書いておきます。読み方はデバッグのタブへ。
Laravel(中の Monolog)は、重い順に emergency・alert・critical・error・warning・notice・info・debug の 8 段階。出し先(チャンネル)ごとに、残す最低のレベルを決められる。
Log::error('決済に失敗しました', ['order' => $order->id]);何が起きたかの文に、手がかり(ID など)を別に渡す。あとで ID で探せる。
Log::info('User {id} failed to login.', ['id' => $user->id]);1 回の頼みに 1 つの ID を付け、その間のログ全部に入れる。返事のヘッダーにも入れておくと、利用者の画面からログへたどれる。
Log::withContext(['request-id' => $requestId]);
パスワード・アクセストークン・セッション ID・暗号の鍵・カードの番号・データベースの接続文字列・大事な個人情報。ログは多くの人や道具が読むので、そこから漏れる。
利用者に向いたサービスで、4 つしか測れないならこれを、と Google の SRE の本が挙げているものです。
「止まらないように頑張る」ではなく、「どこまでなら止まってよいか」を先に決めます。
アラートは、人を呼び出すものです。鳴らしすぎても、鳴らなくても困ります。
障害の多くは、何かを変えたあとに起きます。出し方を工夫しておくと、失敗しても早く戻せます。 設定をコードで管理するやり方はインフラをコードでへ。
サーバー(コンテナ)を少しずつ新しい版に入れ替える。止めずに出せる。Kubernetes の更新は、この形。
本番と同じ環境を 2 つ用意し、新しい版を片方で確かめてから、つなぐ先を切り替える。おかしければ、つなぐ先を戻すだけ(切り戻し)。
新しい版を、まず一部の利用者にだけ出し、問題がないのを見てから全員に広げる。
列の名前を変えるなら、① 新しい列を足して両方に書く → ② 読む所を新しい列に移す → ③ 古い列を消す、と分けて出す(expand and contract)。どの段階でも、アプリを前の版に戻せる。
考え方のヒント戻し方は、出す前に決めておく。前の版はどれか、戻すコマンド、戻すかを決める人。本番作業の前のチェックリストと、元に戻せるかも見てください。
例:「14:00 にリリースしたあと、決済が急に遅くなった」。「次へ」で進むと、グラフの時刻と、そのとき動く役が変わります(時刻と数字は作り物です)。
お知らせに入れること: 。分からないことは「分からない」と書き、次のお知らせの時刻を約束して守ります。
責めずに、仕組みのどこに穴があったかを書きます(リスク: 責めない振り返り)。Google の SRE の本の例をもとにしました。「運が良かったこと」も書くのがポイントです。
障害が起きていない日の、地道な仕事です。
見張り・呼び出し・お知らせの道具です。技術の地図で「開発・運用」の層を見る ↗
AI は調べものの強い味方です。一方で、AI の機能そのものも見張る相手になりました。
確かめたものにチェックを付けてください(この端末にだけ保存されます)。