代码编织梦想

1.前言:

我们的监控系统是zabbix,最近刚做完jvm还有tomcat的监控,需要吐槽以下内容:

zabbix官方提供的jvm和tomcat监控模版,存在item书写格式的坑,导致很多内容无法获取到监控。
网友写的zabbix监控java文章,99%就只有环境的搭建,没有zabbix item键值,所以环境监控上了,item键值不知道怎么写。

本文监控jvm内容如下:

**内存使用状态:**堆内存(Heap memory)和非堆内存(No Heap memory),包括已用值、最大值、已提交;
**堆内存内存池:**新生代(eden space),survivor space,老年代(old gen)的内存使用状态;
**非堆内存内存池:**代码缓存(Code cache),元空间(meta space),压缩类空间(compressed class space);
**类加载:**加载总数,已加载,已卸载。
**Java线程:**总开启线程,活动线程,线程峰值。
本文监控tomcat内容如下:

Tomcat请求数:包括每秒请求数,每秒出错数;
Tomcat网络流量统计:包括进流量统计,出流量统计;
Tomcat线程:包括最大线程数,当前线程数,当前繁忙线程数。

我没有在zabbix中添加垃圾回收(gc)的监控,而是在catalina配置里面添加gc日输入来给开发进行分析,设置方式如下。

CATALINA_OPTS=”-XX:ParallelGCThreads=4 -XX:+PrintGCDetails -Xloggc:日志存放路径”

监控效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.监控环境搭建

环境介绍:

[root@tomcat-01 ~]# /usr/local/tomcat/bin/version.sh
Server version: Apache Tomcat/8.0.23
Server built: May 19 2015 14:58:38 UTC
Server number: 8.0.23.0
OS Name: Linux
OS Version: 2.6.32-573.22.1.el6.x86_64
Architecture: amd64
JVM Version: 1.8.0_65-b17
JVM Vendor: Oracle Corporation

2.1.Server端配置

1、 Zabbix server端安装java jdk环境并开启javaGateway支持java监控。
javaGateway 启用方式如下:
**Zabbix通过rpm包安装:**只需要安装zabbix-java-gateway包即可。
**Zabbix通过编译安装:**在编译时需要加上—enable-java以支持jmx监控,如果之前没加需要重新编译。
2、修改zabbix-java-gateway配置文件

[root@zabbix ~]# vim /etc/zabbix/zabbix_java_gateway.conf
LISTEN_IP="192.168.10.3"
LISTEN_PORT=10052
PID_FILE="/var/run/zabbix/zabbix_java.pid"
START_POLLERS=5

修改zabbix-server配置文件
[root@zabbix ~]# vim /etc/zabbix/zabbix_server.conf
JavaGateway=192.168.10.3
JavaGatewayPort=10052
StartJavaPollers=5

启动zabbix-java-gateway服务
[root@zabbix ~]# /etc/init.d/zabbix-java-gateway start

2.2.Tomcat服务器配置
1、下载catalina-jmx-remote.jar包,到tomcat安装目录下的lib目录

wget -O /usr/local/tomcat/lib/catalina-jmx-remote.jar http://archive.apache.org/dist/tomcat/tomcat-8/v8.0.23/bin/extras/catalina-jmx-remote.jar

2、修改catalina.sh添加如下内容

CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8090
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false"

3、重启tomcat与监控测试
(1)下载cmdline-jmxclient-0.10.3.jar文件,下载地址http://crawler.archive.org/cmdline-jmxclient/downloads.html
(2)本地执行如下命令查看tomcat的堆内存信息

[root@tomcat-01 ~]# java -jar /root/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:type=Memory HeapMemoryUsage
11/04/2016 15:23:16 +0800 org.archive.jmx.Client HeapMemoryUsage:
committed: 2146959360
init: 2147483648
max: 2146959360
used: 407611808

3.监控数据采集

3.1.堆内存
Tomcat本地查看堆内存信息:

[root@tomcat-01 ~]# java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=Memory HeapMemoryUsage
11/04/2016 15:36:58 +0800 org.archive.jmx.Client HeapMemoryUsage:
committed: 2145910784
init: 2147483648
max: 2145910784
used: 741540536

zabbix监控堆内存键值:

堆内存最大值:jmx["java.lang:type=Memory","HeapMemoryUsage.max"]
已用堆内存:jmx["java.lang:type=Memory","HeapMemoryUsage.used"]
已提交堆内存:jmx["java.lang:type=Memory","HeapMemoryUsage.committed"]

一个完整的zabbix item填写方式如下,不同内容填写不同的键值即可:
在这里插入图片描述
3.2.内存池eden space:
Tomcat本地查看eden space:

java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:type=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]

3.3.内存池survivor space:
Tomcat本地查看Survivor space区域:

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

zabbix监控Survivor 键值:

jmx["java.lang:type=MemoryPool,name=PS Survivor Space",Usage.committed]
jmx["java.lang:type=MemoryPool,name=PS Survivor Space",Usage.max]
jmx["java.lang:type=MemoryPool,name=PS Survivor Space",Usage.used]

3.4.内存池old gen:
Tomcat本地查看old gen区域使用:

java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:name=PS\ Old\ Gen,type=MemoryPool Usage

zabbix监控old gen键值:

jmx["java.lang:type=MemoryPool,name=PS Old Gen",Usage.committed]
jmx["java.lang:type=MemoryPool,name=PS Old Gen",Usage.max]
jmx["java.lang:type=MemoryPool,name=PS Old Gen",Usage.used]

3.5.非堆内存:
Tomcat 本地查看非堆内存使用:

java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=Memory NonHeapMemoryUsag1

zabbix监控非堆内存使用

1jmx["java.lang:type=Memory","NonHeapMemoryUsag.committed"]
jmx["java.lang:type=Memory","NonHeapMemoryUsag.used"]

3.6.内存池meta space:
Tomcat 本地查看meta space区域使用:

java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:type=MemoryPool,name=Metaspace Usage

zabbix监控mete space区域键值

jmx["java.lang:type=MemoryPool,name=Metaspace",Usage.committed]
jmx["java.lang:type=MemoryPool,name=Metaspace",Usage.used]

3.7.内存池code cache:
Tomcat 本地查看code cache区域使用:

java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:type=MemoryPool,name=Code\ Cache Usage

zabbix监控code cache区域使用:

jmx["java.lang:type=MemoryPool,name=Code Cache",Usage.committed]
jmx["java.lang:type=MemoryPool,name=Code Cache",Usage.max]
jmx["java.lang:type=MemoryPool,name=Code Cache",Usage.used]

3.8.内存池compressed class space:
Tomcat 本地查看compressed class space区域使用:

java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:type=MemoryPool,name=Compressed\ Class\ Space Usage

zabbix监控 compressed class space区域使用键值:

jmx["java.lang:type=MemoryPool,name=Compressed Class Space",Usage.committed]
jmx["java.lang:type=MemoryPool,name=Compressed Class Space",Usage.max]
jmx["java.lang:type=MemoryPool,name=Compressed Class Space",Usage.used]

3.9.类加载:

Tomcat本地查看类加载信息:

加载总数: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=ClassLoading TotalLoadedClassCoun
已加载: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=ClassLoading LoadedClassCount
已卸载: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=ClassLoading UnloadedClassCount

Zabbix监控类加载键值:

加载总数: jmx["java.lang:type=ClassLoading","TotalLoadedClassCount"]
已加载: jmx["java.lang:type=ClassLoading","LoadedClassCount"]
已卸载: jmx["java.lang:type=ClassLoading","UnloadedClassCount"]

3.10.java线程:

tomcat本地查看java线程:

总开启线程: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=Threading TotalStartedThreadCount
活动线程: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=Threading PeakThreadCount
线程峰值: java -jar cmdline-jmxclient-0.10.3.jar controlRole:tomcat 127.0.0.1:8090 java.lang:type=Threading PeakThreadCount

Zabbix监控java线程键值:

总开启线程: jmx["java.lang:type=Threading","TotalStartedThreadCount"]
活动线程: jmx["java.lang:type=Threading","ThreadCount"]
线程峰值: jmx["java.lang:type=Threading","PeakThreadCount"]

3.11.tomcat线程:

本地查看tomcat线程信息:

最大线程:java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 Catalina:name=\"http-nio-8080\",type=ThreadPool maxThreads
当前线程:java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 Catalina:name=\"http-nio-8080\",type=ThreadPool currentThreadCount
繁忙线程:java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 Catalina:name=\"http-nio-8080\",type=ThreadPool currentThreadsBusy

Zabbix监控tomcat线程键值:

最大线程:jmx["Catalina:type=ThreadPool,name=\"http-nio-8080\"",maxThreads]
当前线程:jmx["Catalina:type=ThreadPool,name=\"http-nio-8080\"",currentThreadCount]
繁忙线程 jmx["Catalina:type=ThreadPool,name=\"http-nio-8080\"",currentThreadsBusy]

3.12.网络流量:

Tomcat本地查看接收的字节:

接收的字节:java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 Catalina:name=\"http-nio-8080\",type=GlobalRequestProcessor bytesReceived
发送的字节:java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 Catalina:name=\"http-nio-8080\",type=GlobalRequestProcessor bytesSent

Zabbix监控tomcat接受字节键值:

接收的字节:jmx["Catalina:type=GlobalRequestProcessor,name=\"http-nio-8080\"",bytesReceived]
发送的字节:jmx["Catalina:type=GlobalRequestProcessor,name=\"http-nio-8080\"",bytesSent]

3.13.tomcat请求,出错请求:

tomcat本地查看tomcat请求数:

tomcat请求数: java -jar cmdline-jmxclient-0.10.3.jar - 192.168.10.46:8090 Catalina:name=\"http-nio-8080\",type=GlobalRequestProcessor requestCount
tomcat出错请求: java -jar cmdline-jmxclient-0.10.3.jar - 192.168.10.46:8090 Catalina:name=\"http-nio-8080\",type=GlobalRequestProcessor errorCount

zabbix监控tomcat请求数:

tomcat请求数: jmx["Catalina:type=GlobalRequestProcessor,name=\"http-nio-8080\"",requestCount]
tomcat出错请求:jmx["Catalina:type=GlobalRequestProcessor,name=\"http-nio-8080\"",errorCount]

4.问题的解答

最近有网友联系我说,看着我的博文搭建完了环境,获取不到数据,我帮助排查了一下,找到了问题所在,特此记录。
网友的报错如下:

# java -jar /root/cmdline-jmxclient-0.10.3.jar - 127.0.0.1:9080 java.lang:type=MemoryPool,name=PS\ Eden\ Space Usag
11/11/2016 10:03:37 +0800
org.archive.jmx.Client java.lang:name=PS Eden Space,type=MemoryPool is not a registered bean

4.1.解决思路

1、如果你使用命令行监控获取不到数据,那么就先使用jconsole看看有没有数据,
2、如果jconsole有数据,那么就往下看,反之检查你的环境。
3、如果jconsole有数据,但是命令行没有数据,那么就是Mbean的Object Name或者属性有问题,网友都是复制我的,但是自己本地环境和我的环境不一样所以导致获取不到数据,查询自己的本地Mbean方法有两种,分别是图形和命令行,网友的报错说事自己的Eden Space空间有问题,那么我就贴出来查看本地内存池的Object Name和属性的方法。

(1)通过jconsole查看:
在这里插入图片描述
(2)通过命令行查看:直接使用java -jar cmdline-jmxclient-0.10.3.jar – 127.0.0.1:8090命令可以获取所有的Mbean信息,输出太多这里就不贴输出结果了。我通过grep命令获取所有内存池的监控信息方式如下。

[root@tomcat-01 ~]# java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 | grep MemoryPool
java.lang:name=Compressed Class Space,type=MemoryPool
java.lang:name=Metaspace,type=MemoryPool
java.lang:name=PS Old Gen,type=MemoryPool
java.lang:name=PS Eden Space,type=MemoryPool
java.lang:name=PS Survivor Space,type=MemoryPool
java.lang:name=Code Cache,type=MemoryPool

然后我要获取Eden Space的所有属性信息方式如下:(一些特殊字符需要转义)

[root@tomcat-01 ~]# java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:name=PS\ Eden\ Space,type=MemoryPool
Attributes:
Usage: Usage (type=javax.management.openmbean.CompositeData)
PeakUsage: PeakUsage (type=javax.management.openmbean.CompositeData)
MemoryManagerNames: MemoryManagerNames (type=[Ljava.lang.String;)
UsageThreshold: UsageThreshold (type=long)
UsageThresholdExceeded: UsageThresholdExceeded (type=boolean)
UsageThresholdCount: UsageThresholdCount (type=long)
UsageThresholdSupported: UsageThresholdSupported (type=boolean)
CollectionUsageThreshold: CollectionUsageThreshold (type=long)
CollectionUsageThresholdExceeded: CollectionUsageThresholdExceeded (type=boolean)
CollectionUsageThresholdCount: CollectionUsageThresholdCount (type=long)
CollectionUsage: CollectionUsage (type=javax.management.openmbean.CompositeData)
CollectionUsageThresholdSupported: CollectionUsageThresholdSupported (type=boolean)
Valid: Valid (type=boolean)
Name: Name (type=java.lang.String)
Type: Type (type=java.lang.String)
ObjectName: ObjectName (type=javax.management.ObjectName)
Operations:
resetPeakUsage: resetPeakUsage
Parameters 0, return type=void

那么我们在查看Eden Space空间的使用信息。就看到已经出来数据了

[root@tomcat-01 ~]# java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:8090 java.lang:name=PS\ Eden\ Space,type=MemoryPool Usage
12/03/2016 08:33:58 +0800 org.archive.jmx.Client Usage:
committed: 712507392
init: 537395200
max: 712507392
used: 396006304

CentOS中zabbix4.0监控tomcat JMX

环境:zabbix4.0
系统:centos7.2

1 修改tomcat端jmx配置

在 /tomcat/apache-tomcat-9.0.17/bin/catalina.sh 文件中增加

/bin/bash下面添加,开头添加

CATALINA_OPTS="$CATALINA_OPTS 
-Djava.rmi.server.hostname=192.168.1.203    ##注意修改IP
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.port=12345   ##注意修改端口
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false"

修改完配置文件后注意重启tomcat
验证tomcat 是否已经开启jmx远程监控
使用jdk默认监控jconsole
windows上解压jdk后,打开bin下面的jconsole,输入IP:端口和用户名密码
在这里插入图片描述
在这里插入图片描述
如果可以查看到相应的值,说明tomcat配置正确,如下:
在这里插入图片描述

2 zabbix-java-gateway安装配置

安装zabbix-java-gateway

#yum -y install zabbix-java-gateway

修改zabbix-java-gateway配置文件

cat /etc/zabbix/zabbix_java_gateway.conf
LISTEN_IP="0.0.0.0"
LISTEN_PORT=10052
PID_FILE="/var/run/zabbix/zabbix_java.pid"
START_POLLERS=10   #探测进程(默认 5 个)
TIMEOUT=10     #超时时间,网络环境差就要改长一点

启动zabbix-java-gateway服务

systemctl start zabbix-java-gateway.service

启动后可以查看到java-gateway监控的是10052。java-gateway相当于一个代理,具体装在哪一台机器上其实是无关紧要的

3 zabbix server配置

需要告诉zabbix-server,java-gateway在那里

vim /etc/zabbix/zabbix_server.conf
JavaGateway=127.0.0.1   ##修改为zabbix-java-gateway安装IP
JavaGatewayPort=10052   ##端口
StartJavaPollers=5    ##启动多少个进程轮询

需要重启zabbix-server

#systemctl restart zabbix-server

4 zabbix web端添加jmx监控

zabbix监控jmx如下图流程,zabbix server收集jmx信息时去联系zabbix java gateway,zabbix java gateway获取jmx信息,所以zabbix java gateway所在机器需要和客户端机器网络可通。
在这里插入图片描述
找到主机,填写jmx的IP和端口
在这里插入图片描述
添加模板,默认的模板有很多是不需要的,所以我自定义了相关模板,有需要的同学可以下载
下载地址:https://down.51cto.com/data/2463401
在这里插入图片描述
在这里插入图片描述

参考链接 :

使用 zabbix 监控 tomcat(包含jvm监控) : https://mp.weixin.qq.com/s/k3qeiwz1FpZ4gOMHqSpEpA

zabbix4.0监控tomcat JMX https://www.jianshu.com/p/b00027d219c3

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_40907977/article/details/103551625

zabbix表数据获取-爱代码爱编程

1、-- 主机,监控项,监控状态,触发器 SELECT a.ip, b. HOST, b.`status`, b.flags, b.`name`, c.`name` FROM interface a LEFT JOIN HOSTS b ON a.hostid = b.hostid LEFT JOIN items c on a.host

promehtues alertmanager exporter 配置-爱代码爱编程

此章节讲述prometheus的配置及使用,安装步骤及资源请查看安装章节 1.exporter的使用 大部分社区开源的exportwe解压都可以直接使用,通过–help即可知道如何使用,以下列举几个比较特殊的exporter (1)kafka-exporter 在github上下载的1.2的二进制包安装,能置入zookeeper的地址的,所以如果你使

prometheus相关 离线安装-爱代码爱编程

以下是基于裸机且离线安装的方式(内网环境) 1.下载基本安装包和后续需要使用的安装包 (1)首先在可以访问外网的服务器将rpm包和二进制安装包下载好 下载基本环境rpm包 yum install yum-utils #此工具用来下载需要的RPM包(就是将我们在线yum安装的东西只下载不安装) yumdownloader lsof --reso

Prometheus 监控安装-爱代码爱编程

Prometheus 监控安装 官方手册请参阅:https://prometheus.io/docs/prometheus/latest/getting_started/ Prometheus 安装文档: 本测试需要的环境: 系统: centos7 安装: wget https://github.com/prometheus/prometheus

Zabbix-爱代码爱编程

文章目录 Zabbix基本概念Zabbix部署实验拓扑环境部署初始化Zabbix配置监控服务 Zabbix 基本概念 Zabbix简介 Zabbix是一个高度集成的监控解决方案可以实现企业级的开源分布式监控Zabbix通过C/S模式采集监控数据Zabbix通过B/S模式实现Web管理 监控拓扑 监控服务器 监控服务器可以通过

zabbix安装-爱代码爱编程

1 配置yum源 [root@node1 ~]# rpm -ivh http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.noarch.rpm Retrieving http://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/