通常在設定 Nagios 監控的時候都會直接訂一個監控水位,例如:CPU 80% 後就噴 Alert 這是一般監控大家的設定方法,但是你可能會有在某些特殊情況需要例外處理,像是:
- 該設備平時僅有 20% 的 CPU 使用率。
- 該設備在凌晨 00:00 ~ 01:00 跑 Job 的時候會持續約 1 小時處於 CPU 90% 的情況。
通常遇到上面這種狀況會有幾種方式可以解:
- 調整監控靈敏度:以 30 min 為單位,當有 2 個以上 datapoint 時才發 Alert。
- 建立 maintain 時間:調整 time period 在 00:00 ~ 01:00 該 Service / Host 不發 Alert。
調整監控靈敏度
由於該設備的 CPU 高峰期只有 00:00 ~ 01:00 這個時段,所以直接把監控閥值拉到 90% 並不合理,容易讓真正需要處理的應急時間縮短。
建立 maintain 時間
單純就 maintain 時間算是最簡單的作法,但是會需要針對該設備處理 time period 的設定值,不是不行,但是不好處理。
會造成這樣的情況其實可以從造成此情況的 Job 著手,用批次的 Job 分散 Loading,但很不幸的在目前維護的環境要改該 Job 並不容易,所以必須從 Nagios 著手處理,也避免之後會有相同的情況發生。
利用 nagios.cmd 控制 maintain 時間
後來查了一下,其實 Nagios 本身有支援 External Commands 讓你「主動」去控制目前的監控,有了這個方式就可以自己寫 Shell Script 彈性去控制什麼時候哪個設備要 maintain 囉!
假設我希望在 00:00「停止」 server01 的 check_cpu 這個服務,可以用 DISABLE_SVC_NOTIFICATIONS 這樣執行:
$ printf "[%lu] DISABLE_SVC_NOTIFICATIONS;%s;%s\n" $(date +%s) server01 check_cpu > /opt/nagios/var/rw/nagios.cmd
反之,要開啟的話則改用 ENABLE_SVC_NOTIFICATIONS
$ printf "[%lu] ENABLE_SVC_NOTIFICATIONS;%s;%s\n" $(date +%s) server01 check_cpu > /opt/nagios/var/rw/nagios.cmd
Nagios notification controller 自動化工具
簡單知道怎麼用之後,就可以用 Shell Script 來寫自動化了,在 shazi7804/nagios-notification-controller 這個專案我利用 CSV 的檔案去設定 Host 在每天的特定時段進入 maintain 時間
在使用之前必須確認你的 nagios.cmd 位置在哪,預設定義位置在 /opt/nagios/var/rw/nagios.cmd
可以自行修改。
透過 config.conf 去設定需要 schedule maintain 的服務即可
web01,check_cpu,00:00,01:00
web02,check_cpu,00:00,01:00
web03,,00:00,01:00
以上述的範例檔
- 第一個欄位為定義 Host (require)
- 第二個欄位為定義 Service (option)
- 第三個欄位為定義 Downtime (require)
- 第三個欄位為定義 Startime (require)
如果當前時間在 Downtime ~ Startime 的時間內就會進入 maintain 時間,以 web01 來說當時間為 00:00 ~ 01:00 時,check_cpu 這個 Alert 就不會發監控。
透過這樣的方式可以跑 cronjob 讓這個 controller 去檢查是否於 maintain time
*/1 * * * * root /opt/nagios-controller/nagios-controller
然後就不用煩惱時常一堆假警報怎麼處理了 …