Zabbix5系列-监控SpringBoot内置的Tomcat和JVM
-
-
-
- 一、参考
- 二、环境
- 三、开启JMX
- 配置模板
- 五、测试
- 六、修改后的模板参考
-
- 6.1 Apache Tomcat JMX模板
- 6.2 Generic Java JMX模板
-
-
一、参考
- Zabbix5系列
- Zabbix5专栏
- Centos7安装Docker
- Centos8安装Docker
- Debian10安装Docker
- Zabbix5系列-Docker安装zabbix5.4 (一)
- Zabbix5系列-监控华为,H3C交换机(snmpv2c/snmpv3/snmptrap) (二)
- Zabbix5系列-监控Windows主机 (三)
- Zabbix5系列-监控Linux主机 (四)
- Zabbix5系列-Linux/Windows磁盘SMART监控 (五)
- Zabbix监控惠普服务器iLO管理口 (六)
- Zabbix监控海康威视摄像头 (七)
- Zabbix5系列-使用SNMP监控Linux (八)
- Zabbix5系列-监控docker (九)
- Zabbix5系列-监控mysql(5.7/5.8/mariadb) (十)
- Zabbix5系列-监控redis (十一)
- Zabbix5系列-监控nginx (十二)
- Zabbix5系列-制作拓扑图 (十三)
- Zabbix5系列-声音报警,电子邮件报警 (十四)
- Zabbix5系列-钉钉报警 (十五)
- Zabbix5系列-创建自动发现模板 (十六)
- Zabbix5系列-接入Grafana面板 (十七)
- Zabbix5系列-报告工具ZbxTable (十八)
- 用户手册: https://www.zabbix.com/documentation/current/zh/manual
- 参考官方模板: https://git.zabbix.com/projects/ZBX/repos/zabbix/browse/templates?at=refs/heads/release/5.4
- Zabbix模板库: https://share.zabbix.com
- Zabbix容器: https://hub.docker.com/u/zabbix
- Zabbix Agent下载页: https://www.zabbix.com/cn/download_agents
- MIB浏览器下载: http://www.ireasoning.com/download.shtml
- 华为MIB查询: https://support.huawei.com/mibtoolweb/enterpriseMibInfo/zh
- 华为 VRP V200R021C00SPC100 MIB文件: https://support.huawei.com/enterprise/zh/software/253350229-ESW2000397776
- H3C Comware MIB文件: https://www.h3c.com/cn/d_200905/635750_30003_0.htm
- 华为图标 百度云盘 提取码mzhx: https://pan.baidu.com/s/1S6p96p3gNrv78Z2yJxrhaQ
- zabbix报表工具: https://zbxtable.cactifans.com/
- Grafana面板: https://grafana.com/docs/grafana/latest/installation/docker/
- Grafana-cn面板: https://hub.docker.com/r/w958660278/grafana-cn
二、环境
系统:Centos7.9 JDK版本:1.8.0_251 Springboot版本:2.1.6.RELEASE
三、开启JMX
3.1 如果采用springboot注册为Linux找到服务模式运行程序jar在目录中创建同名文件的后缀名称conf,添加到配置文件中JAVA_OPTS配置 比如我的jar文件在/usr/local/workmanager/workmanage-2.0.2.jar创建配置文件/usr/local/workmanager/workmanage-2.0.2.conf内容为
JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.registry.ssl=false -Djava.rmi.server.hostname=主机IP地址 -Dcom.sun.management.jmxremote.rmi.port=12345"
3.2 使用脚本或直接操作 在java加入上述参数配置 3.3 JAVAOPTS参考Zabbix-JMX监控和Monitoring and Management Using JMX
参数 | 用途 | 值 |
---|---|---|
-Dcom.sun.management.jmxremote | 开启jmx远程访问 | true / false |
-Dcom.sun.management.jmxremote.port | JMX端口 | 12345 |
-Dcom.sun.management.jmxremote.ssl | 是否启用SSL | true / false |
-Dcom.sun.management.jmxremote.registry.ssl | 是否启用SSL记录 | true / false |
-Djava.rmi.server.hostname | 本地绑定地址 | 127.0.0.1 |
-Dcom.sun.management.jmxremote.rmi.port | RMI端口 | 12345 |
-Dcom.sun.management.jmxremote.authenticate | 是否使用密码认证 | true / false |
3.4 配置JMX密码 进入JRE根目录下的lib/management/目录下 复制jmxremote.password.template密码配置模板为jmxremote.password
# 进入JRE的management目录 cd /us/local/jdk1.8.0_251/jre/lib/management/
# 复制模板文件
cp jmxremote.password.template jmxremote.password
# 编辑密码配置文件 末尾加入 monitorRole 密码
echo "monitorRole 密码">>jmxremote.password
# 修改文件所属用户跟启动jar的用户一致
chown www.www jmxremote.password
# 修改权限为600
chmod 600 jmxremote.password
3.5 重启jar 3.6 在Windows下使用jconsole测试
四、配置模板
- Apache Tomcat JMX模板手册
- Generic Java JMX模板手册
4.1 进入模板"Apache Tomcat JMX",所有监控项和自动发现的key里面的Catalina修改为Tomcat 4.2 进入模板"Generic Java JMX",所有监控项的用户名称和密码填写宏{$JMX.USER}和{$JMX.PASSWORD} 4.3 切换到Generic Java JMX模板的宏页 创建宏{$JMX.USER}和{$JMX.PASSWORD}
4.4 创建主机 选择JMX方式 写入IP地址和前面配置的端口 4.5 切换到模板页 选择刚修改过的模板
4.6 切换到宏页 从继承的宏里配置前面设置的JMX用户和密码
4.7 添加主机
五、测试
5.1 检查是否正常读取
六、修改后的模板参考
6.1 Apache Tomcat JMX模板
zabbix_export:
version: '5.4'
date: '2022-06-19T07:33:51Z'
groups:
-
uuid: a571c0d144b14fd4a87a9d9b2aa9fcd6
name: Templates/Applications
templates:
-
uuid: 3cc8c9ae7055458c9a803597007f70bd
template: 'Apache Tomcat JMX'
name: 'Apache Tomcat JMX'
description: | The template to monitor Apache Tomcat by Zabbix that work without any external scripts. The metrics are collected by JMX.
You can discuss this template or leave feedback on our forum https://www.zabbix.com/forum/zabbix-suggestions-and-feedback/411862-discussion-thread-for-official-zabbix-template-tomcat
Template tooling version used: 0.38
groups:
-
name: Templates/Applications
items:
-
uuid: 7f6ec0e48d41456896799f487cd8243e
name: 'Tomcat: 版本'
type: JMX
key: 'jmx["Tomcat:type=Server",serverInfo]'
history: 7d
trends: '0'
value_type: CHAR
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'The version of the Tomcat.'
preprocessing:
-
type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1d
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: Tomcat
triggers:
-
uuid: 152d235652914aa2af78334385334214
expression: 'last(/Apache Tomcat JMX/jmx["Tomcat:type=Server",serverInfo],#1)<>last(/Apache Tomcat JMX/jmx["Tomcat:type=Server",serverInfo],#2) and length(last(/Apache Tomcat JMX/jmx["Tomcat:type=Server",serverInfo]))>0'
name: 'Tomcat: 版本已变更'
priority: INFO
description: 'Tomcat version has changed. Ack to close.'
manual_close: 'YES'
discovery_rules:
-
uuid: a478be537e5f48fe95310997d0df0eda
name: '协议处理程序 自动发现'
type: JMX
key: 'jmx.discovery[attributes,"Tomcat:type=ProtocolHandler,port=*"]'
delay: 1h
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
filter:
evaltype: AND
conditions:
-
macro: '{#JMXATTR}'
value: ^name$
formulaid: A
description: 'Discovery for ProtocolHandler'
item_prototypes:
-
uuid: 830f58f8ad6640d989a70c01f7aa2ad8
name: '{#JMXVALUE}: Gzip压缩状态'
type: JMX
key: 'jmx[{#JMXOBJ},compression]'
history: 7d
trends: '0'
value_type: CHAR
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'Gzip compression status on {#JMXNAME}. Enabling gzip compression may save server bandwidth.'
preprocessing:
-
type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 1h
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: ProtocolHandler {#JMXVALUE}'
trigger_prototypes:
-
uuid: 7d707de73a164f1db6b69e4dcb8c6ae9
expression: 'find(/Apache Tomcat JMX/jmx[{#JMXOBJ},compression],,"like","off") = 1'
name: '{#JMXVALUE}: Gzip压缩已禁用'
priority: INFO
description: 'gzip compression is disabled for connector {#JMXVALUE}.'
manual_close: 'YES'
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
-
uuid: 77175f79fe844bb8bca66de437a3ba32
name: '全局请求处理程序 自动发现'
type: JMX
key: 'jmx.discovery[beans,"Tomcat:type=GlobalRequestProcessor,name=*"]'
delay: 1h
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
filter:
evaltype: AND
conditions:
-
macro: '{#JMXNAME}'
value: '{$TOMCAT.LLD.FILTER.MATCHES:"GlobalRequesProcessor"}'
formulaid: A
-
macro: '{#JMXNAME}'
value: '{$TOMCAT.LLD.FILTER.NOT_MATCHES:"GlobalRequesProcessor"}'
operator: NOT_MATCHES_REGEX
formulaid: B
description: 'Discovery for GlobalRequesProcessor'
item_prototypes:
-
uuid: d7cb07f3f5e04792850332c416284dd9
name: '{#JMXNAME}: 每秒接收的字节数'
type: JMX
key: 'jmx[{#JMXOBJ},bytesReceived]'
history: 7d
units: B
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'Bytes received rate by processor {#JMXNAME}'
preprocessing:
-
type: CHANGE_PER_SECOND
parameters:
- ''
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: {#JMXTYPE} {#JMXNAME}'
-
uuid: abad7332ed6b417c92f6038ce12ae000
name: '{#JMXNAME}: 每秒发送的字节数'
type: JMX
key: 'jmx[{#JMXOBJ},bytesSent]'
history: 7d
units: B
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'Bytes sent rate by processor {#JMXNAME}'
preprocessing:
-
type: CHANGE_PER_SECOND
parameters:
- ''
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: {#JMXTYPE} {#JMXNAME}'
-
uuid: 1596a335401d47d6b2bde7a5b0de7b07
name: '{#JMXNAME}: 每秒错误数'
type: JMX
key: 'jmx[{#JMXOBJ},errorCount]'
history: 7d
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'Error rate of request processor {#JMXNAME}'
preprocessing:
-
type: CHANGE_PER_SECOND
parameters:
- ''
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: {#JMXTYPE} {#JMXNAME}'
-
uuid: 985d3eeacd9d404385bfcef693add39a
name: '{#JMXNAME}: 请求处理时间'
type: JMX
key: 'jmx[{#JMXOBJ},processingTime]'
history: 7d
units: s
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'The total time to process all incoming requests of request processor {#JMXNAME}'
preprocessing:
-
type: MULTIPLIER
parameters:
- '0.001'
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: {#JMXTYPE} {#JMXNAME}'
-
uuid: 8e0307b5063549dab118e0e374a62aad
name: '{#JMXNAME}: 每秒请求数'
type: JMX
key: 'jmx[{#JMXOBJ},requestCount]'
history: 7d
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'Rate of requests served by request processor {#JMXNAME}'
preprocessing:
-
type: CHANGE_PER_SECOND
parameters:
- ''
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: {#JMXTYPE} {#JMXNAME}'
graph_prototypes:
-
uuid: 87de97d55baa4be1964652957a051fc2
name: '{#JMXNAME}: 流量'
graph_items:
-
sortorder: '1'
drawtype: GRADIENT_LINE
color: 1A7C11
item:
host: 'Apache Tomcat JMX'
key: 'jmx[{#JMXOBJ},bytesSent]'
-
sortorder: '2'
drawtype: GRADIENT_LINE
color: 2774A4
item:
host: 'Apache Tomcat JMX'
key: 'jmx[{#JMXOBJ},bytesReceived]'
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
-
uuid: cf1badf064714d9b9e3b7110696432f9
name: 'Contexts 自动发现'
type: JMX
key: 'jmx.discovery[beans,"Tomcat:type=Manager,host=*,context=*"]'
delay: 1h
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
filter:
evaltype: AND
conditions:
-
macro: '{#JMXHOST}'
value: '{$TOMCAT.LLD.FILTER.MATCHES:"Manager"}'
formulaid: A
-
macro: '{#JMXHOST}'
value: '{$TOMCAT.LLD.FILTER.NOT_MATCHES:"Manager"}'
operator: NOT_MATCHES_REGEX
formulaid: B
description: 'Discovery for contexts'
item_prototypes:
-
uuid: c20bb67db247471ba686d2ea371b7c73
name: '{#JMXHOST}{#JMXCONTEXT}: 在线会话'
type: JMX
key: 'jmx[{#JMXOBJ},activeSessions]'
history: 7d
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'Active sessions of the application.'
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: Context {#JMXHOST}{#JMXCONTEXT}'
-
uuid: bc3c2a3cff614f3eaf001463df1b2364
name: '{#JMXHOST}{#JMXCONTEXT}: 允许的最大会话数'
type: JMX
key: 'jmx[{#JMXOBJ},maxActiveSessions]'
history: 7d
value_type: FLOAT
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'The maximum number of active Sessions allowed, or -1 for no limit.'
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: Context {#JMXHOST}{#JMXCONTEXT}'
-
uuid: fd8678e68cf440939af2dd8f3568a42f
name: '{#JMXHOST}{#JMXCONTEXT}: 最大在线会话数'
type: JMX
key: 'jmx[{#JMXOBJ},maxActive]'
history: 7d
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'Maximum number of active sessions so far.'
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: Context {#JMXHOST}{#JMXCONTEXT}'
-
uuid: 34702e2d6b2142ec9aa43bea1059a98a
name: '{#JMXHOST}{#JMXCONTEXT}: 每秒拒绝的会话数'
type: JMX
key: 'jmx[{#JMXOBJ},rejectedSessions]'
history: 7d
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'Rate of sessions we rejected due to maxActive being reached.'
preprocessing:
-
type: CHANGE_PER_SECOND
parameters:
- ''
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: Context {#JMXHOST}{#JMXCONTEXT}'
-
uuid: eb28f9bd99d440f4a50d1c24ae758029
name: '{#JMXHOST}{#JMXCONTEXT}: 每秒创建的会话数'
type: JMX
key: 'jmx[{#JMXOBJ},sessionCounter]'
history: 7d
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'Rate of sessions created by this application per second.'
preprocessing:
-
type: CHANGE_PER_SECOND
parameters:
- ''
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: Context {#JMXHOST}{#JMXCONTEXT}'
graph_prototypes:
-
uuid: dfd46f5443f9438fb21ae23dfd4010c0
name: '{#JMXHOST}{#JMXCONTEXT}: 会话'
graph_items:
-
sortorder: '1'
drawtype: GRADIENT_LINE
color: 1A7C11
item:
host: 'Apache Tomcat JMX'
key: 'jmx[{#JMXOBJ},maxActive]'
-
sortorder: '2'
drawtype: GRADIENT_LINE
color: 2774A4
item:
host: 'Apache Tomcat JMX'
key: 'jmx[{#JMXOBJ},activeSessions]'
-
sortorder: '3'
drawtype: GRADIENT_LINE
color: F63100
item:
host: 'Apache Tomcat JMX'
key: 'jmx[{#JMXOBJ},rejectedSessions]'
-
sortorder: '4'
drawtype: GRADIENT_LINE
color: A54F10
item:
host: 'Apache Tomcat JMX'
key: 'jmx[{#JMXOBJ},maxActiveSessions]'
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
-
uuid: 05752834671f416fb2fdac1006308c3e
name: '线程池 自动发现'
type: JMX
key: 'jmx.discovery[beans,"Tomcat:type=ThreadPool,name=*"]'
delay: 1h
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
filter:
evaltype: AND
conditions:
-
macro: '{#JMXNAME}'
value: '{$TOMCAT.LLD.FILTER.MATCHES:"ThreadPool"}'
formulaid: A
-
macro: '{#JMXNAME}'
value: '{$TOMCAT.LLD.FILTER.NOT_MATCHES:"ThreadPool"}'
operator: NOT_MATCHES_REGEX
formulaid: B
description: 'Discovery for ThreadPool'
item_prototypes:
-
uuid: 7d7418c72ced48eca2a92e30021b611b
name: '{#JMXNAME}: 线程数'
type: JMX
key: 'jmx[{#JMXOBJ},currentThreadCount]'
history: 7d
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'Amount of threads the thread pool has right now, both busy and free.'
preprocessing:
-
type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 10m
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: {#JMXTYPE} {#JMXNAME}'
-
uuid: 35b1e99fbc44448083b5aad0ce1239a1
name: '{#JMXNAME}: 繁忙线程数'
type: JMX
key: 'jmx[{#JMXOBJ},currentThreadsBusy]'
history: 7d
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'Number of the requests that are being currently handled.'
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: {#JMXTYPE} {#JMXNAME}'
-
uuid: 32e316ce567c4f94aecb89d9763e4d27
name: '{#JMXNAME}: 线程限制'
type: JMX
key: 'jmx[{#JMXOBJ},maxThreads]'
history: 7d
username: '{$TOMCAT.USER}'
password: '{$TOMCAT.PASSWORD}'
description: 'Limit of the threads count. When currentThreadsBusy counter reaches the maxThreads limit, no more requests could be handled, and the application chokes.'
preprocessing:
-
type: DISCARD_UNCHANGED_HEARTBEAT
parameters:
- 10m
jmx_endpoint: 'service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi'
tags:
-
tag: Application
value: 'Tomcat: {#JMXTYPE} {#JMXNAME}'
trigger_prototypes:
-
uuid: 7a15296553a447f6aebf4958631b6704
expression: 'min(/Apache Tomcat JMX/jmx[{#JMXOBJ},currentThreadsBusy],{$TOMCAT.THREADS.MAX.TIME:"{#JMXNAME}"})>last(/Apache Tomcat JMX/jmx[{#JMXOBJ},maxThreads])*{$TOMCAT.THREADS.MAX.PCT:"{#JMXNAME}"}/100'
name: '{#JMXNAME}: 繁忙线程数 {$TOMCAT.THREADS.MAX.TIME:"{#JMXNAME}"} 内超过 {$TOMCAT.THREADS