Spring Boot Actuator的端点都怎么用?咱用事实说话!

开发 架构
本文通过对Spring Boot Actuator提供所有端点构建实例并演示结果,本文大多数内容和实例都是全网第一手资料。该框架对排查线上问题,性能优化等都有极大的帮助。

[[411075]]

本文转载自微信公众号「程序新视界」,作者丑胖侠二师兄。转载本文请联系程序新视界公众号。

前言

在微服务系统架构中,服务的监控是必不可少的。目前大多数微服务应用又是基于Spring Cloud系列,也可以说是基于Spring Boot系列的。此时使用Spring Boot Actuator来进行微服务的监控,不仅功能全面,而且非常方便。

在上篇文章《Spring Boot Actuator集成,难的是灵活运用!》中我们已经介绍了如何将Actuator集成到Spring Boot项目中,并且介绍了如何自定义Endpoint(端点)。有朋友留言说不够深入,那么,本篇文章呢,我们将介绍Actuator原生端点的功能及基本使用场景。

Endpoints 介绍

Actuator中所谓的 Endpoints (翻译为端点)提供了外部来与应用程序进行访问和交互的功能。比如说/health端点提供了应用健康情况的信息,metrics 端点提供了应用程序的指标(JVM 内存使用、系统CPU使用等)信息。

Actuator原生的端点可分为三大类:

  • 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。
  • 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、HTTP请求统计等。
  • 操作控制类:提供了对应用的关闭等操作类功能。

不同版本的Actuator提供的原生端点有所出入,在使用的过程中最好以所使用版本的官方文档为准。同时,每个原生的端点都可以通过配置来单独的禁用或启用。

而在Actuator 2.x 中默认端点增加了/actuator前缀,同时默认只暴露的两个端点为/actuator/health和 /actuator/info。关于端点暴露的配置,可参考前一篇文章。下面基于Spring Boot 2.2.2.RELEASE版本来重点讲解每个端点的功能和应用场景。

actuator端点

Actuator 2.x新增的默认端点,用于展示目前应用中暴露出来的端点汇总,你可以理解为可用端点的目录。

访问URL:http://localhost:8080/actuator ,对应展示结果如下图:

上述只展示了一部分的端点,返回结果为JSON,这里采用了浏览器的JSON插件JSON-Handler进行了格式美化。通过actuator可以直观的看出目前开放了哪些端点,以及这些端点的名称和请求路径。

下面我们就按照显示actuator端点展示的列表逐一介绍。

auditevents端点

auditevents端点用于显示应用暴露的审计事件 (比如认证进入、订单失败),即使我们打开了所有端点,默认情况下也是看不到这个端点的。因为使用它的前提是需要在Spring容器中存在一个类型为AuditEventRepository的Bean的。

查看了网络上大多数教程,基本上都是介绍了auditevents端点功能,而未展示具体实例。笔者经过多方尝试,终于给大家写了一个案例出来。

首先涉及到权限认证,需要先引入spring-boot-starter-security依赖:

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-security</artifactId> 
  4. </dependency> 

 

单纯添加这个依赖还是不够的,还需要加入security的配置,不然AuthorizationAuditListener,AuthenticationAuditListener 监听什么事件呢? 因此,我们加入如下代码:

  1. @Configuration 
  2. public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
  3.  
  4.    @Override 
  5.    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
  6.  
  7.       auth.inMemoryAuthentication() 
  8.             .withUser("admin"
  9.             .password(bcryptPasswordEncoder().encode("admin")) 
  10.             .roles("admin"); 
  11.    } 
  12.  
  13.    @Bean 
  14.    public PasswordEncoder bcryptPasswordEncoder() { 
  15.       return new BCryptPasswordEncoder(); 
  16.    } 

这里采用了security默认的登录界面和权限控制,也就是说所有的访问都需要进行登录。而登录的用户名和密码均为admin。

另外,前面提到需要用到AuditEventRepository的Bean,这里初始化一个对应的Bean:

  1. @Configuration 
  2. public class AuditEventConfig { 
  3.  
  4.    @Bean 
  5.    public InMemoryAuditEventRepository repository(){ 
  6.       return new InMemoryAuditEventRepository(); 
  7.    } 

InMemoryAuditEventRepository是AuditEventRepository接口的唯一实现类。

重启项目,auditevents端点便可用了。访问http://localhost:8080/actuator ,此时会跳转到Security提供的登录页面:

输入代码中指定的用户名和密码,登录成功,跳转到/actuator页面:

可以看到auditevents端点已经成功显示出来了。新开页面访问http://localhost:8080/actuator/auditevents ,展示内容如下:

可以看到已经记录下了权限相关的事件,其中第一次事件是我们直接访问actuator端点时,由于之前为做权限认真,所以事件类型为"AUTHORIZATION_FAILURE",也就是认证失败。此时跳转到登录页面,然后在登录页面输入用户名和密码,登录成功,对应的事件为"AUTHENTICATION_SUCCESS"。

也就是说auditevents记录了用户认证登录系统相关的事件信息,包括时间戳、认证用户、事件类型、访问地址、sessionId等。

示例源码地址:https://github.com/secbr/springboot-all/tree/master/springboot-actuator-auditevents 。

beans端点

/beans端点会返回Spring容器中所有bean的别名、类型、是否单例、依赖等信息。

访问路径为http://localhost:8080/actuator/beans,范围结果如下:

这个端点会展示目前Spring容器中初始化的所有Bean,试想一下,如果你配置了一个Bean,但不确定是否成功实例化,是不是就可以通过这个端口查询一下呢?

我们在项目中定义一个TestController,并注入一个UserService:

  1. @Controller 
  2. public class TestController { 
  3.  
  4.    @Resource 
  5.    private UserService userService; 

重新启动并访问该端点,会看到如下信息: 

可以看到TestController被实例化了,而且依赖于UserService。

caches端点

caches端点主要用于暴露应用程序中的缓冲。这里以Spring Boot提供的Cache组件来展示一下实例。

在项目中集成spring-boot-starter-cache,引入依赖:

  1. <dependency> 
  2.     <groupId>org.springframework.boot</groupId> 
  3.     <artifactId>spring-boot-starter-cache</artifactId> 
  4. </dependency> 

 

然后在启动类上添加@EnableCaching,开启缓存功能。

定义一个CacheController,对其方法queryAll使用缓存机制:

  1. @RestController 
  2. public class CacheController { 
  3.  
  4.     @RequestMapping("/queryAll"
  5.     @Cacheable(value = "queryAll"
  6.     public Map<String, String> queryAll() { 
  7.         Map<String, String> map = new HashMap<>(); 
  8.         map.put("1""Tom"); 
  9.         map.put("2""Steven"); 
  10.         return map; 
  11.     } 

这里使用@Cacheable注解来实现缓存功能,缓存的key为queryAll。此时,访问http://localhost:8080/actuator/caches ,会展示缓存的根内容,但里面并没有缓存。

访问一下http://localhost:8080/queryAll ,也就是触发一下缓存内容的生成。此时再访问上面的链接,便可以看到应用程序中的缓存信息了:

可以看到,返回的内容不仅展示了应用程序的缓存管理器,同时也展示了缓存的Key和缓存数据存储类型信息。

caches-cache端点

caches-cache端点是对上面caches端点的扩展,caches端点展示的所有的缓存信息。如果想直接看出具体的一个缓存信息,则可以使用caches-cache端点。

访问的URL为:http://localhost:8080/actuator/caches/{cache},其中大括号内的值可以替换为缓存的key。

http://localhost:8080/actuator/caches/queryAll

将上面的占位符换成queryAll(缓存的key),执行结果如下:

可以看出,只查询除了指定的缓存信息,包括缓存管理器、缓存名称(key),缓存的存储类型。

health端点

health端点用来检查应用的运行状态,最高频使用的一个端点。检查应用实例的运行状态以及应用不”健康“的原因,比如数据库连接、磁盘空间不够等。

访问地址:http://localhost:8080/actuator/health

展示结果:

  1.     "status""UP" 

上面的实例过于简单,在项目中把数据库给集成进去:

  1. <!--数据库连接相关--> 
  2. <dependency> 
  3.     <groupId>org.springframework.boot</groupId> 
  4.     <artifactId>spring-boot-starter-jdbc</artifactId> 
  5. </dependency> 
  6. <dependency> 
  7.     <groupId>mysql</groupId> 
  8.     <artifactId>mysql-connector-java</artifactId> 
  9. </dependency> 

 

然后在application配置文件中进行配置:

  1. spring: 
  2.   datasource: 
  3.     url: jdbc:mysql://xxx:3333/xxx?characterEncoding=utf8&serverTimezone=Asia/Shanghai 
  4.     username: root 
  5.     password: root 
  6.     driver-class-name: com.mysql.cj.jdbc.Driver 

同时,我们要在application配置文件中配置一下management.endpoint.health.show-details的值。该属性有三个可选项:

never :不展示详细信息,up 或者 down 的状态,默认配置;

when-authorized:详细信息将会展示给通过认证的用户。授权的角色可以通过management.endpoint.health.roles 配置;

always:对所有用户暴露详细信息。

默认值是never,所以我们直接访问看到的只有UP或DOWN。现在集成了数据库,同时把该项值配置为always,看一下详情:

可以看到整体状态为UP,其中下面的三个组件均为UP,而数据库是MYSQL,检查数据库的语句为“SELECT 1”。同时,还展示了磁盘信息和ping的状态。

现在我们把数据库的用户名和密码故意改错,重启访问可得:

状态为DOWN,组件中db出现了问题,状态为DOWN。问题的详情在error中展示,可以看出是建立连接时出错了。在实践中,我们可以通过health端口监控数据库、Redis、MongoDB、磁盘等健康情况。Actuator预定义的处理类为:DataSourceHealthIndicator, DiskSpaceHealthIndicator, MongoHealthIndicator, RedisHealthIndicator等。

而且每个指标都可以单独的进行开启和关闭,以数据库的为例:

  1. management: 
  2.   health: 
  3.     db: 
  4.       enabled: true 

info端点

/info 端点用来查看配置文件 application中以info开头的配置信息,默认情况下 application中并没有 info 节点配置,所以默认为空。

application中添加如下配置:

  1. info: 
  2.   user
  3.     type: 公众号 
  4.     name: 程序新视界 
  5.     wechat: zhuan2quan 

访问http://localhost:8080/actuator/info ,展示结果如下:

conditions端点

Spring Boot提供了自动配置功能,使用起来非常方便。但这些自动配置类是什么情况下生效的,是否生效是比较难排查的。此时,可以使用 conditions 在应用运行时查看某个配置类在什么条件下生效,或为什么没有生效。

访问URL:http://localhost:8080/actuator/conditions ,部分返回信息如下:

可以看到某个自动配置类对应的生效条件和提示信息。

shutdown端点

shutdown端点属于操作控制类端点,可以优雅关闭 Spring Boot 应用。需要在配置文件中开启:

  1. management: 
  2.   endpoint: 
  3.     shutdown: 
  4.       enabled: true 

该端点只支持POST请求,执行命令及返回结果如下:

  1. curl -X POST "http://localhost:8080/actuator/shutdown"  
  2.     "message""Shutting down, bye..." 

执行之后,会发现应用程序已经被关闭了。由于该端点会关闭应用程序,因此使用时需要小心。

configprops端点

在Spring Boot项目中,我们经常会用到@ConfigurationProperties注解来批量注入一些属性,而configprops端点就是用来显示这些被该注解标注的配置类。

比如前面的info配置,我们就可以定义一个类InfoProperties:

  1. @Component 
  2. @ConfigurationProperties(prefix = "info"
  3. public class InfoProperties { 
  4.  
  5.     private String type; 
  6.  
  7.     private String name
  8.  
  9.     private String wechat; 
  10.      
  11.    // 省略getter/setter  

访问URL:http://localhost:8080/actuator/configprops ,部分信息如下:

不仅可以看到系统中默认集成的配置类信息,还可以看到我们自定义的配置类信息。这里需要注意的是对应的类需要进行实例化(@Component)这里才能够看到。

我们自定义的类中返回了Bean的名称、配置前缀。上面的ProjectInfoProperties还返回了属性信息。

env端点

env端点用于获取全部环境属性,包括application配置文件中的内容、系统变量等。

访问URL:http://localhost:8080/actuator/env ,返回部分信息:

env-toMatch端点

env-toMatch端点与caches和caches-cache类似,一个是获取所有的,一个是获取指定的。这里的env-toMatch端点是获取指定key的环境变量属性。

基本格式为:http://localhost:8080/actuator/env/{toMatch}。 实例URL:http://localhost:8080/actuator/env/info.user.name ,返回结果如下图: 图片

返回数据信息包括该属性的来源、value值等信息。

loggers端点

/loggers 端点暴露了程序内部配置的所有 logger 的信息,包括不同的package、不同的类的日志级别信息。

访问URL:http://localhost:8080/actuator/loggers ,部分返回结果:

loggers-name端点

loggers-name端点也是logger端点的细分,可以通过name访问某一个logger。

基本请求格式:http://localhost:8080/actuator/loggers/{name} 示例请求URL:http://localhost:8080/actuator/loggers/com.secbro2.SpringbootActuatorApplication ,返回结果如下:

  1.     "configuredLevel"null
  2.     "effectiveLevel""INFO" 

可以看出,启动类的日志级别为INFO。

heapdump端点

heapdump端点会返回一个JVM 堆dump,通过JVM自带的监控工具VisualVM可打开此文件查看内存快照。这是内存优化,基于堆栈层面进行排查的利器。

访问URL:http://localhost:8080/actuator/heapdump 。Mac操作系统下浏览器访问会下载一个名字为heapdump的文件,无后缀,30M。

命令行执行jvisualvm命令,打开VisualVM,依次点击“文件”、“装入”,记得文件类型要选择“堆Dump(.hprof,.*)”,然后选择heapdump。

此时便可以通过工具来进行堆栈信息的分析了。对于线上问题的分析提供了极为便利的方式。

threaddump端点

/threaddump 端点会生成当前线程活动的快照。在日常定位问题的时候查看线程的情况非常有用,主要展示了线程名、线程ID、线程的状态、是否等待锁资源等信息。

访问URL:http://localhost:8080/actuator/threaddump ,部分返回结果:

我们可通过线程快照来排查生产环境的问题。

metrics端点

/metrics 端点用来暴露当前应用的各类重要度量指标,比如:内存信息、线程信息、垃圾回收信息、tomcat、数据库连接池等。2.x版本这里只显示了一个指标的列表。

访问URL:http://localhost:8080/actuator/metrics 。

  1.     "names": [ 
  2.         "jvm.memory.max"
  3.         "jvm.threads.states"
  4.         "jvm.gc.pause"
  5.         "http.server.requests"
  6.         "process.files.max"
  7.         "jvm.gc.memory.promoted"
  8.         "system.load.average.1m"
  9.         "jvm.memory.used"
  10.         "jvm.gc.max.data.size"
  11.         "jvm.memory.committed"
  12.         "system.cpu.count"
  13.         "logback.events"
  14.         "jvm.buffer.memory.used"
  15.         "tomcat.sessions.created"
  16.         "jvm.threads.daemon"
  17.         "system.cpu.usage"
  18.         "jvm.gc.memory.allocated"
  19.         "tomcat.sessions.expired"
  20.         "jvm.threads.live"
  21.         "jvm.threads.peak"
  22.         "process.uptime"
  23.         "tomcat.sessions.rejected"
  24.         "process.cpu.usage"
  25.         "jvm.classes.loaded"
  26.         "jvm.classes.unloaded"
  27.         "tomcat.sessions.active.current"
  28.         "tomcat.sessions.alive.max"
  29.         "jvm.gc.live.data.size"
  30.         "process.files.open"
  31.         "jvm.buffer.count"
  32.         "jvm.buffer.total.capacity"
  33.         "tomcat.sessions.active.max"
  34.         "process.start.time" 
  35.     ] 

/metrics端点可以提供应用运行状态的完整度量指标报告,这项功能非常的实用,但是对于监控系统中的各项监控功能,它们的监控内容、数据收集频率都有所不同,如果我们每次都通过全量获取报告的方式来收集,略显粗暴。官方也是可能是处于此方面的考虑,在Spring Boot 2.x之后,/metrics端点只显示了指标的列表。

如果需要查看具体的某项指标,则可通过/metrics-requiredMetricName端点来实现。

metrics-requiredMetricName端点

metrics-requiredMetricName端点,用于访问指定指标的报告,一般会配合/metrics端点先查出指标列表,然后再查询具体的某个指标。

基本格式:http://localhost:8080/actuator/metrics/{requiredMetricName}。 实例URL:http://localhost:8080/actuator/metrics/jvm.memory.max ,返回结果如下:

  1.     "name""jvm.memory.max"
  2.     "description""The maximum amount of memory in bytes that can be used for memory management"
  3.     "baseUnit""bytes"
  4.     "measurements": [ 
  5.         { 
  6.             "statistic""VALUE"
  7.             "value": 5606211583 
  8.         } 
  9.     ], 
  10.     "availableTags": [ 
  11.         { 
  12.             "tag""area"
  13.             "values": [ 
  14.                 "heap"
  15.                 "nonheap" 
  16.             ] 
  17.         }, 
  18.         { 
  19.             "tag""id"
  20.             "values": [ 
  21.                 "Compressed Class Space"
  22.                 "PS Survivor Space"
  23.                 "PS Old Gen"
  24.                 "Metaspace"
  25.                 "PS Eden Space"
  26.                 "Code Cache" 
  27.             ] 
  28.         } 
  29.     ] 

上述结果展示了最大可用内存的情况。其他相关指标的展示替换对应的名字进行查看即可。

scheduledtasks端点

/scheduledtasks端点用于展示应用中的定时任务信息。

先在项目中构建两个定时任务,首先在启动类上添加@EnableScheduling开启定时任务功能。然后创建定时任务类:

  1. @Component 
  2. public class MyTask { 
  3.  
  4.     @Scheduled(cron = "0/10 * * * * *"
  5.     public void work() { 
  6.         System.out.println("I am a cron job."); 
  7.     } 
  8.  
  9.     @Scheduled(fixedDelay = 10000) 
  10.     public void work1() { 
  11.         System.out.println("I am a fixedDelay job."); 
  12.     } 

其中定义了两种类型的定时任务,work是基于cron实现的定时任务,work1是基于fixedDelay实现的定时任务。

访问URL:http://localhost:8080/actuator/scheduledtasks ,返回结果信息如下:

  1.     "cron": [ 
  2.         { 
  3.             "runnable": { 
  4.                 "target""com.secbro2.job.MyTask.work" 
  5.             }, 
  6.             "expression""0/10 * * * * *" 
  7.         } 
  8.     ], 
  9.     "fixedDelay": [ 
  10.         { 
  11.             "runnable": { 
  12.                 "target""com.secbro2.job.MyTask.work1" 
  13.             }, 
  14.             "initialDelay": 0, 
  15.             "interval": 10000 
  16.         } 
  17.     ], 
  18.     "fixedRate": [], 
  19.     "custom": [] 

可以看到,通过该端点可以明确的知道当前应用中定义的定时任务,以及执行模式和频次。

mappings端点

/mappings端点用于描述全部的 URI 路径,以及和控制器的映射关系。这个功能算是比较常用的了,如果想系统的查看URL对应的Controller及方法,可以使用此端点。

访问URL:http://localhost:8080/actuator/mappings ,部分返回结果如下:

至此关于Spring Boot Actuator提供的所有端点介绍完毕。

小结

 

本文通过对Spring Boot Actuator提供所有端点构建实例并演示结果,本文大多数内容和实例都是全网第一手资料。该框架对排查线上问题,性能优化等都有极大的帮助。而在写本文的过程中也越来越惊叹Actuator的功能之强大,强烈推荐用起来。

 

责任编辑:武晓燕 来源: 程序新视界
相关推荐

2013-11-25 11:04:45

2016-06-06 14:25:30

云计算

2017-06-04 16:05:48

Spring BootActuatorinfo

2023-04-11 16:04:19

Spring Boo端点运维

2010-01-07 15:36:22

JSON转化

2024-01-26 07:37:51

Stream工具场景

2022-02-09 20:39:52

Actuator应用监控

2021-04-08 19:07:54

安全Spring Bootendpoint

2021-07-12 07:08:52

Spring Boot集成框架

2014-12-23 09:23:42

2022-12-05 13:45:06

Actuator监控

2012-06-05 10:09:57

2012-05-07 17:06:29

2016-10-14 14:16:28

Spring BootJava应用

2018-05-25 16:32:45

Spring BootJava开发

2022-11-09 07:49:12

Records类声明代码

2023-04-28 12:01:56

Spring项目编译

2023-11-08 08:15:48

服务监控Zipkin

2022-05-09 11:01:18

配置文件数据库
点赞
收藏

51CTO技术栈公众号