springcloud-netflix 之应用程序监控

[亡魂溺海] 提交于 2020-08-14 03:27:33

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 。

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!