何爲自動發現?首先咱們監控多tomcat實例,若是一個個實例地添加或許能夠完成當前需求。可是往後隨着實例的增多,再手動一個個去添加就十分不方便了。這時候須要自動發現這個功能,來幫助咱們自動添加監控tomcat實例。本文就以監控tomcat線程爲例,來實現這個自動發現的功能。這裏zabbix版本爲3.0。
python
能夠理解爲這個腳本可以打印出當前服務器上全部的tomcat實例名稱。zabbix會按期執行這個腳本,作到自動發現當前全部的tomcat實例,腳本放在zabbix-agent安裝路徑的scripts目錄下。而下一步就是給找到的tomcat實例添加所須要監控的值。下面先看腳本:shell
# 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=(',',':'))
執行打印結果以下所示:json
# chmod a+x discover_jvm.py 賦予執行權限 # chown zabbix:zabbix discover_jvm.py 添加屬主爲zabbix用戶 # ./discover_jvm.py { "data":[ { "{#APP_NAME}":"app1" }, { "{#APP_NAME}":"app2" } ] } 這裏打印出app一、app2兩個實例,之後要是有其餘實例,也可以一樣打印出來。
這個腳本的做用是打印出tomcat實例須要監控的項,本例爲線程數。該腳本執行須要兩個參數,$1爲實例名,$2爲監控項名。打印的結果爲一個整型的數字。記得跟上面的腳本放在一樣的位置,並賦予執行權限和正確的屬主。tomcat
# 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的選擇便可。bash
在客戶端配置文件中添加自定義監控的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,[*]表示須要變量支持,這裏即爲$一、$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客戶端。而後在服務端進行驗證:app
#驗證獲取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] 若是正確的話,就會返回在客戶端執行腳本同樣的結果。
爲了便於後面更多的主機添加此監控,這裏就建立一個模板來進行配置。首先建立一個發現規則,該規則就是用來自動發現tomcat實例的:
python2.7
取一個名字,並填上咱們以前定義的key,而後保存便可:
jvm
而後建立一個監控項:
線程
取一個名字,也填上咱們以前定義的key,注意這裏的#APP_NAME爲以前腳本輸出的變量,要填寫一致:
而後咱們建立一個圖像來觀察數據:
一樣取名字的變量要跟以前一致,並添加數據源爲剛剛咱們定義的監控項:
最後能夠觀察到圖像:
固然咱們還能夠定義一個觸發器,好比大於多少線程就告警,這裏就不一一贅述了。