zabbix之自动发现Tomcat多实例(第一种:已经部署完成,后续不再添加;第二种:后续或根据需要添加Tomcat实例)
单一实例手动部署:https://www.cnblogs.com/huangyanqi/p/8522526.html
注释:参考的一位博主的博客后续做的修改,那个博主的网址找不到了!!!!
背景:
1、每台测试机上已经有十几个tomcat实例,需要添加tomcat的监控端口,监控端口12345后记累加计算;
2、后续会加新服务器开新的tomcat实例,规划tomcat的监控端口为:30000~300300;
主要应对多实例(第一种情况)
约定:
zbbix配置文件:/etc/zabbix/
脚本文件:/etc/zabbix/scripts/
其他文件:/tmp/
1、下载catalina-jmx-remote.jar
放置到/tmp/目录下:(需墙)
下载地址:http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.30/bin/extras/catalina-jmx-remote.jar
2、第一个脚本
cd /etc/zabbix/scripts
vim add_service_tomcat.sh
#!/bin/bash #修改为对应的tomcat的目录
t_datadir=`find /usr/local/webserver/*/bin/ -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'`
tomcat_no=`find /usr/local/webserver/*/bin/ -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'|wc -l`
#监控的端口启始端口
n_port=12345 #修改为对应的接入网卡
local_ip=`ifconfig eth2 |awk -F '[ :]+' 'NR==2 {print $3}'`
for tomcat in $t_datadir
do
m_no=`cat -n $tomcat/bin/catalina.sh|grep 'Execute The Requested Command'|awk '{print $1}'` #在该行的下边插入如下几行
cp $tomcat/bin/catalina.sh $tomcat/bin/catalina.sh_bak #先备份原文件
#把catalina-jmx-remote.jar放置/tmp目录下,方便拷贝
cp /tmp/catalina-jmx-remote.jar $tomcat/lib/catalina-jmx-remote.jar #注意这个地方,需要把软件包拷贝到对应的目录下
sed -i ''$m_no'a CATALINA_OPTS="-Dcom.sun.management.jmxremote=true' $tomcat/bin/catalina.sh #插入配置
let "m_no=m_no+1" #切换到新的行
sed -i ''$m_no'a -Djava.rmi.server.hostname='$local_ip'' $tomcat/bin/catalina.sh
let "m_no=m_no+1"
sed -i ''$m_no'a -Dcom.sun.management.jmxremote.port='$n_port'' $tomcat/bin/catalina.sh
let "m_no=m_no+1"
sed -i ''$m_no'a -Dcom.sun.management.jmxremote.ssl=false' $tomcat/bin/catalina.sh
let "m_no=m_no+1"
sed -i ''$m_no'a -Dcom.sun.management.jmxremote.authenticate=false"' $tomcat/bin/catalina.sh
let "n_port=n_port+1"
done
#以下为测试环境添加的配置,忽略!
##server.mxl
##M_mxlfind=`find /application/tomcat*/conf/server.xml -name server.xml | awk -F "/conf/server.xml" '{print $1}'`
##Smxl_no=`find /application/tomcat*/conf/server.xml -name server.xml | awk -F "/conf/server.xml" '{print $1}'|wc -l`
#for Mxl in $t_datadir
#do
# S_hc=`cat -n $Mxl/conf/server.xml|grep 'ThreadLocalLeakPreventionListener'|awk '{print $1}'`
## let "Smxl_no=Smxl_no+1"
# cp $Mxl/conf/server.xml $Mxl/conf/server.xml_bak
# sed -i ''$S_hc'a \\ <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="'$n_port'" rmiServerPortPlatform="'$n_port'"/>' $Mxl/conf/server.xml
## let "Smxl_no=Smxl_no+1"
# let "n_port=n_port+1"
#done #local_ip=`ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $3}'`
注释:脚本的主要目的是,逐一修改每个Tomcat实例的/bin/catalina.sh文件;只需执行一次即可;分别添加如下内容
export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote"
export CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=122.114.200.185"
export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
catalina.sh-284行
3、第二个脚本
[root@agent scripts]#pwd
/etc/zabbix/scripts
[root@localhost scripts]# vim jmx_discovery.sh #!/bin/bash
t_datadir=`find /usr/local/webserver/*/bin/ -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'`
tomcat_no=`find /usr/local/webserver/*/bin/ -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'|wc -l`
local_ip1=`ifconfig eth2 |awk -F '[ :]+' 'NR==2 {print $3}'` n_port=
i=
printf '{"data":[\n' for tomcat in $t_datadir
do
t_service=`echo "$tomcat"|awk -F"/" '{print $(NF)}'`
if [ "$i" != ${tomcat_no} ];then
printf "\t\t{ \n"
printf "\t\t\t\"{#LOCAL_IP1}\":\"${local_ip1}\",\n"
printf "\t\t\t\"{#JMX_PORT}\":\"${n_port}\",\n"
printf "\t\t\t\"{#JAVA_NAME}\":\"${t_service}\"},\n"
else
printf "\t\t{ \n"
printf "\t\t\t\"{#LOCAL_IP1}\":\"${local_ip1}\",\n"
printf "\t\t\t\"{#JMX_PORT}\":\"${n_port}\",\n"
printf "\t\t\t\"{#JAVA_NAME}\":\"${t_service}\"}]}\n"
fi
let "n_port=n_port+1"
let "i=i+1"
done
注释:输出json格式的数据。
效果如下:

4、zabbix_agentd.conf 添加如下内容:
#Tomcat
UnsafeUserParameters=1
UserParameter=java.jmx.discovery,/etc/zabbix/scripts/jmx_discovery.sh
#UserParameter=java.Runtime.status[*],/usr/local/jdk1./bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Runtime \$ >& |grep \$ |awk '{print $NF}'
UserParameter=java.Memory.status[*],/usr/local/jdk1./bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Memory \$ >& |grep \$ |awk '{print $NF}'
UserParameter=java.System.status[*],/usr/local/jdk1./bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=OperatingSystem \$ >& |grep \$ |awk '{print $NF}'
UserParameter=java.HeapMemoryUsage.status[*],/usr/local/jdk1./bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Memory HeapMemoryUsage >& |grep \$ |awk '{print $NF}'
UserParameter=java.NonHeapMemoryUsage.status[*],/usr/local/jdk1./bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Memory NonHeapMemoryUsage >& |grep \$ |awk '{print $NF}'
UserParameter=java.LoadClass.status[*],/usr/local/jdk1./bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=ClassLoading \$ >& |awk '{print $NF}'
UserParameter=java.Threading.status[*],/usr/local/jdk1./bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Threading \$ >& |awk '{print $NF}'
如有其他监控的项,可以按此方式添加即可,注意模板也要更改哦!
注释:
第一行是开启接受自定义的变量;
第二行是给zabbix-server模板使用的变量宏,在模板中定义key的变量。
其他行是key和key值
5、其他操作
#权限设置
chmod +s /usr/bin/find
chmod 550 /etc/zabbix/scripts/jmx_discovery.sh
chown zabbix.zabbix /etc/zabbix/scripts/ #重启agent服务
systemctl restart zabbix-agent.service
systemctl enable zabbix-agent.service
6、server端测试agent端设置是否成功
zabbix_get -s 122.114.100.15 -p -k java.jmx.discovery zabbix_get -s 122.114.100.15 -p 10050 -k "java.HeapMemoryUsage.status[122.114.100.15,12345,used]" #必须要有返回值

6.1、agent自己测试自己
[root@localhost ~]# java -jar /lib/cmdline-jmxclient-0.10..jar - 120.120.19.14: java.lang:type=Runtime Uptime >& |grep Uptime |awk '{print $NF}'
183465827
java -jar /lib/cmdline-jmxclient-0.10.3.jar - 120.120.19.14:12345 java.lang:type=Memory HeapMemoryUsage
注释:必须要有返回值
7、实例测试
#重启单个Tomcat实力
/application/tomcat/bin/startup.sh
/application/tomcat/bin/shutdown.sh



8、模板3.0以上的
链接:https://pan.baidu.com/s/1u5EOlT9jReTkuGPxZOb1ng 密码:ddpt
注释:导入到zabbix3.0以上的server中,套到相关主机撒上即可
9、其他故障问题

10、一个成功的栗子!

有规划的添加tomcat(第二种情况)
1、还是在#vim /application/tomcat8_1/bin/catalina.sh的
# ----- Execute The Requested Command -----------------------------------------
CATALINA_OPTS="-Dcom.sun.management.jmxremote=true
-Djava.rmi.server.hostname=10.220.129.140
-Dcom.sun.management.jmxremote.port=30000
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"
2、/etc/zabbix/scripts/prot.sh内容如下
#!/bin/bash
Server_Ip=`ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $3}'` declare -a port_scan=()
declare -i j=
scan(){
nc -vz -w 127.0.0.1 $ > /dev/null
if [ $? -eq ];then
return
else
return
fi
} for i in `seq `
do
scan $i
if [ $? -eq ];then
# echo "j=$j"
port_scan[$j]=$i
j=$((j+))
# echo "$i success."
fi
done length=${#port_scan[@]}
#printf "{\n"
printf '{"data":[\n'
for ((i=;i<$length;i++))
do
if [ $i -lt $[$length-] ];then
printf "\t\t{ \n"
printf "\t\t\t\"{#SERVER_IP}\":\"${Server_Ip}\",\n"
printf "\t\t\t\"{#JMX_PORT}\":\"${port_scan[$i]}\"},\n"
else
printf "\t\t{ \n"
printf "\t\t\t\"{#SERVER_IP}\":\"${Server_Ip}\",\n"
printf "\t\t\t\"{#JMX_PORT}\":\"${port_scan[$i]}\"}]}\n"
# if [ $i -lt $[$length-] ];then
# printf ','
fi
done
#printf "\n\t]\n"
#printf "}\n"
3、#vim /etc/zabbix/zabbix_agentd.conf
#Tomcat
UserParameter=java.jmx.discovery,/etc/zabbix/scripts/prot.sh
UserParameter=java.Runtime.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Runtime \$ >& |grep \$ |awk '{print $NF}'
UserParameter=java.Memory.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Memory \$ >& |grep \$ |awk '{print $NF}'
UserParameter=java.System.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=OperatingSystem \$ >& |grep \$ |awk '{print $NF}'
UserParameter=java.HeapMemoryUsage.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Memory HeapMemoryUsage >& |grep \$ |awk '{print $NF}'
UserParameter=java.NonHeapMemoryUsage.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Memory NonHeapMemoryUsage >& |grep \$ |awk '{print $NF}'
UserParameter=java.LoadClass.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=ClassLoading \$ >& |awk '{print $NF}'
UserParameter=java.Threading.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Threading \$ >& |awk '{print $NF}'
4、测试结果:
[root@zabbix-server ~]#zabbix_get -s 122.114.200.185 -p -k java.jmx.discovery
{"data":[
{
"{#SERVER_IP}":"122.114.200.185",
"{#JMX_PORT}":""},
{
"{#SERVER_IP}":"122.114.200.185",
"{#JMX_PORT}":""}]}
[root@zabbix-server ~]#zabbix_get -s 122.114.200.185 -p -k "java.HeapMemoryUsage.status[122.114.200.185,30001,used]" [root@zabbix-server ~]#
5、zabbix模板(各位根据上班的模板修改下对应的宏)
zabbix之自动发现Tomcat多实例(第一种:已经部署完成,后续不再添加;第二种:后续或根据需要添加Tomcat实例)的更多相关文章
- zabbix使用自动发现监控esxi的磁盘存储storage
zabbix使用自动发现监控esxi的磁盘存储storage 在任意一台可以访问vcenter的zabbix-agent服务器上添加exsi的磁盘监控模板即可 创建模板过程: custom.esxi. ...
- 【Zabbix】Zabbix Server自动发现
Zabbix自动发现 由于有上百台的虚拟机需要监控,如果一个个去添加配置,费时费力.Zabbix的自动发现,可以自动发现需要监控的机器,监控相应指标. 前置条件 安装部署好Zabbix Server. ...
- zabbix的自动发现、自定义添加监控项目、配置邮件告警
1.zabbix的自动发现这里的自动发现,所显示出来的是规则的上自动了现 然后 可以对其内容进行相关的配制,如时间或周期 注意:对于单个主机的规则,可以自行添加或删除, 但对于已经添加好了的规则,若需 ...
- 01 - zabbix | LLD自动发现
01 - zabbix | LLD自动发现 1. 原理 zabbix支持设置变量,用{#VAR_NAME}来表示.然后有一些系统保留的变量 2. 设置 2.1 交换机电源自动发现 名字写好后进进入 ...
- zabbix低级自动发现之mysql多实例
1.低级自动发现概述 zabbix的低级自动发现(LLD)适用于监控多实例,监控变化的数据(分区.网卡). 自动发现(LLD)提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法.例如,Z ...
- zabbix监控自动发现监控tomcat(V1)
背景说明: 由于zabbix监控使用自带的模版,只能监控主机上只有1个tomcat的场景适合,虽然网上很多朋友都是在每个监控项上面添加一个空格来解决问题.但是个人感觉这种方法还是蛮麻烦的,所以写一篇使 ...
- Zabbix实现自动发现端口并监控
1.新建客户端需要的脚本 # vim discovertcpport.sh #!/bin/bash portarray=(`sudo netstat -tnlp|egrep -i "$1&q ...
- zabbix配置自动发现,故障邮件告警
对网段内的主机进行自动发现,自动加入主机组,自定加入template 创建动作时,类型这里选择discovery 然后将发现的主机加入host group和template: 动作针对的是discov ...
- zabbix自定义自动发现模板
需求: 自定义发现磁盘io,并实现监控.其他的业务组件自动发现监控其实也和这个大同小异,自动发现主要逻辑就是你要根据组件规则自动匹配出需要监控的所有组件,再通过传参的方式获取对应组件数据. 自动发现无 ...
随机推荐
- 从Qt到PyQt
Hello World PyQt与Qt具有极其相似的类族和API,而且不再使用qmake系统和Q_OBJECT宏使得PyQt在没有编译链接时频繁的错误而且代码更加友好. from PyQt4 impo ...
- c#基础学习(0806)之接口学习
首先了解一下什么是接口: 1.接口就是一种规范,协议,约定好遵守某种规范就可以写通用的代码 2.定义了一组具有各种功能的方法(只是一种能力,没有具体实现,像抽象方法一样,“关说不做”) 接口存在的意义 ...
- 我在项目中运用 IOC(依赖注入)--入门篇
之前就听同事说过依赖注入(dependency injection).控制反转(Inversion of Control).起初听的是一头雾水,试着在项目中运用了几次,总算明白了一些,抛砖引玉,与大家 ...
- AutoFac在项目中应用的体会
AutoFac的工作原理就是:注册类并映射到接口,通过注入后返回相应实例化的类! 先来简单介绍下Autofac的使用 1.通过Nuget或代码安装autofac 安装autofac :ins ...
- 动态We API(ABP官方文档翻译)
动态Web API层 创建动态Web API控制器 ForAll方法 重写ForAll ForMethods Http动词 WithVerb方法 HTTP特性 命名约定 API管理器 RemoteSe ...
- JVM类加载器及Java类的生命周期
预定义类加载器(三种): 启动(Bootstrap)类加载器: 是用本地代码实现的类装入器,它负责将<Java_Runtime_Home>/lib下面的类库加载到内存中(比如rt.jar) ...
- Python 两个list合并成一个字典
方法一:list1 = ['k1','k2','k3'] list2 = ['v1','v2','v3'] dic = dict(map(lambda x,y:[x,y],list1,list2)) ...
- 【学习笔记】--- 老男孩学Python,day10, 初识函数 形参、实参
函数:对功能的封装语法: def 函数名(形参): 函数体 函数名(实参) 函数名:命名规则和变量一样 函数的返回值: return, 函数执行完毕. 不会执行后面逻辑 1. 如果函数中不写retur ...
- java多线程3种方式
Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- PowerDesigner 常用配置修改
PowerDesigner中Name与Code同步的问题 转自:http://blog.sina.com.cn/u/48932504010005t9 PowerDesigner中,但修改了某个字段的n ...