Spring Boot 应用监控解析
在企业应用中除了要了解 Spring Boot 业务的单元测试、集成测试等功能使用外,在上线之后还需要对线上应用的各项指标(比如,CPU 利用率、内存利用率、数据库连接是否正常、用户请求数据等)进行监控和运维。
在传统项目中,这些监控和运维往往需要借助其他第三方的工具实现,而在 Spring Boot 中提供了 spring-boot-actuator 模块,可以通过 http、jmx、 ssh、telnet 等形式来监控和管理生产环境。同时,Spring Boot 还提供了灵活的自定义接口用来扩展监控的功能。
本章不会过多涉及 actuator 基础使用,而是重点绍 actuator 的自动配置及实现原理。
Actuator 简介
Spring Boot Actuator 提供了应用的审计(Auditing) 、健康(Health) 状态信息、数据采集(Metrics gathering)统计等监控运维的功能。同时,还提供了可扩展的端点(Endpoint) 功能,方便使用者进行自定义监控指标。默认情况下,这些信息以 JSON 的数据格式呈现,用户也可以使用 Spring BootAdmin 项目进行界面管理。
Spring Boot Actuator 通常使用下面的 starter 引入。
<dependency>
<groupId>org. springframework . boot</groupId>
<artifactId>spring- boot -starter-actuator</artifactId>
</ dependency>
通过上面的 starter 会间接引入以下两个依赖。
<dependency>
<groupId>org. springframework . boot</groupId>
<artifactId>spring- boot- actuator</ artifactId>
</ dependency>
<dependency>
<groupId>org. springfr amework . boot</ groupId>
<artifactId>spring- boot- actuator autoconfigure</ artifactId>
</ dependency>
在 Spring Boot 项目中,spring-boot-actuator 作为一 个独立的项目,提供 Actuator 的核心功能,
spring-boot-actuator-autoconfigure 提供 了 Actuator 自动配置的功能。
引入 spring-boot- starter-actuator 之后,默认情况下便开启了监控功能,我们可通过
http://localhost:8080/actuator 来查看默认支持的监控信息。
通过浏览器访问,上述请求地址,默认返回结果信息如下。
{
_links":
"self": {
"href": "http://localhost: 8080/actuator",
"templated": false
},
"health-path": {
"href": "http://localhost: 8080/ actuator/health/{*path}",
"templated": true
"health": {
"href": "http://localhost :8080/ actuator/health" ,"templated": false
},
"info": {
"href": "http://localhost : 8080/actuator/info",
"templated": false
}
}
}
默 认 情 况 下 , 上 述 返 回 信 息 对 应 的 监 控 处 于 开 启 状 态 , 使 用 者 也 可 以 在application.properties 中进行配置来禁用或开启具体的监控。
#启用 shutdown
management . endpoint . shutdown. enabled=true
#全部禁用
management . endpoints . enabled-by-default=false
s 启用 info
management . endpoint. info. enabled=true
了解了监控的基本集成和配置,下面重 点讲解一下 Actuator 的自动配置及原理。
Actuator 自动配置
关于 Actuator 自动配置,我们以 HealthEndpoint 为例, 了解一下在 SpringBoot 中是如何进行自动配置并获取到对应的监控信息的。同时,也简单了解一下,这些自动配置组件获得的信息是如何通过 URL 访问展示出来的。
HealthEndpoint 自动配置
Actuator 的自动配置默认没有在 Spring Boot Autoconfigure 中集成,而是通过独立的spring-boot actuator- autoconfigure 项目来实现。在该项目中实现了大量关于不同组件监控的自动配置。
在继续本章学习或将 Spring Boot 版本升级之前,需提醒读者注意对照所使用的 Spring BootActuator 的版本,因为从 Spring Boot 2.0.x 到 2.2.x 版本,关于 Actuator 及其自动配置的实现代码发生了比较大的变动。
本节以监控点(Health) 相关的自动配置源码及实现原理为例进行讲解,步及的自动配置类有
HealthEndpointAutoConfigurationHealthEndpointConfiguration 等。关于 Health 的相关类均位于 org.springframework.boot.actuate .autoconfigure.health 包下。
Actuator 的 自 动 配 置 类 的 注 册 都 是 在
spring-boot-actuator-autoconfigure 项 目 下 的spring.factories 中完成的。HealthEndpointAutoConfiguration 也不例外,源码如下。
@Configuration(proxyBeanMethods = false)@ConditionalOnAvailableEndpoint (endpoint = HealthEndpoint . class)
@EnableConfigurationProperties
@Import({ LegacyHealthEndpointAdaptersConfiguration. class, LegacyHealthEndpoint-
CompatibilityConfiguration. class,
HealthEndpointConfiguration. class, ReactiveHealthEndpointConfiguration. class,
HealthEndpointWebExtens ionConfiguration. class, HealthEndpointReactive-
WebExtens ionConfiguration.class })
public class HealthEndpointAutoConfiguration {
@Bean
@SuppressWarnings("deprecation")
HealthEndpointProperties healthEndpointProperties (HealthIndicatorProperti
es healthIndicatorPrope
rties) {
HealthEndpointProperties healthEndpointProperties = new HealthEndpoint -
Properties();
healthEndpointPrope