• 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=12345
    i=1
    printf '{"data":[
    '
    
    for tomcat in $t_datadir
    do
        t_service=`echo "$tomcat"|awk -F"/" '{print $(NF)}'`
        if [ "$i" != ${tomcat_no} ];then
            printf "		{ 
    "
            printf "			"{#LOCAL_IP1}":"${local_ip1}",
    "
            printf "			"{#JMX_PORT}":"${n_port}",
    "
            printf "			"{#JAVA_NAME}":"${t_service}"},
    "
        else
            printf "		{ 
    "
            printf "			"{#LOCAL_IP1}":"${local_ip1}",
    "
            printf "			"{#JMX_PORT}":"${n_port}",
    "
            printf "			"{#JAVA_NAME}":"${t_service}"}]}
    "
        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.8/bin/java -jar /lib/cmdline-jmxclient-0.10.3.jar - $1:$2 java.lang:type=Runtime $3 2>&1 |grep $3 |awk '{print $NF}' UserParameter=java.Memory.status[*],/usr/local/jdk1.8/bin/java -jar /lib/cmdline-jmxclient-0.10.3.jar - $1:$2 java.lang:type=Memory $3 2>&1 |grep $3 |awk '{print $NF}' UserParameter=java.System.status[*],/usr/local/jdk1.8/bin/java -jar /lib/cmdline-jmxclient-0.10.3.jar - $1:$2 java.lang:type=OperatingSystem $3 2>&1 |grep $3 |awk '{print $NF}' UserParameter=java.HeapMemoryUsage.status[*],/usr/local/jdk1.8/bin/java -jar /lib/cmdline-jmxclient-0.10.3.jar - $1:$2 java.lang:type=Memory HeapMemoryUsage 2>&1 |grep $3 |awk '{print $NF}' UserParameter=java.NonHeapMemoryUsage.status[*],/usr/local/jdk1.8/bin/java -jar /lib/cmdline-jmxclient-0.10.3.jar - $1:$2 java.lang:type=Memory NonHeapMemoryUsage 2>&1 |grep $3 |awk '{print $NF}' UserParameter=java.LoadClass.status[*],/usr/local/jdk1.8/bin/java -jar /lib/cmdline-jmxclient-0.10.3.jar - $1:$2 java.lang:type=ClassLoading $3 2>&1 |awk '{print $NF}' UserParameter=java.Threading.status[*],/usr/local/jdk1.8/bin/java -jar /lib/cmdline-jmxclient-0.10.3.jar - $1:$2 java.lang:type=Threading $3 2>&1 |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 10050 -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.3.jar - 120.120.19.14:12345 java.lang:type=Runtime Uptime 2>&1 |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=0
    scan(){
      nc -vz -w 1 127.0.0.1 $1 2> /dev/null
      if [ $? -eq 0 ];then
        return 0
      else
        return 1
      fi
    }
    
    for i in `seq 30000 30010`
    do
      scan $i
      if  [ $? -eq 0 ];then
    #    echo "j=$j"
        port_scan[$j]=$i
        j=$((j+1))
    #    echo "$i success."
      fi
    done
    
    length=${#port_scan[@]}
    #printf "{
    "
    printf '{"data":[
    '
    for ((i=0;i<$length;i++))
    do
        if [ $i -lt $[$length-1] ];then
           printf "		{ 
    " 
           printf "			"{#SERVER_IP}":"${Server_Ip}",
    "
           printf "			"{#JMX_PORT}":"${port_scan[$i]}"},
    "
      else
           printf "		{ 
    "
           printf "			"{#SERVER_IP}":"${Server_Ip}",
    "
           printf "			"{#JMX_PORT}":"${port_scan[$i]}"}]}
    "
    #         if [ $i -lt $[$length-1] ];then
    #                 printf ','
            fi
    done
    #printf  "
    	]
    "
    #printf "}
    "

    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.3.jar - $1:$2 java.lang:type=Runtime $3 2>&1 |grep $3 |awk '{print $NF}'
    UserParameter=java.Memory.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10.3.jar - $1:$2 java.lang:type=Memory $3 2>&1 |grep $3 |awk '{print $NF}'
    UserParameter=java.System.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10.3.jar - $1:$2 java.lang:type=OperatingSystem $3 2>&1 |grep $3 |awk '{print $NF}'
    UserParameter=java.HeapMemoryUsage.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10.3.jar - $1:$2 java.lang:type=Memory HeapMemoryUsage 2>&1 |grep $3 |awk '{print $NF}'
    UserParameter=java.NonHeapMemoryUsage.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10.3.jar - $1:$2 java.lang:type=Memory NonHeapMemoryUsage 2>&1 |grep $3 |awk '{print $NF}'
    UserParameter=java.LoadClass.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10.3.jar - $1:$2 java.lang:type=ClassLoading $3 2>&1 |awk '{print $NF}'
    UserParameter=java.Threading.status[*],/application/jdk/bin/java -jar /lib/cmdline-jmxclient-0.10.3.jar - $1:$2 java.lang:type=Threading $3 2>&1 |awk '{print $NF}'

    4、测试结果:

    [root@zabbix-server ~]#zabbix_get -s 122.114.200.185  -p 10050 -k java.jmx.discovery
    {"data":[
            { 
                "{#SERVER_IP}":"122.114.200.185",
                "{#JMX_PORT}":"30001"},
            { 
                "{#SERVER_IP}":"122.114.200.185",
                "{#JMX_PORT}":"30002"}]}
    [root@zabbix-server ~]#zabbix_get -s 122.114.200.185  -p 10050 -k "java.HeapMemoryUsage.status[122.114.200.185,30001,used]"   
    15899208
    [root@zabbix-server ~]#

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

  • 相关阅读:
    Python连接MySQL
    Python监控文件夹 && 发送邮件
    CentOS安装Redis
    weak_ptr
    libevent(六)http server
    libevent(五)使用例子
    laravel查询数据库获取结果如何判断是否为空?
    centos7 php-fpm 开机启动
    centos7 防火墙
    Laravel
  • 原文地址:https://www.cnblogs.com/huangyanqi/p/9243085.html
Copyright © 2020-2023  润新知