Zabbix-(五)監控Docker容器與自定義jvm監控項
Zabbix-(五)監控Docker容器與自定義jvm監控項
一.前言
前文中講述了Zabbix對伺服器硬體方面的監控功能,本文將講述利用Zabbix監控Docker容器中的Java Web服務,並通過自定義監控項,監控JVM老年代使用情況以及GC資訊。Zabbix其實提供了JMX監控,自帶了JMX模板能夠直接監控JVM資訊,本文主要側重於自定義引數與自定義監控項,關於JMX會在之後的文章中介紹。
準備
- Zabbix Server (Zabbix 4.4) (ip:192.168.152.140)
- 執行Java應用的主機 以下簡稱Server-A (已被Zabbix監控) (ip:192.168.152.142)
二.開啟agent使用者自定義引數配置
修改配置
使用自定義引數時,首先需要修改Server-A的agent配置
# vim /etc/zabbix/zabbix_agentd.conf
修改配置 UnsafeUserParameters=1
UnsafeUserParameters=1
重啟zabbix-agent
# systemctl restart zabbix-agent
三.執行tomcat容器
在Server-A執行tomcat容器
# docker run --name tomcat -p 8080:8080 -dit tomcat:jdk8-adoptopenjdk-hotspot
將zabbix賬號新增到docker組。參考部署問題
# sudo gpasswd -a zabbix docker
外部訪問測試一下
四.建立自定義Docker模板
我們可以定義一個比較通用的Docker模板,有服務需要被監控時,直接連結該模板即可。
建立群組
點選【配置】-【主機群組】-【建立主機群組】
定義一個組名 Docker Group
配置項 值 * 組名 Docker Group - 建立模板
建立一個自定義模板,模板名稱Docker Template,選擇上步驟建立的Docker Group群組
配置項 值 * 模板名稱 Docker Template * 群組 Docker Group
五.編寫指令碼與自定義監控引數
我們需要編寫一個指令碼,用於發現當前正在執行的docker容器(這裡使用容器名稱)。
在Server-A編寫發現執行容器的python指令碼
建立指令碼
# cd /data/zabbix # touch find_container.py # chmod a+x find_container.py # vim find_container.py
指令碼內容:
執行指令碼,檢視一下json資料格式:#!/usr/bin/env python import os import json # 檢視當前執行的docker容器 t=os.popen(""" docker ps |grep -v 'CONTAINER ID'|awk {'print $NF'} """) container_name = [] for container in t.readlines(): r = os.path.basename(container.strip()) container_name += [{'{#CONTAINERNAME}':r}] # 轉換成json資料 print json.dumps({'data':container_name},sort_keys=True,indent=4,separators=(',',':'))
{ "data":[ { "{#CONTAINERNAME}":"tomcat" } ] }
- 在Server-A自定義容器發現引數
我們需要自定義一個鍵值對的配置型別,以便Zabbix可以通過鍵讀取到值。
增加自定義引數
# cd /etc/zabbix/zabbix_agentd.d # vim userparameter_find_container.conf
鍵 值 docker.container /data/zabbix/find_container.py (指令碼的執行結果) UserParameter=docker.container,/data/zabbix/find_container.py
在Server-A建立檢視容器JVM GC情況的指令碼
我們可以使用
jstat -gcutil
命令檢視GC情況建立python指令碼
# cd /data/zabbix # touch monitor_gc.py # chmod a+x monitor_gc.py # vim monitor_gc.py
指令碼內容
#!/usr/bin/python import sys import os def monitor_gc(container_name, keyword): cmd = ''' docker exec %s bash -c "jstat -gcutil 1" | grep -v S0 | awk '{print $%s}' ''' %(container_name, keyword) value = os.popen(cmd).read().replace("\n","") print value if __name__ == '__main__': # 引數1:容器的名稱 # 引數2:檢視第幾列(例如 Eden區在第3列傳入3,Full GC次數在第9列傳入9) container_name, keyword = sys.argv[1], sys.argv[2] monitor_gc(container_name, keyword)
測試指令碼,檢視當前tomcat容器Full GC次數
# /data/zabbix/monitor_gc.py 'tomcat' '9'
- 在Server-A自定義Zabbix JVM GC引數
同樣,增加一個conf檔案,表示自定義引數
# cd /etc/zabbix/zabbix_agentd.d # touch userparameter_gc_status.conf # vim userparameter_gc_status.conf
鍵 值 jvm.gc.status[*] /data/zabbix/monitor_gc.py $1 $2 UserParameter=jvm.gc.status[*], /data/zabbix/monitor_gc.py $1 $2
jvm.gc.status[*] 表示可以使用引數。其中$1表示引數1,即容器名稱;$2表示引數2,需要檢視哪項GC資訊,$1 $2都是通過Zabbix配置時傳遞的。Zabbix自定義引數
在Zabbix server上測試自定義引數
為zabbix sever安裝zabbix-get
# yum install -y zabbix-get
測試自定義引數,如果有許可權問題,可以參考部署問題
# zabbix_get -s 192.168.152.142 -p 10050 -k docker.container # zabbix_get -s 192.168.152.142 -p 10050 -k "jvm.gc.status['tomcat', 9]"
六.Zabbix模板增加自動發現規則
上述配置中,已經可以通過指令碼獲取到已執行的容器資訊,此步驟將通過Zabbix配置介面,在模板中新增自動發現規則,以發現被監控主機中正在執行的docker容器,並利用這些獲取的資料進一步監控容器中jvm資料。
建立自動發現規則
點選【配置】-【模板】-【Docker Template】
點選【自動發現規則】-【建立發現規則】
先配置【自動發現規則】
配置項 值 * 名稱 發現正在執行的Docker容器規則 型別 Zabbix 客戶端 * 鍵值 docker.container (這是我們上述步驟中自定義的鍵值) 其他配置 根據需要配置 鍵值配置項是之前自定義的監控鍵值
再配置【過濾器】
巨集則配置自定義指令碼返回json資料中的key值
配置項 值 巨集 {#CONTAINERNAME} 新增監控項原型
點選新建的自動發現規則的【監控項原型】-【建立監控項原型】
輸入引數
配置項 值 * 名稱 Tomcat Full GC次數監控項 型別 Zabbix 客戶端 * 鍵值 jvm.gc.status[{#CONTAINERNAME} , 9] 其他配置項 根據需要填寫 鍵值是自定義jvm gc引數步驟中定義的引數,{#CONTAINERNAME} 是jvm.gc.status的引數1,使用了自動發現規則,發現到的docker容器名稱(本文中即是 tomcat);引數2 9 則是表示需要檢視FullGC次數,FGC列(第9列)
除此之外,還可以新增Old老年代(對應第4列),Full GC時間(對應第10列)等監控項,這裡就不一一添加了,和上述過程基本一致,只需修改引數2即可(也可以利用剛新建的監控項原型進行【克隆】)。
七.連結模板
將上述自定義的模板連結到Server-A主機
八.DashBoard新增視覺化圖形
回到Zabbix首頁可以為新增的自定義監控項,增加圖形(新增圖形步驟可以參考Zabbix-(三)監控主機CPU、磁碟、記憶體並建立監控圖形)
九.其他
部署問題
zabbix在執行指令碼時,是使用的zabbix賬戶,因此可能要注意要給zabbix賬號賦予許可權。
例如,zabbix賬戶無法使用docker命令,將zabbix新增到docker組
# sudo gpasswd -a zabbix docker
zabbix server無法執行agent自定義引數中的指令碼
為agent主機設定
# setenforce 0