Zabbix监控多实例Tomcat

作者: 十二楼中月 | 来源:发表于2018-06-27 17:01 被阅读17次
    监控原理图

    1. 监控步骤和设置

    1.1监控端设置

    如果add-service编写正确,并且所有需要监控的Tomcat位置固定,直接运行脚本,完成监控端的设置.重启zabbix-agent和Tomcat即可.监控还需要用到jar包,将此包上传到/lib下即可.
    cmdline-jmxclient-0.10.3

    如果不用脚本运行,可以如下设置:
    在zabbix_agent.conf最后加入以下内容
    UserParameter=java.jmx.discovery[*],/usr/local/zabbix/etc/discover_jvm.sh #这个是你discove_jvm.sh脚本放置的位置
    UserParameter=java.Runtime.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=Runtime $2 2>&1 |grep $2 |awk '{print $NF}' #jar包放置的位置.这里统一放置到 /lib下
    UserParameter=java.Memory.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=Memory $2 2>&1 |grep $2 |awk '{print $NF}'
    UserParameter=java.System.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=OperatingSystem $2 2>&1 |grep $2 |awk '{print $NF}'
    UserParameter=java.HeapMemoryUsage.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=Memory HeapMemoryUsage 2>&1 |grep $2 |awk '{print $NF}'
    UserParameter=java.NonHeapMemoryUsage.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=Memory NonHeapMemoryUsage 2>&1 |grep $2 |awk '{print $NF}'
    UserParameter=java.LoadClass.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=ClassLoading $2 2>&1 |awk '{print $NF}'
    UserParameter=java.Threading.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 192.168.0.195:$1 java.lang:type=Threading $2 2>&1 |awk '{print $NF}'
    #这里的IP是你要监控的主机的IP.
    

    当然不想写到zabbix_agent.conf文件中,可以新建tomcat.conf放置到/etc/zabbix/zabbix_agentd.conf.d中#如果是默认安装的zabbix-agent(yum安装),如果是在源码安装,找到你的安装位置.

    在catalina.sh中增加:
    # ----- Execute The Requested Command -----------------------------------------在才此处添加如下内容
    export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote"
    export CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=192.168.0.195"#客户端IP
    export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=12346"
    export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
    export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
    

    设置的JMX端口.这里需要特别注意,如果是多个实例监控,不用脚本配置,手动配置时候,要和discover_jmx.sh获取到的端口匹配上,就是每个Tomcat都有自己端口.可以在本地运行discover_jmx.sh和这里匹配下.

    以上配置以后重启zabbix-agent和Tomcat.

    1.2 web端设置

    服务器主要就是导入监控模版这里我在网络上模版基础上增加监控信息,主要是GC和堆内存详细信息。tomcat模版

    导入模版
    添加的监控模版

    在创建监控主机后,添加上面的监控模版.

    连接监控模版
    看到发现项正常
    看到这里启用,就是正常的了.
    如果出现报错,比如说不是json格式等,那么是你的discover_jmx脚本获取的值有问题.或者你在zabbix_agent.conf第一个UserParameter=java.jmx.discovery[*],/usr/local/zabbix/etc/discover_jvm.sh配置项错误,并且disconver_jvm.sh所属是否为zabbix等。可以zabbix-server使用如下命令测试,如何使获取到值并且没有例如权限报错说明获取正确:
    /usr/local/zabbix-3.0.3/bin/zabbix_get -s 192.168.199.35 -p10041 –k java.jmx.discovery #IP和端口是监控端的信息

    2. dicover-jmx脚本编写 (需要根据具体环节修改脚本)

    #!/bin/bash
    t_datadir=`find 安装tomcat位置 -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'`       
    tomcat_no=`find 安装tomcat位置 -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'|wc -l` 
    # 这里一点要注意和add-service脚本填的一样,配置端口的顺序才能一样。
     
    n_port=12345  #配置监控初始端口,也是和addservice匹配上,否则会找不到。
    i=1
    printf '{"data":[\n'   
    for tomcat in $t_datadir  #输出JSON文件  
    do  
        t_service=`echo "$tomcat"|awk -F"/" '{print $(NF-0)}'`  #这里的NF-0不能提提取tomcat服务名,则需要修改为:NF-1。  
        if [ "$i" != ${tomcat_no} ];then  
            printf "\t\t{ \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\"{#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
    

    3.add-service脚本编写 (此脚本需要根据你的环境修改后才能使用)

    #!/bin/bash
    t_datadir=`find 安装tomcat位置 -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'`      
    tomcat_no=`find 安装tomcat位置 -name catalina.sh|awk -F "/bin/catalina.sh" '{print $1}'|wc -l`
    n_port=12345  #配置监控初始端口
    local_ip=`ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}'` #提取主机IP
    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.sh
       # cp /tmp/catalina-jmx-remote.jar  $tomcat/lib/catalina-jmx-remote.jar  #复制文件到实例lib目录
        sed -i ''$m_no'a export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote"'  $tomcat/bin/catalina.sh   #插入监控配置
        let "m_no=m_no+1"     #设置行号
        sed -i ''$m_no'a export CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname='$local_ip'"' $tomcat/bin/catalina.sh                
        let "m_no=m_no+1"                                                                                                                      
        sed -i ''$m_no'a export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port='$n_port'"' $tomcat/bin/catalina.sh        
        let "m_no=m_no+1"                                                                                                                      
        sed -i ''$m_no'a export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false"' $tomcat/bin/catalina.sh        
        let "m_no=m_no+1"                                                                                                                      
        sed -i ''$m_no'a export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"' $tomcat/bin/catalina.sh     
        let "n_port=n_port+1"
    done
    local_ip=`ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $4}'`  #提取主机IP
    cat >> /etc/zabbix/zabbix_agentd.conf <<END   #修改zabbix_agentd.conf,添加KEY 增加了GC和堆内存监控 已经连接数等
    UserParameter=java.jmx.discovery,/home/zabbix/bin/jmx_discovery.sh
    UserParameter=java.Runtime.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=Runtime \$2 2>&1 |grep \$2 |awk '{print \$NF}'
    UserParameter=java.Memory.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=Memory \$2 2>&1 |grep \$2 |awk '{print \$NF}'
    UserParameter=java.System.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=OperatingSystem \$2 2>&1 |grep \$2 |awk '{print \$NF}'
    UserParameter=java.HeapMemoryUsage.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=Memory HeapMemoryUsage 2>&1 |grep \$2 |awk '{print \$NF}'
    UserParameter=java.NonHeapMemoryUsage.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=Memory NonHeapMemoryUsage 2>&1 |grep \$2 |awk '{print \$NF}'
    UserParameter=java.LoadClass.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=ClassLoading \$2 2>&1 |awk '{print \$NF}'
    UserParameter=java.Threading.status,java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:type=Threading \$2 2>&1 |awk '{print \$NF}'
    
    UserParameter=java.CMS.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:name=ConcurrentMarkSweep,type=GarbageCollector \$2 2>&1 |grep \$2|awk '{print \$NF}'
    UserParameter=java.Copy.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:name=Copy,type=GarbageCollector \$2 2>&1 |grep \$2|awk '{print \$NF}'  #这个有可能是copy也有可能是ParNew
    UserParameter=java.Survivor.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:name="Survivor Space",type=MemoryPool Usage 2>&1 |grep \$2|awk '{print \$NF}'
    UserParameter=java.PermGen.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:name="CMS Perm Gen",type=MemoryPool Usage 2>&1 |grep \$2|awk '{print \$NF}'
    UserParameter=java.OldGen.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:name="CMS Old Gen",type=MemoryPool Usage 2>&1 |grep \$2|awk '{print \$NF}'
    UserParameter=java.EdenSpace.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 java.lang:name="Eden Space",type=MemoryPool Usage 2>&1 |grep \$2|awk '{print \$NF}'
    UserParameter=java.tomcatThreadPool.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - $local_ip:\$1 Catalina:type=Executor,name=tomcatThreadPool \$2 2>&1 |grep \$2|awk '{print \$NF}'
    END
    

    4.Tomcat监控模版

    监控模版的修改不建议在xml环境下修改,建议导入到zabbix中再修改监控项,这样修改后导出即可使用.现在监控主要涉及到以下几项.
    GC+线程+线程(jvm线程和service)+堆内存+类+系统文件负载+非堆对象


    监控模版
    多个实例监控

    相关文章

      网友评论

        本文标题:Zabbix监控多实例Tomcat

        本文链接:https://www.haomeiwen.com/subject/ceqiyftx.html