Zabbix-(六) JMX監控
一.前言
Zabbix提供了JMX監控,它通過JMX API獲取JVM信息,從而提供監控數據。本文講述使用JMX監控Tomcat的JVM信息。
准備
- Zabbix Server 4.4 (ip: 192.168.152.140)
- 運行Java應用的主機 以下簡稱Server-A (已被Zabbix監控) (ip:192.168.152.142)
二.安裝Zabbix-Java-gateway
Zabbix Server通過Zabbix Java gateway收集JMX監控數據,因此首先需要安裝Zabbix-Java-gateway,同時修改Zabbix Server的配置。
-
安裝Zabbix-Java-gateway
可以在其他主機安裝Zabbix-Java-gateway,只需要修改Zabbix-server配置文件,指定Zabbix-Java-gateway的地址和端口,這里就在部署Zabbix Server的主機上部署Zabbix-Java-gateway。
# yum install zabbix-java-gateway
-
配置Zabbix-Java-gateway
配置文件是
/etc/zabbix/zabbix_java_gateway.conf
文件,文本采取默認配置,配置項詳細信息可以參考下圖或者參考官方Zabbix-java-gateway配置項。 -
啟動Zabbix-Java-gateway
# systemctl start zabbix-java-gateway
-
修改Zabbix server配置
需要在zabbix server配置文件中增加zabbix-java-gateway相關配置
# vim /etc/zabbix/zabbix_server.conf
修改配置信息
# zabbix-java-gateway地址 JavaGateway=192.168.152.140 # zabbix-java-gateway端口 JavaGatewayPort=10052 StartJavaPollers=5
重啟Zabbix server
# systemctl restart zabbix-server
三.修改Java應用啟動參數
本文是采用docker部署tomcat,因此本文中是修改tomcat的catalina.sh腳本,主要是添加以下幾個jvm啟動參數
-Dcom.sun.management.jmxremote
# java應用ip地址(docker部署 使用宿主機ip)
-Djava.rmi.server.hostname=192.168.152.142
# jmx端口
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.rmi.port=12345
# 不開啟認證
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
在tomcat catalina.sh腳本則可以在文件前面添加
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote"
JAVA_OPTS="$JAVA_OPTS -Djava.rmi.server.hostname=192.168.152.142"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=12345"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.rmi.port=12345"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
重新啟動tomcat容器,暴露JMX 12345端口,並掛載數據卷(主要是配置tomcat的catalina.sh),這里可以先啟動一個tomcat容器,將容器中的catalina.sh docker cp到宿主機上再做修改
# docker rm -f tomcat
# docker run --name tomcat -p 8080:8080 -p 12345:12345 -v /data/zabbix/catalina.sh:/usr/local/tomcat/bin/catalina.sh -dit tomcat:jdk8-adoptopenjdk-hotspot
啟動后可以通過jconsole工具測試一下能不能監控tomcat容器
四.在Zabbix界面配置JMX
服務啟動后,需要在zabbix界面為Server-A主機上增加JMX監控。
點擊【配置】-【主機】-選擇【Server-A】
增加JMX配置
配置項 | 值 |
---|---|
IP地址 | 192.168.152.142 |
端口 | 12345 |
五.自定義JMX監控模板
實際上Zabbix 4.4自帶了兩個JMX模板Template App Apache Tomcat JMX和Template App Generic Java JMX模板一個可以監控Tomcat應用、一個可以監控普通Java應用。讀者可以直接為被監控主機增加鏈接上述兩個模板,也可以快速進行監控。
本文采用自定義的方式創建JMX監控模板
注:Zabbix提供的 JMX模板不一定適配所有 JDK 版本,例如 Template App Generic Java JMX 模板中提供了Perm Gen 永久代的監控項,而 JDK 8中已經將 Perm Gen永久代替換為了 Metaspace元空間,而模板中沒有元空間的監控項
-
創建自定義JMX模板
創建模板過程就不貼出來了,不清楚如何創建自定義模板的讀者可以參考之前的文章如何創建自定義模板。這里創建了一個群組Java Server Group和自定義模板Custom JMX Template
-
創建監控項
JMX監控項的鍵值格式為
jmx[object_name,attribute_name]
,其中object_name是MBean的ObjectName,attribute_name為需要讀取的屬性值。如何確定需要監控的數據可以參考文末的JMX問題。
官方對鍵值的說明:
讀者可以查看JMX監控項的官方文檔
堆內內存監控項
配置項 值 * 名稱 堆內內存監控項 類型 JMX agent代理程序 * 鍵值 jmx["java.lang:type=Memory","HeapMemoryUsage.used"] * JMX 端點 service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi 單位 B 其他配置項 根據需要配置
JVM線程總數監控
配置項 值 * 名稱 JVM線程總數監控 類型 JMX agent代理程序 * 鍵值 jmx["java.lang:type=Threading","ThreadCount"] * JMX 端點 service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi 其他配置項 根據需要配置
Tomcat請求總數監控
配置項 值 * 名稱 Tomcat請求總數監控 類型 JMX agent代理程序 * 鍵值 jmx["Catalina:type=GlobalRequestProcessor,name="http-nio-8080"",requestCount] * JMX 端點 service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi 其他配置項 根據需要配置 其中\"http-nio-8080\" 是使用tomcat的默認端口8080,如果修改了端口這里也要做對應調整。作為模板配置可以把這個參數在模板中配置成自定義宏,在主機中可以修改宏的值。
Tomcat每分鍾請求監控
配置項 值 * 名稱 Tomcat每分鍾請求監控 類型 JMX agent代理程序 * 鍵值 change("jmx["Catalina:type=GlobalRequestProcessor,name=\"http-nio-8080\"",requestCount]") * JMX 端點 service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi 其他配置項 根據需要配置
JVM老年代已使用內存監控
配置項 值 * 名稱 JVM老年代已使用內存監控 類型 JMX agent代理程序 * 鍵值 jmx["java.lang:type=MemoryPool,name=Tenured Gen", "Usage.used"] * JMX 端點 service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi 其他配置項 根據需要配置
JVM老年代總內存監控
配置項 值 * 名稱 JVM老年代已使用內存監控 類型 JMX agent代理程序 * 鍵值 jmx["java.lang:type=MemoryPool,name=Tenured Gen", "Usage.committed"] * JMX 端點 service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi 其他配置項 根據需要配置
老年代內存使用比例監控
配置項 值 * 名稱 JVM老年代已使用內存監控 類型 可計算的 * 鍵值 jmx.old * 公式 100 * (last("jmx[\"java.lang:type=MemoryPool,name=Tenured Gen\", \"Usage.used\"]"))
/
last("jmx[\"java.lang:type=MemoryPool,name=Tenured Gen\", \"Usage.committed\"]")* 信息類型 浮點數 單位 % 其他配置項 根據需要配置
六.DashBoard創建圖形
創建圖形的步驟本文就忽略了,添加圖形步驟可以參考Zabbix-(三)監控主機CPU、磁盤、內存並創建監控圖形
七.其他
如何確定JMX的object_name和attribute_name
jmx監控項格式: jmx[object_name,attribute_name]
-
使用jconsole連接到JVM,選擇MBean
-
找到需要監控的MBean,查看Bean信息和它的屬性信息
!
-
結合上面的步驟,那么zabbix監控項就可以填寫為
jmx["java.lang:type=Memory","HeapMemoryUsage.used"]