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
腳本內容:
#!/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=(',',':'))
運行腳本,查看一下json數據格式:{ "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