spring boot的健康检查HealthIndicators实战

网友投稿 826 2022-09-21


spring boot的健康检查HealthIndicators实战

目录springboot 健康检查HealthIndicatorsspringboot health indicator原理及其使用作用自动配置的Health Indicator分组如何管理Health IndicatorRedisHealthIndicator源码解析自定义Indicator

springboot 健康检查HealthIndicators

想提供自定义健康信息,你可以注册实现了HealthIndicator接口的Spring beans。

你需要提供一个health()方法的实现,并返回一个Health响应。

Health响应需要包含一个status和可选的用于展示的详情。

import org.springframework.boot.actuate.health.HealthIndicator;

import org.springframework.stereotype.Component;

@Component

public class MyHealth implements HealthIndicator {

@Override

public Health health() {

int errorCode = check(); // perform some specific health check

if (errorCode != 0) {

return Health.down().withDetail("Error Code", errorCode).build();

} r

eturn Health.up().build();

}

}

除了Spring Boot预定义的Status类型,Health也可以返回一个代表新的系统状态的自定义Status。

在这种情况下,需要提供一个HealthAggregator接口的自定义实现,或使用management.health.status.order属性配置默认的实现。

例如,假设一个新的,代码为FATAL的Status被用于你的一个HealthIndicator实现中。 为了配置严重程度, 你需要将下面的配

置添加到application属性文件中:

management.health.status.order: DOWN, OUT_OF_SERVICE, UNKNOWN, UP

如果使用HTTP访问health端点, 你可能想要注册自定义的status, 并使用HealthMvcEndpoint进行映射。 例如, 你可以将

FATAL映射为HttpStatus.SERVICE_UNAVAILABLE。

springboot health indicator原理及其使用

作用

sping boot health 可以通过暴露的接口来提供系统及其系统组件是否可用。默认通过/health来访问。返回结果如下:

{

"status": http://"UP",

"discoveryComposite": {

"description": "Spring Cloud Eureka Discovery Client",

"status": "UP",

"discoveryClient": {

"description": "Spring Cloud Eureka Discovery Client",

"status": "UP",

"services": [

"..."

]

},

"eureka": {

"description": "Remote status from Eureka server",

"status": "UP",

"applications": {

"AOMS-MOBILE": 1,

"DATA-EXCHANGE": 1,

"CLOUD-GATEWAY": 2,

"AOMS": 1,

"AOMS-AIIS": 0,

"AOMS-EUREKA": 2

}

}

},

"diskSpace": {

"status": "UP",

"total": 313759301632,

"free": 291947081728,

"threshold": 10485760

},

"refreshScope": {

"status": "UP"

},

"hystrix": {

"status": "UP"

}

}

状态说明:

UNKNOWN:未知状态,映射HTTP状态码为503

UP:正常,映射HTTP状态码为200

DOWN:失败,映射HTTP状态码为503

OUT_OF_SERVICE:不能对外提供服务,但是服务正常。映射HTTP状态码为200

注意:UNKNOWN,DOWN,OUT_OF_SERVICE在为微服务环境下会导致注册中心中的实例也为down状态,请根据具体的业务来正确使用状态值。

自动配置的Health Indicator

自动配置的HealthIndicator主要有以下内容:

Key

Name

Description

cassandra

CassandraDriverHealthIndicator

Checks that a Cassandra database is up.

couchbase

CouchbaseHealthIndicator

Checks that a Couchbase cluster is up.

datasource

DataSourceHealthIndicator

Checks that a connection to DataSource can be obtained.

diskspace

DiskSpaceHealthIndicator

Checks for low disk space.

elasticsearch

ElasticsearchRestHealthIndicator

Checks that an Elasticsearch cluster is up.

hazelcast

HazelcastHealthIndicator

Checks that a Hazelcast server is up.

influxdb

InfluxDbHealthIndicator

Checks that an InfluxDB server is up.

jms

JmsHealthIndicator

Checks that a JMS broker is up.

ldap

LdapHealthIndicator

Checks that an LDAP server is up.

mail

MailHealthIndicator

Checks that a mail server is up.

mongo

MongoHealthIndicator

Checks that a Mongo database is up.

neo4j

Neo4jHealthIndicator

Checks that a Neo4j database is up.

ping

PingHealthIndicator

Always responds with UP.

rabbit

RabbitHealthIndicator

Checks that a Rabbit server is up.

redis

RedisHealthIndicator

Checks that a Redis server is up.

solr

SolrHealthIndicator

Checks that a Solr server is up.

分组

可以通过一个别名来启用一组指标的访问。配置的格式如下:

management.endpoint.health.group.

//demo:

management.endpoint.health.group.mysys.include=db,redis,mail

management.endpoint.health.group.custom.exclude=rabbit

如何管理Health Indicator

开启

可以通过management.health.key.enabled来启用key对应的indicator。例如:

management.health.db.enabled=true

关闭

management.health.db.enabled=false

RedisHealthIndicator源码解析

下面,通过RedisHealthIndicator源码来为什么可以这么写。

代码结构

自动配置的health indicator有HealthIndicator和HealthIndicatorAutoConfiguration两部分组成。

HealthIndicator所在包在org.springframework.boot.actuate,

HealthIndicatorAutoConfiguration所在包在org.springframework.boot.actuate.autoconfigure下

//RedisHealthIndicator.java

public class RedisHealthIndicator extends AbstractHealthIndicator {

static final String VERSION = "version";

static final String REDIS_VERSION = "redis_version";

private final RedisConnectionFactory redisConnectionFactory;

public RedisHealthIndicator(RedisConnectionFactory connectionFactory) {

super("Redis health check failed");

Assert.notNull(connectionFactory, "ConnectionFactory must not be null");

this.redisConnectionFactory = connectionFactory;

}

@Override

protected void doHealthCheck(Health.Builder builder) throws Exception {

RedisConnection connection = RedisConnectionUtils

.getConnection(this.redisConnectionFactory);

try {

if (connection instanceof RedisClusterConnection) {

ClusterInfo clusterInfo = ((RedisClusterConnection) connection)

.clusterGetClusterInfo();

builder.up().withDetail("cluster_size", clusterInfo.getClusterSize())

.withDetail("slots_up", clusterInfo.getSlotsOk())

.withDetail("slots_fail", clusterInfo.getSlotsFail());

}

else {

Properties info = connection.info();

builder.up().withDetail(VERSION, info.getProperty(REDIS_VERSION));

}

}

finally {

RedisConnectionUtils.releaseConnection(connection,

this.redisConnectionFactory);

}

}

}

主要实现doHealthCheck方法来实现具体的判断逻辑。注意,操作完成后在finally中释放资源。

在父类AbstractHealthIndicator中,对doHealthCheck进行了try catch,如果出现异常,则返回Down状态。

//AbstractHealthIndicator.java

@Override

public final Health health() {

Health.Builder builder = new Health.Builder();

try {

doHealthCheck(builder);

}

catch (Exception ex) {

if (this.logger.isWarnEnabled()) {

String message = this.healthCheckFailedMessage.apply(ex);

this.logger.warn(StringUtils.hasText(message) ? message : DEFAULT_MESSAGE,

ex);

}

builder.down(ex);

}

return builder.build();

}

RedisHealthIndicatorAutoConfiguration完成RedisHealthIndicator的自动配置

@Configuration

@ConditionalOnClass(RedisConnectionFactory.class)

@ConditionalOnBean(RedisConnectionFactory.class)

kCzXzYtlYj@ConditionalOnEnabledHealthIndicator("redis")

@AutoConfigureBefore(HealthIndicatorAutoConfiguration.class)

@AutoConfigureAfter({ RedisAutoConfiguration.class,

RedisReactiveHealthIndicatorAutoConfiguration.class })

public class RedisHealthIndicatorAutoConfiguration extends

CompositeHealthIndicatorConfiguration {

private final Map redisConnectionFactories;

public RedisHealthIndicatorAutoConfiguration(

Map redisConnectionFactories) {

this.redisConnectionFactories = redisConnectionFactories;

}

@Bean

@ConditionalOnMissingBean(name = "redisHealthIndicator")

public HealthIndicator redisHealthIndicator() {

return createHealthIndicator(this.redisConnectionFactories);

}

}

重点说明ConditionalOnEnabledHealthIndicator:如果management.health..enabled为true,则生效。

CompositeHealthIndicatorConfiguration 中会通过HealthIndicatorRegistry注册创建的HealthIndicator

自定义Indicator

@Component

@ConditionalOnProperty(name="spring.dfs.http.send-url")

@Slf4j

public class DfsHealthIndicator implements HealthIndicator {

@Value("${spring.dfs.http.send-url}")

private String dsfSendUrl;

@Override

public Health health() {

log.debug("正在检查dfs配置项...");

log.debug("dfs 请求地址:{}",dsfSendUrl);

Health.Builder up = Health.up().withDetail("url", dsfSendUrl);

try {

HttpUtils.telnet(StringUtils.getIpFromUrl(dsfSendUrl),StringUtils.getPortFromUrl(dsfSendUrl));

return up.build();

} catch (IOException e) {

e.printStackTrace();

log.error("DFS配置项错误或网络超时");

return up.withException(e).build();

}

}

}

返回值:

{

"dfs": {

"status": "UP",

"url": "10.254.131.197:8088",

"error": "java.net.ConnectException: Connection refused (Connection refused)"

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:网络小白学网工笔记(1):单臂路由实验(单臂路由技术)
下一篇:记一次典型的故障排错(发生故障错误做法)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~