▶SpringBoot监控 - 集成actuator监控工具
▶SpringBoot监控 - 集成actuator监控工具
当SpringBoot的应用部署到生产环境中后,如何监控和管理呢?比如审计日志,监控状态,指标收集等。为了解决这个问题,SpringBoot提供了Actuator。本文主要介绍Spring Boot Actuator及实现案例。@pdai
知识准备
需要了解什么是Spring Boot Actuator, 以及其提供的功能(Endpoints)。
什么是Actuator?
致动器(actuator)是2018年公布的计算机科学技术名词。
百度百科 在新窗口打开 的解释如下: 致动器能将某种形式的能量转换为机械能的驱动装置。如热致动器、磁致动器等,在磁盘中是指将电能转换为机械能并带动磁头运动的装置。 官网给的解释是:An actuator is a manufacturing term that refers to a mechanical device for moving or controlling something. Actuators can generate a large amount of motion from a small change. 从上述的解释不难知道Spring 命名这个组件为Actuator,就是为了提供监测程序的能力。
什么是Spring Boot Actuator?
什么是Spring Boot Actuator? 用在什么样的场景呢?
Spring Boot Actuator提供了对SpringBoot应用程序(可以是生产环境)监视和管理的能力, 可以选择通过使用HTTP Endpoint或使用JMX来管理和监控SpringBoot应用程序。
什么是Actuator Endpoints?
Spring Boot Actuator 允许你通过Endpoints对Spring Boot进行监控和交互。 Spring Boot 内置的Endpoint包括(两种Endpoint: WEB和JMX, web方式考虑到安全性默认只开启了/health): IDJMXWebEndpoint功能描述auditeventsYesNo暴露当前应用的audit events (依赖AuditEventRepository)beansYesNoSpring中所有BeanscachesYesNo暴露可用的缓存conditionsYesNo展示configuration 和auto-configuration类中解析的condition,并展示是否匹配的信息.configpropsYesNo展示所有的@ConfigurationPropertiesenvYesNo展示环境变量,来源于ConfigurableEnvironmentflywayYesNoflyway数据迁移信息(依赖Flyway)healthYesYes展示应用的健康信息heapdumpN/ANo(web应用时)hprof 堆的dump文件(依赖HotSpot JVM)httptraceYesNo展示HTTP trace信息, 默认展示前100个(依赖HttpTraceRepository)infoYesNo应用信息integrationgraphYesNo展示spring集成信息(依赖spring-integration-core)jolokiaN/ANo(web应用时)通过HTTP暴露JMX beans(依赖jolokia-core)logfileN/ANo(web应用时)如果配置了logging.file.name 或者 logging.file.path,展示logfile内容loggersYesNo展示或者配置loggers,比如修改日志的等级liquibaseYesNoLiquibase 数据迁移信息(依赖Liquibase)metricsYesNo指标信息mappingsYesNo@RequestMapping映射路径prometheusN/ANo(web应用时)向prometheus暴露监控信息(依赖micrometer-registry-prometheus)quartzYesNo展示 quartz任务信息scheduledtasksYesNo展示Spring Scheduled 任务信息sessionsYesNosession信息shutdownYesNo关闭应用startupYesNo展示ApplicationStartup的startup步骤的数据(依赖通在SpringApplication配置BufferingApplicationStartup)threaddumpYesNo线程dump当然你也可以自己定义暴露哪些endpoint, 不如JMX时:
management:
endpoints:
jmx:
exposure:
include: "health,info"
web时(*代表所有):
management:
endpoints:
web:
exposure:
include: "*"
exclude: "env,beans"
简单示例
我们通过一个简单的例子,来展示自定义配置指定的endpoint,然后围绕这个简单的例子,谈谈后续拓展。
POM引入actuator包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
yml配置
自定义暴露哪些endpoint, 比如如下yml配置
server:
port: 8080
management:
endpoints:
enabled-by-default: false
web:
base-path: /manage
exposure:
include: 'info,health,env,beans'
endpoint:
info:
enabled: true
health:
enabled: true
env:
enabled: true
beans:
enabled: true
上述配置只暴露info,health,env,beans四个endpoints, web通过可以/manage访问,
Endpoints的进一步拓展配置
与SpringSecurity集成保障安全
正是由于endpoint可能潜在暴露应用的安全性,web方式的endpoint才在默认情况下只暴露了一个/health。 如果你需要暴露更多,并保证endpoint接口安全,可以与Spring Security集成,比如
@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint())
.authorizeRequests((requests) -> requests.anyRequest().hasRole("ENDPOINT_ADMIN"));
http.httpBasic();
return http.build();
}
}
Endpoint跨域访问
跨域访问,可以通过如下配置:
management:
endpoints:
web:
cors:
allowed-origins: "https://example.com"
allowed-methods: "GET,POST"
实现自己的Endpoint
我们可以通过@JmxEndpoint or @WebEndpoint注解来定义自己的endpoint, 然后通过@ReadOperation, @WriteOperation或者@DeleteOperation来暴露操作, 比如添加系统时间date的endpoint
package tech.pdai.springboot.actuator;
import java.time.LocalDateTime;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.web.annotation.WebEndpoint;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;
/** * @author pdai */
@RestController("custom")
@WebEndpoint(id = "date")
public class CustomEndpointController {
@ReadOperation
public ResponseEntity<String> currentDate() {
return ResponseEntity.ok(LocalDateTime.now().toString());
}
}
enable 自定义的date
management:
endpoints:
enabled-by-default: false
web:
base-path: /manage
exposure:
include: 'info,health,env,beans,date'
endpoint:
info:
enabled: true
health:
enabled: true
env:
enabled: true
beans:
enabled: true
date:
enabled: true
你可以看到所有开放的接口中增加了date
访问效果
组件的health状况
SpringBoot默认集成了如下常见中间件的health监控
当然你也可以自定义HealthIndicator
package tech.pdai.springboot.actuator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
/** * @author pdai */
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check();
if (errorCode!=0) {
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
private int check() {
// perform some specific health check
return 0;
}
}
更详细的信息可以参考官网 在新窗口打开
Metrics接入监控系统
这个也是比较常用的,具体参考
Info信息如何获取
有细心的小伙伴会发现/info是空的,最简单的配置方式是在spring-boot-maven-plugin中加入build-info, 编译成jar后运行,即可获取info:
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
示例源码
https://github.com/realpdai/tech-pdai-spring-demos
参考资料
https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.enabling