SpringBoot健康检查,如何与容器配合?

开发 前端
监控的重要性就不必多说了吧,不要再花功夫开会讨论它的必要性了,当你线上遇到问题,就不会再怀疑监控是浪费开发成本的建设。监控让人告别了靠“猜”来维持的救火现状,它能够留下证据,来支撑我们后续的分析。

[[355892]]

本文转载自微信公众号「小姐姐味道」,作者小姐姐养的狗 。转载本文请联系小姐姐味道公众号。  

监控的重要性就不必多说了吧,不要再花功夫开会讨论它的必要性了,当你线上遇到问题,就不会再怀疑监控是浪费开发成本的建设。监控让人告别了靠“猜”来维持的救火现状,它能够留下证据,来支撑我们后续的分析。

作为监控的首要目标,服务的存活性,也就是它的健康状况,成为了重中之重。SpringBoot可以通过简单的参数,来开启健康检查,并能够和主流的监控系统集成起来。

1. 监控开启

在Spring中,是使用actuator组件,来做监控等相关操作。可以在pom中加入下面的starter:

  1. <dependency> 
  2.   <groupId>org.springframework.boot</groupId> 
  3.   <artifactId>spring-boot-starter-actuator</artifactId> 
  4. </dependency> 

对于gradle来说,加入下面这个。

 

  1. dependencies { 
  2.   compile("org.springframework.boot:spring-boot-starter-actuator"

访问/actuator/health,即可获取项目的健康状况。

  1. {"status":"UP"

在application.yml文件里,加入如下的内容:

  1. management: 
  2.   endpoint: 
  3.     health: 
  4.       show-details: always 

再次访问这个接口,将输出详细的内容。包括DB的状态、磁盘状态等。可以看到,最外层的status,其实是内部各个组件状态的集合。

  1.     "status":"UP"
  2.     "components":{ 
  3.         "db":{ 
  4.             "status":"UP"
  5.             "details":{ 
  6.                 "database":"H2"
  7.                 "validationQuery":"isValid()" 
  8.             } 
  9.         }, 
  10.         "diskSpace":{ 
  11.             "status":"UP"
  12.             "details":{ 
  13.                 "total":250685575168, 
  14.                 "free":31373905920, 
  15.                 "threshold":10485760, 
  16.                 "exists":true 
  17.             } 
  18.         }, 
  19.         "ping":{ 
  20.             "status":"UP" 
  21.         } 
  22.     } 

2. 自定义Indicator

这些功能,是由Indicators来实现的(HealthIndicator)。比如下面这些:

  • DataSourceHealthIndicator
  • DiskSpaceHealthIndicator
  • CouchbaseHealthIndicator
  • MongoHealthIndicator
  • RedisHealthIndicator
  • CassandraHealthIndicator

如果你是用的是组件提供的starter,这些Indicator就会在/health接口进行聚合,如果你不想要监控某个组件,可以在配置中把它关闭。

 

  1. management: 
  2.   health: 
  3.     mongo: 
  4.       enabled: false 

明白了这个道理,在做一些组件的时候时候,就可以通过这种方式,来提供组件自带的健康检查:只需要实现HealthIndicator接口就可以了。代码样例如下:

 

  1. @Component 
  2. @Slf4j 
  3. public class X implements HealthIndicator { 
  4.     @Override 
  5.     public Health health() { 
  6.         try { 
  7.             //检查组件状态异常信息 
  8.         } catch (Exception e) { 
  9.             log.warn("Failed to connect to: {}", URL); 
  10.             return Health.down() 
  11.                     .withDetail("error", e.getMessage()) 
  12.                     .build(); 
  13.         } 
  14.         return Health.up().build(); 
  15.     } 

3. 接入监控系统

更多情况,我们是希望把业务监控的数据,使用专业的监控组件收集起来。这个在SpringBoot中,可以使用micrometer来实现。

以最流行的prometheus为例,在pom里增加下面的内容。

 

  1. <dependency> 
  2.     <groupId>io.micrometer</groupId> 
  3.     <artifactId>micrometer-registry-prometheus</artifactId> 
  4. </dependency> 

当然,我们也要在yaml里配置一些内容。它现在看起来长这个样子:

 

  1. management: 
  2.   endpoints: 
  3.     web: 
  4.       exposure: 
  5.         include: health,info,prometheus 
  6.   endpoint: 
  7.     health: 
  8.       show-details: always 

这时候,访问/actuator/prometheus,即可获取prometheus格式的监控数据。

类似于下面这种:

 

  1. jvm_memory_used_bytes{area="heap",id="PS Survivor Space",} 0.0 
  2. jvm_memory_used_bytes{area="heap",id="PS Old Gen",} 2.9444904E7 
  3. jvm_memory_used_bytes{area="heap",id="PS Eden Space",} 6.829E7 
  4. jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 5.917196E7 
  5. jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 1.0929088E7 
  6. jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 8420512.0 

在prometheus的target页面,可以看到下面的信息:

最终在Grafana里,长的更加妖艳一些。

那它都能监控一些什么东西呢?我们来看一下:

  • 服务节点基本信息,包括内存CPU网络IO等
  • JVM堆栈信息
  • JVM GC信息,STW信息
  • 默认HikariCP的连接池信息
  • HTTP请求接口信息(最大耗时,QPS最高)
  • Tomcat容器监控
  • Logback日志打印监控(各级别条数)
  • ...其他

可以看到,只需要暴露这么一个接口,就可以对项目中的组件,进行比较全面的掌控。

4. 与容器配合

最后一点,由于SpringBoot服务,经常会发布到一些容器中,比如docker。这个时候,就要用到probes配置(kube有相同的概念)。probes是探测的意思,用来区分Liveness和Readiness两种状态。

最终的配置如下:

 

  1. management: 
  2.   health: 
  3.     probes: 
  4.       enabled: true 
  5.   endpoints: 
  6.     web: 
  7.       exposure: 
  8.         include: health,info,prometheus 
  9.   endpoint: 
  10.     health: 
  11.       show-details: always 

这时候,我们将在浏览器的接口中获取两个分组,展示如下:

  • http://localhost:8080/actuator/health/liveness
  • http://localhost:8080/actuator/health/readiness

这两个链接,前者用于判断容器是否应该重启;后者判断服务是否可用,如果可用,将开始接受外部的请求。

End

对于规模比较小的SpringBoot应用来说,使用SpringBootAdmin一类的监控,就已经足够了。但如果你的企业是集中式部署,节点多且变化频繁,一个统一的监控建设平台是非常必要的。

除了Prometheus,SpringBoot的Metrics还支持以下组件:

  • AppOptics
  • Atlas
  • Datadog
  • Dynatrace
  • Elastic
  • Ganglia
  • Graphite
  • Humio
  • Influx
  • JMX
  • KairosDB
  • New Relic
  • Prometheus
  • SignalFx
  • Simple (in-memory)
  • Stackdriver
  • StatsD
  • Wavefront

你熟悉的组件,有没有它的身影呢?

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。

 

责任编辑:武晓燕 来源: 小姐姐味道
相关推荐

2017-08-25 10:20:46

Docker容器机制

2022-09-07 09:19:49

Docker健康检查

2023-05-09 07:34:25

Docker健康检查方式

2023-03-02 07:20:10

GRPC服务健康检查协议

2023-03-03 08:19:35

KubernetesgRPC

2023-03-01 08:33:37

gRPC健康检查代码

2021-07-15 10:25:15

集群节点检查

2023-10-14 15:36:14

PodKubernetes

2024-02-27 17:30:11

2021-01-15 05:38:28

ASPHttp端口

2021-04-18 10:34:28

Spring Clou邮件钉钉

2022-08-23 10:04:23

Dockerhealth健康检查

2021-09-18 16:10:48

Spring BootJava微服务

2022-02-28 07:40:23

Nacos注册中心客户端

2021-07-05 06:51:41

Nacos微服务源码

2021-09-21 16:31:56

Windows 11微软PC健康检查工具

2023-01-30 07:51:38

云原生Kubernetesk8s

2021-09-22 23:08:50

Windows 11Windows微软

2023-03-07 07:49:06

Kubernetes容器

2022-12-27 07:42:12

点赞
收藏

51CTO技术栈公众号