Spring boot 2.0 Actuator 的健康檢查

spring boot 框架是spring framework發(fā)展史上一次質(zhì)的飛躍,用過都說好猜惋。它不僅僅是簡化了繁瑣的配置文件,提高了開發(fā)效率培愁,整合了開發(fā)中常用的各種組件著摔,優(yōu)雅地處理了它們之間的版本兼容性問題,等等定续。除了以上這些優(yōu)點還有本文將重點介紹的監(jiān)控谍咆,Spring boot框架自帶全方位的監(jiān)控禾锤,這樣,做spring boot應(yīng)用的監(jiān)控簡直是太方便了卧波。

00 前言

在當下流行的Service Mesh架構(gòu)中时肿,由于Spring boot框架的種種優(yōu)點,它特別適合作為其中的應(yīng)用開發(fā)框架港粱。

說到Service Mesh的微服務(wù)架構(gòu)螃成,主要特點是將服務(wù)開發(fā)和服務(wù)治理分離開來,然后再結(jié)合容器化的Paas平臺查坪,將它們?nèi)诤掀饋泶绾辏@依賴的都是互相之間默契的配合。也就是說各自都暴露出標準的接口偿曙,可以通過這些接口互相交織在一起氮凝。

Service Mesh的架構(gòu)設(shè)計中的要點之一,就是全方位的監(jiān)控望忆,因此一般我們選用的服務(wù)開發(fā)框架都需要有方便又強大的監(jiān)控功能支持罩阵。在Spring boot應(yīng)用中開啟監(jiān)控特別方便,監(jiān)控面也很廣启摄,還支持靈活定制稿壁。

01 Actuator的使用方法

在Spring boot應(yīng)用中,要實現(xiàn)可監(jiān)控的功能歉备,依賴的是 spring-boot-starter-actuator 這個組件傅是。它提供了很多監(jiān)控和管理你的spring boot應(yīng)用的HTTP或者JMX端點,并且你可以有選擇地開啟和關(guān)閉部分功能蕾羊。當你的spring boot應(yīng)用中引入下面的依賴之后喧笔,將自動的擁有審計、健康檢查龟再、Metrics監(jiān)控功能书闸。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

具體的使用方法:

  1. 引入上述的依賴jar;
  2. 通過下面的配置啟用所有的監(jiān)控端點利凑,默認情況下浆劲,這些端點是禁用的;
management:
  endpoints:
    web:
      exposure:
        include: "*"

“*”號代表啟用所有的監(jiān)控端點截碴,可以單獨啟用,例如蛉威,health日丹,infometrics等蚯嫌。

  1. 通過actuator/+端點名就可以獲取相應(yīng)的信息哲虾。

一般的監(jiān)控管理端點的配置信息丙躏,如下:

management:
  endpoints:
    web:
      exposure:
        include: "*"
  server:
    port: 10111
    servlet:
      context-path: /
    ssl:
      enabled: false
  endpoint:
    health:
      show-details: always

上述配置信息僅供參考,具體須參照官方文檔束凑,由于spring boot的版本更新比較快晒旅,配置方式可能有變化。

02 健康檢查

今天重點說一下Actuator監(jiān)控管理中的健康檢查功能汪诉,隨時能掌握線上應(yīng)用的健康狀況是非常重要的废恋,尤其是現(xiàn)在流行的容器云平臺下的應(yīng)用,它們的自動恢復和擴容都依賴健康檢查功能扒寄。

當我們開啟health的健康端點時鱼鼓,我們能夠查到應(yīng)用健康信息是一個匯總的信息,訪問http://127.0.0.1:10111/actuator/health時该编,我們獲取到的信息是{"status":"UP"}迄本,status的值還有可能是 DOWN。

要想查看詳細的應(yīng)用健康信息需要配置management.endpoint.health.show-details 的值為always课竣,配置之后我們再次訪問http://127.0.0.1:10111/actuator/health嘉赎,獲取的信息如下:

{
    "status": "UP",
    "details": {
        "diskSpace": {
            "status": "UP",
            "details": {
                "total": 250685575168,
                "free": 172252426240,
                "threshold": 10485760
            }
        },
        "redis": {
            "status": "UP",
            "details": {
                "version": "3.2.11"
            }
        },
        "db": {
            "status": "UP",
            "details": {
                "database": "Oracle",
                "hello": "Hello"
            }
        }
    }
}

從上面的應(yīng)用的詳細健康信息發(fā)現(xiàn),健康信息包含磁盤空間于樟、redis公条、DB,啟用監(jiān)控的這個spring boot應(yīng)用確實是連接了redis和oracle DB隔披,actuator就自動給監(jiān)控起來了赃份,確實是很方便、很有用奢米。

經(jīng)過測試發(fā)現(xiàn)抓韩,details中所有的監(jiān)控項中的任何一個健康狀態(tài)是DOWN,整體應(yīng)用的健康狀態(tài)也是DOWN鬓长。

management.endpoint.health.show-details的值除了always之外還有when-authorized谒拴、never,默認值是never涉波。

03 健康檢查的原理

Spring boot的健康信息都是從ApplicationContext中的各種HealthIndicator
Beans中收集到的英上,Spring boot框架中包含了大量的HealthIndicators的實現(xiàn)類,當然你也可以實現(xiàn)自己認為的健康狀態(tài)啤覆。

默認情況下苍日,最終的spring boot應(yīng)用的狀態(tài)是由HealthAggregator匯總而成的,匯總的算法是:

  1. 設(shè)置狀態(tài)碼順序:setStatusOrder(Status.DOWN, Status.OUT_OF_SERVICE, Status.UP, Status.UNKNOWN);窗声。
  2. 過濾掉不能識別的狀態(tài)碼相恃。
  3. 如果無任何狀態(tài)碼,整個spring boot應(yīng)用的狀態(tài)是 UNKNOWN笨觅。
  4. 將所有收集到的狀態(tài)碼按照 1 中的順序排序拦耐。
  5. 返回有序狀態(tài)碼序列中的第一個狀態(tài)碼耕腾,作為整個spring boot應(yīng)用的狀態(tài)。

源代碼請參見:org.springframework.boot.actuate.health.OrderedHealthAggregator杀糯。

Spring boot框架自帶的 HealthIndicators 目前包括:

Name Description
CassandraHealthIndicator Checks that a Cassandra database is up.
DiskSpaceHealthIndicator Checks for low disk space.
DataSourceHealthIndicator Checks that a connection to DataSource can be obtained.
ElasticsearchHealthIndicator Checks that an Elasticsearch cluster is up.
InfluxDbHealthIndicator Checks that an InfluxDB server is up.
JmsHealthIndicator Checks that a JMS broker is up.
MailHealthIndicator Checks that a mail server is up.
MongoHealthIndicator Checks that a Mongo database is up.
Neo4jHealthIndicator Checks that a Neo4j server is up.
RabbitHealthIndicator Checks that a Rabbit server is up.
RedisHealthIndicator Checks that a Redis server is up.
SolrHealthIndicator Checks that a Solr server is up.

你可以通過management.health.defaults.enabled這個配置項將它們?nèi)拷玫羯ò常部梢酝ㄟ^management.health.xxxx.enabled將其中任意一個禁用掉。

04 自定義 HealthIndicator 健康檢查

有時候需要提供自定義的健康狀態(tài)檢查信息固翰,你可以通過實現(xiàn)HealthIndicator的接口來實現(xiàn)狼纬,并將該實現(xiàn)類注冊為spring bean。你需要實現(xiàn)其中的health()方法倦挂,并返回自定義的健康狀態(tài)響應(yīng)信息畸颅,該響應(yīng)信息應(yīng)該包括一個狀態(tài)碼和要展示詳細信息。例如方援,下面就是一個接口HealthIndicator的實現(xiàn)類:

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;

@Component
public class MyHealthIndicator 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();
        }
        return Health.up().build();
    }

}

另外没炒,除了Spring boot定義的幾個狀態(tài)類型,我們也可以自定義狀態(tài)類型犯戏,用來表示一個新的系統(tǒng)狀態(tài)送火。在這種情況下,你還需要實現(xiàn)接口 HealthAggregator 先匪,或者通過配置 management.health.status.order 來繼續(xù)使用HealthAggregator的默認實現(xiàn)种吸。

例如,在你自定義的健康檢查HealthIndicator的實現(xiàn)類中呀非,使用了自定義的狀態(tài)類型FATAL坚俗,為了配置該狀態(tài)類型的嚴重程度,你需要在application的配置文件中添加如下配置:

management.health.status.order=FATAL, DOWN, OUT_OF_SERVICE, UNKNOWN, UP

在做健康檢查時岸裙,響應(yīng)中的HTTP狀態(tài)碼反應(yīng)了整體的健康狀態(tài)猖败,(例如,UP 對應(yīng) 200, 而 OUT_OF_SERVICEDOWN 對應(yīng) 503)降允。同樣恩闻,你也需要為自定義的狀態(tài)類型設(shè)置對應(yīng)的HTTP狀態(tài)碼,例如剧董,下面的配置可以將 FATAL 映射為 503(服務(wù)不可用):

management.health.status.http-mapping.FATAL=503

如果你需要更多的控制幢尚,你可以定義自己的 HealthStatusHttpMapper bean。

下面是內(nèi)置健康狀態(tài)類型對應(yīng)的HTTP狀態(tài)碼列表:

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

05 結(jié)束

本文主要介紹了Spring boot中提供的應(yīng)用健康檢查功能的使用方法和原理翅楼,順帶介紹了一點 Actuator 的內(nèi)容尉剩。主要的內(nèi)容來自spring boot 2.0.1的官方文檔 和 源碼,還有一些自己的想法毅臊,希望多多支持理茎。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子功蜓,更是在濱河造成了極大的恐慌,老刑警劉巖宠蚂,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件式撼,死亡現(xiàn)場離奇詭異,居然都是意外死亡求厕,警方通過查閱死者的電腦和手機著隆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呀癣,“玉大人美浦,你說我怎么就攤上這事∠罾福” “怎么了浦辨?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沼沈。 經(jīng)常有香客問我流酬,道長,這世上最難降的妖魔是什么列另? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任芽腾,我火速辦了婚禮,結(jié)果婚禮上页衙,老公的妹妹穿的比我還像新娘摊滔。我一直安慰自己,他們只是感情好店乐,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布艰躺。 她就那樣靜靜地躺著,像睡著了一般响巢。 火紅的嫁衣襯著肌膚如雪描滔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天踪古,我揣著相機與錄音含长,去河邊找鬼。 笑死伏穆,一個胖子當著我的面吹牛拘泞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播枕扫,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼陪腌,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起诗鸭,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤染簇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后强岸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锻弓,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年蝌箍,在試婚紗的時候發(fā)現(xiàn)自己被綠了青灼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡妓盲,死狀恐怖杂拨,靈堂內(nèi)的尸體忽然破棺而出奕坟,到底是詐尸還是另有隱情贰剥,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布溶其,位于F島的核電站筋粗,受9級特大地震影響贷币,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亏狰,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一役纹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧暇唾,春花似錦促脉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至够挂,卻和暖如春旁仿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孽糖。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工枯冈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人办悟。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓尘奏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親病蛉。 傳聞我的和親對象是個殘疾皇子炫加,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349