Spring boot——JMX 监控

 

前言

Spring Boot 应用的健康监控一文中,我们通过 Spring Boot Actuator 对外暴露应用的监控信息,除了使用 HTTP 获取 JSON 格式 的数据之外,还可以通过 JMX 监控应用,Spring Boot 也提供了对 JMX 监控的支持。

JMX 监控对外暴露的信息相同,不过是使用 MBeans 容器将应用数据封装管理。

 

一、启动 JMX

1、Spring Boot < 2.2.X 默认是启用JMX(Java Management Extensions)的,并且默认是公开的MBeans可以直接使用 jdk 自带的jconsole(shell 窗口使用命令jconsole即可 ) 客户端查看Mbeans.

2、使用JMX那么所有的Actuator端点 ( 除了/heapdump) 会通过MBeans进行公开的。

3、请注意 Spring Boot > 2.2.x 默认禁用 JMX 暴露,需要添加以下设置才能使其工作:
spring.jmx.enabled=true

在命令行中执行jconsole命令启动“Java 管理和监视控制台”,然后选择org.springframework.boot节点下的Endpoint,可以看到如下信息:

4、请注意 Spring Boot > 2.2.x 默认禁用 JMX Tomcat Bean 暴露,需要添加以下设置才能使其工作:

server.tomcat.mbeanregistry.enabled=true

在命令行中执行jconsole命令启动“Java 管理和监视控制台”,然后选择Tomcat,可以看到如下信息:

 

二、禁用 JMX

如果不希望在 JMX 上公开端点,您可以设置management.endpoints.jmx.exposure.exclude属性为 *,如下例所示:

management.endpoints.jmx.exposure.exclude=*

如果 Spring Boot > 2.2.x 默认禁用 JMX 暴露。

 

三、访问 JMX

除了通过 JMX 获取信息,也可以通过 HTTP 接口访问 Mbeans 对象的信息,具体有以下两种方式。

  • actuator 的 metrics

部分指标会暴露在actuatormetrics下面,比如:tomcat thread的相关指标、jvm的相关指标、连接池 (hikaricp 等)的相关指标(具体暴露哪些指标,取决于配置情况)。

1、在应用的 pom 文件中添加 jolokia-core 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2、配置:

在 application.properties 文件:

# Actuator Web 访问端口
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
management.server.port=10111
management.server.ssl.enabled=false
management.server.servlet.context-path=/

spring.jmx.enabled=true
server.tomcat.mbeanregistry.enabled=true
management.endpoints.jmx.exposure.include=*

3、测试验证:

  • Jolokia

Jolokia 是一个 JMX-http 桥梁,它提供了访问 JMX bean 的另一种方法,使用 Jolokia,需要引入 org.jolokia:jolokia-core 的依赖。

1、在应用的 pom 文件中添加 jolokia-core 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<!-- JMX monitor -->
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
</dependency>

2、配置:

添加依赖后,然后可以通过在management.endpoints.web.exposure.include属性中添加 Jolokia 或 * 来公开 Jolokia 端点,然后,你可以使用/actuator/jolokia在你的管理 HTTP 服务器上访问它。

在 application.properties 文件:

# Actuator Web 访问端口
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
management.server.port=10111
management.server.ssl.enabled=false
management.server.servlet.context-path=/

spring.jmx.enabled=true
server.tomcat.mbeanregistry.enabled
=true
management.endpoints.jmx.exposure.include
=*

3、测试验证:

我们在 postman 中访问 http://172.16.4.40:10111/actuator/jolokia/read/Tomcat:type=ThreadPool,name=%22http-nio-8091%22/maxThreads 也可以得到对应的信息:

4、定制 Jolokia:

Jolokia 有许多设置,你通常通过设置 servlet 参数来配置它们,使用 Spring Boot,你可以使用你的 application.properties 文件,为此,在参数前面加上 management.endpoint.jolokia.config.

如下例所示:

management.endpoint.jolokia.config.debug=true

5、禁用 Jolokia:

如果你使用 Jolokia 但不希望 Spring Boot 配置它,设置management.endpoint.jolokia.enabled属性为false,如下所示:

management.endpoint.jolokia.enabled=false

 

四、其它

  • 自定义 MBean 的名字

可以自定义在其中暴露端点的 JMX 域,下面的设置显示了 application.properties 中的一个示例:

management.endpoints.jmx.domain=com.example.myapp
management.endpoints.jmx.unique-names=true

 

 

引用: