Zabbix 監(jiān)控 Jenkins Online Node 進行郵件報警

解決問題

目前 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 種類型:

  1. Gauges:某項指標的瞬時值熄赡,例如:當前 Jenkins executor 的總個數(shù)(jenkins.executor.count.value);
  2. Counters:某項指標的總數(shù)值姜挺,例如:http 請求活動連接數(shù)(http.activeRequests);
  3. Meters:一段時間內(nèi),某事件的發(fā)生概率彼硫,例如:Jenkins成功執(zhí)行的任務每分鐘的執(zhí)行次數(shù)(jenkins.runs.success.m1_rate);
  4. Histogram:統(tǒng)計指標的分布情況炊豪。例如:Jenkins executor 數(shù)量的分布(jenkins.executor.count.history);
  5. 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架構(gòu).jpg

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ù)鬓椭。

補充:

  1. Server 和 ServerActive 都指定 Zabbix Server 的 IP 地址颠猴,不同的是,前者是被動后者是主動小染。也就是說Server這個配置是用來允許Server IP 來 Agent 這取數(shù)據(jù)翘瓮,而 ServerActive則表示Agent將主動提交數(shù)據(jù)給它。
  1. 在配置文件中裤翩,有一個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配置

zabbix web配置.jpg

新建主機(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 有三種默認的報警媒介脱吱,如下:

這里我們選擇直接編輯默認的Email,將郵件SMTP服務器认罩、發(fā)送人以及密碼進行修改箱蝠,然后保存,以騰訊企業(yè)郵箱為例:

Email相關(guān)信息保存成功后垦垂,可以點擊 Test 進行測試:

用戶報警媒介(User)

點擊 Admin -> Users宦搬,配置郵件通知用戶相關(guān)信息:

創(chuàng)建動作(Action)

按照 上面的 Zabbix告警流程,觸發(fā)器用來條件判斷劫拗,接下來還需要創(chuàng)建動作间校,入口如下:

這里的Conditions可以添加多個,一定要勾選 Enabled页慷,然后切換到Operations選項卡憔足,配置如下:

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...】

參考文檔

  1. Zabbix Documentation 4.0
  2. 運維監(jiān)控篇(8)_Zabbix Action(動作)配置淺析 , 小馬
  3. zabbix數(shù)據(jù)采集頻率诚纸、數(shù)據(jù)連續(xù)多次異常觸發(fā)、告警次數(shù)陈惰、告警頻率畦徘,金槍語
  4. Zabbix Documentation: Escalations
  5. zabbix:關(guān)于錯誤unsupported-item-key常見錯誤匯總一只叫羊的羊
  6. zabbix自定義key 抬闯, Mr_dark_
  7. 使用 Zabbix 監(jiān)控 Jenkins井辆,翟志軍
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市溶握,隨后出現(xiàn)的幾起案子杯缺,更是在濱河造成了極大的恐慌,老刑警劉巖睡榆,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萍肆,死亡現(xiàn)場離奇詭異袍榆,居然都是意外死亡,警方通過查閱死者的電腦和手機塘揣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門包雀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人亲铡,你說我怎么就攤上這事才写。” “怎么了奖蔓?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵赞草,是天一觀的道長。 經(jīng)常有香客問我吆鹤,道長厨疙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任疑务,我火速辦了婚禮沾凄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘暑始。我一直安慰自己搭独,他們只是感情好,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布廊镜。 她就那樣靜靜地躺著牙肝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嗤朴。 梳的紋絲不亂的頭發(fā)上配椭,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天,我揣著相機與錄音雹姊,去河邊找鬼股缸。 笑死,一個胖子當著我的面吹牛吱雏,可吹牛的內(nèi)容都是我干的敦姻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼歧杏,長吁一口氣:“原來是場噩夢啊……” “哼镰惦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起犬绒,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旺入,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茵瘾,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡礼华,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拗秘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圣絮。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖聘殖,靈堂內(nèi)的尸體忽然破棺而出晨雳,到底是詐尸還是另有隱情行瑞,我是刑警寧澤奸腺,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站血久,受9級特大地震影響突照,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氧吐,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一讹蘑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筑舅,春花似錦座慰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至误墓,卻和暖如春蛮粮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谜慌。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工然想, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人欣范。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓变泄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恼琼。 傳聞我的和親對象是個殘疾皇子妨蛹,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容