SpringBoot健康檢查,如何與容器配合?
本文轉(zhuǎn)載自微信公眾號「小姐姐味道」,作者小姐姐養(yǎng)的狗 。轉(zhuǎn)載本文請聯(lián)系小姐姐味道公眾號。
監(jiān)控的重要性就不必多說了吧,不要再花功夫開會討論它的必要性了,當(dāng)你線上遇到問題,就不會再懷疑監(jiān)控是浪費開發(fā)成本的建設(shè)。監(jiān)控讓人告別了靠“猜”來維持的救火現(xiàn)狀,它能夠留下證據(jù),來支撐我們后續(xù)的分析。
作為監(jiān)控的首要目標,服務(wù)的存活性,也就是它的健康狀況,成為了重中之重。SpringBoot可以通過簡單的參數(shù),來開啟健康檢查,并能夠和主流的監(jiān)控系統(tǒng)集成起來。
1. 監(jiān)控開啟
在Spring中,是使用actuator組件,來做監(jiān)控等相關(guān)操作??梢栽趐om中加入下面的starter:
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-actuator</artifactId>
- </dependency>
對于gradle來說,加入下面這個。
- dependencies {
- compile("org.springframework.boot:spring-boot-starter-actuator")
- }
訪問/actuator/health,即可獲取項目的健康狀況。
- {"status":"UP"}
在application.yml文件里,加入如下的內(nèi)容:
- management:
- endpoint:
- health:
- show-details: always
再次訪問這個接口,將輸出詳細的內(nèi)容。包括DB的狀態(tài)、磁盤狀態(tài)等??梢钥吹剑钔鈱拥膕tatus,其實是內(nèi)部各個組件狀態(tài)的集合。
- {
- "status":"UP",
- "components":{
- "db":{
- "status":"UP",
- "details":{
- "database":"H2",
- "validationQuery":"isValid()"
- }
- },
- "diskSpace":{
- "status":"UP",
- "details":{
- "total":250685575168,
- "free":31373905920,
- "threshold":10485760,
- "exists":true
- }
- },
- "ping":{
- "status":"UP"
- }
- }
- }
2. 自定義Indicator
這些功能,是由Indicators來實現(xiàn)的(HealthIndicator)。比如下面這些:
- DataSourceHealthIndicator
- DiskSpaceHealthIndicator
- CouchbaseHealthIndicator
- MongoHealthIndicator
- RedisHealthIndicator
- CassandraHealthIndicator
如果你是用的是組件提供的starter,這些Indicator就會在/health接口進行聚合,如果你不想要監(jiān)控某個組件,可以在配置中把它關(guān)閉。
- management:
- health:
- mongo:
- enabled: false
明白了這個道理,在做一些組件的時候時候,就可以通過這種方式,來提供組件自帶的健康檢查:只需要實現(xiàn)HealthIndicator接口就可以了。代碼樣例如下:
- @Component
- @Slf4j
- public class X implements HealthIndicator {
- @Override
- public Health health() {
- try {
- //檢查組件狀態(tài)異常信息
- } catch (Exception e) {
- log.warn("Failed to connect to: {}", URL);
- return Health.down()
- .withDetail("error", e.getMessage())
- .build();
- }
- return Health.up().build();
- }
- }
3. 接入監(jiān)控系統(tǒng)
更多情況,我們是希望把業(yè)務(wù)監(jiān)控的數(shù)據(jù),使用專業(yè)的監(jiān)控組件收集起來。這個在SpringBoot中,可以使用micrometer來實現(xiàn)。
以最流行的prometheus為例,在pom里增加下面的內(nèi)容。
- <dependency>
- <groupId>io.micrometer</groupId>
- <artifactId>micrometer-registry-prometheus</artifactId>
- </dependency>
當(dāng)然,我們也要在yaml里配置一些內(nèi)容。它現(xiàn)在看起來長這個樣子:
- management:
- endpoints:
- web:
- exposure:
- include: health,info,prometheus
- endpoint:
- health:
- show-details: always
這時候,訪問/actuator/prometheus,即可獲取prometheus格式的監(jiān)控數(shù)據(jù)。
類似于下面這種:
- jvm_memory_used_bytes{area="heap",id="PS Survivor Space",} 0.0
- jvm_memory_used_bytes{area="heap",id="PS Old Gen",} 2.9444904E7
- jvm_memory_used_bytes{area="heap",id="PS Eden Space",} 6.829E7
- jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 5.917196E7
- jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 1.0929088E7
- jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 8420512.0
在prometheus的target頁面,可以看到下面的信息:
最終在Grafana里,長的更加妖艷一些。
那它都能監(jiān)控一些什么東西呢?我們來看一下:
- 服務(wù)節(jié)點基本信息,包括內(nèi)存CPU網(wǎng)絡(luò)IO等
- JVM堆棧信息
- JVM GC信息,STW信息
- 默認HikariCP的連接池信息
- HTTP請求接口信息(最大耗時,QPS最高)
- Tomcat容器監(jiān)控
- Logback日志打印監(jiān)控(各級別條數(shù))
- ...其他
可以看到,只需要暴露這么一個接口,就可以對項目中的組件,進行比較全面的掌控。
4. 與容器配合
最后一點,由于SpringBoot服務(wù),經(jīng)常會發(fā)布到一些容器中,比如docker。這個時候,就要用到probes配置(kube有相同的概念)。probes是探測的意思,用來區(qū)分Liveness和Readiness兩種狀態(tài)。
最終的配置如下:
- management:
- health:
- probes:
- enabled: true
- endpoints:
- web:
- exposure:
- include: health,info,prometheus
- endpoint:
- health:
- show-details: always
這時候,我們將在瀏覽器的接口中獲取兩個分組,展示如下:
- http://localhost:8080/actuator/health/liveness
- http://localhost:8080/actuator/health/readiness
這兩個鏈接,前者用于判斷容器是否應(yīng)該重啟;后者判斷服務(wù)是否可用,如果可用,將開始接受外部的請求。
End
對于規(guī)模比較小的SpringBoot應(yīng)用來說,使用SpringBootAdmin一類的監(jiān)控,就已經(jīng)足夠了。但如果你的企業(yè)是集中式部署,節(jié)點多且變化頻繁,一個統(tǒng)一的監(jiān)控建設(shè)平臺是非常必要的。
除了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),一個不允許程序員走彎路的公眾號。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。我的個人微信xjjdog0,歡迎添加好友,進一步交流。