自動化のログ設計:0件を数字で残さないと故障に気づけない

この記事では、自動化処理のログに「対象なし」とだけ書いていたために、3日間まったく処理できていない状態に気づけなかった実例と、そこから変えた3つのログ設計を書きます。エラーが出ない故障をどう可視化するかの話です。

「対象なし」と書いていたら、故障が見えなくなった

自動化した処理のログで、処理対象が0件だったときに『対象なし』とだけ出力していました。文字としては間違っていません。実際に対象は0件です。

ところが、これで3日連続で1件も処理できていない状態に、画面から気づけませんでした。「対象なし」は正常な日にも出る文字列なので、それが3日続いていても異常として目に入ってこないのです。

原因:ボタンは押せるが、状態が変わっていなかった

原因は、操作先の外部サービスのUI変更でした。ボタンは押せる状態にあり、クリック自体は成功します。しかしその後、状態が変わっていませんでした。

この手の失敗はエラーを出しません。クリックが例外を投げるわけではないので、ログ上は最後まで走って正常終了したように見えます。つまり、

  • 例外なし
  • ログは最後まで出ている
  • 「対象なし」と書いてある

という三点が揃うと、外から見て健康な自動化と区別がつきません。ここが一番怖い部分でした。

対策1:0件でも必ず数字で書く

まず、0件のときに文章で逃げるのをやめました。件数を必ず数字として出します。

解除 0件 / 保護 41件

数字で書くと、0という値が記録として残ります。「対象なし」は文字なので比較も集計もできませんが、0件は他の日の数字と並べられます。0が3日並んでいれば、それは並べた時点で異常として見えます。文章にすると消えてしまう情報が、数字にすると残るという違いです。

ポイントは「異常だったから数字を出す」のではなく、「正常でも常に同じ形式で数字を出す」ことです。形式が揃っていないと、そもそも並べられません。

対策2:押せた≠変わった、を確認する

2つ目は、操作した後に状態が変わったかどうかを確認することです。今回の故障は、まさに「押せたこと」を成功の判定に使っていたために見逃しました。

ボタンが押せることと、対象の状態が変わることは別の事象です。押せたのは手前の話で、目的は状態の変化です。だから操作の後にもう一度状態を読み、変わっているかを見る。変わっていなければ、押せていても失敗として扱う。

ここを分けておかないと、外部サービスのUIが変わったときに「操作は通っているのに何も起きない」という状態が、そのまま正常終了として記録されてしまいます。

対策3:手動実行も、cronと同じ経路で通す

3つ目は運用側の話です。手動で動かしたいときも、cronやタスクと同じ経路、つまりログに残る形で実行するようにしました。

直接叩くと記録が残りません。記録が残らない実行が混ざると、集計したグラフが嘘をつきます。実際には動かしていた日が「動いていない日」として並び、逆に手動で処理してしまった件数がどこにも計上されない、といったズレが出ます。故障の判断材料として使うつもりのログなら、抜け道を作ってはいけないと考えるようになりました。

まだ分かっていないこと

今回は外部サービスのUI変更が原因でしたが、UIが変わることを事前に検知する方法は持っていません。次のUI変更でまた壊れる可能性は残っています。今できているのは「壊れたときに、それを数字として見えるようにする」ところまでで、壊れないようにする手立てはありません。ここは正直に、分かっていない部分です。

まとめ

  • 0件のときに「対象なし」とだけ書くと、正常な日と区別できず、3日連続の停止に気づけなかった
  • 原因は外部サービスのUI変更で、ボタンは押せるが状態が変わらない状態だった
  • エラーが出ないため、ログ上は正常終了に見えていた
  • 0件でも数字で書く(例:解除 0件 / 保護 41件)。数字なら並べて比較できる
  • 操作後に状態が変わったかを確認する。押せた≠変わった
  • 手動実行もcronやタスクと同じ経路でログに残す。直接叩くとグラフが嘘をつく
  • UI変更そのものを事前に検知する方法は、まだ持っていない