轉自 Jenkins 中文社區node
本文假設讀者已經瞭解 Jenkins 基本概念及插件安裝,Zabbix 基礎概念。基於 Zabbix 3.4,Jenkins 2.8 作實驗python
筆者最近的工做涉及到使用 Zabbix 監控 Jenkins。在谷歌上搜索到的文章很是少,能操做的就更少了。因此決定寫一篇文章介紹如何使用 Zabbix 監控 Jenkins。git
下圖爲總體架構圖:github
總體並不複雜,大致步驟以下:shell
爲方便讀者實驗,筆者將本身作實驗的代碼上傳到了 GitHub,連接在文章末尾。使用的是 Docker Compose 技術(方便一次性啓動全部的系統)。json
接下來,咱們詳細介紹 Metrics插件及如何實現 Zabbix 監控 Jenkins。api
安裝 Metrics 插件,在系統配置中,會多出「Metrics」的配置,以下圖:瀏覽器
配置項不復雜。咱們須要點擊「Generate...」生成一個 Access Key(生成後,記得要保存)。這個 Key 用於身份校驗,後面咱們會用到。bash
保存後,咱們在瀏覽器中輸入URL:http://localhost:8080/metrics/<剛生成的 Access Key>
驗證 Jenkins 是否已經暴露 metrics。若是看到以下圖,就說明能夠進行下一步了。數據結構
Metrics 插件是基於 dropwizard/metrics 實現。它經過4個接口暴露指標數據:/metrics,/ping,/threads,/healthcheck。
點擊上圖中的metric
連接(http://localhost:8080/metrics/<Access Key>/metrics
),它暴露了如下指標數據:
{
version: "3.0.0",
gauges: {...},
counters: {...},
histograms: {...},
meters: {...},
timers: {...}
}
複製代碼
從數據結構中能夠看出它將指標分紅 5 種數據類型:
因爲指標很是之多,咱們就不分別介紹了。具體有哪些指標,讀者朋友能夠從代碼倉庫中的 metrics.json 文件瞭解。
pong
表明 Jenkins 存活,以下圖:/threads:返回 Jenkins 的線程信息
/healthcheck:返回如下指標:
{
disk-space: {
healthy: true
},
plugins: {
healthy: true,
message: "No failed plugins"
},
temporary-space: {
healthy: true
},
thread-deadlock: {
healthy: true
}
}
複製代碼
Zabbix server 經過與 Zabbix agent 進行通訊實現數據的採集。而 Zabbix agent 又分爲被動和主動兩種模式。咱們使用的是被動模式,也就是Zabbix server 向 agent 索要數據。
因此,咱們須要在 Zabbix agent 所在機器放一個獲取 Jenkins 指標數據的腳本。再配置 Zabbix server 定時從該 agent 獲取數據,最後配置觸發器(trigger)實現告警。
接下來的關於 Zabbix 的配置,基於個人 jenkins-zabbix 實驗環境,讀者朋友須要根據本身的實際狀況變動。
首先,咱們須要告訴 Zabbix server 要與哪些 Zabbix agent 通訊。因此,第一步是建立主機,以下圖:
第二步,在主機列表中點擊「Iterms」進行該主機的監控項設置: 第三步,進入建立監控項頁面: 第四步,建立監控項:這裏須要解釋其中幾個選項爲何要那樣填:
jenkins.metrics
是須要執行的真正的 Key 名稱。而 []
內是傳給該 Key 對應的命令的參數。對於初學者,Zabbix 這部分概念很是很差理解。也許這樣會更好理解:在使用用戶自定義參數來實現監控的狀況下,Zabbix server 會將這個 Key 發送給 agent,而後 agent 根據這個 Key 執行指定的 邏輯 以獲取指標數據。這個 邏輯 一般是一段腳本(shell命令或Python腳本等)。而腳本也是能夠傳參的,[]
中的值就是傳給腳本的參數。具體更多細節,下文會繼續介紹。到此,Zabbix server 端已經配置完成。
當 Zabbix agent 接收到 server 端的請求,如 jenkins.metrics[gauges.jenkins.node.count.value.value]
。Zabbix agent 會讀取本身的配置(agent 啓動時會配置),配置內容以下:
## Zabbix Agent Configuration File for Jenkins Master
UserParameter=jenkins.metrics[*], python /usr/lib/zabbix/externalscripts/jenkins.metrics.py $1
複製代碼
根據 Key 名稱(jenkins.metrics)找到相應的命令,即:python /usr/lib/zabbix/externalscripts/jenkins.metrics.py $1
。並執行它,同時將參數 gauges.jenkins.node.count.value.value
傳入到腳本 jenkins.metrics.py 中。jenkins.metrics.py 須要咱們在 Jenkins agent 啓動前放到 /usr/lib/zabbix/externalscripts/ 目錄下。
jenkins.metrics.py 的源碼在 jenkins-zabbix 實驗環境中能夠找到,篇幅有限,這裏就簡單介紹一下其中的邏輯。
jenkins.metrics.py 所作的事情,無非就是從 Jenkins master 的 metrics api 獲取指標數據。可是因爲 api 返回的是 JSON 結構,並非 Zabbix server 所須要的格式。因此,jenkins.metrics.py 還作了一件事情,就是將 JSON 數據進行扁平化,好比原來的數據爲:{"gauges":{"jenkins.node.count.value": { "value": 1 }}}
扁平化後變成: gauges.jenkins.node.count.value.value=1
。
若是 jenkins.metrics.py 腳本沒有接收參數的執行,它將一次性返回全部的指標如:
......
histograms.vm.memory.pools.Metaspace.used.window.15m.stddev=0.0
histograms.vm.file.descriptor.ratio.x100.window.5m.p75=0.0
histograms.vm.memory.pools.PS-Old-Gen.used.window.5m.count=4165
gauges.vm.runnable.count.value=10
timers.jenkins.task.waiting.duration.mean=0.0
histograms.vm.memory.non-heap.committed.history.p99=123797504.0
gauges.vm.memory.pools.PS-Eden-Space.used.value=19010928
gauges.jenkins.node.count.value.value=1
histograms.vm.memory.pools.Code-Cache.used.window.15m.mean=44375961.6
......
複製代碼
可是,若是接收到具體參數,如 gauges.jenkins.node.count.value.value
,腳本只返回該參數的值。本例中,它將只返回 1
。
jenkins.metrics.py 腳本之因此對 JSON 數據進行扁平化,是由於 Zabbix server 一次只拿一個指標的值(這點須要向熟悉 Zabbix 的人求證,筆者從文檔中沒有找到明確的說明)。
注意:在 2.1 節中,若是 Key 值設置爲:jenkins.metrics,Zabbix server 不會拿 jenkins.metrics.py 返回的全部的指標值自動建立對應的監控項。因此,Key 值必須設置爲相似於 jenkins.metrics[gauges.jenkins.node.count.value.value] 這樣的值。
在通過 2.2 節的配置後,若是 Zabbix server 採集到數據,可經過_Monitoring -> Latest data -> Graph_菜單(以下圖),看到圖形化的報表:
圖形化的報表:
有了指標數據就能夠根據它進行告警了。告警在 Zabbix 中稱爲觸發器(trigger)。以下圖,咱們建立了一個當 Jenkins node 小於 2 時,就觸發告警的觸發器:至於最終觸發器的後續行爲是發郵件,仍是發短信,屬於細節部分,讀者朋友可根據本身的狀況進行設置。
在理解了 Zabbix server 與 agent 之間的通訊原理的前提下,使用 Zabbix 監控 Jenkins 是不難的。筆者認爲難點在於自動化整個過程。上文中,咱們建立主機和添加監控項的過程,是手工操做的。雖然 Zabbix 能經過自動發現主機,自動關聯模板來自動化上述過程,可是建立」自動化發現主機「和」自動關聯動做「依然是手工操做。這不符合」自動化一切「的」追求「。
最後,若是讀者朋友不是歷史包袱緣由而選擇 Zabbix,筆者在這裏推薦 Prometheus,一款《Google 運維解密》推薦的開源監控系統。