javascript
Spring Boot 应用监控:Actuator与 Admin
第 III 部分Spring Boot 系統(tǒng)監(jiān)控、測試與運(yùn)維
Spring Boot 應(yīng)用監(jiān)控:Actuator與 Admin
《Spring Boot 實(shí)戰(zhàn)開發(fā)》(陳光劍)
—— 基于 Gradle + Kotlin的企業(yè)級(jí)應(yīng)用開發(fā)最佳實(shí)踐
在企業(yè)級(jí)應(yīng)用中,對(duì)系統(tǒng)進(jìn)行運(yùn)行狀態(tài)監(jiān)控通常是必不可少的。Spring Boot提供了 Actuator 模塊實(shí)現(xiàn)應(yīng)用的監(jiān)控與管理,對(duì)應(yīng)的起步依賴是spring-boot-starter-actuator。
spring-boot-actuator模塊提供了一個(gè)監(jiān)控和管理生產(chǎn)環(huán)境的模塊,可以使用http、jmx、ssh、telnet等拉管理和監(jiān)控應(yīng)用。它提供了應(yīng)用的審計(jì)(Auditing)、健康(health)狀態(tài)信息、數(shù)據(jù)采集(metrics gathering)統(tǒng)計(jì)等監(jiān)控運(yùn)維的功能。同時(shí),我們可以擴(kuò)展 Actuator 端點(diǎn)(Endpoint) 自定義監(jiān)控指標(biāo)。這些指標(biāo)都是以 JSON 接口數(shù)據(jù)的方式呈現(xiàn)。而使用 Spring Boot Admin 可以實(shí)現(xiàn)這些 JSON 接口數(shù)據(jù)的界面展現(xiàn)。
本章介紹 Spring Boot Actuator 和使用Spring Boot Admin實(shí)現(xiàn)對(duì) Spring Boot應(yīng)用的監(jiān)控與管理。
1.1 Actuator簡介
在實(shí)際的生產(chǎn)系統(tǒng)中,我們怎樣知道我們的應(yīng)用運(yùn)行良好呢?我們往往需要對(duì)系統(tǒng)實(shí)際運(yùn)行的情況(例如cpu、io、disk、db、業(yè)務(wù)功能等指標(biāo))進(jìn)行監(jiān)控運(yùn)維。這需要耗費(fèi)我們不少精力來搞這些工作。
在SpringBoot中,我們完全不需要面對(duì)這樣的難題。Spring Boot Actuator 提供了眾多 HTTP 接口端點(diǎn)(Endpoint),其中包含了豐富的 Spring Boot 應(yīng)用程序運(yùn)行時(shí)的內(nèi)部狀態(tài)信息。同時(shí),我們還可以自定義監(jiān)控端點(diǎn)實(shí)現(xiàn)靈活定制。
Actuator是spring boot提供的對(duì)應(yīng)用系統(tǒng)的自省和監(jiān)控功能,Actuator對(duì)應(yīng)用系統(tǒng)本身的自省功能,可以讓我們方便快捷的實(shí)現(xiàn)線上運(yùn)維監(jiān)控的工作。這個(gè)有點(diǎn)DevOps的味道。通過Actuator,我們可以使用數(shù)據(jù)化的指標(biāo)去度量我們的應(yīng)用的運(yùn)行情況。比如查看服務(wù)器的磁盤、內(nèi)存、CPU 等信息,系統(tǒng)運(yùn)行了多少線程,gc的情況,運(yùn)行狀態(tài)等等。
spring-boot-actuator模塊提供了一個(gè)監(jiān)控和管理生產(chǎn)環(huán)境的模塊,可以使用http、jmx、ssh、telnet等拉管理和監(jiān)控應(yīng)用。
隨著devops的興起,以及docker技術(shù)的普及,微服務(wù)在一定場合會(huì)越來越受歡迎。即使不說微服務(wù),springboot這種可以直接內(nèi)嵌web服務(wù)器打成一個(gè)jar包的方式,也更符合devops的趨勢:打成個(gè)jar包,往服務(wù)器上一扔,十分方便,自帶Actuator,把監(jiān)控也給省了一大半,真正做到了可以把精力花在刀刃上。
1.2 啟用 Actuator
在 Spring Boot項(xiàng)目中添加Actuator 起步依賴即可啟用 Actuator 功能。在 Gradle項(xiàng)目配置文件build.gradle中添加如下:
為了看到 Spring Boot 中提供的全部的端點(diǎn)信息,在 Spring Boot 1.5.x 版本中默認(rèn)啟用所有 Endpoint,這些端點(diǎn)如下:
{"links" : [ {"rel" : "self","href" : "http://127.0.0.1:8010/actuator"}, {"rel" : "metrics","href" : "http://127.0.0.1:8010/metrics"}, {"rel" : "autoconfig","href" : "http://127.0.0.1:8010/autoconfig"}, {"rel" : "configprops","href" : "http://127.0.0.1:8010/configprops"}, {"rel" : "dump","href" : "http://127.0.0.1:8010/dump"}, {"rel" : "trace","href" : "http://127.0.0.1:8010/trace"}, {"rel" : "logfile","href" : "http://127.0.0.1:8010/logfile"}, {"rel" : "beans","href" : "http://127.0.0.1:8010/beans"}, {"rel" : "env","href" : "http://127.0.0.1:8010/env"}, {"rel" : "heapdump","href" : "http://127.0.0.1:8010/heapdump"}, {"rel" : "serverEndpoint","href" : "http://127.0.0.1:8010/serverEndpoint"}, {"rel" : "jolokia","href" : "http://127.0.0.1:8010/jolokia"}, {"rel" : "info","href" : "http://127.0.0.1:8010/info"}, {"rel" : "loggers","href" : "http://127.0.0.1:8010/loggers"}, {"rel" : "showEndpoints","href" : "http://127.0.0.1:8010/showEndpoints"}, {"rel" : "auditevents","href" : "http://127.0.0.1:8010/auditevents"}, {"rel" : "health","href" : "http://127.0.0.1:8010/health"}, {"rel" : "docs","href" : "http://127.0.0.1:8010/docs"}, {"rel" : "mappings","href" : "http://127.0.0.1:8010/mappings"} ] }在 Spring Boot 2.0中,Actuator 模塊做了較大更新,默認(rèn)啟用的端點(diǎn)如下:
{ _links: { self: { href: "http://127.0.0.1:8008/actuator", templated: false }, health: { href: "http://127.0.0.1:8008/actuator/health", templated: false }, info: { href: "http://127.0.0.1:8008/actuator/info", templated: false } } }如果想啟用所有 Endpoint,在application.properties中配置如下:
#endpoints in Spring Boot 2.0 #http://127.0.0.1:8008/actuator management.endpoints.enabled-by-default=true management.endpoints.web.expose=*重新啟動(dòng)應(yīng)用,我們將看到一個(gè)信息更全的 Actuator 端點(diǎn)列表,這個(gè)列表我們將在下面小節(jié)中看到。
如果是默認(rèn)啟用所有 Actuator 端點(diǎn),但是想要禁用某些端點(diǎn)信息,可以配置如下:
management.endpoint.beans.enabled=false management.endpoint.info.enabled=false management.endpoint.health.enabled=false這樣再訪問 http://127.0.0.1:8008/actuator ,我們將不會(huì)看到/beans、 /info、/health的端點(diǎn)信息了。另外,我們可以通過 application.properties 中的屬性定制 Actuator 的使用。完整的 Actuator 配置屬性列表參考application.properties 中的:
# ---------------------------------------- # ACTUATOR PROPERTIES # ----------------------------------------部分。這些配置屬性都在management.*命名空間下。
提示 :本節(jié)的實(shí)例工程代碼在:https://github.com/KotlinSpringBoot/ksb_with_security/tree/front_back_end_2018.2.2 中。
更多關(guān)于 Spring Boot 2.0中的 Actuator 的介紹參考:https://docs.spring.io/spring-boot/docs/2.0.x/actuator-api/html/
1.4 自定義Actuator Endpoint
Spring Boot Actuator 模塊提供了靈活的接口,方便我們自己定制監(jiān)控端點(diǎn)。例如Endpoint、PublicMetrics、HealthIndicator、CounterService、GaugeService接口等。 為了跟下一小節(jié)中介紹 Spring Boot Admin (目前僅支持 Spring Boot >=1.5.9.RELEASE and <2.0.0.M1版本)銜接,本節(jié)基于Spring Boot 1.5.10中 Actuator模塊。
1.4.1 Endpoint接口
SpringBoot的Endpoint主要是用來監(jiān)控應(yīng)用服務(wù)的運(yùn)行狀況,并在Mvc中集成以提供HTTP接口。內(nèi)置的Endpoint比如HealthEndpoint會(huì)監(jiān)控disk和db的狀況:
圖14-1 HealthEndpoint會(huì)監(jiān)控disk和db的狀況
MetricsEndpoint則會(huì)監(jiān)控內(nèi)存和gc等指標(biāo)的狀況:
Endpoint的接口協(xié)議如下
public interface Endpoint<T> {String getId();boolean isEnabled();boolean isSensitive();T invoke(); }1.4.2 實(shí)現(xiàn)Endpoint接口
下面我們來自定義一個(gè)顯示當(dāng)前 Spring Boot 應(yīng)用程序運(yùn)行機(jī)器的信息。這個(gè)端點(diǎn)ID 是 /serverEndpoint,輸出的數(shù)據(jù)結(jié)構(gòu)是Map<String, Map<String, String>>, 示例數(shù)據(jù)如下:
完整的實(shí)現(xiàn)代碼在ServerEndpoint.kt 中??蓞⒖际纠こ淘创a。
啟動(dòng)應(yīng)用,通過http://127.0.0.1:8010/actuator 我們可以看到 /serverEndpoint 端點(diǎn)的信息
訪問其中的: http://127.0.0.1:8010/serverEndpoint ,可以看到輸出數(shù)據(jù)如下:
1.4.3 繼承AbstractEndpoint抽象類
Spring Boot Actuator 內(nèi)置的/env 端點(diǎn)實(shí)現(xiàn)代碼在EnvironmentEndpoint中。其中的關(guān)鍵代碼如下:
@ConfigurationProperties(prefix = "endpoints.env") public class EnvironmentEndpoint extends AbstractEndpoint<Map<String, Object>> {…@Overridepublic Map<String, Object> invoke() {Map<String, Object> result = new LinkedHashMap<String, Object>();…}... }可以看出,EnvironmentEndpoint是繼承AbstractEndpoint抽象類,重寫invoke() 方法來實(shí)現(xiàn)的。所以,我們也可以通過這種方法來自定義端點(diǎn)。
下面我們實(shí)現(xiàn)一個(gè)顯示 Spring Boot應(yīng)用中所有端點(diǎn)信息(類似 /actuator 功能)的 /showEndpoints。這個(gè)端點(diǎn)輸出的數(shù)據(jù)結(jié)構(gòu)如下
首先,聲明一個(gè)ShowEndpoints 類,它繼承AbstractEndpoint抽象類并實(shí)現(xiàn)ApplicationContextAware接口:
@Component class ShowEndpoints :AbstractEndpoint<MutableMap<String, MyEndpoint>?>("showEndpoints"),ApplicationContextAware {val log = LoggerFactory.getLogger(ShowEndpoints::class.java)private var applicationContext: ApplicationContext? = null@Throws(BeansException::class)override fun setApplicationContext(applicationContext: ApplicationContext) {this.applicationContext = applicationContext}... }Spring容器會(huì)檢測容器中的所有Bean,如果發(fā)現(xiàn)某個(gè)Bean實(shí)現(xiàn)了ApplicationContextAware接口,Spring容器會(huì)在創(chuàng)建該Bean之后,自動(dòng)調(diào)用該Bean的setApplicationContextAware()方法,將容器對(duì)象本身作為applicationContext實(shí)例變量參數(shù)傳給該方法。
接下來可以通過該applicationContext實(shí)例變量來訪問容器本身。使用ApplicationContext對(duì)象調(diào)用getBeansOfType(Class<T> type) 獲取當(dāng)前 Spring Boot 應(yīng)用程序中所有的 Endpoint 接口類型和MvcEndpoint接口類型的 Bean。相關(guān)代碼是:
完整的實(shí)現(xiàn)代碼可以參看示例工程源代碼.kt。在ShowEndpoints.kt 中,可以參考實(shí)例工程源代碼。
1.4.4 實(shí)現(xiàn)健康指標(biāo)接口HealthIndicator
下面我們在 /health端點(diǎn)中自定義健康信息myCustome,輸出的數(shù)據(jù)如下:
我們只需要實(shí)現(xiàn)HealthIndicator接口即可。HealthIndicator接口協(xié)議如下
package org.springframework.boot.actuate.health; public interface HealthIndicator {Health health(); }具體的實(shí)現(xiàn)代碼如下
@Component class MyCustomHealthIndicator : HealthIndicator {override fun health(): Health {val errorCode = check() // 健康檢查方法示例return if (errorCode != 0) {Health.down().withDetail("Error Code", errorCode).build()} else Health.up().withDetail("imageRepository.selectTest", errorCode).build() // 返回selectTest健康信息}@Autowired lateinit var imageRepository: ImageRepository// 健康檢查方法邏輯private fun check(): Int {return imageRepository.selectTest()} }其中,imageRepository.selectTest()方法代碼是
@Query(value = "select 0", nativeQuery = true) fun selectTest():Int1.4.5 實(shí)現(xiàn)度量指標(biāo)接口PublicMetrics
Actuator 中提供的PublicMetrics接口實(shí)現(xiàn)類有
...
本節(jié) Spring Boot客戶端應(yīng)用源代碼:https://github.com/AK-47-D/cms-spider/tree/boot_admin_2018.2.4
Spring Boot Admin Server 工程源代碼:
https://github.com/KotlinSpringBoot/demo_boot_admin
1.6 本章小結(jié)
Spring Boot Actuator 提供了強(qiáng)大的應(yīng)用自省功能,提供了豐富的 Endpoints 的信息覆蓋 Spring Boot 應(yīng)用程序運(yùn)行的方方面面。同時(shí),結(jié)合可視化的 Spring Boot Admin 管理界面,一切顯得如此“高大上”。而在此過程中,我們只需要極簡的幾步配置即可完成這些事情。這正是 Spring Boot 的“初心” 所在。
下章介紹 Spring Boot 應(yīng)用的測試與部署。
總結(jié)
以上是生活随笔為你收集整理的Spring Boot 应用监控:Actuator与 Admin的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5区块链机会没有公司可以错失
- 下一篇: Java修行之路