Spring Boot监控
1、Spring Boot actuator
它是Spring Boot 中提供了一个用于监控和管理自身应用信息的模块,帮助我们及时发现应用程序故障
1.初体验
通过集成 actuator 可以将 Spring Boot 应用本身的一些信息通过 HTTP 或 JMX 的方式暴露出去,可以让第三方的监控工具拉取这些信息,进行信息的管理,查看,监控和告警。
- pom.xml添加starter依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.3.12.RELEASE</version>
</dependency>
- yaml添加配置
management:
endpoints:
# 默认开启端点
enabled-by-default: true
web:
exposure:
# 暴露所有端点
include: "*"
- 访问
http://ip:port/项目路径/actuator
内置端点概述
id | desc | Sensitive |
| 显示当前应用程序的审计事件信息 | Yes |
| 显示应用Spring Beans的完整列表 | Yes |
| 显示可用缓存信息 | Yes |
| 显示自动装配类的状态及及应用信息 | Yes |
| 显示所有 @ConfigurationProperties 列表 | Yes |
| 显示 ConfigurableEnvironment 中的属性 | Yes |
| 显示 Flyway 数据库迁移信息 | Yes |
| 显示应用的健康信息(未认证只显示 | No |
| 显示任意的应用信息(在资源文件写info.xxx即可) | No |
| 展示Liquibase 数据库迁移 | Yes |
| 展示当前应用的 metrics 信息 | Yes |
| 显示所有 @RequestMapping 路径集列表 | Yes |
| 显示应用程序中的计划任务 | Yes |
| 允许从Spring会话支持的会话存储中检索和删除用户会话。 | Yes |
| 允许应用以优雅的方式关闭(默认情况下不启用) | Yes |
| 执行一个线程dump | Yes |
| 显示HTTP跟踪信息(默认显示最后100个HTTP请求 - 响应交换) | Yes |
2.端点的配置
从Spring Boot 2.x开始,我们需要手动的去启用和暴露端点。默认情况下,除了/shutdown之外的所有端点都是可用的,同时只有/health和/info端点是对外暴露的。
暴露和排除端点
management:
endpoints:
# 默认开启端点
enabled-by-default: true
web:
exposure:
# 暴露端点,*表示所有已经开启的端点 也可以通过逗号分隔多个要暴露的端点
include: "*"
# 排除端点(虽然开启端点,但没有暴露,无法访问)
exclude: beans
开启指定端点
management:
endpoints:
# 默认不开启端点(只有/health和/info端点)
enabled-by-default: false
web:
exposure:
# 暴露端点,*表示所有已经开启的端点 也可以通过逗号分隔多个要暴露的端点
include: "*"
# 排除端点(虽然开启端点,但没有暴露,无法访问)
exclude: beans
endpoint:
health:
# 开启health端点 ,注意开启后还需要暴露端点
enabled: true
beans:
# beans虽然开启了,但是被排除了没有暴露也无法访问
enabled: true
注
:
1.Actuator中/shutdown端点比较敏感,该端点默认是不可用的,需要我们手动开启。
2./shutdown端点仅接收POST请求
3 自定义端点
除了使用Actuator默认给予的端点外,还可以自定义端点来满足自定义监控的要求。在 Actuator中加入端点只需要加入注解@Endpoint 即可,这个注解会同时提供JMX 监控和Web 监控。如果只想提供JMX监控,可以使用注解@JmxEndpoint; 如果只想提供 Web 监控可以使用注解@WebEndpoint。
- 编码
@Component
//id 自定义端点的唯一标识
@Endpoint(id="dbcheck")
public class DatabaseConnectionEndpoint {
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
//一个端点只能存在一个@ReadOperation标准的方法
// 它表示HTTP的get请求
@ReadOperation
public Map<String,Object> testConnectDatabase(){
System.out.println("DatabaseConnectionEndpoint.testConnectDatabase");
Map<String, Object> map = new HashMap<>();
Connection conn = null;
try{
Class.forName(driverClassName);
conn = DriverManager.getConnection(url,username,password);
map.put("success",true);
map.put("message", "测试数据库连接成功");
}catch (Exception e){
map.put("success",false);
map.put("message",e.getMessage());
}finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
return map;
}
}
- 配置相关参数
spring:
datasource:
driver-class-Name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: root
注
:
1.一个Endpint中只能定义一个@ReadOperation注解
2.除了@ReadOperation外,还可以定义@WriteOperation(对应POST请求)和@DeleteOperation(对应DELETE请求)
4 自定义HealthIndicator
health端点用来显示程序的健康信息。health端点在默认情况下, 仅显示 "status": "UP"
。 如需显示详细信息, 可以做如下配置:
management:
endpoint:
health:
enabled: true
# 显示health端点的详细信息
show-details: always
再次访问/health端点可以看到如下结果,可以看到健康指示器下面多出来的两个健康指标,分别为diskSpace磁盘空间和ping检查。
{"status":"UP","components":{"diskSpace":{"status":"UP","details":{"total":329034756096,"free":45609562112,"threshold":10485760,"exists":true}},"ping":{"status":"UP"}}}
如果内置的健康指标项无法满足需要,我们可以自定义健康指标项。例如,我们现在需要监测服务器是否可以访问万维网 (World wide Web,www),就可以自定义健康指标。
@Component
public class WwwHealthIndicator extends AbstractHealthIndicator {
private final static String BAIDU_HOST = "www.baidu.com";
private final static int TIME_OUT = 3000;
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
if (ping()) {
builder.withDetail("message", "当前服务可以访问万维网").up();
} else {
builder.withDetail("message", "当前服务不可以访问万维网").outOfService();
}
}
private boolean ping() {
try {
return InetAddress.getByName(BAIDU_HOST).isReachable(TIME_OUT);
} catch (IOException e) {
return false;
}
}
}
2、Spring Boot Admin
目前所有的端点信息不直观,可以通过 Spring Boot Admin 来对 actuator 信息进行管理。
Spring Boot Admin 用于管理和监控 Spring Boot 应用程序的运行状态。在 Spring Boot 项目中可以通过集成 Spring Boot Admin Client 向 Spring Boot Admin Server 进行注册,这样我们就可以在Spring Boot Admin Server 统一管理 Spring Boot 应用。
Spring Boot Admin 主要功能点:
- 显示应用程序的监控状态
- 应用程序上下线监控
- 查看 JVM 和线程信息
- 可视化的查看日志及下载日志文件
- 动态切换日志级别
- HTTP 请求信息跟踪等实用功能
- 将 actuator 提供的数据进行可视化
开发Admin服务端
- 新建一个项目,pom.xml引入spring-boot-admin-starter-server依赖
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<!-- 注意版本,要和springboot的版本兼容-->
<version>2.3.1</version>
</dependency>
- 启动类上添加@EnableAdminServer注解
@SpringBootApplication
@EnableAdminServer
public class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication.class,args);
}
}
- 为避免和其它项目冲突,服务端口配置为8081
server:
port: 8081
- 访问
http://localhost:8081
配置Admin客户端(Spring Boot actuator项目)
- 项目中增加spring-boot-admin-starter-client依赖
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.3.1</version>
</dependency>
- yaml中配置admin服务端的地址
spring:
boot:
admin:
client:
url: http://localhost:8081
instance:
#使用ip注册
prefer-ip: true
- 访问
http://localhost:8081