【個人開発】毎晩の自動データ集めが7週間「0件で成功」していた|定期実行の遅れと止まったことに気づくしくみ

毎晩の自動データ集めが7週間0件で成功していた

※このサイトの記事内では広告を掲載している場合があります。

毎晩クラウドで自動で動かしていたデータ集めが、約7週間、1件も集めていなかった。しかもエラーは一度も出ず、毎回「0件で正常終了」。気づいたときには、8月の終わりから10月の中ごろまでのデータが丸ごと抜けていました。

個人で作っている、競馬のレース結果を使ったデータ分析の練習用プログラムで起きたことです。この記事では、なぜ「0件で成功」になったのか、どう直したのか、そして「止まったら知らせる」しくみを足したら今度は誤報が鳴った話までをまとめます。定期実行(cron)で何かを動かしている人の参考になればうれしいです。

何が起きたか

しくみは単純です。GitHub Actions の定期実行で毎晩プログラムを動かし、前日のレースの結果を集めて、データのファイルに足していきます。手元の PC は使わないので、寝ている間に勝手にたまっていく、はずでした。

ところが、ある日データを見ると、8月末から10月中旬までが空っぽでした。実行の記録を見ても、全部「成功」の緑のマーク。中身を見ると、どの回も「0件」でした。

なぜ「0件で成功」になったのか

定期実行が数時間おくれて日付が変わり、今日の分を見て0件になっていた流れと、直したあとの流れの図

原因は、定期実行が時間どおりに動かないことでした。無料で使っている定期実行は、混んでいると予定より遅れて動くことがあります。この環境では、4〜10時間遅れることがありました。

夜に動く予定が、日付が変わったあとの朝に動く。プログラムは「前日」を「動いた日の前の日」として計算していたので、遅れて動いた日は、まだ終わっていない「今日」のレースを見にいっていました。結果がまだ無いので0件。でも、プログラムとしては「0件だった」というだけで、失敗ではありません。だから毎回、成功として終わっていたのです。

どう直したか

  • 正午ルール:動いた時刻が正午より前なら、前日の分を集める。遅れて朝に動いても、ちゃんと前の日を見にいく
  • 日付の決め方を変える:「今の時刻から前日を出す」のではなく、レースの日付から、どの開催を集めるかを決める
  • 後から埋める処理:抜けた期間を指定して集め直す処理(backfill)を作り、7週間分を全部取り戻した

「止まったら知らせる」を足したら、誤報が鳴った

7週間も気づかなかったのが一番の問題です。そこで、データの抜けを調べて、抜けていたらクラウドの実行をわざと失敗にして、メールで知らせるチェックを足しました。

ところが今度は、データはそろっているのに失敗の知らせが来ました。チェック自体が外のページを見にいっていて、相手側が一時的にエラーを返したときに、チェックそのものが落ちていたのです。

そこで、外が一時的にエラーのときは手元のデータだけで判定するようにし、さらに2日続けて抜けたときだけ失敗にしました。1日だけの遅れや、相手側の調子の悪さでは鳴らないようにしています。

定期実行を使う人へ

  • 無料の定期実行は時間どおりに動かない前提で作る。「いつ動いても同じ結果になる」ようにしておく
  • 「前日」「今日」を動いた時刻から計算しない。日付は、集めたい対象の側から決める
  • 0件は成功ではない。何件取れたかを毎回残し、ふだん0件にならないものが0件なら知らせる
  • 見張りのしくみも壊れる。外の調子に左右されないようにし、続けて起きたときだけ知らせると誤報が減る
  • 抜けたときのために、後から埋め直す方法を先に用意しておく

まとめ

  • 定期実行が数時間遅れて日付が変わり、「今日」の分を見て0件になっていた
  • エラーにならないので、約7週間気づかなかった
  • 正午ルールと後から埋める処理で直し、2日続けて抜けたら知らせるようにした

ほかにも、個人開発でつまずいた話を書いています。作ったアプリは 作ったもの にまとめています。

コメントを残す

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

CAPTCHA