Spring Boot Actuator詳解

執(zhí)行器(Actuator)是一個(gè)制造業(yè)術(shù)語(yǔ)讽坏,指的是用于移動(dòng)或控制東西的一個(gè)機(jī)械裝置锭魔,一個(gè)很小的改變就能讓執(zhí)行器產(chǎn)生大量的運(yùn)動(dòng)。

前言

?在當(dāng)下流行的Service Mesh架構(gòu)中震缭,由于Spring boot框架的種種優(yōu)點(diǎn)赂毯,它特別適合作為其中的應(yīng)用開發(fā)框架。

Service Mesh的微服務(wù)架構(gòu)拣宰,主要特點(diǎn)是將服務(wù)開發(fā)和服務(wù)治理分離開來(lái)党涕,然后再結(jié)合容器化的Paas平臺(tái),將它們?nèi)诤掀饋?lái)巡社,這依賴的都是互相之間默契的配合膛堤。也就是說(shuō)各自都暴露出標(biāo)準(zhǔn)的接口,可以通過(guò)這些接口互相交織在一起晌该。

?由于微服務(wù)之后肥荔,系統(tǒng)結(jié)構(gòu)拆分隨著業(yè)務(wù)發(fā)展越來(lái)越微型化绿渣,也意味著節(jié)點(diǎn)會(huì)呈現(xiàn)幾何數(shù)量級(jí)增長(zhǎng)。每個(gè)一個(gè)節(jié)點(diǎn)都是系統(tǒng)組成部分燕耿,如何保持如此多節(jié)點(diǎn)的可用性是一件非常有挑戰(zhàn)的工作中符。全方位的監(jiān)控變得越來(lái)越重要,當(dāng)我們遇到bug時(shí)誉帅,總是希望可以看到更多信息淀散,因此一般我們選用的服務(wù)開發(fā)框架都需要有方便又強(qiáng)大的監(jiān)控功能支持。
?Spring Boot Actuator便可以幫助我們?nèi)矫姹O(jiān)控應(yīng)用節(jié)點(diǎn)蚜锨,比如健康檢查档插、審計(jì)、統(tǒng)計(jì)亚再、HTTP追蹤等郭膛。我們可以通過(guò)JMX或者HTTP endpoints來(lái)獲得。spring Boot Admin配合下可以進(jìn)行頁(yè)面展示,也和可以與其它外部應(yīng)用系統(tǒng)系統(tǒng)整合氛悬。则剃。

Actuator的使用方法

?在Spring Boot應(yīng)用中,要實(shí)現(xiàn)監(jiān)控的功能圆雁,只需要依賴組件spring-boot-starter-actuator忍级。它提供了很多監(jiān)控和管理你的spring boot應(yīng)用的HTTP或者JMX端點(diǎn),并且你可以有選擇地開啟和關(guān)閉部分功能伪朽。當(dāng)你的spring boot應(yīng)用中引入依賴之后轴咱,將自動(dòng)擁有審計(jì)、健康檢查烈涮、Metrics監(jiān)控功能朴肺。如下,組件依賴:

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

?在引入上述的組件jar之后坚洽,我們先看看actuator提供了哪些接口戈稿,這些接口提供了什么功能?

ednpoints

?在應(yīng)用啟動(dòng)之后讶舰,我們首先訪問(wèn)/actuator鞍盗,如下所示:


actuator接口.png
  • /actuator:接口展示,顯示actuator提供的訪問(wèn)接口跳昼,上圖顯示的是3個(gè)般甲,不過(guò)這只是默認(rèn)顯示,我們可以進(jìn)行配置管理鹅颊。
  • /actuator/health:健康檢查敷存,顯示應(yīng)用健康信息
  • /actuator/info:應(yīng)用信息,展示了關(guān)于應(yīng)用的一般信息堪伍,這些信息從編譯文件比如META-INF/build-info.properties或者Git文件比如git.properties或者任何環(huán)境的property中獲取锚烦。

?我們先看一下健康檢查接口觅闽,訪問(wèn)http://localhost:8888/actuator/health,如下所示:

health接口.png

?status值為UP說(shuō)明應(yīng)用是健康的涮俄,如果應(yīng)用不健康蛉拙,將會(huì)顯示DOWN。
?默認(rèn)情況下禽拔,只有 health 和 info 通過(guò) HTTP 暴露出來(lái)刘离,所以 /actuator 只展示了 health 和 info endpoints。如何暴露其他的 endpoints 睹栖?首先,讓我們先了解一下其他的endpoints茧痕。我們可以在《endpoints官網(wǎng)說(shuō)明》 查看完整的列表野来,下面介紹一些常用的:

Endpoint ID Description
auditevent 顯示應(yīng)用暴露的審計(jì)事件(比如認(rèn)證進(jìn)入、訂單失斪倏酢)
info 顯示應(yīng)用的基本信息
health 顯示應(yīng)用的健康狀態(tài)
metrics 顯示應(yīng)用多樣的度量信息
loggers 顯示和修改配置的loggers
logfile 返回log file中的內(nèi)容(如果logging.file或者logging.path被設(shè)置)
httptrace 顯示HTTP足跡曼氛,最近100個(gè)HTTP request/reponse
env 顯示當(dāng)前的環(huán)境特性
flyway 顯示數(shù)據(jù)庫(kù)遷移路徑的詳細(xì)信息
shutdown 優(yōu)雅地逐步關(guān)閉應(yīng)用
mappings 顯示所有的@RequestMapping路徑
scheduledtasks 顯示應(yīng)用中的調(diào)度任務(wù)
threaddump 執(zhí)行一個(gè)線程dump
heapdump 返回一個(gè)GZip壓縮的JVM堆dump

metrics

?metrics endpoint展示了你可以追蹤的度量,例如jvm內(nèi)存令野、cpu使用舀患、jvm線程等。如下所示:


metrics endpoint.png

?如果想要查看單個(gè)度量的詳細(xì)信息气破,我們需要度量名稱傳入到metrics request接口中聊浅,如下所示:

http://localhost:8080/actuator/metrics/{MetricName}

?比如我們想要查看system.cpu.count 度量,如下進(jìn)行訪問(wèn):


metrics度量查看.png

loggers

?loggers endpoint 展示了應(yīng)用中可配置的loggers列表和相關(guān)日志等級(jí)现使,我們可以訪問(wèn)接口http://localhost:8878/actuator/loggers低匙,如下所示:

loggers日志等級(jí)查看.png

?如果我們想要查看單個(gè)logger的日志配置信息,可以訪問(wèn)如下格式的:

http://localhost:8878/actuator/loggers/{name}

?例如碳锈,我們想要查看com.netflix的日志級(jí)別信息顽冶,如下所示:


discoveryclient logger.png

?loggers endpoint 同時(shí)提供了在應(yīng)用運(yùn)行時(shí)改變?nèi)罩炯?jí)別的能力,比如你想要改變com.netflix.discovery.DiscoveryClient的logger等級(jí)為DEBUG售碳,可以發(fā)送一個(gè)POST請(qǐng)求斩郎,如下所示:

POST http://localhost:8878/actuator/loggers/com.chandler
Content-Type application/json; charset=UTF-8
日志級(jí)別修改.png
loggers日志級(jí)別修改結(jié)果.png

動(dòng)態(tài)修改日志級(jí)別的功能對(duì)于日常排查問(wèn)題,是一個(gè)有利支持俐东。同時(shí)可以傳遞null給configuredLevel來(lái)重置日志等級(jí)鲸阔。

endpoint控制

?默認(rèn)情況,上述所有的endpints都是打開多灸姊,除了shutdown endpoint拱燃。如果我們想要控制單個(gè)endpoint 開關(guān),可以進(jìn)行如下配置:

management.endpoint.<id>.enabled=true/false

?例如力惯,想要打開shutdown endpint碗誉,可以在application.properties文件中進(jìn)行如下配置:

management.endpoint.shutdown.enabled=true

參數(shù)配置

?剛剛介紹了如何通過(guò)配置來(lái)對(duì)endpoint開關(guān)的控制召嘶,Actuator為我們提供豐富的參數(shù)配置。接下來(lái)我將和大家一起去認(rèn)識(shí)哮缺,掌握一些常用的配置弄跌。

顯示詳細(xì)的監(jiān)控信息

?health endpoint 只展示了簡(jiǎn)單的UP和DOWN狀態(tài),為了獲得健康檢查中所有指標(biāo)的詳細(xì)信息尝苇,我們可以在application.properties中增加如下配置:

management.endpoint.health.show-details=always

?配置之后铛只,我們?cè)俅卧L問(wèn)http://localhost:8888/actuator/health,獲取信息如下:

{
    "status": "UP",
    "details": {
        "diskSpace": {
            "status": "UP",
            "details": {
                "total": 249788112896,
                "free": 80719609856,
                "threshold": 10485760
            }
        },
        "refreshScope": {
            "status": "UP"
        },
        "discoveryComposite": {
            "status": "UP",
            "details": {
                "discoveryClient": {
                    "status": "UP",
                    "details": {
                        "services": [
                            "service-instance-peer"
                        ]
                    }
                },
                "eureka": {
                    "description": "Remote status from Eureka server",
                    "status": "UNKNOWN",
                    "details": {
                        "applications": {
                            "SERVICE-INSTANCE-PEER": 1
                        }
                    }
                }
            }
        },
        "hystrix": {
            "status": "UP"
        }
    }
}

?從上面的應(yīng)用的詳細(xì)健康信息發(fā)現(xiàn)糠溜,包含了磁盤空間淳玩、熔斷器hystrix、刷新refreshScope非竿、服務(wù)注冊(cè)中心蜕着。說(shuō)明spring boot應(yīng)用連接注冊(cè)中心,并開啟了刷新功能红柱,熔斷器功能承匣,而actuator自動(dòng)將這些監(jiān)控了起來(lái)。

management.endpoint.health.show-details的默認(rèn)值為never锤悄,除了always之外還有when-authorized韧骗。

健康指標(biāo)

Abstracthealthindicator的子類

?從抽象類AbstractHealthIndicator可以看出,actuator原生封裝了很多的健康指標(biāo)零聚,例如ElasticsearchHealthIndicator袍暴、DataSourceHealthIndicator、RedisHealthIndicator握牧、RabbitHealthIndicator等容诬。這就意味著當(dāng)我們使用
Elasticsearch、DataSource沿腰、Redis等資源的時(shí)候览徒,會(huì)自動(dòng)增加健康指標(biāo)。不過(guò)我們有時(shí)候希望留下一些我們想要關(guān)注等健康指標(biāo)颂龙,而過(guò)濾掉一些指標(biāo)习蓬。
?actuator提供了關(guān)閉健康指標(biāo)的功能,比如我們想要關(guān)閉 mongoDB 健康指標(biāo)措嵌,可以在application.properties中添加如下配置:

management.health.mongo.enabled=false

?我對(duì)哪些可以關(guān)閉產(chǎn)生了好奇躲叼,所以深挖了源代碼發(fā)現(xiàn)如下的邏輯:


HealthIndicatorNameFactory.png

?HealthIndicatorNameFactory在管理健康指標(biāo)開關(guān)的時(shí)候,將類名進(jìn)行了截取做為key企巢,如此我們可以在application.properties中管理如下的HealthIndicator:


健康指標(biāo)開關(guān)

?然而枫慷,我們可以發(fā)現(xiàn)actuator沒(méi)有提供consul和eureka健康指標(biāo)的管理。不過(guò)這樣也說(shuō)了,我們可以創(chuàng)建自定義的健康指標(biāo)或听,只要我們實(shí)現(xiàn)了HealthIndicator接口探孝,如下所示:

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();
    }

}

?我們也可以通過(guò)繼承抽象類AbstractHealthIndicator來(lái)實(shí)現(xiàn)自定義的健康指標(biāo),如下所示:

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

/**
 * 自定義健康指標(biāo)
 *
 * @author 錢丁君-chandler 2019/5/11下午6:07
 * @since 1.8
 */
@Component
public class CustomHealthIndicator extends AbstractHealthIndicator {

    protected void doHealthCheck(Health.Builder builder) throws Exception {
        // Use the builder to build the health status details that should be reported.
        // If you throw an exception, the status will be DOWN with the exception message.

        builder.up()
                .withDetail("app", "Alive")
                .withDetail("author", "chandler");
    }
}

?重現(xiàn)啟動(dòng)spring boot應(yīng)用誉裆,再次訪問(wèn)http://localhost:8888/actuator/health顿颅,如下所示:

自定義健康指標(biāo)

應(yīng)用信息

?info endpoint 展示了應(yīng)用的基本信息,它通過(guò)META-INF/build-info.properties來(lái)獲取編譯信息足丢,通過(guò)git.properties來(lái)獲取當(dāng)前應(yīng)用的Git版本信息粱腻。同時(shí)它可以展示任何信息,只要應(yīng)用環(huán)境property中含有info key斩跌。

1.自定義信息

?如果我們進(jìn)行任何配置绍些,info endpoint 展示信息為空,不過(guò)這也是一個(gè)很重要的端點(diǎn)耀鸦。首先遇革,我們嘗試在application.properties中進(jìn)行如下配置:

#info接口展示
info.app.name=${spring.application.name}
info.app.description=@project.description@
info.app.version=@project.version@
info.app.encoding=@project.build.sourceEncoding@
info.app.java.version=@java.version@

?如上所示,我們進(jìn)行一些信息配置揭糕,包含應(yīng)用名稱、應(yīng)用描述锻霎、應(yīng)用版本著角、編碼格式、JDK版本旋恼。當(dāng)我們?cè)俅卧L問(wèn)info endpoint 時(shí)吏口,能夠得到如下信息:


info endpoint
info顯示異常
info顯示異常

?也許你會(huì)遇到如上所示的情況,這就說(shuō)明沒(méi)有從META-INF/build-info.properties讀取到信息冰更,你可以檢查一下該文件产徊。


build-info.png

?解決方法:使用spring boot插件構(gòu)建一次。

spring boot build.png

2.git.properties

?首先我們需要添加git-commit-id-plugin插件蜀细,該插件用來(lái)產(chǎn)生git的版本信息舟铜。如下所示:

<plugin>
    <groupId>pl.project13.maven</groupId>
    <artifactId>git-commit-id-plugin</artifactId>
</plugin>

?完成了上述配置之后,執(zhí)行g(shù)it-commit-id-plugin插件奠衔。


git-commit-id-plugin

?接下來(lái)谆刨,我們啟動(dòng)應(yīng)用并訪問(wèn)端點(diǎn)http://localhost:8888/actuator/info,如下所示:

info端點(diǎn)結(jié)果

?其中归斤,包含了關(guān)于branch和commit的基礎(chǔ)信息痊夭,如果我們想要獲取更全面的git版本信息,可以在application.properties中進(jìn)行如下配置:

management.info.git.mode=full
全面的git信息

endpoint暴露控制

?前面所述脏里,actuator提供了豐富的endpoint 她我,有部分是我們?cè)谝獾模矔?huì)有我們不在意的。如你所愿番舆,actuator提供了更加豐富的功能酝碳,請(qǐng)看如下配置信息:

management.endpoints.web.exposure.include=
management.endpoints.web.exposure.exclude=

?include表示需要暴露的endpoint,配置時(shí)使用“,”隔開合蔽,你也可以用*讓所有endpoint暴露出來(lái)击敌,如下所示:

management.endpoints.web.exposure.include=*

management.endpoints.web.exposure.include=health,info 

?exclude表示在暴露endpoint時(shí),排除掉哪些拴事,同樣使用“,”隔開沃斤,如下所示:

management.endpoints.web.exposure.exclude=info

security

?actuator可以配合security進(jìn)行權(quán)限控制,保護(hù)endpint刃宵。大家有興趣可以自行探索衡瓶,在此本人就不贅述了。

如果需要給我修改意見的發(fā)送郵箱:erghjmncq6643981@163.com

本博客的代碼示例已上傳GitHub:重新學(xué)習(xí)Spring Cloud組件https://github.com/erghjmncq6643981/cloud-2019

資料參考:Spring Cloud Finchley.SR2官網(wǎng)

轉(zhuǎn)發(fā)博客牲证,請(qǐng)注明哮针,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坦袍,一起剝皮案震驚了整個(gè)濱河市十厢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捂齐,老刑警劉巖蛮放,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異奠宜,居然都是意外死亡包颁,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門压真,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)娩嚼,“玉大人,你說(shuō)我怎么就攤上這事滴肿≡牢颍” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵嘴高,是天一觀的道長(zhǎng)竿音。 經(jīng)常有香客問(wèn)我,道長(zhǎng)拴驮,這世上最難降的妖魔是什么春瞬? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮套啤,結(jié)果婚禮上宽气,老公的妹妹穿的比我還像新娘随常。我一直安慰自己,他們只是感情好萄涯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布绪氛。 她就那樣靜靜地躺著,像睡著了一般涝影。 火紅的嫁衣襯著肌膚如雪枣察。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天燃逻,我揣著相機(jī)與錄音序目,去河邊找鬼。 笑死伯襟,一個(gè)胖子當(dāng)著我的面吹牛猿涨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播姆怪,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼叛赚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了稽揭?” 一聲冷哼從身側(cè)響起俺附,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溪掀,沒(méi)想到半個(gè)月后昙读,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膨桥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唠叛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片只嚣。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖艺沼,靈堂內(nèi)的尸體忽然破棺而出册舞,到底是詐尸還是另有隱情,我是刑警寧澤障般,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布调鲸,位于F島的核電站,受9級(jí)特大地震影響挽荡,放射性物質(zhì)發(fā)生泄漏藐石。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一定拟、第九天 我趴在偏房一處隱蔽的房頂上張望于微。 院中可真熱鬧,春花似錦、人聲如沸株依。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)恋腕。三九已至抹锄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荠藤,已是汗流浹背伙单。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留商源,地道東北人车份。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像牡彻,于是被迫代替她去往敵國(guó)和親扫沼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容