你必須很努力

Day06 - 監控 Sidekiq 有無正常運作(或執行超過多久)

2021/09/19
字數統計: 497閱讀時間: 2 min

前言

去年介紹過 Day25 - Ruby on Rails 中的 Sidekiq 的介紹與應用 ,這次延伸介紹如何自行寫腳本監控 Sidekiq 是否正常運作,以及監控執行超過多久的方法 (絕不承認是擠牙膏策略

說明

網站上線後,若有使用像是 Sidekiq 或 Resque 等,非同步處理任務的 Gem 時,不會希望某個服務掛掉而影響使用者,這時可以自行寫腳本監控,看是否正常運作

示意圖

實作

ps aux 中可以看到是否有運作

1
2
3
4
5
6
7
8
9
10
11
12
13
# 判斷是否有正常運作

out = `ps aux`
total_sidekiq_count = 1
# Normal: `sidekiq 6.2.1 wms [0 of 10 busy]`
# Quiet: `sidekiq 6.2.1 wms [0 of 10 busy] stopping`
sidekiq_matcher = /sidekiq 6\.2\.1 ironman_13th_2021 \[\d+ of \d+ busy\]\s*$/
sidekiq_cnt = out.each_line.count { |line| sidekiq_matcher.match(line) }
if sidekiq_cnt != total_sidekiq_count
msg = "Sidekiq 有 #{sidekiq_cnt} 個,應該是 #{total_sidekiq_count} 個,請檢查。"

# 想做的處理,ex: Slack 通知、寄信...等
end

能知道 Sidekiq 是否正常運作,相對也能判斷每個 Job 執行多久

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 執行超過 10 分鐘的 Sidekiq job 要有提醒

current_time = Time.now.to_i
workers = Sidekiq::Workers.new
sidekiq_over_ten_min = 0
# workers.first = [
# [0] "local:41435:a7fojn24m345",
# [1] "ounxdxzrw",
# [2] {
# "queue" => "default",
# "payload" => {
# "class" => "xxx",
# "args" => [],
# "retry" => 0,
# "queue" => "default",
# "jid" => "46b49fg192950dda552h21a0",
# "created_at" => 1600743892.457303,
# "enqueued_at" => 1600743892.457865
# },
# "run_at" => 1600743892
# }
# ]
workers.each { |_process_id, _thread_id, work| sidekiq_over_ten_min += 1 if current_time - work["run_at"] > 600 }

if sidekiq_over_ten_min.positive?
msg = "Sidekiq 有 #{sidekiq_over_ten_min} 個執行超過 10 分鐘,請檢查。"

# 想做的處理,ex: Slack 通知、寄信...等
end

小結

透過腳本監控,搭配 Slack 、寄信通知,當系統異常時,可以第一時間發現並處理,避免災情擴大,但如果所有人都睡著且沒留意到手機通知,結果還是一樣 (笑

參考資料

  1. Sidekiq GitHub Wiki

鐵人賽文章連結:https://ithelp.ithome.com.tw/articles/10264574
medium 文章連結:https://link.medium.com/mtoj9Ck2Mjb
本文同步發布於 小菜的 Blog https://riverye.com/

備註:之後文章修改更新,以個人部落格為主

原文連結:https://riverye.com/2021/09/19/Day06-監控-Sidekiq-有無正常運作-或執行超過多久/

發表日期:2021-09-19

更新日期:2021-09-24

CATALOG
  1. 1. 前言
  2. 2. 說明
  3. 3. 示意圖
  4. 4. 實作
  5. 5. 小結
  6. 6. 參考資料