夜鶯(ying)監控設(she)計(ji)思考(四(si))關于機器那些事兒
這(zhe)將是一個系列(lie),講(jiang)解(jie) 的設(she)計(ji)(ji)思考,可以理解(jie)為原理+最佳實踐(jian)+產品(pin)設(she)計(ji)(ji)時的折中取(qu)舍。
本系列其他文章:
本篇聊聊夜鶯里跟機(ji)(ji)器相關的(de)那(nei)些事,機(ji)(ji)器的(de)數據采(cai)集(ji)、機(ji)(ji)器的(de)歸組打標簽、機(ji)(ji)器的(de)元信息、機(ji)(ji)器的(de)告警分派等。
前言
機器(qi)這個概念,在監控(kong)系(xi)統里具有比(bi)較(jiao)特殊的場景。核心是因為(wei)兩個原(yuan)因:
- 機器上面的服務有時會混部,導致機器和業務程序之間的對應關系不好搞(這就是對待機器不能像對待 Pod 的原因)
- 采集器 agent 通常部署在機器上,對于機器的管理也會影響采集器的管理(很多新的可觀測性廠商在宣傳的 Fleet 機制,就是側重在采集層面,agent 最終要部署到機器上,所以機器和采集器有很多關聯)
Zabbix、Open-Falcon 等,對機器(qi)概(gai)念都有額(e)外的抽象建模,Prometheus 生(sheng)態則完全忽略機器(qi)概(gai)念的特(te)殊性(xing),走向了另一個極(ji)端。
夜鶯(ying)監控(Nightingale)則站在(zai)二者(zhe)中間,既想遵從 Prometheus 生態的(de)玩法,又想給(gei)機器(qi)場景(jing)(jing)(jing)做(zuo)一些額外的(de)支持,稍微有點擰巴。不過產品是(shi)為業務場景(jing)(jing)(jing)服(fu)務的(de),場景(jing)(jing)(jing)就(jiu)在(zai)那里(li),不是(shi)說想砍就(jiu)能(neng)砍掉的(de)。
夜(ye)鶯體系里,對機器的相關支持比較零散(san),本(ben)文也(ye)會(hui)顯得有點凌(ling)亂,望諸位看官(guan)見諒(liang)。
機器分類管理
夜鶯(ying)里有個告警自愈功能,可(ke)以(yi)(yi)去(qu)機器上執(zhi)行腳本,所以(yi)(yi)需要(yao)非常小心設計機器的權(quan)限。最簡單的是每個機器跟人(ren)、角色綁定(ding),但是不方便(bian)管(guan)(guan)理(li),所以(yi)(yi)給(gei)機器設計了一(yi)個業(ye)務組(zu)的概(gai)念。機器可(ke)以(yi)(yi)歸屬業(ye)務組(zu),業(ye)務組(zu)關聯的管(guan)(guan)理(li)人(ren)員,這(zhe)些人(ren)員可(ke)以(yi)(yi)對機器做操(cao)作。
業務組可能會劃分的很細,比如每個 Service 作為一個業務組,比如 DBA/MySQL/Proxy 是也一個業務組,DBA/MySQL/DataNode/Mall 是另(ling)一個業務組。而(er)同一臺(tai)機器(qi)可能(neng)部(bu)署(shu)多個 Service,所以(yi),機器(qi)要支(zhi)持同時(shi)掛在多個業務組。
Prometheus 生態里(li),監(jian)控指標(biao)的(de)(de)(de)各類維度信息(xi)都(dou)是通過標(biao)簽(qian)來描(miao)述的(de)(de)(de)(業務組(zu)是沒法直(zhi)接(jie)作(zuo)為標(biao)簽(qian)的(de)(de)(de),因為 Prometheus 里(li)的(de)(de)(de)標(biao)簽(qian)不允許同 Key 多 Value),那夜(ye)鶯要支持給機(ji)器(qi)打標(biao)簽(qian)(在(zai)機(ji)器(qi)列表(biao)頁面進行操作(zuo)),給機(ji)器(qi)打的(de)(de)(de)標(biao)簽(qian),會(hui)自動附(fu)加到(dao)機(ji)器(qi)的(de)(de)(de)監(jian)控指標(biao)上。
所以,夜(ye)鶯里,機器的歸組(zu)提供了(le)兩個機制:
- 業務組,通常以 Service 顆粒度劃分,跟權限相關
- 標簽:如果想把某些維度信息附加到監控指標上,那就把這些維度信息做成標簽
當(dang)然,這一(yi)切的前提,是你要使用 Categraf 作為采集器,并且把(ba) Categraf 的 heartbeat 和 writer 的 url 都(dou)指向夜鶯。
如果你沒有使用 Categraf 采集器,機器列(lie)表里就是(shi)空(kong)的(de)(de),用不了機器的(de)(de)歸組、打標簽的(de)(de)能力。其實也不是(shi)啥大事,不用 Categraf 也不會影響你對(dui)時序庫中(zhong)的(de)(de)數據做告(gao)警、看圖。只是(shi),使用 Categraf 會讓體驗更(geng)絲滑,可以(yi)獲(huo)得額外一(yi)些(xie)能力。
Categraf 部署到(dao)所有待監控的目標機器(qi)上(shang),采集機器(qi)的元信(xin)息、基礎監控指標、執行腳本做(zuo)告警自愈。
機器信息上報
如果使用 Categraf 作為采(cai)集器,在夜鶯的機(ji)器列(lie)表(biao)(biao)里(li)就(jiu)會(hui)自動(dong)出現機(ji)器列(lie)表(biao)(biao):

如果發現(xian)內存、CPU、時(shi)間偏移等(deng)列是(shi) unknown,可(ke)能的(de)原因(yin)是(shi):
- 你沒有使用 Categraf 采集器
- Categraf 配置文件里的 heartbeat 沒有開啟,或沒有指向夜鶯
這個(ge)表格(ge)里,機(ji)器(qi)標(biao)識是可以(yi)點擊的,點擊機(ji)器(qi)標(biao)識,可以(yi)打(da)開一個(ge)側拉板,展示機(ji)器(qi)的元(yuan)信息:

多說(shuo)一句:有些人會問,機器列(lie)表里可以看到機器的(de) CPU、內(nei)存等信息,但(dan)是儀表盤是空的(de),為啥?可能的(de)原因:
- Categraf 配置文件里 writer 部分配置的不對,沒有指向夜鶯
- 如果配置是對的,那就要看 Categraf 的日志找線索了
機器告警
使用了 Categraf 之(zhi)后,除了可以看到機(ji)(ji)(ji)器(qi)列(lie)表、機(ji)(ji)(ji)器(qi)元(yuan)信息、給機(ji)(ji)(ji)器(qi)分組、打標簽(qian)之(zhi)外,還(huan)可以對機(ji)(ji)(ji)器(qi)做特殊(shu)的告警(jing)規則配置。

告(gao)警(jing)規(gui)則里,有個專門的(de) Host 類型,提供三種機(ji)器相關(guan)的(de)告(gao)警(jing)規(gui)則:機(ji)器失(shi)聯、機(ji)器集群失(shi)聯、機(ji)器時間偏移。
注意,機器時間偏移并非是機器和 NTP Server 之間的時間偏移,而是 Categraf 所在的機器和夜鶯服務端的時間偏移,如果用了 n9e-edge 邊緣模塊,就是 Categraf 所在的機器和 n9e-edge 所在(zai)機器的時(shi)間偏移。
機器時間偏移這個規則較為常用,另一(yi)個常用的(de)是(shi)機器失聯(lian)。因為 Categraf + Nightingale 的(de)監控(kong)數據流向是(shi)典型的(de) PUSH 模型,沒有 Prometheus 中的(de) up 指標(biao),所以(yi)需要(yao)額外的(de)機制(zhi)來判定機器是(shi)否失聯(lian)。
Question:機器掛載了業務組,我想對某些業務組做告警判定,應該怎么配置?
這個問題也很常(chang)見(jian)。在(zai)夜鶯的體系里,性能最好的方(fang)式(shi)是使用變量,配置方(fang)式(shi)如下:

上圖中,創建了一個 ident 變量,變量類型是 機器標識,機器范圍是 Default Busi Group 和 DevOps 兩個業務組下的機器。然后在 promql 中引用了 ident 標簽作為過濾條件。
當然,如果(guo)你的監控指(zhi)標里有標簽(qian)可以(yi)很方便做過濾,則直接使用標簽(qian)也是 OK 的。
上例用的變量模式,還有另一個好處,是用于特殊機器的閾值配置,比如 Default Busi Group 和 DevOps 兩個業務組下的機器默認 CPU 閾值都是 80,但是其中有1臺機器很特殊,平時負載就很高,CPU 閾值要設置為 88,那就可以再加一個閾值變量,同時繼續配置 變量篩選 條件:

這(zhe)個配置方式稍微有點復雜(za)(za),不(bu)過沒辦法(fa),問題場(chang)景本身就是(shi)復雜(za)(za)的。
老版本沒有 啟用變量 這個配置,只有 僅在本業務組生效 的配置,那(nei)個(ge)方式性能不好。其原理(li)是:
拿著告警(jing)規則里(li)的(de)(de) promql 去(qu)查詢時序庫里(li)的(de)(de)所有滿(man)足條件的(de)(de)數(shu)據(ju),可能(neng)查到很多(duo)機(ji)器都告警(jing)了(le),然后(hou)再(zai)根據(ju)機(ji)器的(de)(de)歸屬關系做過(guo)濾,只保留自己業務(wu)組下的(de)(de)機(ji)器的(de)(de)相關告警(jing)。
儀表盤只查看業務組下的機器
既(ji)然(ran)在夜(ye)鶯(ying)里(li)維(wei)護了(le)機器和業務組(zu)(zu)的關系,那在儀表盤里(li)查看機器的時候(hou),能(neng)否只查看當前業務組(zu)(zu)下的機器呢?是可以的。
我們可以導入內置的機器相關儀表盤(在 Linux 類別下),打開 機器常用指標 那個儀表盤,默認是查看所有機器,因為 ident 變量配置是 label_values(system_uptime, ident),如下:

然后,我們修改一下 ident 變量,如下:

保存儀表盤(pan)然后(hou)刷新,就(jiu)會看到機(ji)(ji)器(qi)的變量下拉框里,只有(you)當(dang)前業(ye)(ye)務組下的機(ji)(ji)器(qi),如果(guo)儀表盤(pan)所屬(shu)的業(ye)(ye)務組下面(mian)沒有(you)機(ji)(ji)器(qi),那就(jiu)看不了數據了。
其他機器相關的功能
開源版(ban)(ban)本,跟(gen)機器相關的功能主要就是上(shang)面羅列的那(nei)些。商業版(ban)(ban)會有額外的功能,比如(ru):
- Categraf 的采集規則中心化管理和下發
- 專門的網絡設備管理里需要采集器探針的管理,會和機器管理有聯動
