zabbix监控JMX之Tomcat

1、我们需要这4个文件:
下载链接:https://share.weiyun.com/5PobRgc

1
2
3
4
cmdline-jmxclient-0.10.3.jar:用来读取jmx信息
discovery_java_status.conf:客户端配置文件
java.txt:填写tomcat的相关端口
jmx_discovery.sh:自动发现的脚本

zabbixjvm-1.png


2、zabbix客户端配置Incloude路径

1
2
3
4
5
6
7
8
9
10
11
12
vi /usr/local/zabbix/etc/zabbix_agentd.conf
234 ### Option: Include
235 # You may include individual files or all files in a directory in the configuration file.
236 # Installing Zabbix will create include directory in /usr/local/etc, unless modified during the compile time.
237 #
238 # Mandatory: no
239 # Default:
240 # Include=
241
242 # Include=/usr/local/etc/zabbix_agentd.userparams.conf
243 Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/
244

3、配置tomcat:

tomcat版本为7.0.85

在相应的tomcat实例中 启动参数下,添加这个:

1
export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10052 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=127.0.0.1"

10052是jmx远程监控的端口
配置完这个 记住重启下tomcat实例


4、将java.txt 、 jmx_discovery.sh放在这个目录下

1
2
3
4
5
6
7
[root@qhkjt-web scripts]# pwd
/usr/local/zabbix/scripts
[root@qhkjt-web scripts]# ll
总用量 8
-rwxr-xr-x 1 root root 42 8月 22 2018 java.txt
-rwxr-xr-x 1 root root 1391 8月 23 2018 jmx_discovery.sh
[root@qhkjt-web scripts]#

5、java.txt内容如下:

1
2
qhkjt-web|10052|9090
qhkjt-pdf|10053|9091
  • 第一列:自定义的名称
  • 第二列:jmx远程监控的端口
  • 第二列:tomcat实例端口

6、jmx_discovery.sh内容如下,其作用是为服务器传递json格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash
#function:monitor tcp connect status from zabbix
source /etc/bashrc >/dev/null 2>&1
source /etc/profile >/dev/null 2>&1
#定义发现函数,从java.txt读取文本
jmx_port_discovery () {
catalina_port=($(cat /usr/local/zabbix/scripts/java.txt|cut -d "|" -f3))
jmx_port=($(cat /usr/local/zabbix/scripts/java.txt|cut -d "|" -f2))
Tomcat_Name=($(cat /usr/local/zabbix/scripts/java.txt|cut -d "|" -f1))

length=${#jmx_port[@]}

printf "{\n"
printf '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
printf "\n\t\t{"
printf "\t\"{#JMX_PORT}\":\"${jmx_port[$i]}\",\n"
printf "\t\t\t\"{#JAVA_NAME}\":\"${Tomcat_Name[$i]}\",\n"
printf "\t\t\t\"{#CATALINA_PORT}\":\"${catalina_port[$i]}\"}\n"
if [ $i -lt $[$length-1] ];then
printf ","
fi
done
printf "\n\t]\n"
printf "}\n"

}
case "$1" in
jmx_port_discovery)
jmx_port_discovery
;;
jvmper)
#这个计算堆内存的百分比
userd=`/usr/bin/java -jar /usr/local/zabbix/lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:$2 java.lang:type=Memory HeapMemoryUsage 2>&1|grep used |cut -d " " -f2`
total=`/usr/bin/java -jar /usr/local/zabbix/lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:$2 java.lang:type=Memory HeapMemoryUsage 2>&1|grep max |cut -d " " -f2`
awk -v userd="$userd" -v total="$total" 'BEGIN{printf "%0.2f\n",userd/total*100}'
;;
*)
echo "Usage:$0 {jmx_port_discovery|jvmper}"
;;
esac

7、将cmdline-jmxclient-0.10.3.jar放在这个路径,因为脚本中写了绝对路径

1
2
3
4
5
6
7
[root@qhkjt-web lib]# pwd
/usr/local/zabbix/lib
[root@qhkjt-web lib]# ll
总用量 24
-rw-r--r-- 1 root root 140 8月 21 2018 1
-rw-r--r-- 1 root root 20124 8月 21 2018 cmdline-jmxclient-0.10.3.jar
[root@qhkjt-web lib]#

8、将discovery_java_status.conf放在这个目录下

1
2
3
4
5
6
[root@qhkjt-web zabbix_agentd.conf.d]# pwd
/usr/local/zabbix/etc/zabbix_agentd.conf.d
[root@qhkjt-web zabbix_agentd.conf.d]# ll
总用量 4
-rw-r--r-- 1 root root 2491 823 2018 discovery_java_status.conf
[root@qhkjt-web zabbix_agentd.conf.d]#

9、discovery_java_status.conf内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
格式:UserParameter=键值,脚本
#发现项目类别
UserParameter=java.jmx.discovery,/usr/local/zabbix/scripts/jmx_discovery.sh jmx_port_discovery
#当前线程数
UserParameter=java.ThreadCounts[*],/usr/bin/java -jar /usr/local/zabbix/lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:$1 java.lang:type=Threading ThreadCount 2>&1|cut -d " " -f6
#线程数峰值
UserParameter=java.PeakThreadCount[*],/usr/bin/java -jar /usr/local/zabbix/lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:$1 java.lang:type=Threading PeakThreadCount 2>&1|cut -d " " -f6
#总纯程数
UserParameter=java.TotalStartedThreadCount[*],/usr/bin/java -jar /usr/local/zabbix/lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:$1 java.lang:type=Threading TotalStartedThreadCount 2>&1| cut -d " " -f6
#实例当前线程数
UserParameter=java.Catalina.currentThreadCount[*],/usr/bin/java -jar /usr/local/zabbix/lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:$1 Catalina:name=\"http-apr-$2\",type=ThreadPool currentThreadCount 2>&1| cut -d " " -f6
#实例当前连接数
UserParameter=java.Catalina.connectionCount[*],/usr/bin/java -jar /usr/local/zabbix/lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:$1 Catalina:name=\"http-apr-$2\",type=ThreadPool connectionCount 2>&1| cut -d " " -f6
#实例最大线程数
UserParameter=java.Catalina.maxThreads[*],/usr/bin/java -jar /usr/local/zabbix/lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:$1 Catalina:name=\"http-apr-$2\",type=ThreadPool maxThreads 2>&1| cut -d " " -f6
#当前繁忙线程数
UserParameter=java.Catalina.currentThreadsBusy[*],/usr/bin/java -jar /usr/local/zabbix/lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:$1 Catalina:name=\"http-apr-$2\",type=ThreadPool currentThreadsBusy 2>&1| cut -d " " -f6
#堆内存使用量
UserParameter=java.HeapMemoryUsage.used[*],/usr/bin/java -jar /usr/local/zabbix/lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:$1 java.lang:type=Memory HeapMemoryUsage 2>&1|grep used |cut -d " " -f2
#堆内存最大
UserParameter=java.HeapMemoryUsage.max[*],/usr/bin/java -jar /usr/local/zabbix/lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:$1 java.lang:type=Memory HeapMemoryUsage 2>&1|grep max |cut -d " " -f2
#堆内存百分比
UserParameter=java.HeapMemoryUsage.per[*],/usr/local/zabbix/scripts/jmx_discovery.sh $1 $2
#当前会话数
UserParameter=java.Catalina.activeSessions[*],/usr/bin/java -jar /usr/local/zabbix/lib/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:$1 Catalina:type=Manager,context=/egrantweb,host=localhost activeSessions 2>&1| cut -d " " -f6

10、配置完discovery_java_status.conf 记得重启下客户端

1
2
pkill -9 zabbix
/usr/local/zabbix/sbin/zabbix_agentd

11、测试客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@qhkjt-web bin]# /usr/local/zabbix/bin/zabbix_get -s 127.0.0.1 -p 10050 -k java.jmx.discovery
{
"data":[
{ "{#JMX_PORT}":"10052",
"{#JAVA_NAME}":"qhkjt-web",
"{#CATALINA_PORT}":"9090"}
,
{ "{#JMX_PORT}":"10053",
"{#JAVA_NAME}":"qhkjt-pdf",
"{#CATALINA_PORT}":"9091"}

]
}
[root@qhkjt-web bin]#

测试成功

二、服务端:

1、创建模板
zabbixjvm-2.png


2、配置自动发现规则
zabbixjvm-3.png

类型:主动式
键值:java.jmx.discovery
zabbixjvm-4.png


3、由于是自动发现 所以要在“监控项原型”去创建监控项
zabbixjvm-5.png

zabbixjvm-6.png

名称:自定义
类型:主动式(注意)

键值:java.ThreadCounts[{#JMX_PORT}]

应用集:JMX(自定义,便于查看)
zabbixjvm-7.png

4、在监控主机添加这个模板
zabbixjvm-8.png

5、查看有没有数据过来
zabbixjvm-9.png

己有数据过来

6、继续添加其他的“监控原型”
zabbixjvm-10.png

7、查看监控的数据:
zabbixjvm-11.png

三、配置触发器

1、创建触发器 注意:要在“自动发现规则”下的“触发器类型”下去创建
zabbixjvm-12.png

2、创建触发器原型
zabbixjvm-13.png

3、创建一个堆内丰百分比大于75%时就触发报警的触发器
zabbixjvm-14.png

4、“选择原型”
zabbixjvm-15.png

5、选中对应的监控原型
zabbixjvm-16.png

6、使用avg()函数
统计5分钟内的平均值,如果平均值大于75 就触发报警
zabbixjvm-17.png

zabbixjvm-18.png

7、定义为:严重
zabbixjvm-19.png

配置成功。

# zabbix
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×