Spring Actuator源码分析-阿里云开发者社区

开发者社区> edwardsbean> 正文

Spring Actuator源码分析

简介: <div class="markdown_views"> <h3 id="actuator-endpoint">Actuator Endpoint</h3> <p>Actuator模块通过Endpoint暴露一些接口,可以是Rest方式,也可以是JMX等其他方式.</p> <p>如果使用Rest方式,通常SpringMVC是使用@RequestMapping,以及@Cont
+关注继续查看

Actuator Endpoint

Actuator模块通过Endpoint暴露一些接口,可以是Rest方式,也可以是JMX等其他方式.

如果使用Rest方式,通常SpringMVC是使用@RequestMapping,以及@Controller标注一个控制器方法,如果不使用SpringMVC,即没引入SpringMVC的包,那么Springboot就会出错.所以为了不走正常的SpringMVC机制,Actuator用EndpointHandlerMapping重写了RequestMappingInfoHandlerMapping,匹配的是实现了MvcEndpoint接口的”控制器”
这里写图片描述

Endpoint和MvcEndpoint两个的区别?
MvcEndpoint是对Endpoint SpringMVC层的装饰,添加了@RequestMapping,以及@ResponseBody.具体逻辑委托给Endpoint处理,.Endpoint的id即为url.

文档中已经提到了自定义endpoint的方法,

Health Check

HealthEndpoint是Actuator自带的Health Check,具体的检查操作都是交由HealthIndicator处理,根据文档,实现 HealthIndicator即可自定义一些Health Check的逻辑,如下

@Component
public class MyHealth implements HealthIndicator {
    @Override
    public Health health() {
  return new Health.Builder()
    .withDetail("tair", "timeout") // some logic check tair
    .withDetail("tfs", "ok") // some logic check tfs
    .status("500")
    .down()
    .build();
    }
}

现在访问 health endpoint 是这样的:

$ curl http://localhost:8080/health
{
    "status": "DOWN",
    "tair": "timeout",
    "tfs": "ok"
}

HealthIndicatorAutoConfiguration会在EndpointAutoConfiguration之前,自动配置所有的HealthIndicator
Actuator已经自带了一些HealthIndicator,自动启用部分:
这里写图片描述

多个HealchIndicator会由CompositeHealthIndicator调用HealthAggregator做aggregate(聚合),目前只有OrderedHealthAggregator,用于排序

Metrics Endpoint

这个Endpoint展示Metrics信息,具体的Metrics是由实现了PublicMetrics接口的类处理.
MetricsEndpoint维护着一份PublicMetrics列表,Actuator已经实现了如下:
这里写图片描述
所有被激活的PublicMetrics,都可以通过访问/metrics查看:

{
    "counter.status.200.root": 20,
    "counter.status.200.metrics": 3,
    "counter.status.200.star-star": 5,
    "counter.status.401.root": 4,
    "gauge.response.star-star": 6,
    "gauge.response.root": 2,
    "gauge.response.metrics": 3,
    "classes": 5808,
    "classes.loaded": 5808,
    "classes.unloaded": 0,
    "heap": 3728384,
    "heap.committed": 986624,
    "heap.init": 262144,
    "heap.used": 52765,
    "mem": 986624,
    "mem.free": 933858,
    "processors": 8,
    "threads": 15,
    "threads.daemon": 11,
    "threads.peak": 15,
    "uptime": 494836,
    "instance.uptime": 489782,
    "datasource.primary.active": 5,
    "datasource.primary.usage": 0.25
}

MetricReaderPublicMetrics

通过这个PublicMetrics可以获取到控制器访问情况:

"gauge.response.hi": 5,
"counter.status.200.hi": 19,

分别为hi接口响应时间,访问次数.

整个过程:
MetricRepositoryAutoConfiguration -> CounterBuffers,GaugeBuffers用于保存计数数据
MetricRepositoryAutoConfiguration -> 初始化GaugeService + CounterService(内含CounterBuffers,GaugeBuffers)
MetricFilterAutoConfiguration -> 初始化MetricsFilter,该过滤器使用GaugeService + CounterService统计访问次数以及响应时间
PublicMetricsAutoConfiguration -> 初始化MetricReaderPublicMetrics,塞入CompositeMetricReader(CounterBuffers,GaugeBuffers).
MetricReaderPublicMetrics读取CounterBuffers,GaugeBuffers保存的统计数据

我们重点来看下MetricsFilter这个过滤器:

自定义Metrics

根据文档,可以在业务代码中注入CounterService或GaugeService来统计信息:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.metrics.CounterService;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    private final CounterService counterService;

    @Autowired
    public MyService(CounterService counterService) {
        this.counterService = counterService;
    }

    public void exampleMethod() {
        this.counterService.increment("services.system.myservice.invoked");
    }

}

当然也可以使用AOP做一个method level的统计.但是我希望做一个与业务无关,集成到框架里的Metrics统计

Reference

http://kielczewski.eu/2015/01/application-metrics-with-spring-boot-actuator/

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Spring AOP 源码分析——创建代理对象
1.简介 与筛选合适的通知器相比,创建代理对象的过程则要简单不少,本文所分析的源码不过100行,相对比较简单。在接下里的章节中,我将会首先向大家介绍一些背景知识,然后再去分析源码。
1001 0
高性能网络I/O框架-netmap源码分析(2)
作者:gfree.wind@gmail.com 博客:blog.focus-linux.net linuxfocus.blog.chinaunix.net 微博:weibo.com/glinuxer QQ技术群:4367710 前面e1000_probe的分析,按照Linux驱动框架,接下来就该e1000_open。
920 0
Spring IOC 容器源码分析
原文出处:https://javadoop.com/post/spring-ioc Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器。
705 0
RestTemplate源码分析
RestTemplate是Spring提供的访问Rest服务的客户端,它简化了和http服务器的交互。 HTTP 协议特点是纯文本协议,其媒体类型MediaType可以为text/html、text/xml、application/json等,HTTP消息必须使用content-type进行自我描述,否则不能区分媒体类型。
3791 0
React源码分析5 -- 组件通信,refs,key,ReactDOM
React源码系列文章,请多支持: [React源码分析1 — 组件和对象的创建(createClass,createElement)](https://www.atatech.org/articles/72905) [React源码分析2 — React组件插入DOM流程](http://www.atatech.org/articles/72908) [React源码分析3 — React
3648 0
Dubbo 源码分析 - 集群容错之 Directory
1. 简介 前面文章分析了服务的导出与引用过程,从本篇文章开始,我将开始分析 Dubbo 集群容错方面的源码。这部分源码包含四个部分,分别是服务目录 Directory、服务路由 Router、集群 Cluster 和负载均衡 LoadBalance。
1021 0
前后端交互之封装Ajax+SpringMVC源码分析
为什么需要封装呢?因为用的多,我想将其封装成函数,当我想用它时,只需将那个函数对应的js文件引入即可,而不要重复写很多相同代码,利于开发效率的提高。 无论是$.ajax或$.post、$.get等,在开发中是经常用到的。
875 0
+关注
98
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载