執(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:接口展示,顯示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,如下所示:
?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線程等。如下所示:
?如果想要查看單個(gè)度量的詳細(xì)信息气破,我們需要度量名稱傳入到metrics request接口中聊浅,如下所示:
http://localhost:8080/actuator/metrics/{MetricName}
?比如我們想要查看system.cpu.count 度量,如下進(jìn)行訪問(wèn):
loggers
?loggers endpoint 展示了應(yīng)用中可配置的loggers列表和相關(guān)日志等級(jí)现使,我們可以訪問(wèn)接口http://localhost:8878/actuator/loggers低匙,如下所示:
?如果我們想要查看單個(gè)logger的日志配置信息,可以訪問(wèn)如下格式的:
http://localhost:8878/actuator/loggers/{name}
?例如碳锈,我們想要查看com.netflix的日志級(jí)別信息顽冶,如下所示:
?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
動(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可以看出,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在管理健康指標(biāo)開關(guān)的時(shí)候,將類名進(jìn)行了截取做為key企巢,如此我們可以在application.properties中管理如下的HealthIndicator:
?然而枫慷,我們可以發(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顿颅,如下所示:
應(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顯示異常
?也許你會(huì)遇到如上所示的情況,這就說(shuō)明沒(méi)有從META-INF/build-info.properties讀取到信息冰更,你可以檢查一下該文件产徊。
?解決方法:使用spring boot插件構(gòu)建一次。
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插件奠衔。
?接下來(lái)谆刨,我們啟動(dòng)應(yīng)用并訪問(wèn)端點(diǎn)http://localhost:8888/actuator/info,如下所示:
?其中归斤,包含了關(guān)于branch和commit的基礎(chǔ)信息痊夭,如果我們想要獲取更全面的git版本信息,可以在application.properties中進(jìn)行如下配置:
management.info.git.mode=full
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)注明哮针,謝謝。