Jvm应用程序暴露JMX指标集成Prometheus
默认Jvm的运行数据,可以通过Jconsole连接本地的jvm进程去查看,但是在服务器上需要远程监控的时候则比较麻烦,这时候可以通过开启remote jvm port让jconsole去连接远程的jm。
使用方式是在java程序提交的时候指定:
-Dcom.sun.management.jmxremote.port=5001 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false |
因为jmx默认需要验证用户身份信息,-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false是用来关闭验证,生产环境下不建议使用。
但是这种用法暴露的jmx信息依旧会有很大的局限和约束,例如和周边工具集成就不太方便,这时可以选择和prometheus这类工具去集成,prometheus提供了agent和server的方式,具体查看:
https://github.com/prometheus/jmx_exporter
agent的使用方式是在提交的时候指定:
-javaagent:metrics/jmx_prometheus_javaagent-0.17.0.jar=10006:metrics/config.yaml |
config的内容为:
rules: |
便会在10006的端口开启jmx的监听数据,这时候通过浏览器访问:http://127.0.0.1:10006
也可看到数据,在prometheus中直接配置即可,如果有自己自定义的监控数据,则需要扩展代码,具体如下:
编写接口
public interface MonitorMemoryMBean { |
然后实现这个接口:
public class MonitorMemory implements MonitorMemoryMBean { |
这个例子在 MonitorMemory.java 中只有两个 long 基本类型属性,所以接口是以 MBean 结尾。如果资源实现类中的属性是自定义实体类的引用,那么接口就需要以 MXBean 结尾。
这样就完成了线程数量资源 MBean 的创建,其中 total 和 used 是资源属性,doMemoryInfo 是资源操作方法。
注册资源到 MBean Server
MBean 资源需要注册到 MBean Server 进行代理才可以暴露给外部进行调用,所以想要通过远程管理自定义的 MonitorMemory 资源,需要先进行资源代理。
MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer(); |
在这个过程中可以对myMemory 的对象进行更新,会实时反应出去。
扫码手机观看或分享: