zabbix监控多实例TomCat(自动发现)

案例:一台主机部署多实例tomcat,端口不同,协议不同,路径不同

解决方案:zabbix自动发现

工具下载:cmdline-jmxclient-0.10.3.jar

监控项:65项,较为全面,可根据自己项目需求,具体使用

监控名称键值应用集
{#JAVA_NAME} ActiveCount 当前连接池数量:tomcat.DruidDataSource.status[{#JMX_PORT},"{#JDBC_ID}",ActiveCount]Tomcat_JDBC连接池
{#JAVA_NAME} Code Cache (代码缓存区)使用空间:java.MemoryPool.status[{#JMX_PORT},"name=Code Cache",used]Tomcat_内存
{#JAVA_NAME} Code Cache (代码缓存区)提交空间:java.MemoryPool.status[{#JMX_PORT},"name=Code Cache",committed]Tomcat_内存
{#JAVA_NAME} Code Cache (代码缓存区)最大空间:java.MemoryPool.status[{#JMX_PORT},"name=Code Cache",max]Tomcat_内存
{#JAVA_NAME} Compressed Class (压缩类空间)使用空间:java.MemoryPool.status[{#JMX_PORT},"name=Compressed Class Space",used]Tomcat_内存
{#JAVA_NAME} Compressed Class (压缩类空间)提交空间:java.MemoryPool.status[{#JMX_PORT},"name=Compressed Class Space",committed]Tomcat_内存
{#JAVA_NAME} Compressed Class (压缩类空间)最大空间::java.MemoryPool.status[{#JMX_PORT},"name=Compressed Class Space",max]Tomcat_内存
{#JAVA_NAME} CPU 使用率:tomcat.Cpu.status[{#TOMCAT_PID}]Tomcat_CPU
{#JAVA_NAME} Eden Space (伊甸园)使用空间:java.MemoryPool.status[{#JMX_PORT},"name=Par Eden Space",used]Tomcat_内存
{#JAVA_NAME} Eden Space (伊甸园)提交空间:java.MemoryPool.status[{#JMX_PORT},"name=Par Eden Space",committed]Tomcat_内存
{#JAVA_NAME} Eden Space (伊甸园)最大空间:java.MemoryPool.status[{#JMX_PORT},"name=Par Eden Space",max]Tomcat_内存
{#JAVA_NAME} GC CMS (ConcurrentMarkSweep)回收时间:java.Gc.status[{#JMX_PORT},ConcurrentMarkSweep,CollectionTime]Java_GC
{#JAVA_NAME} GC CMS (ConcurrentMarkSweep)每秒回收数量:java.Gc.status[{#JMX_PORT},ConcurrentMarkSweep,CollectionCount]Java_GC
{#JAVA_NAME} GC Copy 时间:java.Gc.status[{#JMX_PORT},Copy,CollectionTime]Java_GC
{#JAVA_NAME} GC Copy 每秒数量:java.Gc.status[{#JMX_PORT},Copy,CollectionCount]Java_GC
{#JAVA_NAME} GC MSC (MarkSweepCompact)回收时间:java.Gc.status[{#JMX_PORT},MarkSweepCompact,CollectionTime]Java_GC
{#JAVA_NAME} GC ParNew (新生代)回收时间:java.Gc.status[{#JMX_PORT},ParNew,CollectionTime]Java_GC
{#JAVA_NAME} GC ParNew (新生代)每秒回收数量:java.Gc.status[{#JMX_PORT},ParNew,CollectionCount]Java_GC
{#JAVA_NAME} GC PMS (PS MarkSweep)回收时间:java.Gc.status[{#JMX_PORT},"PS MarkSweep",CollectionTime]Java_GC
{#JAVA_NAME} GC PMS (PS MarkSweep)每秒回收数量:java.Gc.status[{#JMX_PORT},"PS MarkSweep",CollectionCount]Java_GC
{#JAVA_NAME} GC PS (PS Scavenge)回收时间:java.Gc.status[{#JMX_PORT},"PS Scavenge",CollectionTime]Java_GC
{#JAVA_NAME} GC PS (PS Scavenge)每秒回收数量:java.Gc.status[{#JMX_PORT},"PS Scavenge",CollectionCount]Java_GC
{#JAVA_NAME} java总开启线程数:java.Threading.status[{#JMX_PORT},TotalStartedThreadCount]Java_线程
{#JAVA_NAME} java活动线程数:java.Threading.status[{#JMX_PORT},ThreadCount]Java_线程
{#JAVA_NAME} java线程峰值:java.Threading.status[{#JMX_PORT},PeakThreadCount]Java_线程
{#JAVA_NAME} JVM名称:java.Runtime.status[{#JMX_PORT},VmName]Tomcat_运行时间
{#JAVA_NAME} JVM启动时间:java.Runtime.status[{#JMX_PORT},Uptime]Tomcat_运行时间
{#JAVA_NAME} JVM版本:java.Runtime.status[{#JMX_PORT},VmVersion]Tomcat_版本
{#JAVA_NAME} MaxActive 最大连接池数量:tomcat.DruidDataSource.status[{#JMX_PORT},"{#JDBC_ID}",MaxActive]Tomcat_JDBC连接池
{#JAVA_NAME} Metaspace (元数据)使用空间:java.MemoryPool.status[{#JMX_PORT},name="Metaspace",used]Tomcat_内存
{#JAVA_NAME} Metaspace (元数据)提交空间:java.MemoryPool.status[{#JMX_PORT},name="Metaspace",committed]Tomcat_内存
{#JAVA_NAME} Old Gen (老年代)使用空间:java.MemoryPool.status[{#JMX_PORT},"name=CMS Old Gen",used]Tomcat_内存
{#JAVA_NAME} Old Gen (老年代)提交空间:java.MemoryPool.status[{#JMX_PORT},"name=CMS Old Gen",committed]Tomcat_内存
{#JAVA_NAME} Old Gen (老年代)最大空间:java.MemoryPool.status[{#JMX_PORT},"name=CMS Old Gen",max]Tomcat_内存
{#JAVA_NAME} Survivor Space (幸存区)使用空间:java.MemoryPool.status[{#JMX_PORT},"name=Par Survivor Space",used]Tomcat_内存
{#JAVA_NAME} Survivor Space (幸存区)提交空间:java.MemoryPool.status[{#JMX_PORT},"name=Par Survivor Space",committed]Tomcat_内存
{#JAVA_NAME} Survivor Space (幸存区)最大空间:java.MemoryPool.status[{#JMX_PORT},"name=Par Survivor Space",max]Tomcat_内存
{#JAVA_NAME} TomCat_允许的活动会话的最大数量,或-1(没有限制):tomcat.Session.status[{#JMX_PORT},{#APP_PATH_NAME},maxActiveSessions]Tomcat_会话
{#JAVA_NAME} TomCat_到目前为止活动会话的最大数量:tomcat.Session.status[{#JMX_PORT},{#APP_PATH_NAME},maxActive]Tomcat_会话
{#JAVA_NAME} TomCat_单个请求的最大处理时间:tomcat.GlobalRequestProcessor.status[{#JMX_PORT},{#TOMCAT_PORT},maxTime]Tomcat_请求时间
{#JAVA_NAME} TomCat_当前活动会话的数量:tomcat.Session.status[{#JMX_PORT},{#APP_PATH_NAME},activeSessions]Tomcat_会话
{#JAVA_NAME} TomCat_当前线程:tomcat.ThreadPool.status[{#JMX_PORT},{#TOMCAT_PORT},currentThreadCount]Tomcat_线程
{#JAVA_NAME} TomCat_最大线程:tomcat.ThreadPool.status[{#JMX_PORT},{#TOMCAT_PORT},maxThreads]Tomcat_线程
{#JAVA_NAME} TomCat_每秒创建的会话数量:tomcat.Session.status[{#JMX_PORT},{#APP_PATH_NAME},sessionCounter]Tomcat_会话
{#JAVA_NAME} TomCat_由于到达maxActive而拒绝的会话数:tomcat.Session.status[{#JMX_PORT},{#APP_PATH_NAME},rejectedSessions]Tomcat_会话
{#JAVA_NAME} TomCat_繁忙线程:tomcat.ThreadPool.status[{#JMX_PORT},{#TOMCAT_PORT},currentThreadsBusy]Tomcat_线程
{#JAVA_NAME} TomCat_网络入流量:tomcat.GlobalRequestProcessor.status[{#JMX_PORT},{#TOMCAT_PORT},bytesReceived]Tomcat_网络流量
{#JAVA_NAME} TomCat_网络出流量:tomcat.GlobalRequestProcessor.status[{#JMX_PORT},{#TOMCAT_PORT},bytesSent]Tomcat_网络流量
{#JAVA_NAME} TomCat_请求总的处理时间:tomcat.GlobalRequestProcessor.status[{#JMX_PORT},{#TOMCAT_PORT},processingTime]Tomcat_请求时间
{#JAVA_NAME} TomCat_请求数:tomcat.GlobalRequestProcessor.status[{#JMX_PORT},{#TOMCAT_PORT},requestCount] 
{#JAVA_NAME} TomCat_错误请求数:tomcat.GlobalRequestProcessor.status[{#JMX_PORT},{#TOMCAT_PORT},errorCount] 
{#JAVA_NAME} TomCat版本:tomcat.Version[{#JMX_PORT}]Tomcat_请求数
{#JAVA_NAME} 堆内存使用值:java.HeapMemoryUsage.status[{#JMX_PORT},used]Tomcat_版本
{#JAVA_NAME} 堆内存提交值:java.HeapMemoryUsage.status[{#JMX_PORT},committed]Tomcat_内存
{#JAVA_NAME} 堆内存最大值:java.HeapMemoryUsage.status[{#JMX_PORT},max]Tomcat_内存
{#JAVA_NAME} 守护程序线程数:java.Threading.status[{#JMX_PORT},DaemonThreadCount]Tomcat_内存
{#JAVA_NAME} 已加载当前类的数量:java.LoadClass.status[{#JMX_PORT},LoadedClassCount]Java_线程
{#JAVA_NAME} 已加载类总数:java.LoadClass.status[{#JMX_PORT},TotalLoadedClassCount]Tomcat_类
{#JAVA_NAME} 已卸载类的数量:java.LoadClass.status[{#JMX_PORT},UnloadedClassCount]Tomcat_类
{#JAVA_NAME} 系统可打开最大打开文件数:java.System.status[{#JMX_PORT},MaxFileDescriptorCount]Tomcat_类
{#JAVA_NAME} 系统平均负载:java.System.status[{#JMX_PORT},SystemLoadAverage]Tomcat_系统
{#JAVA_NAME} 系统应用当前打开文件数:java.System.status[{#JMX_PORT},OpenFileDescriptorCount]Tomcat_系统
{#JAVA_NAME} 被挂起的对象的计数:java.Memory.status[{#JMX_PORT},ObjectPendingFinalizationCount]Tomcat_系统
{#JAVA_NAME} 非堆内存使用值:java.NonHeapMemoryUsage.status[{#JMX_PORT},used]Tomcat_内存
{#JAVA_NAME} 非堆内存提交值:java.NonHeapMemoryUsage.status[{#JMX_PORT},committed]Tomcat_内存

上述监控项中,不能体现出具体取值方式是什么,简单写几个:

内存池eden space:

Tomcat本地查看eden space:

java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:=MemoryPool,name=PS\ Eden\ Space Usage

zabbix监控eden区域键值:

最大空间:   jmx["java.lang:type=MemoryPool,name=PS Eden Space",Usage.max]
已用空间:   jmx["java.lang:type=MemoryPool,name=PS Eden Space",Usage.used]
提交空间:   jmx["java.lang:type=MemoryPool,name=PS Eden Space",Usage.committed]

由于多实例监控TomCat,所以zabbix监控的

监控项设置为动态获取 {#JAVA_NAME}

jmx端口设置为动态获取  {#JMX_PORT}

tomcat-http端口为动态   {#TOMCAT_PORT}

zabbix监控agentd配置添加:

UserParameter=java.jmx.discovery,/usr/local/zabbix-2.4.5/etc/zabbix_agentd.conf.d/jmx_discovery.sh
UserParameter=java.Runtime.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:"$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 - 127.0.0.1:"$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 - 127.0.0.1:"$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 - 127.0.0.1:"$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 - 127.0.0.1:"$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 - 127.0.0.1:"$1" java.lang:type=ClassLoading "$2" 2>&1 |awk '{print $NF}'
UserParameter=java.Threading.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:"$1" java.lang:type=Threading "$2" 2>&1 |awk '{print $NF}'
UserParameter=java.MemoryPool.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:"$1" java.lang:type=MemoryPool,"$2" Usage 2>&1 | grep "$3" | awk '{print $NF}'
UserParameter=java.Gc.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:"$1" java.lang:type=GarbageCollector,name="$2" "$3" 2>&1 | awk '{print $NF}'
UserParameter=tomcat.ThreadPool.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:"$1" Catalina:type=ThreadPool,name=\"$2\" "$3" 2>&1 | awk '{print $NF}'
UserParameter=tomcat.GlobalRequestProcessor.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:"$1" Catalina:type=GlobalRequestProcessor,name=\"$2\" "$3" 2>&1 | awk '{print $NF}'
UserParameter=tomcat.Version[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:"$1" Catalina:type=Server serverInfo 2>&1 | awk '{print $NF}'
UserParameter=tomcat.Session.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:"$1" Catalina:type=Manager,context="$2",host=localhost $3 2>&1 | awk '{print $NF}'
UserParameter=tomcat.Cpu.status[*],/usr/bin/top -bn 1 -p "$1" | grep "$1" | awk '{print $$9}'
UserParameter=tomcat.DruidDataSource.status[*],java -jar /lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:"$1" com.alibaba.druid:"$2",type=DruidDataSource "$3" 2>&1 | awk '{print $NF}'

如下脚本:

jmx_discovery.sh   路径为:/usr/local/zabbix-2.4.5/etc/zabbix_agentd.conf.d/  (也可根据自己爱好移动脚本位置)

#!/bin/bash
# auth hzh
# date 2019-08-16

Host="127.0.0.1"

# 过滤已添加JMX配置的TomCat
jmx_TomCat=`ps aux | grep tomcat | grep "jmxremote" | grep -v grep  | awk -F'file=' '{print $2}' | awk -F'conf' '{print $1}'`

# 统计本机TomCat实例个数 
tomcat_no=`echo "${jmx_TomCat}" | wc -l `

i=1
cmd="/lib/cmdline-jmxclient-0.10.3.jar"
java_cmd=`which java`

# --输出JSON文件--
printf '{\n\t"data":[\n'
for tomcat in $jmx_TomCat                                                                    
do
    # 这里的NF不一能提提取tomcat服务名,可需要修改为:NF-1。
    t_service=`echo "$tomcat"|awk -F"/" '{print $(NF-1)}'`  

    # 获取JMX端口
    n_port=`grep 'jmxremote.port' "${tomcat}"/bin/catalina.sh | grep -v '^#'| awk -F'jmxremote.port=' '{print $2}' | awk '{print $1}'`

    # 获取TomCat Web端口
    t_port=`${java_cmd} -jar "${cmd}" - "${Host}":"${n_port}" |grep 'ThreadPool' | grep "http"|  awk -F'"' '{print $2}'`

    # 获取TomCat PID
    t_pid=`ps -ef | grep -Ev 'grep|jmxclient' | grep "${n_port}"| awk '{print $2}'`

    # 获取JDBC id
    j_id=`${java_cmd} -jar "${cmd}" - "${Host}":"${n_port}" | grep "alibaba" | grep id= | awk -F':' '{print $2}'| awk -F',' '{print $1}' | head -n 1`

    # 调试输出TomCat PID
    # echo JMX_PORT:${n_port},t_pid:${t_pid}

    # 获取TomCat部署项目文件夹名称,过滤不需要统计的应用目录(根据实际需要修改 -Ev 参数后名称 以 | 分隔)
    ignore_name="/,|tiao|manager,|examples|docs"
    app_name=`${java_cmd} -jar "${cmd}" - "${Host}":"${n_port}" | grep  'type=Manager'| grep -Ev "${ignore_name}" | awk -F',' '{print $1}'| awk -F'=' '{print $2}'`
    
    # 调试输出
    # echo "${app_name}"

    # 判断如果是最后一个TomCat,则打印格式为else下
        if [ "$i" != "${tomcat_no}" ];then
                printf "\t\t{ \n"
                printf "\t\t\t\"{#JMX_PORT}\":\"${n_port}\",\n"
                printf "\t\t\t\"{#TOMCAT_PORT}\":\"${t_port}\",\n"
                printf "\t\t\t\"{#TOMCAT_PID}\":\"${t_pid}\",\n"
                printf "\t\t\t\"{#JDBC_ID}\":\"${j_id}\",\n"
                printf "\t\t\t\"{#APP_PATH_NAME}\":\"${app_name}\",\n"
                printf "\t\t\t\"{#JAVA_NAME}\":\"${t_service}\"\n\t\t},\n"
        else
                printf "\t\t{ \n"
                printf "\t\t\t\"{#JMX_PORT}\":\"${n_port}\",\n"
                printf "\t\t\t\"{#TOMCAT_PORT}\":\"${t_port}\",\n"
                printf "\t\t\t\"{#TOMCAT_PID}\":\"${t_pid}\",\n"
                printf "\t\t\t\"{#JDBC_ID}\":\"${j_id}\",\n"
                printf "\t\t\t\"{#APP_PATH_NAME}\":\"${app_name}\",\n"
                printf "\t\t\t\"{#JAVA_NAME}\":\"${t_service}\"\n\t\t}\n\t\t]\n}\n"
        fi
        let "i=i+1"
done

输出如下:本机三个tomcat实例基本信息

{
        "data":[
                { 
                        "{#JMX_PORT}":"12347",
                        "{#TOMCAT_PORT}":"http-bio-8081",
                        "{#TOMCAT_PID}":"3842",
                        "{#APP_PATH_NAME}":"/",
                        "{#JAVA_NAME}":"tomcat_7_01"
                },
                { 
                        "{#JMX_PORT}":"12349",
                        "{#TOMCAT_PORT}":"http-bio-8082",
                        "{#TOMCAT_PID}":"3878",
                        "{#APP_PATH_NAME}":"/",
                        "{#JAVA_NAME}":"tomcat_7_02"
                },
                { 
                        "{#JMX_PORT}":"12345",
                        "{#TOMCAT_PORT}":"http-bio-8080",
                        "{#TOMCAT_PID}":"3787",
                        "{#APP_PATH_NAME}":"/",
                        "{#JAVA_NAME}":"tomcat_7"
                }
                ]
}

zabbix 获取到此JSON数据后一一匹配探索规则进行对应替换

配置完成后,导入监控模板 Template_App_Tomcat.xml

重启zabbix_agentd 后,需要等3-5分钟即可出监控项

 

如果还有其他问题,各位朋友可以留言我交流

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值