解決問題
目前 Jenkins上有多個節(jié)點負責執(zhí)行構(gòu)建。有時候可能由于某些意外原因蚂蕴,導致節(jié)點掛掉幽勒,但卻無法及時通知到相關(guān)同學(特別是節(jié)假日的時候)洞翩。所以需要對Jenkins服務進行監(jiān)控,這里選擇的是Zabbix沮翔。當節(jié)點掛掉后艺普,可以通過設置的告警策略,及時進行郵件通知鉴竭。
Jenkins
Jenkin version : 2.164.2
Jenkins需要安裝 Metrics 插件暴露metrics api歧譬。安裝完成后,在系統(tǒng)配置中搏存,會多出“Metrics”的配置瑰步,如下:
只需要點擊“Generate...”生成一個 Access Key(生成后,記得要保存)璧眠,這個 Key 用于身份校驗缩焦,后面會用到。保存后责静,在瀏覽器中輸入URL:
${JENKINS_URL}/metrics/<Access Key>
驗證 Jenkins 是否已經(jīng)暴露 metrics袁滥,如下:
Metrics 插件基于 dropwizard/metrics 實現(xiàn),它通過4個接口暴露Jenkins各項數(shù)據(jù): /metrics灾螃,/ping题翻,/threads,/healthcheck 腰鬼。下面分別簡單介紹一下這四個接口的功能嵌赠。
- /metrics
接口返回的的數(shù)據(jù)非常多(有50000多行),數(shù)據(jù)結(jié)構(gòu)如下:
{
version: "3.0.0",
gauges: {...},
counters: {...},
histograms: {...},
meters: {...},
timers: {...}
}
從數(shù)據(jù)結(jié)構(gòu)中可以看出它將指標分成 5 種類型:
- Gauges:某項指標的瞬時值熄赡,例如:當前 Jenkins executor 的總個數(shù)(jenkins.executor.count.value);
- Counters:某項指標的總數(shù)值姜挺,例如:http 請求活動連接數(shù)(http.activeRequests);
- Meters:一段時間內(nèi),某事件的發(fā)生概率彼硫,例如:Jenkins成功執(zhí)行的任務每分鐘的執(zhí)行次數(shù)(jenkins.runs.success.m1_rate);
- Histogram:統(tǒng)計指標的分布情況炊豪。例如:Jenkins executor 數(shù)量的分布(jenkins.executor.count.history);
- Timer:某項指標的持續(xù)時間凌箕。例如:Jenkins 任務等待時間(jenkins.job.waiting.duration)
/ping
接口返回pong
代表 Jenkins 存活 ;/threads
返回 Jenkins 的線程信息词渤;/healthcheck
返回 Jenkins 健康檢查的各項信息陌知,包括disk-space、plugins掖肋、temporary-space 和 thread-deadlock 仆葡。
Zabbix
官方文檔:https://www.zabbix.com/documentation/3.4/zh/manual/installation/containers
Zabbix Server
Docker version: 1.13.1
Zabbix-Server 以及數(shù)據(jù)庫都運行在Docker容器中, docker-compose.yml 內(nèi)容如下:
version: "3"
services:
mysql-server-for-z:
image: mysql:5.7
container_name: mysql-server-for-z
environment:
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=ZabbiX
- MYSQL_ROOT_PASSWORD=******
ports:
- "3306:3306"
volumes:
- "${PWD}/mysql:/var/lib/mysql"
zabbix-server-mysql:
image: zabbix/zabbix-server-mysql:latest
container_name: zabbix-server-mysql
environment:
- DB_SERVER_HOST=mysql-server-for-z
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=ZabbiX
- MYSQL_ROOT_PASSWORD=******
ports:
- "10051:10051"
links:
- mysql-server-for-z:mysql
depends_on:
- mysql-server-for-z
zabbix-web-nginx-mysql:
image: zabbix/zabbix-web-nginx-mysql:latest
container_name: zabbix-web-nginx-mysql
environment:
- DB_SERVER_HOST=mysql-server-for-z
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=ZabbiX
- MYSQL_ROOT_PASSWORD=******
- ZBX_SERVER_HOST=zabbix-server-mysql
- PHP_TZ=Asia/Shanghai
ports:
- "8000:80"
- "8443:443"
links:
- mysql-server-for-z:mysql
- zabbix-server-mysql:zabbix-server
depends_on:
- zabbix-server-mysql
運行容器后,在瀏覽器中訪問 Server IP:8000 查看 志笼,默認登錄用戶:Admin/zabbix .
Zabbix Agent
Zabbix Windows Agent Version : 4.2.4
由于 Jenkins 運行在 Windows機器上沿盅,所以 Zabbix Agent 對應選擇 Windows 版本。官網(wǎng)下載地址:https://www.zabbix.com/download_agents 纫溃,Windows下可以下載MSI和ZIP版本腰涧,建議下載ZIP版本。
下載完成后紊浩,解壓到C盤根目錄窖铡,并重命名目錄為zabbix。conf 目錄存放是agent 配置文件坊谁,bin文件存放windows下32位和64位安裝程序费彼;
找到 conf 目錄下的配置文件 zabbix_agentd.conf ,修改如下參數(shù):
# zabbix agent log path
LogFile=C:\zabbix\zabbix_agentd.log
# zabbix server的ip地址
Server=******
ServerActive=******
Zabbix server 通過與 Zabbix agent 進行通信實現(xiàn)數(shù)據(jù)的采集口芍。而 Zabbix agent 又分為被動和主動兩種模式箍铲,這里我們使用的是被動模式,也就是Zabbix server 向 agent 索要數(shù)據(jù)鬓椭。
補充:
- Server 和 ServerActive 都指定 Zabbix Server 的 IP 地址颠猴,不同的是,前者是被動后者是主動小染。也就是說Server這個配置是用來允許Server IP 來 Agent 這取數(shù)據(jù)翘瓮,而 ServerActive則表示Agent將主動提交數(shù)據(jù)給它。
- 在配置文件中裤翩,有一個Hostname字段资盅,即主機名,如果不指定參數(shù)值將會使用默認的主機名岛都。在主動監(jiān)控中律姨,Hostname 必須 和 zabbix web上配置的一致振峻,否則zabbix主動監(jiān)控將無法正常工作臼疫。參考:Agent on Windows systems官方文檔
修改完成后,復制 zabbix_agentd.exe和zabbix_agentd.conf 到 C:\zabbix 目錄下扣孟,關(guān)閉監(jiān)控主機 windows server防火墻或設置防火墻入放行zabbix_agentd客戶端口號 10050 (TPC/UDP)烫堤,然后使用 管理員權(quán)限(Win+X)依次執(zhí)行以下命令,將Zabbix Agent 安裝為 Windows服務運行。
# 將代理安裝為Windows服務
C:\zabbix>C:\zabbix\zabbix_agentd.exe -i -c c:\zabbix\zabbix_agentd.conf
# 啟動 agent (也可以通過服務面板啟動)
C:\zabbix>C:\zabbix\zabbix_agentd.exe -s -c c:\zabbix\zabbix_agentd.conf
如果需要重新安裝 zabbix_agent 服務鸽斟,則需要先停止服務拔创,再卸載服務,如下:
# 停止服務(也可以通過服務面板)
C:\zabbix\zabbix_agentd.exe -d -c C:\zabbix\zabbix_agentd.win.conf
# 卸載服務
C:\zabbix\zabbix_agentd.exe -d -c C:\zabbix\zabbix_agentd.win.conf
注意富蓄,Windows服務面板可能會出現(xiàn)服務狀態(tài)沒有刷新的情況剩燥,此時建議重新打開服務面板。
Zabbix Web配置
新建主機(Host)
Zabbix中將需要被zabbix監(jiān)控的對象稱之為主機(Host)立倍,主機必須屬于某個主機組灭红,新建主機的入口如下:
系統(tǒng)默認已經(jīng)準備了一些主機組,如果這些主機組不滿足項目需要口注,用戶也可以選擇創(chuàng)建新的主機組变擒,此處可以隨意選擇一個主機組。
主機添加完成后寝志,在Host列表中就可以看到了娇斑,此時可用性Availability是灰色的,需要添加監(jiān)控項item后材部,才能激活zabbix可用性毫缆。
添加監(jiān)控項 (Item)
監(jiān)控項依附于主機(組),創(chuàng)建監(jiān)控項入口如下:
解釋一下其中幾個選項為什么要這樣填:
Type:是 Zabbix server 采集指標的類型乐导,我們選擇的是 Zabbix agent悔醋;
Type of information:監(jiān)控數(shù)據(jù)的數(shù)據(jù)類型,由于我們監(jiān)控的是 Jenkins node 節(jié)點的個數(shù)兽叮,所以芬骄,使用數(shù)字整型;
Update interval:指 Zabbix server 多長時間向 agent 獲取一次數(shù)據(jù)鹦聪;
-
Key:由于要監(jiān)控的指標并不是 Zabbix 預定義的账阻,所以,需要使用自定義參數(shù)來實現(xiàn)監(jiān)控指標泽本。Key 填的值為:
jenkins.metrics[gauges.jenkins.node.count.value.value]
淘太。jenkins.metrics
是需要執(zhí)行的真正的 Key 名稱。而[]
內(nèi)是傳給該 Key 對應的命令的參數(shù)规丽。在使用自定義參數(shù)來實現(xiàn)監(jiān)控的情況下蒲牧,Zabbix server 會將這個 Key 發(fā)送給 agent,然后 agent 根據(jù)這個 Key 執(zhí)行指定的 邏輯 以獲取指標數(shù)據(jù)赌莺。這個邏輯通常是一段腳本(shell命令或Python腳本等)冰抢。而腳本也是可以傳參的,[]
中的值就是傳給腳本的參數(shù)艘狭。當 Zabbix agent 接收到 server 端的請求時挎扰,Zabbix agent 會讀取自己的配置翠订。由于上面啟動 Agent 時使用的是Zabbix Agent默認的配置文件,我們可以直接在
zabbix_agentd.conf
中加入以下配置信息:
# Zabbix Agent Configuration File for Jenkins Master
UserParameter=jenkins.metrics[*], C:/python37/python.exe C:/zabbix/jenkins.metrics.py $1
根據(jù) Key 名稱(jenkins.metrics)找到相應的命令遵倦,即:C:/python37/python.exe C:/zabbix/jenkins.metrics.py $1
尽超。并執(zhí)行它,同時將參數(shù) gauges.jenkins.node.online.value.value
傳入到腳本 jenkins.metrics.py 中梧躺。jenkins.metrics.py 需要我們在 Jenkins agent 啟動前放到 C:/zabbix/
目錄下似谁。
jenkins.metrics.py 的源碼如下:
import sys
import requests
metrics = {}
JENKINS_URL = "YOUR_JENKINS_URL"
PLUGIN_KEY = "QBpW2iDCCmF6yEVOSekEpaBfJQk3fPwK4wxlg6_Y5C30c_3fp3eSwRfctn0ZonZW"
def denormalize(data, keyname):
for d in data.keys():
if isinstance(data[d], dict):
denormalize(data[d], "%s%s." % (keyname, d))
else:
metrics["%s%s" % (keyname, d)] = data[d]
if __name__ == "__main__":
try:
response = requests.get("%s/metrics/%s/metrics" % (JENKINS_URL, PLUGIN_KEY))
data = response.json()
denormalize(data, "")
if len(sys.argv) > 1:
print(metrics[str(sys.argv[1])])
else:
for m in metrics:
print("%s=%s" % (m, metrics[m]))
except:
print(0)
jenkins.metrics.py 所做的事情,無非就是從 Jenkins master 的 metrics api 獲取指標數(shù)據(jù)掠哥。但是由于 api 返回的是 JSON 結(jié)構(gòu)棘脐,并不是 Zabbix server 所需要的格式。所以龙致,jenkins.metrics.py 還做了一件事情蛀缝,就是將 JSON 數(shù)據(jù)進行扁平化,比如原來的數(shù)據(jù)為:{"gauges":{"jenkins.node.online.value": { "value": 1 }}}
扁平化后變成: gauges.jenkins.node.online.value.value=1
目代。
當Jenkins服務未啟動時屈梁,會返回 0 給 Zabbix Server, 所以根據(jù)此值同樣可以判斷 Jenkins的存活狀態(tài)。
重啟Agent 榛了,就樣一個自定義的Key在Server和Agent端的配置就完成了在讶。在zabbix_server端通過zabbix_get命令驗證是否可以獲取到值,如果獲取到值霜大,表明這個Key就設置成功了构哺。
/var/lib/zabbix # zabbix_get -s ${Agent_IP} -p 10050 -k jenkins.metrics[gauges.jenkins.node.online.value.value]
1
主機監(jiān)控項設置完成后,此時再查看 Hosts 的 可用性(Availability)战坤,就會發(fā)現(xiàn)已經(jīng)變?yōu)榫G色了硼被。添加觸發(fā)器(Trigger)
再經(jīng)過上面的配置后无切,如果 Zabbix server 采集到數(shù)據(jù)晾咪,可通過Monitoring -> Latest data -> Graph菜單(如下圖)的圆,看到圖形化的報表。
數(shù)據(jù)采集的頻率是在 監(jiān)控項 中的 Update interval 字段設置的囊卜。
有了指標數(shù)據(jù)就可以根據(jù)它進行告警了娜扇,告警在 Zabbix 中稱為觸發(fā)器(trigger),上圖中的 “事件”栅组,可以理解為監(jiān)控項(Items)雀瓢,條件判斷就需要觸發(fā)器(Triggers)來完成,創(chuàng)建觸發(fā)器的入口如下:
有幾個參數(shù)需要說明一下:
Severity:嚴重程度玉掸,這里選擇Hign刃麸,在后續(xù)的Action操作中,可以根據(jù)嚴重程度這一維度來決定是否發(fā)郵件告警排截;
Expression:表達式
{jenkins-zabbix-agent:jenkins.metrics[gauges.jenkins.node.online.value.value].last(#1)}<2
當 Agent 返回的Jenkins online node<2時嫌蚤,就會觸發(fā) 動作(Action)辐益。
配置報警媒介類型(Media)
選擇 Administration-> Media types断傲,Zabbix 有三種默認的報警媒介脱吱,如下:
用戶報警媒介(User)
點擊 Admin -> Users宦搬,配置郵件通知用戶相關(guān)信息:創(chuàng)建動作(Action)
按照 上面的 Zabbix告警流程,觸發(fā)器用來條件判斷劫拗,接下來還需要創(chuàng)建動作间校,入口如下:Default message 中的內(nèi)容如下:
Problem: {EVENT.NAME}故障{TRIGGER.STATUS},服務器:{HOSTNAME1}發(fā)生: {TRIGGER.NAME}故障!
內(nèi)容:
告警主機:{HOSTNAME1}
告警時間:{EVENT.DATE} {EVENT.TIME}
告警等級:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警項目:{TRIGGER.KEY1}
問題詳情:{ITEM.NAME}:{ITEM.VALUE}
當前狀態(tài):{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}</pre>
Operation details中的設置項是Action的核心,按照此處設置酒繁,當觸發(fā)器觸發(fā)動作后滓彰,會給Zabbix administrators User groups 和 Admin (Zabbix Administrator) 發(fā)送3封郵件報警,每次的間隔為600s州袒。Recovery Operations 和 Update Operations 配置和 Operations 保持一致就好揭绑。
以上,使用 Zabbix 監(jiān)控 Jenkins Node 配置完成郎哭。當Jenkins節(jié)點<2 或 Jenkins掛掉時他匪,會自動發(fā)郵件通知相關(guān)人員,在 Report>Action log中可以查看歷史日志信息夸研。
【To be continued...】