失敗の通知が、失敗と同じ理由で届かないとき:定期処理の通知を3通りに分けてログに残す

何をしたかったか:定期処理を「誰かが見ている」状態にする

TechAthletes では、記事の公開・集計・バックアップのように毎日決まった時刻に動く処理を、共通の起動用の包み(ラッパー)から動かしています。この包みは、処理の開始と終了をそれぞれ1行ずつログに残します。そして終了コードが0でなければ、社内チャットへ通知します。

通知は最初からONにしています。通知の無い定期処理は、「回っているつもりで、実は誰も見ていない」状態になるからです。失敗したら知らせが来る、来なければ問題なし。この前提で運用していました。

この記事は、その前提が崩れた日の記録です。

何が起きたか:通知そのものが飛ばなかった

2026-09-28 の 13:39、ある定期処理が失敗しました。原因はネットワークが切れていたことでした。

ここまではよくある失敗です。問題はこの後でした。失敗を知らせるはずの通知も、同じ理由で送れなかったのです。ネットワークが切れていては、社内チャットに届けようがありません。ログに残ったのは「通知できなかった」の1行だけでした。処理の終わりと通知の結果は、ログでは次のように出ていました。

END          rc=1
NOTIFY-FAILED rc=1

END の行は処理が終了コード1で終わったこと、NOTIFY-FAILED の行は通知を送ろうとして送れなかったことを表しています。チャットには何も届いていません。

この「通知できなかった」がどれくらい起きているか数えてみると、この日の1件だけでした。めったに起きないが、起きると何も届かない失敗です。失敗を知らせる経路が、失敗の原因に巻き込まれていました。

何が分かったか:「通知が来ていない」は「失敗が無かった」と見分けられない

この件で一番大きかったのは、通知が抜けたことよりも、受け取る側から見て区別がつかないことでした。

通知が飛ばなかったとき、ログに残るのは終了コードの行だけになります。チャットを見ている側にとっては、

  • 処理が成功したので、通知が来なかった
  • 処理は失敗したが、通知が届かなかった

のどちらも「何も来ていない」という同じ見え方になります。通知を「失敗したら来るもの」として使っている限り、届かなかった失敗は成功と同じ顔をして紛れ込みます。

通知先の設定が抜けている場合も、やはり「何も来ない」になります。つまり「何も出ていない」には、少なくとも3つの意味が混ざっていました。

どう直したか:撃ち直しと、結果を3通りの言葉で残すこと

包みの側を、次のように変えました。

  • 通知が送れなかったら、ネットワークが戻るのを待って1回だけ撃ち直す。待つのは最大120秒。
  • それでも送れなければ、「通知できなかった」を必ずログに残す。黙って飛ばさない。
  • 通知先の設定が無い場合も、「設定が無いので通知しなかった」と残す。

そのうえで、通知の結果を必ず次の3通りのどれかで記録するようにしました。

ログに残す言葉 意味
通知した 送れた
通知できなかった 送ろうとして送れなかった(ネットワーク断など)
通知しなかった 送り先の設定が無い

大事なのは、3つを別の言葉にしたことです。「通知していない」の1語にまとめてしまうと、送れなかったのか、そもそも送る設定が無かったのかが後から分かりません。「何も出ていない」を「問題なし」と読まないために、言葉を分けています。

撃ち直しは、ネットワークが待っている間に戻れば通知を届けるための手当てです。3通りの記録は、撃ち直しても届かなかったときに「届かなかった」という事実を残すための手当てです。役割が違うので、両方入れています。

対策をどこに当てるか

1つ気をつけていることがあります。今回の対策は、どれも報告の側の対策です。通知を届きやすくし、届かなかったことが分かるようにしました。けれども、ネットワーク断で処理そのものが失敗したことは、これでは変わりません。

**報告の側に当てた対策では、処理そのものは直らない。**通知を直したことで「直った」と思い込むと、元の失敗はそのまま起き続けます。対策を入れたら、「その対策は、起きた失敗そのものを再現できるか」を確かめるようにしています。

業務に置き換えると

自社の定期処理や自動化を点検するときは、次の点を確かめてみてください。

  • **定期処理に通知が付いているか。**付いていなければ、回っているつもりで誰も見ていない状態になっています。
  • **「通知が届かなかったこと」も残るか。**届かない通知は、無いのと同じです。送れなかったという事実が、ログなどどこかに残るかを見ます。
  • **通知の経路が、障害の原因に巻き込まれないか。**ネットワーク障害の通知をネットワークで送るように、失敗と通知が同じ弱点を抱えていないかを考えます。
  • 「通知が来ていない」と「失敗が無かった」を見分けられる言葉がログにあるか。「送れた」「送れなかった」「送る設定が無い」を別々に記録しておけば、後から読み違えません。
  • **入れた対策が、起きた失敗そのものを再現できるかを確かめたか。**報告の改善と処理の改善は、別物として扱います。

この記事は、TechAthletes が自社のサービスを作る中で記録した実測をもとに書いています。業務への導入のご相談は 仕事の窓口 で受け付けています。

✨ Claudeエージェントを複数走らせるならAgent Desk
Terminal tile manager for macOS。全ソース付き $10 買切り。
Agent Desk を見る →

投稿者 TechAthletes 編集部

TechAthletes は、AI・クラウド・開発ツールの技術記事を公開しているメディアです。記事内の商品リンクには広告(アフィリエイトリンク)が含まれます。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

Click to listen highlighted text!