【SpringBoot】定制⾃⼰的 Health Indicator

Spring Boot ⾃带的 Health Indicator

⽬的

  • 检查应⽤程序的运⾏状态

状态

  • DOWN - 503
  • OUT_OF_SERVICE - 503
  • UP - 200
  • UNKNOWN - 200

机制

  • 通过 HealthIndicatorRegistry 收集信息
  • HealthIndicator 实现具体检查逻辑

配置项

  • management.health.defaults.enabled=true|false
  • management.health..enabled=true
  • management.endpoint.health.show-details=never | when�authorized | alway
image

⾃定义 Health Indicator

⽅法

  • 实现 HealthIndicator 接⼝
  • 根据⾃定义检查逻辑返回对应 Health 状态
    • Health 中包含状态和详细描述信息

Health Information

官网地址:https://docs.spring.io/spring-boot/docs/2.5.6/reference/html/actuator.html#actuator.endpoints.health

可以使用运行状况信息(health information)检查正在运行的应用程序的状态。它经常被监控软件用于在生产系统崩溃时发出警报。health endpoint公开的信息取决于management.endpoint.health.show-detailsmanagement.endpoint.health.show-components属性,可配置为以下值之一:

Name Description
never 从不显示详细信息。
when-authorized 详细信息只显示给授权用户。可使用management.endpoint.health.roles配置授权角色。
always 详细信息将显示给所有用户。

缺省值为never。当用户处于一个或多个endpoints的角色中时,就认为用户已获得授权。如果端点没有配置角色(默认),则所有经过身份验证的用户都被认为是经过授权的。可以使用management.endpoint.health.roles属性配置角色。

如果已保护了应用程序并希望使用always,则安全配置必须允许已验证和未验证的用户访问运行状况端点。

运行状况信息从HealthContributorRegistry(默认情况下,ApplicationContext中定义的所有HealthContributor实例)的内容中收集。Spring Boot包括许多自动配置的HealthContributors,您也可以编写自己的HealthContributors

HealthContributor可以是HealthIndicatorCompositeHealthContributorHealthIndicator提供实际的运行状况信息,包括状态。CompositeHealthContributor提供其他HealthContributors的组合。总的来说,contributors形成了一个树形结构来表示整个系统的健康状况。

默认情况下,最终的系统运行状况由StatusAggregator派生,它根据有序的状态列表对每个HealthIndicator中的状态进行排序。排序列表中的第一个状态用作总体运行状况状态。如果没有HealthIndicator返回StatusAggregator已知的状态,则使用UNKNOWN状态。

HealthContributorRegistry可用于在运行时注册和取消注册health indicators

Auto-configured HealthIndicators

下面的HealthIndicators在适当的时候由Spring Boot自动配置。您也可以通过配置management.health.key.enabled来启用/禁用所选指标。通过使用下表中列出的key

Key Name Description
cassandra CassandraDriverHealthIndicator 检查Cassandra数据库是否已启动。
couchbase CouchbaseHealthIndicator 检查Couchbase集群是否已启动。
db DataSourceHealthIndicator 检查是否可以获得到数据源的连接。
diskspace DiskSpaceHealthIndicator 检查磁盘空间不足。
elasticsearch ElasticsearchRestHealthIndicator 检查Elasticsearch集群是否已启动。
hazelcast HazelcastHealthIndicator 检查Hazelcast服务器是否已启动。
influxdb InfluxDbHealthIndicator 检查InfluxDB服务器是否已启动。
jms JmsHealthIndicator 检查JMS代理是否已启动。
ldap LdapHealthIndicator 检查LDAP服务器是否已启动。
mail MailHealthIndicator 检查邮件服务器是否启动。
mongo MongoHealthIndicator 检查Mongo数据库是否已启动。
neo4j Neo4jHealthIndicator 检查Neo4j数据库是否已启动。
ping PingHealthIndicator 总是用UP响应。
rabbit RabbitHealthIndicator 检查Rabbit服务器是否启动。
redis RedisHealthIndicator 检查Redis服务器是否启动。
solr SolrHealthIndicator 检查Solr服务器是否启动。

可以通过设置management.health.defaults.enabled属性来禁用它们。

有其他HealthIndicators可用,但默认情况下不启用:

Key Name Description
livenessstate LivenessStateHealthIndicator 暴露“Liveness”应用程序可用性状态。
readinessstate ReadinessStateHealthIndicator 暴露“Readiness”应用程序可用性状态。

自定义 HealthIndicators

要提供定制的运行状况信息,可以注册实现HealthIndicator接口的Spring bean。您需要提供health()方法的实现并返回一个 Health 响应。Health 响应应包括一个状态,并可选地包括要显示的其他详细信息。下面的代码显示了一个HealthIndicator实现的示例:

@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() {
        // perform some specific health check
        return ...
    }

}

给定HealthIndicator的标识符是不带HealthIndicator后缀的bean的名称(如果它存在的话)。在前面的示例中,health informationentry时my中可用。

除了Spring Boot的预定义Status类型外,Health还可以返回一个表示新系统状态的自定义状态。在这种情况下,还需要提供StatusAggregator接口的自定义实现,或者必须使用management.endpoint.health.status.order配置属性来配置默认实现。

例如,假设在您的一个HealthIndicator实现中使用了一个code为FATAL的新Status。要配置严重性顺序,请将以下属性添加到应用程序属性中:

management.endpoint.health.status.order=fatal,down,out-of-service,unknown,up

响应中的HTTP状态码反映总体运行状况状态。缺省情况下,OUT_OF_SERVICEDOWN对应为503。任何未映射的运行状况状态(包括UP)都映射到200。如果通过HTTP访问health endpoint,还可能需要注册自定义状态映射。配置自定义映射将禁用DOWNOUT_OF_SERVICE的默认映射。如果您希望保留默认映射,则必须在任何自定义映射旁边显式地配置它们。例如,以下属性将FATAL映射到503(服务不可用),并保留DOWNOUT的默认映射:

management.endpoint.health.status.http-mapping.down=503
management.endpoint.health.status.http-mapping.fatal=503
management.endpoint.health.status.http-mapping.out-of-service=503

如果需要更多的控制,可以定义自己的HttpCodeStatusMapper bean。

下表显示了内置statuses的默认状态映射:

Status Mapping
DOWN SERVICE_UNAVAILABLE (503)
OUT_OF_SERVICE SERVICE_UNAVAILABLE (503)
UP No mapping by default, so HTTP status is 200
UNKNOWN No mapping by default, so HTTP status is 200
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容