Spring Boot监控

1、Spring Boot actuator

它是Spring Boot 中提供了一个用于监控和管理自身应用信息的模块,帮助我们及时发现应用程序故障

1.初体验

通过集成 actuator 可以将 Spring Boot 应用本身的一些信息通过 HTTP 或 JMX 的方式暴露出去,可以让第三方的监控工具拉取这些信息,进行信息的管理,查看,监控和告警。

  1. pom.xml添加starter依赖
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
     <version>2.3.12.RELEASE</version>
</dependency>
  1. yaml添加配置
management:
  endpoints:
    # 默认开启端点
    enabled-by-default: true
    web:
      exposure:
      # 暴露所有端点
        include: "*"
  1. 访问 http://ip:port/项目路径/actuator

内置端点概述

id

desc

Sensitive

auditevents

显示当前应用程序的审计事件信息

Yes

beans

显示应用Spring Beans的完整列表

Yes

caches

显示可用缓存信息

Yes

conditions

显示自动装配类的状态及及应用信息

Yes

configprops

显示所有 @ConfigurationProperties 列表

Yes

env

显示 ConfigurableEnvironment 中的属性

Yes

flyway

显示 Flyway 数据库迁移信息

Yes

health

显示应用的健康信息(未认证只显示status,认证显示全部信息详情)

No

info

显示任意的应用信息(在资源文件写info.xxx即可)

No

liquibase

展示Liquibase 数据库迁移

Yes

metrics

展示当前应用的 metrics 信息

Yes

mappings

显示所有 @RequestMapping 路径集列表

Yes

scheduledtasks

显示应用程序中的计划任务

Yes

sessions

允许从Spring会话支持的会话存储中检索和删除用户会话。

Yes

shutdown

允许应用以优雅的方式关闭(默认情况下不启用)

Yes

threaddump

执行一个线程dump

Yes

httptrace

显示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。

  1. 编码
@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;
    }

}
  1. 配置相关参数
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服务端

  1. 新建一个项目,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>
  1. 启动类上添加@EnableAdminServer注解
@SpringBootApplication
@EnableAdminServer
public class AdminApplication {
    public static void main(String[] args) {
        SpringApplication.run(AdminApplication.class,args);
    }
}
  1. 为避免和其它项目冲突,服务端口配置为8081
server:
  port: 8081
  1. 访问 http://localhost:8081

配置Admin客户端(Spring Boot actuator项目)

  1. 项目中增加spring-boot-admin-starter-client依赖
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.3.1</version>
</dependency>
  1. yaml中配置admin服务端的地址
spring:
  boot:
    admin:
      client:
        url: http://localhost:8081
        instance:
        #使用ip注册
          prefer-ip: true
  1. 访问 http://localhost:8081