SpringBoot实现项目健康检查与监控

这篇文章主要介绍了SpringBoot实现项目健康检查与监控,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

Spring Boot 最主要的特性就是AutoConfig自动配置),而对于我们这些使用者来说也就是各种starter,

Spring Boot-Actuator 也提供了starter,为我们自动配置,在使用上我们只需要添加starter到我们的依赖中,然后启动项目即可。

org.springframework.bootspring-boot-starter-actuator

常用Endpoint

Spring Boot-actuator,提供了许多有用的EndPoint,对Spring Boot应用提供各种监控,下面说一下我常用的EndPoint:

/health 应用的健康状态

/configprops 获取应用的配置信息,因为Spring Boot 可能发布时是单独的jar包配置文件可能包含其中, 当我们需要检查配置文件时可以使用 ConfigpropsEndPoint 进行查看一些配置是否正确。

/trace 最近几次的http请求信息

HealthEndPoint

当我们访问 http://localhost:8088/health 时,可以看到 HealthEndPoint 给我们提供认的监控结果,包含 磁盘检测和数据库检测。

{ "status": "UP", "diskSpace": { "status": "UP", "total": 398458875904, "free": 315106918400, "threshold": 10485760 }, "db": { "status": "UP", "database": "MysqL", "hello": 1 } }

其实看 Spring Boot-actuator 源码,你会发现 HealthEndPoint 提供的信息不仅限于此,org.springframework.boot.actuate.health 包下 你会发现 ElasticsearchHealthindicator、RedisHealthindicator、RabbitHealthindicator 等

也就是 HealthEndPoint 也提供 ES, Redis 等组件的健康信息。

自定义Indicator 扩展 HealthEndPoint

看源码 其实 磁盘和数据库健康信息就是 diskSpaceHealthindicator、DataSourceHealthindicator 来实现的,当我们对一些我们自定义的组件进行监控时, 我们也可以实现个Indicator :

@Component public class User implements Healthindicator { /** * user监控 访问: http://localhost:8088/health * * @return 自定义Health监控 */ @Override public Health health() { return new Health.Builder().withDetail("usercount", 10) //自定义监控内容 .withDetail("userstatus", "up").up().build(); } }

这时我们再次访问: http://localhost:8088/health 这时返回的结果如下,包含了我们自定义的 User 健康信息。

{ "status": "UP", "user": { "status": "UP", "usercount": 10, "userstatus": "up" }, "diskSpace": { "status": "UP", "total": 398458875904, "free": 315097989120, "threshold": 10485760 }, "db": { "status": "UP", "database": "MysqL", "hello": 1 } }

自定义EndPoint

其实除了扩展 HealthEndPoint 来添加一些健康检查, 我们也可以自定定义一些EndPoint 来提供程序运行时一些信息的展示:

@Configuration public class EndPointAutoConfig { @Bean public Endpoint> customEndPoint() { return new SystemEndPoint(); } } @ConfigurationProperties(prefix="endpoints.customsystem") public class SystemEndPoint extends AbstractEndpoint> { public SystemEndPoint(){ super("customsystem"); } @Override public Map invoke() { Map result= new HashMap(); Map map = System.getenv(); result.put("username",map.get("USERNAME")); result.put("computername",map.get("COmpuTERNAME")); result.put("userdomain",map.get("USERDOMAIN")); return result; } }

访问 http://localhost:8088/customsystem 来查看我们自定义的EndPoint ,返回结果如下:

{ "username": "xxx", "userdomain": "DESKTOP-6EAN1H4", "computername": "DESKTOP-6EAN1H4" }

我们在为Spring Boot应用添加actuator后,期望的health接口返回结果应该是类似下面的结果:

{ status: "UP", diskSpace: { status: "UP", total: 250182889472, free: 31169568768, threshold: 10485760 }, db: { status: "UP", database: "H2", hello: 1 } }

如果只是返回了status

{ status: "UP" }

则需要为应用新增配置,以yml配置文件为例,需要添加如下配置:

management: security: enabled: false endpoints: health: sensitive: false

management.endpoint.health.show-details=always

总结

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...