默认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:
- pattern: ".*"

便会在10006的端口开启jmx的监听数据,这时候通过浏览器访问:http://127.0.0.1:10006
也可看到数据,在prometheus中直接配置即可,如果有自己自定义的监控数据,则需要扩展代码,具体如下:

编写接口

public interface MonitorMemoryMBean {

long getTotal();

void setTotal(long total);

long getUsed();

void setUsed(long used);

String doMemoryInfo();
}

然后实现这个接口:

public class MonitorMemory implements MonitorMemoryMBean {

private long total;
private long used;

@Override
public long getTotal() {
return total;
}

@Override
public void setTotal(long total) {
this.total = total;
}

@Override
public long getUsed() {
return used;
}

@Override
public void setUsed(long used) {
this.used = used;
}

@Override
public String doMemoryInfo() {
return String.format("使用内存: %dMB/%dMB", used, total);
}

}

这个例子在 MonitorMemory.java 中只有两个 long 基本类型属性,所以接口是以 MBean 结尾。如果资源实现类中的属性是自定义实体类的引用,那么接口就需要以 MXBean 结尾。

这样就完成了线程数量资源 MBean 的创建,其中 total 和 used 是资源属性,doMemoryInfo 是资源操作方法。

注册资源到 MBean Server

MBean 资源需要注册到 MBean Server 进行代理才可以暴露给外部进行调用,所以想要通过远程管理自定义的 MonitorMemory 资源,需要先进行资源代理。

MBeanServer platformMBeanServer = ManagementFactory.getPlatformMBeanServer();
MonitorMemory myMemory = new MonitorMemory();
myMemory.setTotal(100L);
myMemory.setUsed(20L);
ObjectName objectName = new ObjectName(MonitorMemory.class.getPackage().getName() + ":type=" + MonitorMemory.class.getSimpleName());
platformMBeanServer.registerMBean(myMemory, objectName);

在这个过程中可以对myMemory 的对象进行更新,会实时反应出去。


扫码手机观看或分享: