目录
1.概述
2.使用
2.1.依赖
2.2.配置
2.2.1.默认
2.2.2.暴露端点
2.3.常用端点
2.3.1.health
2.3.2.metrics
2.3.3.loggers
2.3.4.beans
2.3.5.用于定位线上问题的端点
2.4.自定端点
1.概述
Spring Boot Actuator提供了对Spring Boot应用进行监控的能力,其提供了4个方面的监控能力:
-
健康状况, 提供有关应用程序健康状况的信息。
-
指标 ,提供有关应用程序运行的量化数据,如内存使用情况、CPU使用情况等。
-
信息,提供有关应用程序的一般信息,例如应用程序名称、版本号等。
-
跟踪,提供有关应用程序请求的跟踪信息,例如请求的时间、响应时间等。
这4个方面的能力由多种端点来支撑实现:
-
health:用于检查应用程序的健康状况。可以返回应用程序的健康状态、描述和详细信息等。
-
info:用于获取应用程序的基本信息。可以返回应用程序的名称、版本、描述和其他相关信息等。
-
metrics:用于获取应用程序的度量指标信息。可以返回应用程序的各种度量指标,例如请求响应时间、请求次数、JVM 内存使用情况等。
-
beans:用于获取应用程序中的所有 Bean 的信息。可以返回应用程序中所有 Bean 的名称、类型和依赖关系等。
-
env:用于获取应用程序的环境变量信息。可以返回应用程序的系统属性、配置属性和命令行参数等。
-
configprops:用于获取应用程序中所有配置属性的信息。可以返回应用程序中所有配置属性的名称、类型和默认值等。
-
mappings:用于获取应用程序的 URL 映射信息。可以返回应用程序中所有 URL 映射的路径、方法和处理器等。
-
loggers:用于获取应用程序的日志信息。可以返回应用程序中所有日志记录器的名称、级别和配置信息等。
-
trace:用于获取应用程序的请求跟踪信息。可以返回应用程序中最近的请求跟踪信息,包括请求时间、处理时间、状态码和请求参数等。
Spring Boot Actuator有多种访问端点的方式:
-
HTTP端点访问:通过HTTP请求访问端点。
-
JMX端点访问:通过Java Management Extensions(JMX)访问端点。
-
SSH端点访问:通过SSH连接访问端点。
-
WebSocket端点访问:通过WebSocket连接访问端点。
-
Telnet端点访问:通过Telnet连接访问端点。
-
RSocket端点访问:通过RSocket连接访问端点。
本文介绍的是以HTTP方式进行访问,Spring Boot Actuator的核心就是端点,弄清楚端点后访问方式都是可以平滑切换的。
2.使用
2.1.依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.2.配置
2.2.1.默认
引入依赖后其实监控就已经可以使用了,使用ip:port/actuator就可以看到有哪些端点是开放的,如果没有配置监控的端口号,会默认使用应用的端口号:
通过以下配置修改监控的端口号:
management.server.port=8081
通过以下配置可以修改Path前缀:
management.endpoints.web.base-path=/manage
配置成以上Path前缀后,访问地址将变为ip:port/manage/actuator/XXX
2.2.2.暴露端点
只有一些常用的端点会被暴露给 HTTP ,可以通过配置来指定哪些端点暴露或者不暴露,支持通配符*用来匹配所有。
指定哪些端点不暴露:
management.endpoints.web.exposure.exclude=health,info
指定哪些端点暴露:
management.endpoints.web.exposure.include=beans,configprops
shutdown是个特殊的端点,可以用于远程关闭应用程序。当您向该端点发送 POST 请求时,应用程序将优雅地关闭,即首先关闭所有正在处理的请求,然后关闭 Spring 应用程序上下文。暴露该端点需要单独配置:
management.endpoint.shutdown.enabled=true
2.3.常用端点
2.3.1.health
1.显示详细内容
health端点暴露后,默认只能访问到一个简短的状态信息:
通过配置可以返回详细的健康信息:
management.endpoint.health.show-details=always
由于demo中没有使用任何中间件、数据库只返回了磁盘状态和详细信息,如果有用到中间件、数据库等,details内会包含相关内容:
-
diskSpace
:磁盘空间的使用情况,包括总空间、已用空间和可用空间。 -
db
:数据库的连接状态和性能指标,如连接池的使用情况、查询执行次数等等。 -
redis
:Redis的连接状态和性能指标,如连接池的使用情况、key数量等等。 -
cassandra
:Cassandra的连接状态和性能指标,如连接池的使用情况、节点状态等等。 -
elasticsearch
:Elasticsearch的连接状态和性能指标,如连接池的使用情况、索引数量等等。
2.自定义health指标
actuator提供了自定义的健康状态检查信息的能力,可以通过实现`HealthIndicator`的接口来实现:
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class MyHealthIndicator 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() {
// 检查自定义健康指标的实现逻辑
return 1;
}
}
3.状态码
health指标有多种状态,因此在自定义的时候需要注意标准化:
- UP:表示应用程序正在正常运行并且没有错误。
- DOWN:表示应用程序已经停止了服务或者发生了错误。
- UNKNOWN:表示应用程序健康状况不确定,需要进一步检查才能确定问题所在。
- OUT_OF_SERVICE:表示应用程序上下文不接受请求,因此服务处于禁用状态。
- FATAL:表示应用程序出现了严重错误,无法继续处理请求。
可以通过配置来在返回中各指标根据状态来进行排序:
management.health.status.order=FATAL, DOWN, OUT_OF_SERVICE, UNKNOWN, UP
在做健康检查时,响应中的HTTP状态码反应了整体的健康状态,(例如,UP 对应 200, 而 OUT_OF_SERVICE`和 DOWN 对应 503)。可以为自定义的状态类型设置对应的HTTP状态码,例如,下面的配置可以将 FATAL`映射为 503(服务不可用):
management.health.status.http-mapping.FATAL=503
2.3.2.metrics
1.查看内容
查看有哪些指标:
查看具体某个指标的内容:
/actuator/metrics/指标名
2.自定义指标
指标有四种基本数据类型:
- Counter: 计数器,递增或递减的整数值
- Gauge: 可以任意取值的数值,例如当前线程数、内存使用情况等
- Timer: 计时器,可以测量一段代码的执行时间和调用次数
- Distribution Summary: 统计数据分布的摘要,例如响应时间的分布情况
此处我们以创建一个计数器类型的指标为例,其它类型的可以同理类推。
创建指标:
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyMetrics {
private final Counter myCounter;
@Autowired
public MyMetrics(MeterRegistry registry) {
//指标名my.counter
myCounter = registry.counter("my.counter");
}
public void incrementCounter() {
myCounter.increment();
}
}
调用:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
private final MyMetrics myMetrics;
public MyController(MyMetrics myMetrics) {
this.myMetrics = myMetrics;
}
@GetMapping("/my-api")
public String myApi() {
// 处理业务逻辑
myMetrics.incrementCounter();
return "success";
}
}
在上述代码中,我们定义了一个名叫my.counter的指标,并在Controller的myApi()方法中调用incrementCounter()方法。这样,每次请求myApi()方法时,计数器的值都会递增1。
2.3.3.loggers
- loggers端点可以帮助开发人员实时查看和管理应用程序的日志记录器。该端点提供了以下操作:获取日志记录器列表:使用HTTP GET请求访问/loggers端点,可以获取当前应用程序的所有日志记录器的名称列表。
- 获取特定日志记录器的级别:使用HTTP GET请求访问/loggers/{logger-name}端点,可以获取指定日志记录器的当前级别。
- 更改特定日志记录器的级别:使用HTTP POST请求访问/loggers/{logger-name}端点,并在请求体中提供所需的日志级别,可以将指定日志记录器的级别更改为所需级别。
对于第3点,需要在请求体中提供一个JSON对象,例如:
{
"configuredLevel": "DEBUG"
}
其中,`configuredLevel`是日志级别,可以是`TRACE`、`DEBUG`、`INFO`、`WARN`、`ERROR`或`FATAL`。如果将级别设置为`null`,则将恢复使用默认级别。
info.app.name=actuator-test-demo
info.app.encoding=UTF-8
info.app.java.source=1.8
info.app.java.target=1.8
当然也可以通过代码来定义:
@Component
public class MyInfo implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
Map<String, String> info = new HashMap<>();
info.put("name", "zou");
info.put("email", "service@zou.com");
builder.withDetail("author", info);
}
}
2.3.4.beans
beans端点用于获取应用程序上下文中所有可用的 Spring bean 列表。该端点返回的信息包括 bean 名称、bean 的完全限定类名和是否为懒加载等信息。该端点主要用于应用程序调试和故障排除。
2.3.5.用于定位线上问题的端点
在生产环境中,一般定位线上问题无非两个方面:
- JVM信息
- 线程信息
actuator支持我们通过端点获取到应用的以上两个方面的信息来方便我们进行线上问题的定位、处理。
1.heapdump
用浏览器访问:ip:port/actuator/heapdump会自动生成一个 Jvm 的堆文件 heapdump。我们可以使用 JDK 自带的 Jvm 监控工具 VisualVM 打开此文件查看内存快照。
2.threaddump
`/actuator/threaddump` 端点用于获取应用程序中所有线程的堆栈跟踪信息,可用于分析和诊断线程相关的问题,比如死锁和线程阻塞等。
当访问 `/actuator/threaddump` 端点时,应用程序将返回一个JSON对象,其中包含了所有线程的详细信息,每个线程都有自己的ID,名称和状态等信息,以及它当前执行的堆栈跟踪信息。
2.4.自定端点
Spring Boot Actuator支持以注解的方式自定义端点,可以在Bean上使用 @Endpoint 、@JmxEndpoint 或 @WebEndpoint 编写 EndPoint。三个注解的不同之处见名知意,各自的访问方式不同,@WebEndpoint 仅能通过HTTP访问,@JmxEndpoint 仅能通过JMX访问。
然后配套了三个方法注解用来定义对各类请求的响应:
- @ReadOperation对应HTTP的GET请求
- @WriteOperation对应HTTP的POST请求
- @DeleteOperation对应HTTP的DELETE请求
通过ip:port/actuator/myEndPoint能访问到下面我们自定义的端点。
package com.eryi.bean;
import org.springframework.boot.actuate.endpoint.annotation.DeleteOperation;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
import org.springframework.stereotype.Component;
@Component
@Endpoint(id = "myEndPoint")
public class MyEndPoint {
@ReadOperation
public String endpointCustomRead(String content) {
return "请求的内容: " + content;
}
@WriteOperation
public String endpointCustomWrite(String content) {
return "写的内容: " + content;
}
@DeleteOperation
public String endpointCustomDelete(String content) {
return "删除的内容: " + content;
}
}