之前新東方的老師分享了他們通過 Telegraf、Loki、Nightingale 等工具來監控機器硬體狀態的方案,具備很強的靈活性、平臺性。本文會介紹一個相對輕量的方式,只需要一個二進位+一個腳本即可搞定,給各位朋友提供一種新的選擇 ...
之前新東方的老師分享了他們通過 Telegraf、Loki、Nightingale 等工具來監控機器硬體狀態的方案,具備很強的靈活性、平臺性。本文會介紹一個相對輕量的方式,只需要一個二進位+一個腳本即可搞定,給各位朋友提供一種新的選擇。
新東方的方案
物理機可以通過帶外開啟 SNMP,通過 SNMP 可以獲取各個硬體模塊的健康狀態,Telegraf 提供了很多 input、output 插件,我們可以使用 Telegraf 的 snmp input 插件採集硬體狀態信息,使用 loki output 插件寫入 Loki,然後使用 Nightingale 做告警規則配置( Loki 相容 Prometheus 的 Querying 介面),產出告警事件,之後可以發給釘釘、企微,或者發給 FlashDuty 做告警聚合降噪、排班、認領、升級等後續處理。
實操步驟
1. snmp 插件準備
snmp監控主要通過各種oid節點獲取對應信息,分為get(單值)、walk(多值),telegraf的snmp插件預設是取單值,如果需要多值,可以找對應的table類型節點進行採集。
# 單值節點
[[inputs.snmp.field]]
name="uptime"
oid=".1.3.6.1.2.1.1.3.0"
# 多值節點,table類型
[[inputs.snmp.table]]
oid = ".1.3.6.1.2.1.31.1.1"
name = "interface"
2. OID節點查找
不同型號的物理機,oid節點不同,可以通過對應型號的MIB文件進行查找。除了單獨查找每個硬體的狀態oid外,MIB文件中一般還能找到伺服器整體狀態的OID節點,可以直接取這個值,以下例子為浪潮伺服器:
正常取值為"OK"、“Normal”,有報警的話取值為"WARNING"、“CRITICAL”。
採集OID=‘INSPUR-MIB::serverSystemHealthTable’(轉換數字為’.1.3.6.1.4.1.37945.2.1.2.13.1’),可以先用snmpwalk命令看下取值:
#正常節點
snmpwalk -v3 1.1.1.1 INSPUR-MIB::serverSystemHealthTable
INSPUR-MIB::serverCurPowerState."" = STRING: "Power On"
INSPUR-MIB::serverUIDState."" = STRING: "UID Off"
INSPUR-MIB::serverCPUState."" = STRING: "OK"
INSPUR-MIB::serverMemoryState."" = STRING: "OK"
INSPUR-MIB::serverHDDState."" = STRING: "OK"
INSPUR-MIB::serverFANState."" = STRING: "OK"
INSPUR-MIB::serverPSUState."" = STRING: "OK"
INSPUR-MIB::serverRAIDState."" = STRING: "OK"
INSPUR-MIB::serverTempState."" = STRING: "OK"
INSPUR-MIB::serverHealthState."" = STRING: "OK"
#異常節點
snmpwalk -v3 2.2.2.2 INSPUR-MIB::serverSystemHealthTable
INSPUR-MIB::serverCurPowerState."" = STRING: "Power On"
INSPUR-MIB::serverUIDState."" = STRING: "UID Off"
INSPUR-MIB::serverCPUState."" = STRING: "OK"
INSPUR-MIB::serverMemoryState."" = STRING: "WARNING"
INSPUR-MIB::serverHDDState."" = STRING: "OK"
INSPUR-MIB::serverFANState."" = STRING: "OK"
INSPUR-MIB::serverPSUState."" = STRING: "OK"
INSPUR-MIB::serverRAIDState."" = STRING: "OK"
INSPUR-MIB::serverTempState."" = STRING: "OK"
INSPUR-MIB::serverHealthState."" = STRING: "WARNING"
INSPUR-MIB::serverCPUStandardStatus."" = STRING: "Normal"
INSPUR-MIB::serverMemoryStandardStatus."" = STRING: "Warning"
INSPUR-MIB::serverHDDStandardStatus."" = STRING: "Normal"
INSPUR-MIB::serverFANStandardStatus."" = STRING: "Normal"
INSPUR-MIB::serverPSUStandardStatus."" = STRING: "Normal"
INSPUR-MIB::serverRAIDStandardStatus."" = STRING: "Normal"
INSPUR-MIB::serverTempStandardStatus."" = STRING: "Normal"
INSPUR-MIB::serverHealthStandardStatus."" = STRING: "Warning"
通過採集狀態可以看出 2.2.2.2 這個機子memory為報警狀態。具體如何配置 Telegraf,如何配置夜鶯和 Loki 對接,請參看文章:新東方老師教你使用 Telegraf + Loki + Nightingale 實現硬體監控。
既然 snmpwalk 可以拿到具體內容了,也知道要告警的關鍵字是 WARNING、CRITICAL,實際不用這麼複雜也可以告警。下麵我們介紹使用 catpaw 的方案。
catpaw 的方案
catpaw 是一個事件監控工具,提供了多種插件,從 v0.4.0 版本開始,提供了 sfilter 插件,具體邏輯是:通過執行腳本或命令獲取輸出(stdout),然後對輸出的內容做字元串匹配,如果匹配到了,就可以產生告警事件。把告警事件推給 FlashDuty 即可。
1. 安裝 catpaw
catpaw 的安裝非常簡單,只需要下載二進位文件即可,下載地址:https://download.flashcat.cloud/catpaw-v0.4.0-linux-amd64.tar.gz,目前提供的是 linux-amd64 的安裝包,如果有其他平臺的安裝包的需求,可以聯繫我。
2. 配置 sfilter 插件
sfilter 插件的配置在 conf.d/p.sfilter/sfilter.toml
,樣例如下:
[[instances]]
command = "/path/to/sfilter-scripts/system-health.sh"
# # script timeout
timeout = "10s"
# check rule name
check = "Check system health state"
# support glob
filter_include = ["*WARNING*", "*CRITICAL*"]
filter_exclude = []
# # gather interval
interval = "30s"
[instances.alerting]
## Enable alerting or not
enabled = true
## Same functionality as Prometheus keyword 'for'
for_duration = 0
## Minimum interval duration between notifications
repeat_interval = "5m"
## Maximum number of notifications
repeat_number = 3
## Whether notify recovery event
recovery_notification = true
## Choice: Critical, Warning, Info
default_severity = "Warning"
3. 編寫腳本
system-health.sh 腳本是需要我們準備的,比如就簡單的探測一下 192.168.3.4 機器的系統健康狀態(以浪潮機器舉例),腳本內容如下:
#!/bin/sh
snmpwalk -v2c -c public 192.168.3.4 INSPUR-MIB::serverSystemHealthTable
4. 配置事件推送地址
catpaw 只負責產生事件,不負責事件的後續處理(告警聚合降噪、認領升級、排班、多渠道觸達等),這些功能交由 FlashDuty,在 FlashDuty 的協作空間中創建一個自定義事件的集成,點擊就可以看到推送地址了:
把截圖中這個 URL 配置到 catpaw 的 config.toml 中。
5. 啟動 catpaw
nohup ./catpaw --configs conf.d &> catpaw.log &
如果伺服器有硬體故障,就會產生告警了,完活!enjoy…make a better world :)