zabbix監(jiān)控tomcat多實例(自動發(fā)現(xiàn),主動模式)
實驗背景
筆者同一臺服務(wù)器運行三個java api接口,需要監(jiān)控tomcat 服務(wù)狀態(tài),很多監(jiān)控項的情況下一個個添加很煩,筆者使用自動發(fā)現(xiàn)功能,已監(jiān)控tomcat線程為例。系統(tǒng)CentOS7,zabbix 3.0.x
- 創(chuàng)建發(fā)現(xiàn)服務(wù)器上面運行tomcat的 tomcat目錄名稱的腳本
腳本可以自動發(fā)現(xiàn)tomcat的目錄名稱(一般自定義),設(shè)置腳本成監(jiān)控項,zabbix會定期執(zhí)行這個監(jiān)控項,自動發(fā)現(xiàn)當(dāng)前服務(wù)器上所有tomcat實例,筆者腳本默認(rèn)放在zabbix配置文件目錄下的scripts(筆者zabbix,yum安裝,scripts需手動創(chuàng)建)目錄下,腳本如下:
# cat tomcat_name_discovery.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import os
import subprocess
import simplejson as json
TOMCAT_HOME="/data/tomcats"
# TOMCAT_NAME 自定義項目運行的tomcat的目錄名稱
#TOMCAT_NAME="/bin/find 'TOMCAT_HOME' -name 'server.xml' | sort -n | uniq -c | awk -F'/' '{print $4}'"
TOMCAT_NAME="/bin/find /data/tomcats -name 'server.xml' | sort -n | uniq -c | awk -F'/' '{print $4}'"
#t=subprocess.Popen(args,shell=True,stdout=subprocess.PIPE).communicate()[0]
t=subprocess.Popen(TOMCAT_NAME,shell=True,stdout=subprocess.PIPE).communicate()[0]
tomcats=[]
for tomcat in t.split('\n'):
if len(tomcat) != 0:
tomcats.append({'{#TOMCAT_NAME}':tomcat})
# 打印出zabbix可識別的json格式
print json.dumps({'data':tomcats},sort_keys=True,indent=4,separators=(',',':'))
- 本地執(zhí)行腳本查看獲取到的tomcat實例
# 安裝pip,并安裝simplejson模塊,筆者最小化安裝的CentOS7默認(rèn)沒有安裝所用到的python模塊
yum install python-pip -y && pip install simplejson
pip install --upgrade pip # 順手更新下pip
# 獲取當(dāng)前服務(wù)器tomcat實例
[root@ecs-09 scripts]# python tomcat_name_discovery.py
{
"data":[
{
"{#TOMCAT_NAME}":"tomcat-7081"
},
{
"{#TOMCAT_NAME}":"tomcat-7082"
},
{
"{#TOMCAT_NAME}":"tomcat-7083"
}
]
}
- 創(chuàng)建監(jiān)控項腳本
腳本作用打印出tomcat實例需要監(jiān)控的監(jiān)控項,本文以tomcat線程數(shù)為例,腳本執(zhí)行需要兩個參數(shù),$1為tomcat實例名,$2為tomcat監(jiān)控項。所有腳本記得賦權(quán)
[root@ecs-09 scripts]# cat tomcat_status_monitor.sh
#!/bin/bash
######################################
# Usage: tomcat project status monitor
#
# Changelog:
# 2018-05-10 shaonbean@qq.com create
######################################
# config zabbix sudo
# echo "zabbix ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/zabbix
TOMCAT_NAME=$1
status=$2
TOMCAT_PID=`/usr/bin/ps -ef | grep "$TOMCAT_NAME" | grep "[o]rg.apache.catalina.startup.Bootstrap start" | grep -v grep | awk '{print $2}'`
jstack=`which jstack`
case $status in
thread.num)
# use jstack --help
/usr/bin/sudo ${jstack} -l ${TOMCAT_PID} | grep http | grep -v grep | wc -l
;;
*)
echo "Usage: $0 {TOMCAT_NAME status[thread.num]}"
exit 1
;;
esac
# 監(jiān)控項可以在case部分添加多個,具體參考jstack --help,jstack pid獲取的信息,
# 配置jstack環(huán)境變量,
ln -s /usr/java/jdk1.7.0_80/bin/jstack /usr/local/sbin/jstack
zabbix客戶端配置
- 在客戶端配置文件中添加自定義的監(jiān)控項key,示例如下:
[root@ecs-09 scripts]# cd /etc/zabbix/zabbix_agentd.d/
[root@ecs-09 zabbix_agentd.d]# cat userparameter_tomcat.conf
# 變量1的key定義為:tomcat.name.discovery, 是腳本自動發(fā)現(xiàn)的tomcat實例名稱,獲取途徑是執(zhí)行tomcat_name_discovery.py
UserParameter=tomcat.name.discovery, /etc/zabbix/scripts/tomcat_name_discovery.py
# 變量2的key自定義為:tomcat.status.thread_num, [*]表示需要變量支持,$1,$2(腳本中$2,即tomcat的監(jiān)控項自定義,監(jiān)控項可添加),獲取途徑執(zhí)行:tomcat_status_monitor.sh
UserParameter=tomcat.status.thread_num[*], /etc/zabbix/scripts/tomcat_status_monitor.sh $1 $2
- 添加完成后重啟zabbix-agent,并在客戶端驗證(筆者客戶端使用的是zabbix主動模式,如果zabbix是被動模式,驗證步驟可到zabbix服務(wù)端進(jìn)行)
# 驗證獲取tomcat.name.discovery的key值
[root@ecs-09 ~]# zabbix_get -s 127.0.0.1 -p 10050 -k tomcat.name.discovery # zabbix_get記得yum安裝一下
{
"data":[
{
"{#TOMCAT_NAME}":"tomcat-7081"
},
{
"{#TOMCAT_NAME}":"tomcat-7082"
},
{
"{#TOMCAT_NAME}":"tomcat-7083"
}
]
}
# 驗證獲取tomcat.status.thread_num 的key值
[root@ecs-09 ~]# zabbix_get -s 127.0.0.1 -p 10050 -k tomcat.status.thread_num[tomcat-7081,thread.num]
4
[root@ecs-09 ~]# zabbix_get -s 127.0.0.1 -p 10050 -k tomcat.status.thread_num[tomcat-7082,thread.num]
4
zabbix界面添加自動發(fā)現(xiàn)模板
模板下載:https://github.com/wh211212/zabbix
-
創(chuàng)建發(fā)現(xiàn)規(guī)則
這里寫圖片描述 添加監(jiān)控項
這里寫圖片描述
-設(shè)置trigger告警
這里寫圖片描述
- 添加圖形展示
這里寫圖片描述
-
查看
這里寫圖片描述 模擬tomcat實例停掉,假死,查看告警觸發(fā)
這里寫圖片描述