說明
何為自動發現?首先我們監控多tomcat實例,如果一個個實例地添加或許可以完成當前需求。但是日后隨着實例的增多,再手動一個個去添加就十分不方便了。這時候需要自動發現這個功能,來幫助我們自動添加監控tomcat實例。本文就以監控tomcat線程為例,來實現這個自動發現的功能。這里zabbix版本為3.0。
創建自動發現腳本
可以理解為這個腳本能夠打印出當前服務器上所有的tomcat實例名稱。zabbix會定期執行這個腳本,做到自動發現當前所有的tomcat實例,腳本放在zabbix-agent安裝路徑的scripts目錄下。而下一步就是給找到的tomcat實例添加所需要監控的值。下面先看腳本:
# cat discover_jvm.py
#!/usr/bin/python2.7
#Usage: discover tomcat_app
#Last Modified:
import subprocess
import json
#args為自己定義查找項目名字的方式,由於各自部署方式的不同,這里需要根據實際情況來寫命令。
args="find /opt/app/applications -name 'catalina.properties' | sort -n | uniq | awk -F'/' '{print $5}'"
t=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()[0]
apps=[]
for app in t.split('\n'):
if len(app) != 0:
apps.append({'{#APP_NAME}':app})
#打印出zabbix可識別的json格式
print json.dumps({'data':apps},indent=4,separators=(',',':'))
執行打印結果如下所示:
# chmod a+x discover_jvm.py 賦予執行權限
# chown zabbix:zabbix discover_jvm.py 添加屬主為zabbix用戶
# ./discover_jvm.py
{
"data":[
{
"{#APP_NAME}":"app1"
},
{
"{#APP_NAME}":"app2"
}
]
}
這里打印出app1、app2兩個實例,以后要是有其他實例,也能夠同樣打印出來。
創建監控項腳本
這個腳本的作用是打印出tomcat實例需要監控的項,本例為線程數。該腳本執行需要兩個參數,$1為實例名,$2為監控項名。打印的結果為一個整型的數字。記得跟上面的腳本放在同樣的位置,並賦予執行權限和正確的屬主。
# cat app_status.sh
#!/bin/bash
#Usage: tomcat_app status
#Last Modified:
app=$1
status=$2
pid=`ps -ef | grep "$app" | grep -v grep | grep -v "$0"| awk '{print $2}'`
case $status in
thread.num)
/opt/programs/jdk1.7.0_67/bin/jstack "$pid" | grep http | wc -l
;;
*)
echo "Usage:$0 {app_name status[thread.num]}"
exit 1
;;
esac
#執行
#./app_status.sh app_name thread.num
日后如果需要添加新的監控項,只需修改上面的腳本,改變$2的選擇即可。
zabbix客戶端配置
在客戶端配置文件中添加自定義監控的key,其實就是給我們監控選項取個名字,然后如何獲取這個值。示例如下:
#變量1的key為custom.discover.jvm_app,為自動發現的tomcat實例名,獲取方式即為執行dicover_jvm腳本
UserParameter=custom.discover.jvm_app,/opt/programs/bd-zabbix-agentd_3.0.4/scripts/discover_jvm.py
#變量2的key為custom.app.thread_num,[*]表示需要變量支持,這里即為$1、$2(本例中$2的意義不同,監控項就不同)獲取方式為執行app_status.sh腳本
UserParameter=custom.app.thread_num[*],/opt/programs/bd-zabbix-agentd_3.0.4/scripts/app_status.sh $1 $2
修改完后重啟zabbix客戶端。然后在服務端進行驗證:
#驗證獲取custom.discover.jvm_app的key值
zabbix-server_3.0.4/bin/zabbix_get -s 10.205.51.22 -p 20050 -k custom.discover.jvm_app
#驗證獲取custom.app.thread_num的key值
./zabbix_get -s 10.205.51.22 -p 20050 -k custom.app.thread_num[app1,thread_num]
如果正確的話,就會返回在客戶端執行腳本一樣的結果。
zabbix界面添加自動發現模版
為了便於后面更多的主機添加此監控,這里就創建一個模板來進行配置。首先創建一個發現規則,該規則就是用來自動發現tomcat實例的:
取一個名字,並填上我們之前定義的key,然后保存即可:
然后創建一個監控項:
取一個名字,也填上我們之前定義的key,注意這里的#APP_NAME為之前腳本輸出的變量,要填寫一致:
然后我們創建一個圖像來觀察數據:
同樣取名字的變量要跟之前一致,並添加數據源為剛剛我們定義的監控項:
最后可以觀察到圖像:
當然我們還可以定義一個觸發器,比如大於多少線程就告警,這里就不一一贅述了。