使用 Zabbix 監控 Jenkins

轉自 Jenkins 中文社區node

本文假設讀者已經瞭解 Jenkins 基本概念及插件安裝,Zabbix 基礎概念。基於 Zabbix 3.4,Jenkins 2.8 作實驗python

筆者最近的工做涉及到使用 Zabbix 監控 Jenkins。在谷歌上搜索到的文章很是少,能操做的就更少了。因此決定寫一篇文章介紹如何使用 Zabbix 監控 Jenkins。git

下圖爲總體架構圖:github

總體並不複雜,大致步驟以下:shell

  1. 在 Jenkins 上安裝 Metrics 插件,使 Jenkins 暴露 metrics api。
  2. 配置 Zabbix server 及 agent 以實現監控及告警

爲方便讀者實驗,筆者將本身作實驗的代碼上傳到了 GitHub,連接在文章末尾。使用的是 Docker Compose 技術(方便一次性啓動全部的系統)。json

接下來,咱們詳細介紹 Metrics插件及如何實現 Zabbix 監控 Jenkins。api

1. 使 Jenkins 暴露 metrics api

安裝 Metrics 插件,在系統配置中,會多出「Metrics」的配置,以下圖:瀏覽器

配置項不復雜。咱們須要點擊「Generate...」生成一個 Access Key(生成後,記得要保存)。這個 Key 用於身份校驗,後面咱們會用到。bash

保存後,咱們在瀏覽器中輸入URL:http://localhost:8080/metrics/<剛生成的 Access Key> 驗證 Jenkins 是否已經暴露 metrics。若是看到以下圖,就說明能夠進行下一步了。數據結構

1.1 Metrics 插件介紹

Metrics 插件是基於 dropwizard/metrics 實現。它經過4個接口暴露指標數據:/metrics,/ping,/threads,/healthcheck。

1.2 Metrics 插件:/metrics 接口介紹

點擊上圖中的metric連接(http://localhost:8080/metrics/<Access Key>/metrics),它暴露了如下指標數據:

{
  version: "3.0.0",
  gauges: {...},
  counters: {...},
  histograms: {...},
  meters: {...},
  timers: {...}
}
複製代碼

從數據結構中能夠看出它將指標分紅 5 種數據類型:

  • Gauges:某項指標的瞬時值,例如:當前 Jenkins executor 的總個數(jenkins.executor.count.value)
  • Counters:某項指標的總數值,例如:http 請求活動鏈接數(http.activeRequests)
  • Meters:一段時間內,某事件的發生機率,例如:Jenkins成功執行的任務每分鐘的執行次數(jenkins.runs.success.m1_rate)
  • Histogram:統計指標的分佈狀況。例如:Jenkins executor 數量的分佈(jenkins.executor.count.history)
  • Timer:某項指標的持續時間。例如:Jenkins 任務等待時間(jenkins.job.waiting.duration)

因爲指標很是之多,咱們就不分別介紹了。具體有哪些指標,讀者朋友能夠從代碼倉庫中的 metrics.json 文件瞭解。

1.2 Metrics 插件其它接口介紹

  • /ping:接口返回 pong 表明 Jenkins 存活,以下圖:

  • /threads:返回 Jenkins 的線程信息

  • /healthcheck:返回如下指標:

    {
      disk-space: {
       healthy: true
      },
      plugins: {
        healthy: true,
        message: "No failed plugins"
      },
      temporary-space: {
        healthy: true
      },
      thread-deadlock: {
        healthy: true
      }
    }
    複製代碼

2. 配置 Zabbix server 與 agent 實現監控及告警

Zabbix server 經過與 Zabbix agent 進行通訊實現數據的採集。而 Zabbix agent 又分爲被動和主動兩種模式。咱們使用的是被動模式,也就是Zabbix server 向 agent 索要數據。

因此,咱們須要在 Zabbix agent 所在機器放一個獲取 Jenkins 指標數據的腳本。再配置 Zabbix server 定時從該 agent 獲取數據,最後配置觸發器(trigger)實現告警。

接下來的關於 Zabbix 的配置,基於個人 jenkins-zabbix 實驗環境,讀者朋友須要根據本身的實際狀況變動。

2.1 配置 Zabbix server 如何從 agent 獲取指標數據

首先,咱們須要告訴 Zabbix server 要與哪些 Zabbix agent 通訊。因此,第一步是建立主機,以下圖:

第二步,在主機列表中點擊「Iterms」進行該主機的監控項設置:

第三步,進入建立監控項頁面:

第四步,建立監控項:

這裏須要解釋其中幾個選項爲何要那樣填:

  • Type:是 Zabbix server 採集指標的類型,咱們選擇的是 Zabbix agent,如上文所說。
  • Key:因爲咱們要監控的指標並非 Zabbix 預約義的。因此,須要使用用戶自定義參數來實現監控 Jenkins 指標。Key 填的值爲:jenkins.metrics[gauges.jenkins.node.count.value.value]。jenkins.metrics是須要執行的真正的 Key 名稱。而 [] 內是傳給該 Key 對應的命令的參數。對於初學者,Zabbix 這部分概念很是很差理解。也許這樣會更好理解:在使用用戶自定義參數來實現監控的狀況下,Zabbix server 會將這個 Key 發送給 agent,而後 agent 根據這個 Key 執行指定的 邏輯 以獲取指標數據。這個 邏輯 一般是一段腳本(shell命令或Python腳本等)。而腳本也是能夠傳參的,[]中的值就是傳給腳本的參數。具體更多細節,下文會繼續介紹。
  • Type of information:監控數據的數據類型,因爲咱們監控的是 Jenkins node 節點的個數,因此,使用數字整型。
  • Update interval:指 Zabbix server 多長時間向 agent 獲取一次數據,爲方便實驗,咱們設置爲 2s。

到此,Zabbix server 端已經配置完成。

2.2 配置 Zabbix agent 使其有能力從 Jenkins 獲取指標數據

當 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] 這樣的值。

3. 配置 Zabbix server 監控指標,並告警

在通過 2.2 節的配置後,若是 Zabbix server 採集到數據,可經過_Monitoring -> Latest data -> Graph_菜單(以下圖),看到圖形化的報表:

圖形化的報表:

有了指標數據就能夠根據它進行告警了。告警在 Zabbix 中稱爲觸發器(trigger)。以下圖,咱們建立了一個當 Jenkins node 小於 2 時,就觸發告警的觸發器:

至於最終觸發器的後續行爲是發郵件,仍是發短信,屬於細節部分,讀者朋友可根據本身的狀況進行設置。

小結

在理解了 Zabbix server 與 agent 之間的通訊原理的前提下,使用 Zabbix 監控 Jenkins 是不難的。筆者認爲難點在於自動化整個過程。上文中,咱們建立主機和添加監控項的過程,是手工操做的。雖然 Zabbix 能經過自動發現主機,自動關聯模板來自動化上述過程,可是建立」自動化發現主機「和」自動關聯動做「依然是手工操做。這不符合」自動化一切「的」追求「。

最後,若是讀者朋友不是歷史包袱緣由而選擇 Zabbix,筆者在這裏推薦 Prometheus,一款《Google 運維解密》推薦的開源監控系統。

附錄

相關文章
相關標籤/搜索