有道无术,术尚可求,有术无道,止于术。
本系列Spring Boot版本2.7.0
在生产环境很有必要对应用进行监控、追踪、审计、控制,假如数据库突然挂了,直到客户打电话骂娘时~ 我们才知道这回事,就很尴尬了。。。
Spring Boot提供了spring-boot-actuator用于后台应用程序运行监控、指标收集、审计等功能。
spring-boot-actuator是Spring Boot除了自动配置外另一个重要的核心功能。
首先创建一个spring boot web项目,添加actuator starter依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
然后添加端点配置,所谓端点endpoint就是spring-boot-actuator提供获取监控程序信息的入口,Spring Boot 包含了许多内置端点,也可以自定义端点。例如,health端点提供基本的应用程序健康信息。
下面的配置表示将所有端点都暴露出来:
management:
endpoints:
# Web端点的配置属性
web:
# 设置端点访问的URL前缀,默认为/actuator
base-path: /actuator
exposure:
# 开放端点的ID集合(eg:['health','info','beans','env']),配置为“*”表示全部
include: '*'
在项目启动后,日志会打印当前端点开启数量及访问前缀:

访问http://localhost:9056/actuator/health,也就是监控健康状态的端点,返回了一个状态为UP,表示当前程序正常运行中:

端点可以通过 HTTP 或 JMX启用、禁用和公开(远程访问)。
当端点被启用和公开时,它被认为是可用的。内置端点只有在可用时才会自动配置。
大多数应用程序选择通过HTTP 公开,也是就通过URL地址访问,完整的路径为:
http://ip:port/前缀/端点ID
比如健康信息端点HTTP 访问URL 为:http://localhost:9056/actuator/health
常用端点如下表说示:
| 端点ID | 描述 |
|---|---|
| auditevents | 公开当前应用程序的审计事件信息。需要一个AuditEventRepository的Bean。 |
| beans | 显示应用程序中所有 Spring bean 的完整列表。 |
| caches | 公开可用的缓存。 |
| conditions | 显示在配置和自动配置类上评估的条件以及它们匹配或不匹配的原因。 |
| configprops | 显示所有 @ConfigurationProperties的整理列表。 |
| env | Spring 的ConfigurableEnvironment. |
| flyway | 显示已应用的任何 Flyway 数据库迁移。需要一颗或多Flyway Bean。 |
| health | 显示应用程序运行状况信息。 |
| httptrace | 显示 HTTP 跟踪信息(默认情况下,最后 100 个 HTTP 请求-响应交换)。需要一个HttpTraceRepository Bean。 |
| info | 显示任意应用程序信息。 |
| integrationgraph | 显示 Spring 集成图。需要依赖于spring-integration-core. |
| loggers | 显示和修改应用程序中记录器的配置。 |
| liquibase | 显示已应用的任何 Liquibase 数据库迁移。需要一颗或多Liquibase Bean。 |
| metrics | 显示当前应用程序的“指标”信息。 |
| mappings | 显示所有@RequestMapping路径列表。 |
| quartz | 显示有关 Quartz 调度程序作业的信息。 |
| scheduledtasks | 显示应用程序中的计划任务。 |
| sessions | 允许从 Spring Session 支持的会话存储中检索和删除用户会话。需要使用 Spring Session 的基于 Servlet 的 Web 应用程序。 |
| shutdown | 让应用程序正常关闭。默认禁用。 |
| startup | 显示由收集的启动步骤ApplicationStartup 数据。需要SpringApplication使用BufferingApplicationStartup. |
| threaddump | 执行线程转储。 |
Web 应用程序(Spring MVC、Spring WebFlux 或 Jersey),可以使用以下附加端点:
| 端点ID | 描述 |
|---|---|
| heapdump | 返回hprof堆转储文件。需要一个 HotSpot JVM。 |
| jolokia | 通过 HTTP 公开 JMX bean(当 Jolokia 在类路径上时,不适用于 WebFlux)。需要依赖于jolokia-core. |
| logfile | 返回日志文件的内容(如果已设置logging.file.name或logging.file.path属性)。支持使用 HTTPRange头来检索日志文件的部分内容。 |
| prometheus | 以 Prometheus 服务器可以抓取的格式公开指标。需要依赖于micrometer-registry-prometheus. |
访问beans 端点,显示容器中所有的Bean:

访问loggers端点,显示程序日志记录器的级别:

访问metrics端点,显示容器中所有的指标:
再访问metrics/指标名称,可以看到当前指标详情,比如硬盘可用大小:

info端点显示当前应用程序信息。这些信息需要从特定位置配置:
META-INF/build-info.propertiesGit文件 ,比如git.propertiesproperty 中获取首先添加 POM 插件,构建 build-info.properties文件。
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojogroupId>
<artifactId>build-helper-maven-pluginartifactId>
<version>3.2.0version>
<executions>
<execution>
<id>local-timestamp-propertyid>
<phase>validatephase>
<goals>
<goal>timestamp-propertygoal>
goals>
<configuration>
<name>local.build.timestampname>
<pattern>${maven.build.timestamp.format}pattern>
<timeZone>Asia/ShanghaitimeZone>
<timeSource>buildtimeSource>
configuration>
execution>
executions>
plugin>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<executions>
<execution>
<goals>
<goal>build-infogoal>
goals>
<configuration>
<additionalProperties>
<name>spring-boot-actuator-demo 后台监控服务name>
<encoding.source>UTF-8encoding.source>
<encoding.reporting>UTF-8encoding.reporting>
<java.source>${maven.compiler.source}java.source>
<java.target>${maven.compiler.target}java.target>
<time>构建时间:${local.build.timestamp}time>
additionalProperties>
configuration>
execution>
executions>
plugin>
plugins>
build>
执行打包命令,查看生成的文件:

访问info端点:

默认情况下,启用除了shutdown之外的所有端点。要配置端点的启用,请使用management.endpoint.属性。以下示例启用shutdown端点:
management:
endpoint:
# 让应用程序正常关闭。默认禁用。
shutdown:
enabled: true
如果想要选择性的启用,可以将management.endpoints.enabled-by-default属性设置为false,表示禁止所有默认端点,然后使用单个端点的enabled属性开启你想要的端点。
management:
endpoint:
# 启用info端点
info:
enabled: true
endpoints:
# 禁用所有其他端点
enabled-by-default: false
启用了端点之后,还需要暴露出来,让其他程序来获取监控信息。
由于端点可能包含敏感信息,应该仔细考虑何时公开它们。下表显示了内置端点的暴露配置:
| ID | JMX | HTTP |
|---|---|---|
| auditevents | 是的 | 不 |
| beans | 是的 | 不 |
| caches | 是的 | 不 |
| conditions | 是的 | 不 |
| configprops | 是的 | 不 |
| env | 是的 | 不 |
| flyway | 是的 | 不 |
| health | 是的 | 是的 |
| heapdump | 不适用 | 不 |
| httptrace | 是的 | 不 |
| info | 是的 | 不 |
| integrationgraph | 是的 | 不 |
| jolokia | 不适用 | 不 |
| logfile | 不适用 | 不 |
| loggers | 是的 | 不 |
| liquibase | 是的 | 不 |
| metrics | 是的 | 不 |
| mappings | 是的 | 不 |
| prometheus | 不适用 | 不 |
| quartz | 是的 | 不 |
| scheduledtasks | 是的 | 不 |
| sessions | 是的 | 不 |
| shutdown | 是的 | 不 |
| startup | 是的 | 不 |
| threaddump | 是的 | 不 |
更改公开的端点,使用include和exclude属性:
management:
endpoints:
# Web端点的配置属性
web:
# 设置端点访问的URL前缀,默认为/actuator
base-path: /actuator
exposure:
# 开放端点的ID集合(eg:['health','info','beans','env']),配置为“*”表示全部
include: '*'
# 不暴露的端点集合
exclude: 'info'
# JMX 端点配置
jmx:
exposure:
exclude: 'info'
include: '*'
端点会自动缓存对不带任何参数的读取操作的响应结果。要配置端点缓存响应的时间,使用其cache.time-to-live属性。以下示例将beans端点缓存的生存时间设置为 10 秒:
management:
endpoint:
beans:
cache:
time-to-live: 10s
还可以配置CORS 跨域:
management:
endpoints:
# Web端点的配置属性
web:
cors:
allowed-origins: '*'
allowed-methods: GET,POST