JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。
JMX最常见的场景是监控Java程序的基本信息和运行情况,任何Java程序都可以开启JMX,然后使用JConsole或Visual VM进行预览。
标准的MBean : 定义 XyMBean接口,Xy 类实现 XyMBean接口 。
public interface XyMBean { String getStatus(); void setStatus(String status); }
public class Xy implements XyMBean{ private String status = "default" ; public String getStatus() { return this.status; } public void setStatus(String status) { this.status = status ; } }
注册MBean :
public class Main { public static void main(String[] args) throws Exception{ XyMBean bean = new Xy() ; MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("com.lzf.study:type=String"); mbs.registerMBean(bean, name); Thread.sleep(Integer.MAX_VALUE); } }
通过jconsole查看和管理MBean 。
如果某些内部运行数据需要被外部知晓,则可以考虑MBean 。
以上玩法简单,但是限制太多,一是需要预先定义接口,二是每个地方都得命名,手动注册 。 下面介绍一个开箱即用的MBean工具箱。
(官方推荐使用Spectator !!! )
<dependencies> <dependency> <groupId>com.netflix.servo</groupId> <artifactId>servo-core</artifactId> <version>0.12.7</version> </dependency> </dependencies>
关于 servo 的官方介绍
Servo provides a simple interface for exposing and publishing application metrics in Java. The primary goals are:
- Leverage JMX: JMX is the standard monitoring interface for Java and can be queried by many existing tools.
- Keep It Simple: It should be trivial to expose metrics and publish metrics without having to write lots of code such as MBean interfaces.
- Flexible Publishing: Once metrics are exposed, it should be easy to regularly poll the metrics and make them available for internal reporting systems, logs, and services like Amazon CloudWatch.
This has already been implemented inside of Netflix and most of our applications currently use it.
1: jmx 是一种标准。
2:简单。
3:灵活发布。
servo 基于 DynamicMBean
用法:
public class Server { @Monitor(name="Status", type=INFORMATIONAL) private AtomicReference<String> status = new AtomicReference<String>("UP"); @Monitor(name="CurrentConnections", type=GAUGE) private AtomicInteger currentConnections = new AtomicInteger(0); @Monitor(name="TotalConnections", type=COUNTER) private AtomicInteger totalConnections = new AtomicInteger(0); @Monitor(name="BytesIn", type=COUNTER) private AtomicLong bytesIn = new AtomicLong(0L); @Monitor(name="BytesOut", type=COUNTER) private AtomicLong bytesOut = new AtomicLong(0L); private volatile Counter counter = Monitors.newCounter("LoadBalancer_ChooseServer"); }
1: 使用@Monitor 注解, 修饰成员变量或者成员方法。 注意成员方法不能是IO密集或者计算密集的方法 。
2:使用内置的 Monitor , Monitors.newXXX() .
注册:
Server s1 = new Server(); Monitors.registerObject("s1", s1); Server s2 = new Server(); Monitors.registerObject("s2", s2); Thread.sleep(Integer.MAX_VALUE);
3:
BasicCounter counter new BasicCounter(MonitorConfig.builder(strippedName).build()); DefaultMonitorRegistry.getInstance().register(counter)
以上技巧在 com.netflix.* 中大量使用
通过jconsole 便能了解程序内部的运行状态了
除了支持标准的JMX 以外 , servo 还提供了自己的 publish 方案, 这意味着servo 能将监控指标发布到其他指标收集器(Atlas) 。
Atlas : https://github.com/Netflix/atlas
开启 Atlas 服务: (指标存储于内存中)
微服务端
1: 引入maven 依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-atlas</artifactId> </dependency>
2: 配置yml
netflix: atlas: uri: http://127.0.0.1:7101/api/v1/publish enabled: true
3: @EnableAtlas。
另外注一笔: spring-boot-starter-actuator 也有监控功能。
springcloud 在整合 Hystrix 时也有把 Hystrix的运行信息注册到MonitorRegistry中去, 至于具体是如何实现的,请参考 ServoMetricServices
和 HystrixCircuitBreakerConfiguration 等几个class 。
来源:oschina
链接:https://my.oschina.net/qidis/blog/4406221