太卷了,史上最簡單的監(jiān)控系統(tǒng) catpaw 簡介
指標(biāo)監(jiān)控的痛點
當(dāng)下比較流行的監(jiān)控系統(tǒng),比如 Prometheus、Nightingale、VictoriaMetrics,都是基于數(shù)值型指標(biāo)的監(jiān)控系統(tǒng),這類監(jiān)控系統(tǒng)的痛點在于:告警的時候只能拿到異常值,以及有限的幾個標(biāo)簽,難以拿到更詳細(xì)的信息。比如 HTTP 探測監(jiān)控,通常用監(jiān)控值表示不同的錯誤:
告警的時候,比如你收到一個異常值,說訪問?http://x.com?異常了,異常值是 3,需要比較資深的人才能知道這個異常是 DNS 解析失敗,對于普通研發(fā),就會很懵。當(dāng)然了,我們可以在告警規(guī)則的備注里把這個異常值和錯誤消息的對應(yīng)關(guān)系寫上,但總覺得這樣不太優(yōu)雅。如果我們能在告警的時候,把詳細(xì)錯誤信息也一并告訴接收者,那就更好了。比如,我們更希望的是收到類似下面的信息:

本文看完,就可以做到上圖的效果了,我們繼續(xù)。
當(dāng)然了,也可以用日志系統(tǒng)來做這類監(jiān)控,比如 ElasticSearch、Loki,然后輔以一個周期性查詢的告警引擎就可以了。但是整個架構(gòu)就復(fù)雜了,另外,如果還要考慮告警接收人管理、告警媒介對接管理、告警觸達(dá)策略、降噪規(guī)則、靜默規(guī)則、抑制規(guī)則、排班、認(rèn)領(lǐng)、升級等等,那就更復(fù)雜了,有沒有輕量的工具可用?
思路
最輕量的工具,顯然是 SaaS 類工具,無需部署、維護,即開即用,快貓星云提供了?FlashDuty,用于聚合接收各個監(jiān)控系統(tǒng)的告警事件,比如 Prometheus、Zabbix、Nightingale、公有云云監(jiān)控,提供告警事件的統(tǒng)一納管、靈活派發(fā)、靜默、排班認(rèn)領(lǐng)升級等功能,這里不再贅述。基本上,可以認(rèn)為 FlashDuty 已經(jīng)完成了事件后續(xù)處理的所有功能。如果我們能有一個工具,可以產(chǎn)出告警事件,然后把告警事件推送到 FlashDuty,那就可以實現(xiàn)非常完備的功能了。而且 FlashDuty 是 SaaS 化的,無需維護,我們只需要搞一個輕量的小工具跑在自己的環(huán)境下采集異常事件即可,這個小工具就是 catpaw。
適合的場景
catpaw 不能取代指標(biāo)監(jiān)控和日志系統(tǒng),它只是一個輕量的 check 工具,一些場景舉例:
探測某個 HTTP 地址,如果不可用,把不可用的原因發(fā)出來
探測某個 TCP 地址,如果不可用,把不可用的原因發(fā)出來
探測某個文件,如果文件不存在,或者 MD5 發(fā)生變化,發(fā)出告警事件
探測 ulimit 配置,如果發(fā)現(xiàn)不合理,發(fā)出告警事件
探測目錄是否可讀可寫,如果異常發(fā)出告警事件
探測是否有目錄已寫滿,如果寫滿的目錄,發(fā)出告警事件,把?
df -h
?的結(jié)果一并發(fā)出來探測某個進(jìn)程是否存在,如果不存在,發(fā)出告警事件
探測 MySQL 慢查詢,如果發(fā)現(xiàn)慢SQL,發(fā)出告警事件,事件中帶上SQL
探測 MySQL 主從延遲,如果延遲超過閾值,發(fā)出告警事件,事件中帶上延遲時間以及兩個 Thread 的情況
接收 SNMP Trap 消息,如果消息中包含某個關(guān)鍵字,發(fā)出告警事件
檢查系統(tǒng)日志,如果出現(xiàn)某個關(guān)鍵字,告警,把日志詳情一并發(fā)出來
….
更多場景不再贅述,其特點基本上可以概括為:
check 的時候已經(jīng)可以知道是否正常
check 的時候大概率可以拿到異常原因或者現(xiàn)場值,把這些信息一并發(fā)出來
其實吧,這就是 nagios 的邏輯,只不過 nagios 安裝復(fù)雜、組件散亂、缺少 FlashDuty 這樣的事件后續(xù)處理能力。我更想要的是一個輕量的事件采集器,配置 FlashDuty,完美。
catpaw 的安裝
catpaw 剛剛開始,目前只提供了 Linux 版本,下載地址:https://download.flashcat.cloud/catpaw-v0.1.1-linux-amd64.tar.gz
下載解壓縮,可以看到如下文件:
其中:
catpaw:二進(jìn)制文件
conf.d:配置文件目錄,下面的 config.toml 是主配置,p.exec 和 p.http 是插件配置,目前只提供了這兩個插件,exec 插件可以自定義腳本,提供了無限可能
scripts:一些示例腳本
主配置
config.toml 的內(nèi)容:
flashduty.url 需要去?FlashDuty?獲取,地址在這里:https://console.flashcat.cloud/,可以免費注冊,注冊之后,系統(tǒng)會自動引導(dǎo)你創(chuàng)建一個協(xié)作空間,然后在協(xié)作空間下,添加告警接入專屬集成就可以了:

點擊剛才創(chuàng)建的自定義集成,我的自定義集成取名為 catpaw,點擊之后出現(xiàn)右側(cè)抽屜側(cè)拉板。

FlashDuty 如果使用過程有問題,可以聯(lián)系我,我會幫助你解決。注冊進(jìn)來默認(rèn)有兩周的全功能免費試用期,試用期過后,如果你覺得不錯,可以繼續(xù)使用(有免費版、標(biāo)準(zhǔn)版、專業(yè)版三個版本),如果你覺得不好用,扔一邊就好,無需有壓力。
插件配置
當(dāng)前是 v0.1.1 版本,只提供了兩個插件,http 插件和 exec 插件,exec 插件可以自定義腳本,所以,提供了無限擴展可能,下面我們分別介紹。
http 插件
http 插件的配置文件是 conf.d/p.http/http.toml,內(nèi)容如下:
看起來配置很多,實際非常清晰,我做一個簡單講解。要探測 HTTP 地址,只需要在 targets 里面填寫即可,可以填寫多個,每個地址用雙引號包裹,多個地址用逗號分隔,如下:
比如我們把公司依賴的所有第三方接口都配置在這里,那可能有好幾百個,探測的時候最好要控制一下并發(fā)度,所以提供了 concurrency 配置,可以控制并發(fā)度。interval 是探測頻率,如果不配置,就使用全局的探測頻率。labels 是附加標(biāo)簽,這些標(biāo)簽會附加到這個?[[instances]]
?產(chǎn)生的所有事件上。
下面的 http_proxy、interface、method、timeout、follow_redirects、basic_auth_user、basic_auth_pass、headers、payload、use_tls、tls_ca、tls_cert、tls_key、insecure_skip_verify 這些都是 http 客戶端的配置,catpaw 作為一個 http 客戶端,向 targets 中的地址發(fā)探測請求,需要有一些基本的配置,看起來配置項挺多,都可以維持默認(rèn)值,不需要修改。
其中,有些公司會使用自簽證書,此時需要配置:
接下來是?[instances.expect]
?部分,配置了一些期望,比如期望返回狀態(tài)碼是 20x 或者 30x,期望返回的 body 中包含 html 字符串,期望證書過期時間大于 72 小時,如果不滿足期望,就會觸發(fā)告警。
接下來是?[instances.alerting]
?部分,配置了告警的一些參數(shù),比如告警是否啟用、告警觸發(fā)要求的持續(xù)時長(類似 Prometheus 的 for 關(guān)鍵字)、告警的級別、告警的重復(fù)次數(shù)、告警的重復(fù)間隔、是否通知恢復(fù)等等。
targets 中可以配置一個假地址,比如?http://a.cn
,這樣待會啟動 catpaw 之后立馬就可以看到效果。
exec 插件
exec 插件核心是指定要執(zhí)行的腳本路徑,比如我的一個配置樣例:
其他都可以維持默認(rèn),exec 插件的?[instances.alerting]
?沒有指定 severity,因為 exec 插件的腳本是自行控制 severity(通過腳本的 stdout),大家看一下 scripts 目錄下的樣例腳本就知道了。
比如 ulimit.sh :
這個腳本的作用是 check 系統(tǒng)的 ulimit 配置,默認(rèn) Linux 句柄限制是 1024,生產(chǎn)環(huán)境顯然是不夠用的,所以我們可以通過這個腳本來檢查 ulimit 配置,如果低于 2048,就觸發(fā)告警。
腳本的輸出是一個 json 數(shù)組,每個元素是一個事件,事件的字段有:
event_status:事件狀態(tài),可選值:Ok、Info、Warning、Critical
labels:附加標(biāo)簽,這些標(biāo)簽會附加到這個事件上,不同的事件就是通過 labels 來區(qū)分的
title_rule:事件標(biāo)題,支持模板,模板中的變量是 labels 中的字段(具體可以查閱剛才提到的 FlashDuty 的文檔)
description:事件描述,可以使用 markdown 格式
啟動測試
我們只是修改了 config.toml 中的 flashduty.url,exec.toml 中的 scripts 路徑,其他都維持不變,啟動測試:
./catpaw --configs conf.d
啟動之后,可以看到控制臺輸出了一些信息,產(chǎn)生了 3 條告警事件,推給了 FlashDuty,F(xiàn)lashDuty 也收到了告警,如下圖:

這里我點擊 HTTP check failed 這個告警,可以看到詳情:

描述信息是 markdown 的,可以明顯看到是 DNS 的問題(lookup x on x:53: no such host 是典型的 DNS 報錯),非常清晰。
測試恢復(fù)消息
這里我手工修改 scripts 下的 demo.sh,把 event_status 返回 Ok:
稍等一下下,F(xiàn)lashDuty 就會收到恢復(fù)消息:

點擊告警詳情,點開關(guān)聯(lián)事件,可以看到 Ok 的事件:

總結(jié)
Catpaw 是一個非常簡單的告警工具,它的核心是插件機制,插件機制使得 Catpaw 可以很容易地擴展,比如我想要一個插件,可以檢查 MySQL 的連接數(shù),那么我只需要寫一個腳本,輸出事件 json 數(shù)組,然后配置到 exec 插件中,就可以了。
當(dāng)然,后面我們也會把更多常見的場景直接內(nèi)置到 catpaw 的二進(jìn)制中,開箱即用。各位老鐵,有好的腳本,歡迎提交到?https://github.com/flashcatcloud/catpaw-scripts,群策群力,爭取搞個牛逼的腳本庫,我們會把好的腳本合并到 catpaw 的二進(jìn)制中,方便大家使用,一起來吧!