单一实例手动部署: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

  1. #!/bin/bash
  2.  
  3. #修改为对应的tomcat的目录
  4. t_datadir=`find /usr/local/webserver/*/bin/ -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'`
  5. tomcat_no=`find /usr/local/webserver/*/bin/ -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'|wc -l`

  6. #监控的端口启始端口
  7. n_port=12345
  8.  
  9. #修改为对应的接入网卡
  10. local_ip=`ifconfig eth2 |awk -F '[ :]+' 'NR==2 {print $3}'`
  11. for tomcat in $t_datadir
  12. do
  13. m_no=`cat -n $tomcat/bin/catalina.sh|grep 'Execute The Requested Command'|awk '{print $1}'` #在该行的下边插入如下几行
  14. cp $tomcat/bin/catalina.sh $tomcat/bin/catalina.sh_bak #先备份原文件
  15. #把catalina-jmx-remote.jar放置/tmp目录下,方便拷贝
  16. cp /tmp/catalina-jmx-remote.jar $tomcat/lib/catalina-jmx-remote.jar #注意这个地方,需要把软件包拷贝到对应的目录下
  17. sed -i ''$m_no'a CATALINA_OPTS="-Dcom.sun.management.jmxremote=true' $tomcat/bin/catalina.sh #插入配置
  18. let "m_no=m_no+1" #切换到新的行
  19. sed -i ''$m_no'a -Djava.rmi.server.hostname='$local_ip'' $tomcat/bin/catalina.sh
  20. let "m_no=m_no+1"
  21. sed -i ''$m_no'a -Dcom.sun.management.jmxremote.port='$n_port'' $tomcat/bin/catalina.sh
  22. let "m_no=m_no+1"
  23. sed -i ''$m_no'a -Dcom.sun.management.jmxremote.ssl=false' $tomcat/bin/catalina.sh
  24. let "m_no=m_no+1"
  25. sed -i ''$m_no'a -Dcom.sun.management.jmxremote.authenticate=false"' $tomcat/bin/catalina.sh
  26. let "n_port=n_port+1"
  27. done

  28. #以下为测试环境添加的配置,忽略!
  29. ##server.mxl
  30. ##M_mxlfind=`find /application/tomcat*/conf/server.xml -name server.xml | awk -F "/conf/server.xml" '{print $1}'`
  31. ##Smxl_no=`find /application/tomcat*/conf/server.xml -name server.xml | awk -F "/conf/server.xml" '{print $1}'|wc -l`
  32. #for Mxl in $t_datadir
  33. #do
  34. # S_hc=`cat -n $Mxl/conf/server.xml|grep 'ThreadLocalLeakPreventionListener'|awk '{print $1}'`
  35. ## let "Smxl_no=Smxl_no+1"
  36. # cp $Mxl/conf/server.xml $Mxl/conf/server.xml_bak
  37. # sed -i ''$S_hc'a \\ <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="'$n_port'" rmiServerPortPlatform="'$n_port'"/>' $Mxl/conf/server.xml
  38. ## let "Smxl_no=Smxl_no+1"
  39. # let "n_port=n_port+1"
  40. #done
  41.  
  42. #local_ip=`ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $3}'`

注释:脚本的主要目的是,逐一修改每个Tomcat实例的/bin/catalina.sh文件;只需执行一次即可;分别添加如下内容

  1. export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote"
  2. export CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=122.114.200.185"
  3. export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
  4. export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"

catalina.sh-284行

 

  3、第二个脚本

  1. [root@agent scripts]#pwd
  2. /etc/zabbix/scripts
  3. [root@localhost scripts]# vim jmx_discovery.sh
  4.  
  5. #!/bin/bash
  6. t_datadir=`find /usr/local/webserver/*/bin/ -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'`
  7. tomcat_no=`find /usr/local/webserver/*/bin/ -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'|wc -l`
  8. local_ip1=`ifconfig eth2 |awk -F '[ :]+' 'NR==2 {print $3}'`
  9.  
  10. n_port=
  11. i=
  12. printf '{"data":[\n'
  13.  
  14. for tomcat in $t_datadir
  15. do
  16. t_service=`echo "$tomcat"|awk -F"/" '{print $(NF)}'`
  17. if [ "$i" != ${tomcat_no} ];then
  18. printf "\t\t{ \n"
  19. printf "\t\t\t\"{#LOCAL_IP1}\":\"${local_ip1}\",\n"
  20. printf "\t\t\t\"{#JMX_PORT}\":\"${n_port}\",\n"
  21. printf "\t\t\t\"{#JAVA_NAME}\":\"${t_service}\"},\n"
  22. else
  23. printf "\t\t{ \n"
  24. printf "\t\t\t\"{#LOCAL_IP1}\":\"${local_ip1}\",\n"
  25. printf "\t\t\t\"{#JMX_PORT}\":\"${n_port}\",\n"
  26. printf "\t\t\t\"{#JAVA_NAME}\":\"${t_service}\"}]}\n"
  27. fi
  28. let "n_port=n_port+1"
  29. let "i=i+1"
  30. done

注释:输出json格式的数据。

效果如下:

  4、zabbix_agentd.conf 添加如下内容:

  1. #Tomcat
    UnsafeUserParameters=1
  2. UserParameter=java.jmx.discovery,/etc/zabbix/scripts/jmx_discovery.sh
  3. #UserParameter=java.Runtime.status[*],/usr/local/jdk1./bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Runtime \$ >& |grep \$ |awk '{print $NF}'
  4. UserParameter=java.Memory.status[*],/usr/local/jdk1./bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Memory \$ >& |grep \$ |awk '{print $NF}'
  5. UserParameter=java.System.status[*],/usr/local/jdk1./bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=OperatingSystem \$ >& |grep \$ |awk '{print $NF}'
  6. 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}'
  7. 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}'
  8. UserParameter=java.LoadClass.status[*],/usr/local/jdk1./bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=ClassLoading \$ >& |awk '{print $NF}'
  9. 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、其他操作

  1. #权限设置
    chmod +s /usr/bin/find
  2. chmod 550 /etc/zabbix/scripts/jmx_discovery.sh
    chown zabbix.zabbix /etc/zabbix/scripts/
  3.  
  4. #重启agent服务
  5. systemctl restart zabbix-agent.service
    systemctl enable zabbix-agent.service

  6、server端测试agent端设置是否成功

  1. zabbix_get -s 122.114.100.15 -p -k java.jmx.discovery
  2.  
  3. zabbix_get -s 122.114.100.15 -p 10050 -k "java.HeapMemoryUsage.status[122.114.100.15,12345,used]" #必须要有返回值

   6.1、agent自己测试自己

  1. [root@localhost ~]# java -jar /lib/cmdline-jmxclient-0.10..jar - 120.120.19.14: java.lang:type=Runtime Uptime >& |grep Uptime |awk '{print $NF}'
  2. 183465827

 java -jar /lib/cmdline-jmxclient-0.10.3.jar - 120.120.19.14:12345 java.lang:type=Memory HeapMemoryUsage

注释:必须要有返回值

  7、实例测试

  1. #重启单个Tomcat实力
  2. /application/tomcat/bin/startup.sh
  3. /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的

  1. # ----- Execute The Requested Command -----------------------------------------
  2. CATALINA_OPTS="-Dcom.sun.management.jmxremote=true
  3. -Djava.rmi.server.hostname=10.220.129.140
  4. -Dcom.sun.management.jmxremote.port=30000
  5. -Dcom.sun.management.jmxremote.ssl=false
  6. -Dcom.sun.management.jmxremote.authenticate=false"

2、/etc/zabbix/scripts/prot.sh内容如下

  1. #!/bin/bash
  2. Server_Ip=`ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $3}'`
  3.  
  4. declare -a port_scan=()
  5. declare -i j=
  6. scan(){
  7. nc -vz -w 127.0.0.1 $ > /dev/null
  8. if [ $? -eq ];then
  9. return
  10. else
  11. return
  12. fi
  13. }
  14.  
  15. for i in `seq `
  16. do
  17. scan $i
  18. if [ $? -eq ];then
  19. # echo "j=$j"
  20. port_scan[$j]=$i
  21. j=$((j+))
  22. # echo "$i success."
  23. fi
  24. done
  25.  
  26. length=${#port_scan[@]}
  27. #printf "{\n"
  28. printf '{"data":[\n'
  29. for ((i=;i<$length;i++))
  30. do
  31. if [ $i -lt $[$length-] ];then
  32. printf "\t\t{ \n"
  33. printf "\t\t\t\"{#SERVER_IP}\":\"${Server_Ip}\",\n"
  34. printf "\t\t\t\"{#JMX_PORT}\":\"${port_scan[$i]}\"},\n"
  35. else
  36. printf "\t\t{ \n"
  37. printf "\t\t\t\"{#SERVER_IP}\":\"${Server_Ip}\",\n"
  38. printf "\t\t\t\"{#JMX_PORT}\":\"${port_scan[$i]}\"}]}\n"
  39. # if [ $i -lt $[$length-] ];then
  40. # printf ','
  41. fi
  42. done
  43. #printf "\n\t]\n"
  44. #printf "}\n"

3、#vim /etc/zabbix/zabbix_agentd.conf

  1. #Tomcat
  2. UserParameter=java.jmx.discovery,/etc/zabbix/scripts/prot.sh
  3. UserParameter=java.Runtime.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Runtime \$ >& |grep \$ |awk '{print $NF}'
  4. UserParameter=java.Memory.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Memory \$ >& |grep \$ |awk '{print $NF}'
  5. UserParameter=java.System.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=OperatingSystem \$ >& |grep \$ |awk '{print $NF}'
  6. UserParameter=java.HeapMemoryUsage.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Memory HeapMemoryUsage >& |grep \$ |awk '{print $NF}'
  7. UserParameter=java.NonHeapMemoryUsage.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Memory NonHeapMemoryUsage >& |grep \$ |awk '{print $NF}'
  8. UserParameter=java.LoadClass.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=ClassLoading \$ >& |awk '{print $NF}'
  9. UserParameter=java.Threading.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10..jar - $:\$ java.lang:type=Threading \$ >& |awk '{print $NF}'

4、测试结果:

  1. [root@zabbix-server ~]#zabbix_get -s 122.114.200.185 -p -k java.jmx.discovery
  2. {"data":[
  3. {
  4. "{#SERVER_IP}":"122.114.200.185",
  5. "{#JMX_PORT}":""},
  6. {
  7. "{#SERVER_IP}":"122.114.200.185",
  8. "{#JMX_PORT}":""}]}
  9. [root@zabbix-server ~]#zabbix_get -s 122.114.200.185 -p -k "java.HeapMemoryUsage.status[122.114.200.185,30001,used]"
  10.  
  11. [root@zabbix-server ~]#

5、zabbix模板(各位根据上班的模板修改下对应的宏)

zabbix之自动发现Tomcat多实例(第一种:已经部署完成,后续不再添加;第二种:后续或根据需要添加Tomcat实例)的更多相关文章

  1. zabbix使用自动发现监控esxi的磁盘存储storage

    zabbix使用自动发现监控esxi的磁盘存储storage 在任意一台可以访问vcenter的zabbix-agent服务器上添加exsi的磁盘监控模板即可 创建模板过程: custom.esxi. ...

  2. 【Zabbix】Zabbix Server自动发现

    Zabbix自动发现 由于有上百台的虚拟机需要监控,如果一个个去添加配置,费时费力.Zabbix的自动发现,可以自动发现需要监控的机器,监控相应指标. 前置条件 安装部署好Zabbix Server. ...

  3. zabbix的自动发现、自定义添加监控项目、配置邮件告警

    1.zabbix的自动发现这里的自动发现,所显示出来的是规则的上自动了现 然后 可以对其内容进行相关的配制,如时间或周期 注意:对于单个主机的规则,可以自行添加或删除, 但对于已经添加好了的规则,若需 ...

  4. 01 - zabbix | LLD自动发现

    01 - zabbix | LLD自动发现 1. 原理 zabbix支持设置变量,用{#VAR_NAME}来表示.然后有一些系统保留的变量 2. 设置 2.1 交换机电源自动发现   名字写好后进进入 ...

  5. zabbix低级自动发现之mysql多实例

    1.低级自动发现概述 zabbix的低级自动发现(LLD)适用于监控多实例,监控变化的数据(分区.网卡). 自动发现(LLD)提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法.例如,Z ...

  6. zabbix监控自动发现监控tomcat(V1)

    背景说明: 由于zabbix监控使用自带的模版,只能监控主机上只有1个tomcat的场景适合,虽然网上很多朋友都是在每个监控项上面添加一个空格来解决问题.但是个人感觉这种方法还是蛮麻烦的,所以写一篇使 ...

  7. Zabbix实现自动发现端口并监控

    1.新建客户端需要的脚本 # vim discovertcpport.sh #!/bin/bash portarray=(`sudo netstat -tnlp|egrep -i "$1&q ...

  8. zabbix配置自动发现,故障邮件告警

    对网段内的主机进行自动发现,自动加入主机组,自定加入template 创建动作时,类型这里选择discovery 然后将发现的主机加入host group和template: 动作针对的是discov ...

  9. zabbix自定义自动发现模板

    需求: 自定义发现磁盘io,并实现监控.其他的业务组件自动发现监控其实也和这个大同小异,自动发现主要逻辑就是你要根据组件规则自动匹配出需要监控的所有组件,再通过传参的方式获取对应组件数据. 自动发现无 ...

随机推荐

  1. linux xargs 命令详解

    xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从 ...

  2. vue2.0读书笔记3 - router、vuex

    1.vue的应用场景.优势.劣势 优势 通常情况下,运行时效率更高:一个事件循环仅一次视图更新,无频繁的DOM操作: 数据与视图分离,通过管理数据流,控制页面的展现,便于维护.且高效: 数据双向绑定, ...

  3. Tomcat 配置上传文件到项目外的路径

    使用 Tomcat 作为服务器的时候,将上传文件保存在项目路径下,每次重启服务或者打成 war 包的时候很容易丢失上传的文件,于是我们配置 Tomcat 把文件保存到项目外的其他磁盘路径: 1. 打开 ...

  4. MySQL常用命令操作

    1. 命令行登录使用默认3306端口的MySQL: mysql -u root -p 2. 通过TCP连接管理不同端口的多个MySQL(注意:MySQL4.1以上版本才有此项功能): mysql -u ...

  5. [学习笔记] Miller-Rabin质数测试 & Pollard-Rho质因数分解

    目录 Miller-Rabin质数测试 & Pollard-Rho质因数分解 Miller-Rabin质数测试 一些依赖的定理 实现以及正确率 Pollard-Rho质因数分解 生日悖论与生日 ...

  6. ionic中generate page后module.ts报错的解决办法

    此问题出现在Ionic官方将版本从2.2升级到Ionic3以上之后, 在项目中generate page时,自动创建的module.ts就报错,如下: 解决办法如下: 1)将IonicModule替换 ...

  7. Promise异步编程整理

    1.单线程模型 单线程模型指的是,JavaScript 只在一个线程上运行.也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待. 注意,JavaScript 只在一个线 ...

  8. Java利用反射取得类的所有信息

    Java中可以利用反射获取类的名称.构造函数.属性.方法.也就是说可以通过反射可以取得类的所有信息(不管该成员是否封装为private). 如有下面的Dept类定义: package org.lyk. ...

  9. 一次查找Windows Live Writer的VSPaste插件丢失RTF格式信息的经历

    背景 我在博客园上写博客是使用Windows Live Writer,代码高亮插件是使用Paste from Visual Studio(下文简称VSPaste). Windows Live Writ ...

  10. The request sent by the client was syntactically incorrect.

    HTTP Status 400 - type Status report message description The request sent by the client was syntacti ...