天天看點

Zabbix-(六) JMX監控

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的配置。

  1. 安裝Zabbix-Java-gateway

    可以在其他主機安裝Zabbix-Java-gateway,隻需要修改Zabbix-server配置檔案,指定Zabbix-Java-gateway的位址和端口,這裡就在部署Zabbix Server的主機上部署Zabbix-Java-gateway。

    # yum install zabbix-java-gateway
               
  2. 配置Zabbix-Java-gateway

    配置檔案是

    /etc/zabbix/zabbix_java_gateway.conf

    檔案,文本采取預設配置,配置項詳細資訊可以參考下圖或者參考官方Zabbix-java-gateway配置項。
    Zabbix-(六) JMX監控
  3. 啟動Zabbix-Java-gateway
    # systemctl start zabbix-java-gateway
               
  4. 修改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-(六) JMX監控

四.在Zabbix界面配置JMX

服務啟動後,需要在zabbix界面為Server-A主機上增加JMX監控。

點選【配置】-【主機】-選擇【Server-A】

Zabbix-(六) JMX監控

增加JMX配置

配置項
IP位址 192.168.152.142
端口 12345
Zabbix-(六) JMX監控

五.自定義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元空間,而模闆中沒有元空間的監控項

  1. 建立自定義JMX模闆

    建立模闆過程就不貼出來了,不清楚如何建立自定義模闆的讀者可以參考之前的文章如何建立自定義模闆。這裡建立了一個群組Java Server Group和自定義模闆Custom JMX Template

  2. 建立監控項

    JMX監控項的鍵值格式為

    jmx[object_name,attribute_name]

    ,其中object_name是MBean的ObjectName,attribute_name為需要讀取的屬性值。如何确定需要監控的資料可以參考文末的JMX問題。

    官方對鍵值的說明:

    Zabbix-(六) JMX監控

    讀者可以檢視JMX監控項的官方文檔

    堆内記憶體監控項

    配置項
    * 名稱 堆内記憶體監控項
    類型 JMX agent代理程式
    * 鍵值 jmx["java.lang:type=Memory","HeapMemoryUsage.used"]
    * JMX 端點 service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi
    機關 B
    其他配置項 根據需要配置
    Zabbix-(六) JMX監控
    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、磁盤、記憶體并建立監控圖形

Zabbix-(六) JMX監控

七.其他

如何确定JMX的object_name和attribute_name

jmx監控項格式:

jmx[object_name,attribute_name]

  1. 使用jconsole連接配接到JVM,選擇MBean
    Zabbix-(六) JMX監控
  2. 找到需要監控的MBean,檢視Bean資訊和它的屬性資訊
    Zabbix-(六) JMX監控
    Zabbix-(六) JMX監控
    !
    Zabbix-(六) JMX監控
  3. 結合上面的步驟,那麼zabbix監控項就可以填寫為

    jmx["java.lang:type=Memory","HeapMemoryUsage.used"]