对于Java项目而言,开启JMX 进行JVM监控是很有必要的,可以帮忙开发人员分析、定位问题
常规开启Java JMX 方法
一般可以在启动脚本中添加相关的参数
-Dcom.sun.management.jmxremote.port=6543
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
上述的配置项,会在指定的端口(比如6543)开启JMX,这样的话像JConsole这样的监视器就可以通过这个端口连接到应用程序。
同时连接不需要身份认证和SSL
关于都有哪些常见的 JMX 监控工具,详见文末小福利
Java spring boot 框架开启JMX
最常见的就是在Java项目的 applicaiton.properties
文件中添加如下配置
spring.jmx.enabled=true
但是现在基本都是使用 spring boot
框架开发,有更简便的方案。
案例中是使用 spring boot
框架 加 apollo
配置中心。所以核心配置都是在Apollo中进行配置。
在Java项目的 applicaiton.properties
文件中进行如下配置加载 Apollo
# 服务ID,对应的Apollo中的服务ID
app.id=xxxx-service
# apollo 相关配置
apollo.cluster=default
# Apollo的访问地址
apollo.meta=http://apollo.xxxx.local
apollo.cacheDir=/data/apollo-config
apollo.bootstrap.enabled = true
apollo.bootstrap.eagerLoad.enabled = true
apollo.bootstrap.namespaces = application,elasticsearch,redis,tech.consul,tech.site,logger,tech.database
Apollo中JMX 相关配置及说明
# apollo中项目对应的application 命名空间
management.endpoint.metrics.enabled = true
management.endpoint.prometheus.enabled = true
management.endpoints.jmx.exposure.include = health,prometheus
management.endpoints.web.exposure.include = health,prometheus
management.metrics.export.prometheus.enabled = true
management.metrics.tags.application = ${spring.application.name}
management.endpoint.health.show-details = ALWAYS
management.health.redis.enabled = false
细心的同学已经发现,在项目的 applicaiton.properties
中没有配置 spring.jmx.enabled=true
。
那么上述的配置是否真的开启了JMX呢?答案是肯定的,已经开启了。
这是因为:
在SpringBoot中
management.endpoints.jmx.enabled
默认为True,它会自动开启JMX监控功能。
在Spring Boot框架中提供了对JMX的自动配置,当检测到management.endpoints.jmx.enabled
属性为true时,会自动开启JMX监控功能,并将MBean注册到MBean服务器中。
因此,即使在应用的配置文件中没有显式地配置 spring.jmx.enabled=true
,Spring Boot应用也会开启JMX监控功能。
下面对Apollo中配置的相关参数做详细介绍
-
management.endpoint.metrics.enabled
是用于启用或禁用 Spring Actuator Metrics 端点的参数。该端点提供了当前应用程序的度量指标信息,一般是指通过
/actuator/metrics
提供如应用程序的请求量、响应时间、错误率等。 -
management.endpoint.prometheus.enabled
参数是用于启用或禁用 Prometheus 端点的开关。当设置为
true
时,Spring Boot 将启动一个 HTTP 服务器,向/actuator/prometheus
路径提供可供 Prometheus 采集的指标数据。这些指标数据可以用于监控应用程序的性能、健康状态等信息。 -
management.metrics.export.prometheus.enabled
是 Spring Boot Actuator 库提供的一个配置参数,它用于启用或禁用 Prometheus 格式的度量指标的导出。默认情况下,该参数的值为 true,即启用 Prometheus 格式的度量指标的导出。
但是当参数的值为 false 时,应用程序不会将度量指标以 Prometheus 格式导出。
但是可以通过其他格式的导出方式访问度量指标,如 JSON 或 JMX
-
management.endpoints.jmx.exposure.include
用于指定哪些端点将在 JMX 中暴露出来。默认情况下,JMX 中的所有端点都是开启的。可以使用逗号分隔的端点 ID 列表来配置开启哪些端点
-
management.endpoints.web.exposure.include
用于指定哪些端点将在 Web 界面上暴露出来。默认情况下,Web 界面上的所有端点都是开启的。同样可以使用逗号分隔的端点 ID 列表来配置开启哪些端点
比如上面种,这两个都只是保留
health
和prometheus
两个断点。所以可以请求/actuator/health
和/actuator/prometheus
。 虽然management.endpoint.metrics.enabled = true
开启可以通过/actuator/metrics
获取数据 , 但是实际上 JMX 或者Web形式都没有进行暴露
,所以请求/actuator/metrics
是 404
-
management.metrics.tags.application
用于在度量指标中添加标签,这里是添加了一个
application
标签,您可以根据自己需求添加 -
management.endpoint.health.show-details
该参数用于控制是否在/actuator/health
接口中是否展示所有细节,如果请求可以开启,有助于排查问题
management.health.redis.enabled
用于控制是否在/actuator/health
接口是否检测该项目链接的所有Redis,如果开启,会检测所有的,如果有一个Redis有问题连接不上,就会导致这个服务的健康检查为 Down
无法注册到Consul
,进而无法对外提供服务。
配置Prometheus
然后在Prometheus中就可以通过服务暴漏的/actuator/prometheus
接口获取服务的性能数据,然后通过grafana进行 监控数据的呈现
#
- job_name: 'consul-discovery-service'
scrape_interval: 30s
metrics_path: '/actuator/prometheus'
consul_sd_configs:
- server: 'consul.xxxx.local'
因为服务都是注册在 Consul中的,所以通过 consul_sd_configs
的形式可以简化配置
然后在Prometheus自带的Web页面中进行查询
jvm_memory_used_bytes{job="consul-discovery-service"}
结果如下
可以看到采集到了相关的JVM数据,然后进行Grafana配置即可。
网上有合适的JVM模板,自行搜索导入Grafana即可。
小福利
1、常见的 JMX 监控工具:
-
JConsole:Java 自带的监视工具,可通过 JDK 中的 bin 目录下的 jconsole 命令启动,提供了一些基本的监视功能和操作界面。
-
VisualVM:Java 自带的多合一监视和分析工具,集成了 JConsole 和 VisualGC 等插件,提供了更加详细的监视信息和功能。
-
Mission Control:Java 官方提供的高级监视和管理工具,提供了诊断、调优、性能分析等丰富的功能。
-
Zabbix:开源的网络监控和管理工具,支持通过 JMX 监控 Java 应用程序,提供了实时监视、性能分析、告警等功能。
-
Nagios:开源的网络监控和管理工具,可通过插件扩展支持 JMX 监控 Java 应用程序,提供了实时监视、告警等功能。
-
Prometheus:开源的监控和警报工具,可通过 Prometheus 的 JMX exporter 支持 JMX 监控 Java 应用程序,提供了度量和警报功能。
-
Jolokia:开源的 JMX-HTTP 桥接器,可将 JMX 接口转换为 HTTP/JSON 接口,方便其他监视工具集成。
-
JavaMelody:开源的 Java 应用程序性能监视工具,支持通过 JMX 监视 Java 应用程序,提供了实时监视、性能分析等功能。
这些工具中,你了解和熟悉那些呢?
2、在 management.metrics.export
配置下,常见的 reporter 包括:
-
prometheus
:用于将度量数据导出到 Prometheus 监控系统。 -
graphite
:用于将度量数据导出到 Graphite 监控系统。 -
influx
:用于将度量数据导出到 InfluxDB 时间序列数据库。 -
stackdriver
:用于将度量数据导出到 Google Cloud Stackdriver。 -
jmx
:用于将 JMX bean 度量数据导出到 JMX 管理系统。 -
newrelic
:用于将度量数据导出到 New Relic APM 系统。
欢迎关注个人公众号