Feedforce Developer Blog

フィードフォース開発者ブログ

月末に起動したいバッチを sidekiq-cron で指定し、healthchecks.io で監視する

こんにちは。id:masutaka26 です。

去年の 6/30 からジムに通い始めて、なんとか週に 2~3 のペースで続いています。サプリメントも半信半疑ながら毎日飲んでいますが、ドラッグストアや Amazon で買うと割と高いと思います。

個人的には iHerb がだいぶオススメです。以前 3.6kg のプロテインを買ったらなぜかキャンペーンが適用されて、30% オフの 6,517 円になりました。

さらにこの案件動画を見て、プレワークアウトサプリ(C4 SPORT)にも手を出してしまいました。BCAA も飲んでいます。

Twitter とかで検索すると、初回 10% OFF の紹介コードが見つかると思います。さらにお得です。

何の記事でしたっけ...?そうだ、この記事は Feedforce Advent Calendar 2019 の 5 日目の記事です!

昨日は id:kano-e の「2019 年に会社ボドゲ棚から自宅に持ち帰ったボドゲたち」でした。変わらぬボドゲ愛・・・!

ff-boardgame.hatenablog.com

sidekiq-cron で月末を指定する

脈絡ありませんが、sidekiq-cron では last で月末を指定することが出来ます。

例えば 0 12 last * * Asia/Tokyo の次回実行は 2019/12/31 12:00 JST です。2019/11/30 12:00 JST は無事動きました。

このような設定になります。

sample_job:
  active_job: true
  cron: "0 12 last * * Asia/Tokyo"
  class: "SampleJob"
  queue: default

この cron 書式は sidekiq-cron が依存する fugit による実装です。

確認はしていませんが、last の他にも -1L などが使えるようです。

🔗 https://github.com/floraison/fugit/blob/v1.3.3/spec/cron_spec.rb#L734-L747

context 'negative monthdays' do

  [
    [ '* * -1 * *', '* * -1 * *' ],
    [ '* * -7--1 * *', '* * -7,-6,-5,-4,-3,-2,-1 * *' ],
    [ '* * -1--27 * *', '* * -31,-30,-29,-28,-27,-1 * *' ],
    [ '* * -7--1/2 * *', '* * -7,-5,-3,-1 * *' ],
    [ '* * L * *', '* * -1 * *' ],
    [ '* * -7-L * *', '* * -7,-6,-5,-4,-3,-2,-1 * *' ],
    [ '* * last * *', '* * -1 * *' ],
  ].each { |c, e|
    it("parses #{c}") { expect(Fugit::Cron.parse(c).to_cron_s).to eq(e) }
  }
end

negative monthdays って表現は面白い。

healthchecks.io で月末のバッチを監視する

バッチが本当に起動したかを監視するのは難しいと思います。月末の監視はさらに難しいと思います。

過度な依存は禁物ですが、healthchecks.io は選択肢に入れても良いかもしれません。以下の記事をどうぞ。

developer.feedforce.jp

前述の cron 設定だと 0 12 l * * で監視することが出来ます。l は小文字のエルです。

terraform-provider-healthchecksio の設定例です。

resource "healthchecksio_check" "sample_job" {
  name     = "SampleJob"
  tags     = ["production"]
  grace    = "60"
  schedule = "0 12 l * *"
  timezone = "Asia/Tokyo"
  channels = [data.healthchecksio_channel.slack.id]
}

data "healthchecksio_channel" "slack" {
  kind = "slack"
}

こちらの cron 書式は healthchecks が依存する croniter による実装です。

l 以外の指定は見当たりませんでした。

🔗 https://github.com/taichino/croniter/blob/0.3.29/src/croniter/tests/test_croniter.py#L209-L223

def testLastDayOfMonth(self):
    base = datetime(2015, 9, 4)
    itr = croniter('0 0 l * *', base)
    n1 = itr.get_next(datetime)
    self.assertEqual(n1.month, 9)
    self.assertEqual(n1.day, 30)
    n2 = itr.get_next(datetime)
    self.assertEqual(n2.month, 10)
    self.assertEqual(n2.day, 31)
    n3 = itr.get_next(datetime)
    self.assertEqual(n3.month, 11)
    self.assertEqual(n3.day, 30)
    n4 = itr.get_next(datetime)
    self.assertEqual(n4.month, 12)
    self.assertEqual(n4.day, 31)

2019 年もそろそろ終わりです。年末にだけ動くバッチを設定&監視するのも良いかもしれません。

明日は、こばりゅうの記事です。ひこうきかっけー!?お楽しみに。