1. 程式人生 > >cronmon 定時任務執行狀態監控

cronmon 定時任務執行狀態監控

       cronmon是一個計劃任務(定時任務)監控系統,可以對迴圈執行的程式和指令碼進行監控告警,當其未按照預期執行時,傳送郵件到對應郵箱進行通知。同時可以將監控任務劃分到不同業務下面,每個業務可以分配不同的通知人,建立業務、通知人和監控任務的多層級關係。
 
       通過以一定的間隔傳送HTTPS請求到特定的URL實現監控。如果URL未按時接受到請求,對應的業務通知人則會收到告警。
 
       也就是說,你可以在你的計劃任務或者程式指令碼中,根據執行結果進行條件判斷,如果成功則傳送請求到cronmon,這樣的任務可以包括資料庫備份、安全掃描、資料同步等任何你認為重要的,需要保證其在指定時間間隔完成的任務。
   
   
主要功能介紹

   

  • 登入;

image

  • 登入之後,看到的是首頁:包括業務、通知人、任務和日誌相關彙總資訊,以及圖表展示一段時間API請求資料;

image

  • 任務管理相關操作:這裡是系統最核心的功能,監控任務管理,包括新建,編輯,刪除,監控日誌檢視。;

image

image

image

  • 系統管理相關操作:系統使用者角色分為二種,擁有所有許可權的系統管理員和繫結若干業務的業務管理員。在這裡,你可以新建、編輯、刪除使用者以及業務許可權分配;

image

image

image

image
  
API呼叫

  
目前API僅針對監控任務,包括獲取所有監控任務和基於關鍵字進行的任務過濾,json格式返回。

  • 獲取所有監控任務

image

  • 按指定關鍵字獲取任務(業務名、任務名和任務URL)

image

image

image

公共引數包括page(顯示第幾頁)和length(每頁顯示多少記錄)
  
如何使用監控連結

  
在不同情況下呼叫任務監控URL的寫法

  • crontab寫法
# system status check
20 * * * * cd /path/to/systemStatusCheck && ./systemStatusCheck.sh > systemStatusCheck.sh.cron.log 2>&1 && curl -kfsS --retry 3 --connect-timeout 10 --ipv4 https://cronmon.yoursite.io/api/monlink/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx >> systemStatusCheck.sh.cron.log 2>&1
  • bash寫法
curl -kfsS --retry 3 --connect-timeout 10 --ipv4 https://cronmon.yoursite.io/api/monlink/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
  • python寫法
import requests
requests.get('https://cronmon.yoursite.io/api/monlink/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')

  
生產環境

  
本部分是針對生產環境一些額外的配置優化,包括日誌表自動分割槽指令碼、程式管理服務化(linux)、nginx配置和日誌輪轉配置。

  • 服務啟停

以CentOS為例,首先編輯相關變數

image

然後將啟動指令碼(production/init.d/cronmon)放入/etc/init.d目錄

$ service cronmon help
Usage: cronmon {start|stop|restart|reload|status|help}
$ chkconfig --level 35 cronmon on  # 加入開機啟動
  • 日誌分割槽

針對日誌表資料,為了方便管理和提高效率,使用mysql分割槽,首先匯入儲存過程建立sql檔案(production/cronmonPartition.sql),
指令碼首先修改表結構,添加了複合主鍵(id+create_datetime),然後建立了所需的5個儲存過程,指令碼基於zabbix分割槽建立指令碼進行修改,執行指令碼後結果如下:

image

image

對應的shell指令碼

image

對應的crontab配置

# cronmon mysql partition
15 0 * * * cd /path/to/cronmonMysqlPartition && ./cronmonMysqlPartition.sh > cronmonMysqlPartition.sh.cron.log 2>&1 && curl -kfsS --retry 3 --connect-timeout 10 --ipv4 https://cronmon.yoursite.io/api/monlink/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx >> cronmonMysqlPartition.sh.cron.log 2>&1
  • WebService配置

以nginx為例

image

  • 日誌輪轉

以logrotate為例

image
  
壓力測試

  
本系統主要的壓力是客戶端對監控URL的請求,而網站本身操作的壓力以及API請求的壓力相對較小,有鑑於此,針對此部分進行了壓力測試。

  • 配置調整

uwsgi相關配置

[uwsgi]
listen=10240
processes=8
gevent=100

系統相關配置

# echo 'net.core.somaxconn=4096' >> /etc/sysctl.conf
  • 壓測表現

使用ab對監控連結進行壓力測試,10000併發無錯誤(目前只測試到10000併發,未測試更高併發),客戶端和服務端網路延遲在11ms左右:

$ ab -n 50000 -c 10000 https://cronmon.yoursite.com/api/monlink/ba60afc4-f162-11e8-a56a-001b7872e686

image

獲取幫助

如果想進一步瞭解安裝配置,資料庫變更和系統網站的功能可以點選github