Actuator 是 Spring Boot 提供的对应用系统的自省和监控功能。通过 Actuator,可以使用数据化的指标去度量应用的运行情况,比如查看服务器的磁盘、内存、CPU等信息,系统的线程、gc、运行状态等等。
Actuator 通常通过使用 HTTP 和 JMX 来管理和监控应用,大多数情况使用 HTTP 的方式。
Actuator 端点说明
| 端点 | 描述 |
|---|---|
| auditevents | 获取当前应用暴露的审计事件信息 |
| beans | 获取应用中所有的 Spring Beans 的完整关系列表 |
| caches | 获取公开可以用的缓存 |
| conditions | 获取自动配置条件信息,记录哪些自动配置条件通过和没通过的原因 |
| configprops | 获取所有配置属性,包括默认配置,显示一个所有 @ConfigurationProperties 的整理列版本 |
| env | 获取所有环境变量 |
| flyway | 获取已应用的所有Flyway数据库迁移信息,需要一个或多个 Flyway Bean |
| liquibase | 获取已应用的所有Liquibase数据库迁移。需要一个或多个 Liquibase Bean |
| health | 获取应用程序健康指标(运行状况信息) |
| httptrace | 获取HTTP跟踪信息(默认情况下,最近100个HTTP请求-响应交换)。需要 HttpTraceRepository Bean |
| info | 获取应用程序信息 |
| integrationgraph | 显示 Spring Integration 图。需要依赖 spring-integration-core |
| loggers | 显示和修改应用程序中日志的配置 |
| logfile | 返回日志文件的内容(如果已设置logging.file.name或logging.file.path属性) |
| metrics | 获取系统度量指标信息 |
| mappings | 显示所有@RequestMapping路径的整理列表 |
| scheduledtasks | 显示应用程序中的计划任务 |
| sessions | 允许从Spring Session支持的会话存储中检索和删除用户会话。需要使用Spring Session的基于Servlet的Web应用程序 |
| shutdown | 关闭应用,要求endpoints.shutdown.enabled设置为true,默认为 false |
| threaddump | 获取系统线程转储信息 |
| heapdump | 返回hprof堆转储文件 |
| jolokia | 通过HTTP公开JMX bean(当Jolokia在类路径上时,不适用于WebFlux)。需要依赖 jolokia-core |
| prometheus | 以Prometheus服务器可以抓取的格式公开指标。需要依赖 micrometer-registry-prometheus |
Actuator 使用及配置
项目依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yml 配置
management:
endpoints:
# 如果将management.endpoints.enabled-by-default设置为false,则禁用所有端点
enabled-by-default: true
web:
exposure:
include: "*"
exclude: shutdown
# 配置后启动应用,访问 http://127.0.0.1:8080/actuator 我们可以看到所有的 Actuator 端点列表
base-path: /manage
Spring Boot 2.X 中,Actuator 默认只开放 health 和 info 两个端点。
常用端点详解
1. health
主要用来检测应用的运行状况,是使用最多的一个监控点。监控软件通常使用该接口实时监测应用运行状况,在系统出现故障时把报警信息推送给相关人员,如磁盘空间使用情况、数据库和缓存等的一些健康指标。
默认情况下 health 端点是开放的,访问http://127.0.0.1:8080/manage/health即可看到应用运行状态。
{
"status":"UP"
}
如果需要看到详细信息,则需要做添加配置:
management.endpoint.health.show-details=always
访问返回信息如下
{
"status": "UP",
"details": {
"db": {
"status": "UP",
"details": {
"database": "H2",
"hello": 1
}
},
"diskSpace": {
"status": "UP",
"details": {
"total": 250685575168,
"free": 22458560512,
"threshold": 10485760
}
}
}
}
2. info
查看应用信息是否在 application.yml 中配置。如我们在项目中配置是
info:
app:
name: springboot-data-jpa-h2-actuator-swagger2 Demo
version: v1.0.0
description: Spring Boot Actuator Demo Description.
启动项目,访问http://127.0.0.1:8888/manage/info返回信息如下:
{
"app": {
"name": "springboot-data-jpa-h2-actuator-swagger2 Demo",
"version": "v1.0.0",
"description": "Spring Boot Actuator Demo Description."
}
}
3. env
通过 env 可以获取到所有关于当前 Spring Boot 应用程序的运行环境信息,如:操作系统信息(systemProperties)、环境变量信息、JDK 版本及 ClassPath 信息、当前启用的配置文件(activeProfiles)、propertySources、应用程序配置信息(applicationConfig)等。
4. beans
返回的信息中我们可以看出主要展示了 bean 的别名、类型、是否单例、类的地址、依赖等信息。
5. conditions
通过 conditions 可以在应用运行时查看代码了某个配置在什么条件下生效,或者某个自动配置为什么没有生效。
6. loggers
获取系统的日志信息。
7. heapdump
访问http://127.0.0.1:8888/manage/heapdump会自动生成一个 GZip 压缩的 Jvm 的堆文件 heapdump,我们可以使用 JDK 自带的 Jvm 监控工具 VisualVM 打开此文件查看。
https://visualvm.github.io/download.html现在工具可以查看这个文件
8. threaddump
获取系统线程的转储信息,主要展示了线程名、线程ID、线程的状态、是否等待锁资源等信息。在工作中,我们可以通过查看线程的情况来排查相关问题。
9. shutdown
开启可以接口关闭 Spring Boot 应用,要使用这个功能需要做如下配置:
management:
endpoint:
shutdown:
enabled: true
可以通过 post(仅支持 post) 请求访问http://127.0.0.1:8888/manage/shutdown关闭应用。
10. metrics
访问 http://127.0.0.1:8888/manage/metrics 可以获取系统度量指标信息项如下
{
"names": [
"jvm.memory.max",
"jvm.threads.states",
"jvm.gc.pause",
"jdbc.connections.active",
"process.files.max",
"jvm.gc.memory.promoted",
"system.load.average.1m",
"http.server.requests",
"jvm.memory.used",
"jvm.gc.max.data.size",
"jdbc.connections.max",
"jdbc.connections.min",
"jvm.memory.committed",
"system.cpu.count",
"logback.events",
"tomcat.global.sent",
"jvm.buffer.memory.used",
"tomcat.sessions.created",
"jvm.threads.daemon",
"system.cpu.usage",
"jvm.gc.memory.allocated",
"tomcat.global.request.max",
"hikaricp.connections.idle",
"hikaricp.connections.pending",
"tomcat.global.request",
"tomcat.sessions.expired",
"hikaricp.connections",
"jvm.threads.live",
"jvm.threads.peak",
"tomcat.global.received",
"hikaricp.connections.active",
"hikaricp.connections.creation",
"process.uptime",
"tomcat.sessions.rejected",
"process.cpu.usage",
"tomcat.threads.config.max",
"jvm.classes.loaded",
"hikaricp.connections.max",
"hikaricp.connections.min",
"jvm.classes.unloaded",
"tomcat.global.error",
"tomcat.sessions.active.current",
"tomcat.sessions.alive.max",
"jvm.gc.live.data.size",
"hikaricp.connections.usage",
"tomcat.threads.current",
"hikaricp.connections.timeout",
"process.files.open",
"jvm.buffer.count",
"jvm.buffer.total.capacity",
"tomcat.sessions.active.max",
"hikaricp.connections.acquire",
"tomcat.threads.busy",
"process.start.time"
]
}
对应访问 names 中的指标,可以查看具体的指标信息。如访问 http://127.0.0.1:8888/manage/metrics/jvm.memory.used 返回信息如下:
{
"name": "jvm.memory.used",
"description": "The amount of used memory",
"baseUnit": "bytes",
"measurements": [
{
"statistic": "VALUE",
"value": 398812920
}
],
"availableTags": [
{
"tag": "area",
"values": [
"heap",
"nonheap"
]
},
{
"tag": "id",
"values": [
"Compressed Class Space",
"PS Survivor Space",
"PS Old Gen",
"Metaspace",
"PS Eden Space",
"Code Cache"
]
}
]
}