前文中講述了Zabbix對服務器硬件方面的監控功能,本文將講述利用Zabbix監控Docker容器中的Java Web服務,並經過自定義監控項,監控JVM老年代使用狀況以及GC信息。Zabbix其實提供了JMX監控,自帶了JMX模板可以直接監控JVM信息,本文主要側重於自定義參數與自定義監控項,關於JMX會在以後的文章中介紹。html
修改配置python
使用自定義參數時,首先須要修改Server-A的agent配置docker
# vim /etc/zabbix/zabbix_agentd.conf
修改配置 UnsafeUserParameters=1shell
UnsafeUserParameters=1
重啓zabbix-agentjson
# systemctl restart zabbix-agent
在Server-A運行tomcat容器vim
# docker run --name tomcat -p 8080:8080 -dit tomcat:jdk8-adoptopenjdk-hotspot
將zabbix帳號添加到docker組。參考部署問題tomcat
# sudo gpasswd -a zabbix docker
外部訪問測試一下bash
咱們能夠定義一個比較通用的Docker模板,有服務須要被監控時,直接連接該模板便可。服務器
建立羣組jvm
點擊【配置】-【主機羣組】-【建立主機羣組】
定義一個組名 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=(',',':'))
{ "data":[ { "{#CONTAINERNAME}":"tomcat" } ] }
咱們須要自定義一個鍵值對的配置類型,以便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'
一樣,增長一個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配置界面,在模板中添加自動發現規則,以發現被監控主機中正在運行的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主機
回到Zabbix首頁能夠爲新增的自定義監控項,增長圖形(添加圖形步驟能夠參考Zabbix-(三)監控主機CPU、磁盤、內存並建立監控圖形)
zabbix在執行腳本時,是使用的zabbix帳戶,所以可能要注意要給zabbix帳號賦予權限。
例如,zabbix帳戶沒法使用docker命令,將zabbix添加到docker組
# sudo gpasswd -a zabbix docker
zabbix server沒法執行agent自定義參數中的腳本
爲agent主機設置
# setenforce 0