• Spring Boot 2.x系列【22】应用监控篇之Health端点


    有道无术,术尚可求,有术无道,止于术。

    本系列Spring Boot版本2.7.0

    前言

    Health是健康的意思,该端点用来检查正在运行的应用程序的状态。当生产系统出现故障时,可以自动告警。在之前我们访问只返回了如下信息:
    在这里插入图片描述
    这里只是显示了一个UP,接下来我们如何了解下,如何返回更多的健康状态信息。

    配置

    想要health返回更多的信息,需要修改以下配置:

    management:
      endpoint:
        # Health 端点配置
        health:
          # 显示详情,默认never
          show-details: always
          # 所有组件的详细信息,默认never
          show-components: always
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    以上配置值是枚举类型,可配置的属性如下:

    • never:永远不会显示详细信息。

    • when-authorized:详细信息仅向授权用户显示,可以使用management.endpoint.health.roles.配置授权角色

    • always:详细信息显示给所有用户。

    配置为always后,可以看到多了几个类别的健康信息,分别为数据库、磁盘空间、网络:
    在这里插入图片描述

    自动配置健康指标

    在上面的演示中,是因为配置了数据库连接DataSourceSpring Boot通过自动配置启用数据库的监控并显示信息。

    HealthIndicator接口是健康指标的顶级接口,其每个实现类都表示一个具体类型的健康指标。比如数据源就是DataSourceHealthIndicator,可以看到其检查方法就是通过JdbcTemplate去执行了一个检测查询。
    在这里插入图片描述
    在自动配置中注入了DataSourceHealthIndicator开启这个组件的监控功能:
    在这里插入图片描述
    注意:spring-boot-actuator自动配置模块是独立的:
    在这里插入图片描述

    健康指标是Spring Boot在适当时自动配置的,也就是引入了某个功能,相应组件的检测功能就会自动启用。

    可以通过配置management.health.key.enabled属性启用/禁用选定的指标,默认存在的key如下表所示:

    key名称描述
    cassandraCassandraDriverHealthIndicator检查 Cassandra 数据库是否已启动。
    couchbaseCouchbaseHealthIndicator检查 Couchbase 集群是否已启动。
    dbDataSourceHealthIndicator检查是否可以获得连接DataSource。
    diskspaceDiskSpaceHealthIndicator检查磁盘空间不足。
    elasticsearchElasticsearchRestHealthIndicator检查 Elasticsearch 集群是否已启动。
    hazelcastHazelcastHealthIndicator检查 Hazelcast 服务器是否已启动。
    influxdbInfluxDbHealthIndicator检查 InfluxDB 服务器是否已启动。
    jmsJmsHealthIndicator检查 JMS 代理是否已启动。
    ldapLdapHealthIndicator检查 LDAP 服务器是否已启动。
    mailMailHealthIndicator检查邮件服务器是否已启动。
    mongoMongoHealthIndicator检查 Mongo 数据库是否已启动。
    neo4jNeo4jHealthIndicator检查 Neo4j 数据库是否已启动。
    pingPingHealthIndicator始终以 响应UP。
    rabbitRabbitHealthIndicator检查 Rabbit 服务器是否已启动。
    redisRedisHealthIndicator检查 Redis 服务器是否已启动。
    solrSolrHealthIndicator检查 Solr 服务器是否已启动。

    其他可用但默认情况下未启用的Key :

    key名称描述
    livenessstateLivenessStateHealthIndicator公开“Liveness”应用程序可用性状态。
    readinessstateReadinessStateHealthIndicator公开“就绪”应用程序可用性状态。

    Redis 健康指标案例

    接下来我们将应用程序集成Redis ,看下关于Redis 的健康信息。

    spring boot 项目添加Redis依赖:

            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-data-redisartifactId>
            dependency>
    
    • 1
    • 2
    • 3
    • 4

    添加连接配置:

    spring:
      application:
        name: spring-boot-actuator-demo
      redis:
        host: 127.0.0.1
        port: 6379
        password: 123456
        timeout: 20000
        jedis:
          pool:
            max-active: 8
            min-idle: 0
            max-idle: 8
            max-wait: -1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    访问health端点,查看Redis健康信息:

    在这里插入图片描述

    自定义健康指标

    实现HealthIndicator接口,并注册为Spring bean,即可实现自定义健康指标。

    演示需求:检测某个远程服务器网络健康状态。

    实现HealthIndicator接口的health() 方法,检查网络状态,通则返回UP,不通返回DOWN

    @Component
    public class MyHealthIndicator implements HealthIndicator {
    
        @SneakyThrows
        @Override
        public Health health() {
        	// 查看某个IP是否在线
            boolean status = InetAddress.getByName("127.0.0.1").isReachable(3000);
            if (status) {
            	// 在线,返回UP状态
                return Health.up().status(Status.UP).withDetail("自定义详情", "啊哈~ 在线中...").build();
            }
            // 不在线,返回DOWN状态
            return Health.down().status(Status.DOWN).withDetail("自定义详情", "我屮艸芔茻~~~ 对方掉线了").build();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    查看健康信息:
    在这里插入图片描述
    这里为啥使用my去获取信息呢?这是因为Spring Boot使用Bean 的名称作为组件的信息访问Key ,如果存在HealthIndicator后缀,还会自动去掉该后缀,上述案例中的Bean 名称为myHealthIndicator ,所以就是my了。

    health()方法中返回的Health是采用的构建者模式进行创建的,withDetail用于构建详情信息,status表示健康状态。

    下表显示了内置状态的返回状态码映射关系

    选项说明
    DOWNSERVICE_UNAVAILABLE( 503)
    OUT_OF_SERVICESERVICE_UNAVAILABLE( 503)
    UP默认没有映射,所以 HTTP 状态是 200
    UNKNOWN默认没有映射,所以 HTTP 状态是 200

    还可以自定义配置状态码:

    management:
      endpoint:
        # Health 端点配置
        health:
          # 显示详情,默认never
          show-details: always
          # 所有组件的详细信息,默认never
          show-components: always
          # 配置状态码
          status:
            http-mapping:
              down: 500
              fatal: 100
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    RocketMQ笔记-进行中
    react学习随笔
    前端设计模式
    格密码入门
    pandas教程:Date and Time Data Types and Tools 日期和时间数据类型及其工具
    SysTick—系统定时器
    解析华为OSPF协议
    深度!程序员生涯的垃圾时间(上)
    kafka消费端消息去重方案
    计算机毕业设计Java中医药院校科研会议系统(源码+系统+mysql数据库+Lw文档)
  • 原文地址:https://blog.csdn.net/qq_43437874/article/details/119721036