毎晩クラウドで自動で動かしていたデータ集めが、約7週間、1件も集めていなかった。しかもエラーは一度も出ず、毎回「0件で正常終了」。気づいたときには、8月の終わりから10月の中ごろまでのデータが丸ごと抜けていました。
個人で作っている、競馬のレース結果を使ったデータ分析の練習用プログラムで起きたことです。この記事では、なぜ「0件で成功」になったのか、どう直したのか、そして「止まったら知らせる」しくみを足したら今度は誤報が鳴った話までをまとめます。定期実行(cron)で何かを動かしている人の参考になればうれしいです。
何が起きたか
しくみは単純です。GitHub Actions の定期実行で毎晩プログラムを動かし、前日のレースの結果を集めて、データのファイルに足していきます。手元の PC は使わないので、寝ている間に勝手にたまっていく、はずでした。
ところが、ある日データを見ると、8月末から10月中旬までが空っぽでした。実行の記録を見ても、全部「成功」の緑のマーク。中身を見ると、どの回も「0件」でした。
なぜ「0件で成功」になったのか

原因は、定期実行が時間どおりに動かないことでした。無料で使っている定期実行は、混んでいると予定より遅れて動くことがあります。この環境では、4〜10時間遅れることがありました。
夜に動く予定が、日付が変わったあとの朝に動く。プログラムは「前日」を「動いた日の前の日」として計算していたので、遅れて動いた日は、まだ終わっていない「今日」のレースを見にいっていました。結果がまだ無いので0件。でも、プログラムとしては「0件だった」というだけで、失敗ではありません。だから毎回、成功として終わっていたのです。
どう直したか
- 正午ルール:動いた時刻が正午より前なら、前日の分を集める。遅れて朝に動いても、ちゃんと前の日を見にいく
- 日付の決め方を変える:「今の時刻から前日を出す」のではなく、レースの日付から、どの開催を集めるかを決める
- 後から埋める処理:抜けた期間を指定して集め直す処理(backfill)を作り、7週間分を全部取り戻した
「止まったら知らせる」を足したら、誤報が鳴った
7週間も気づかなかったのが一番の問題です。そこで、データの抜けを調べて、抜けていたらクラウドの実行をわざと失敗にして、メールで知らせるチェックを足しました。
ところが今度は、データはそろっているのに失敗の知らせが来ました。チェック自体が外のページを見にいっていて、相手側が一時的にエラーを返したときに、チェックそのものが落ちていたのです。
そこで、外が一時的にエラーのときは手元のデータだけで判定するようにし、さらに2日続けて抜けたときだけ失敗にしました。1日だけの遅れや、相手側の調子の悪さでは鳴らないようにしています。
定期実行を使う人へ
- 無料の定期実行は時間どおりに動かない前提で作る。「いつ動いても同じ結果になる」ようにしておく
- 「前日」「今日」を動いた時刻から計算しない。日付は、集めたい対象の側から決める
- 0件は成功ではない。何件取れたかを毎回残し、ふだん0件にならないものが0件なら知らせる
- 見張りのしくみも壊れる。外の調子に左右されないようにし、続けて起きたときだけ知らせると誤報が減る
- 抜けたときのために、後から埋め直す方法を先に用意しておく
まとめ
- 定期実行が数時間遅れて日付が変わり、「今日」の分を見て0件になっていた
- エラーにならないので、約7週間気づかなかった
- 正午ルールと後から埋める処理で直し、2日続けて抜けたら知らせるようにした
ほかにも、個人開発でつまずいた話を書いています。作ったアプリは 作ったもの にまとめています。
ナノトイラボ 