使用Actuator 實(shí)現(xiàn)Spring Boot應(yīng)用監(jiān)控
本文轉(zhuǎn)載自微信公眾號(hào)「架構(gòu)師精進(jìn)」,作者章為忠。轉(zhuǎn)載本文請(qǐng)聯(lián)系架構(gòu)師精進(jìn)公眾號(hào)。
我們知道Spring Boot 提供了Actuator組件,方便我們對(duì)應(yīng)用程序進(jìn)行監(jiān)控和維護(hù)。接下來(lái),就來(lái)介紹Actuator到底是什么?如何在Spring Boot項(xiàng)目中快速集成Actuator?
一、Actuator簡(jiǎn)介
1.Actuator是什么?
Actuator是Spring Boot提供的應(yīng)用系統(tǒng)監(jiān)控的開(kāi)源框架,它是Spring Boot體系中非常重要的組件。它可以輕松實(shí)現(xiàn)應(yīng)用程序的監(jiān)控治理。支持通過(guò)眾多 REST接口、遠(yuǎn)程Shell和JMX收集應(yīng)用的運(yùn)行情況。
2.端點(diǎn)(Endpoint)
Actuator的核心是端點(diǎn)(Endpoint),它用來(lái)監(jiān)視、提供應(yīng)用程序的信息,Spring Boot提供的spring-boot-actuator組件中已經(jīng)內(nèi)置了非常多的 Endpoint(health、info、beans、metrics、httptrace、shutdown等),每個(gè)端點(diǎn)都可以啟用和禁用。Actuator也允許我們擴(kuò)展自己的端點(diǎn)。通過(guò)JMX或HTTP的形式暴露自定義端點(diǎn)。
Actuator會(huì)將自定義端點(diǎn)的ID默認(rèn)映射到一個(gè)帶/actuator前綴的URL。比如,health端點(diǎn)默認(rèn)映射到/actuator/health。這樣就可以通過(guò)HTTP的形式獲取自定義端點(diǎn)的數(shù)據(jù)。
Actuator同時(shí)還可以與外部應(yīng)用監(jiān)控系統(tǒng)整合,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等。這些系統(tǒng)提供了非常好的儀表盤、圖標(biāo)、分析和告警等功能,使得你可以通過(guò)統(tǒng)一的接口輕松的監(jiān)控和管理你的應(yīng)用系統(tǒng)。這對(duì)于實(shí)施微服務(wù)的中小團(tuán)隊(duì)來(lái)說(shuō),無(wú)疑快速高效的解決方案。
二、Spring Boot集成Actuator
在Spring Boot項(xiàng)目中集成Actuator非常簡(jiǎn)單,只需要在項(xiàng)目中添加spring-boot-starter-actuator組件,就能自動(dòng)啟動(dòng)應(yīng)用監(jiān)控的功能。
首先,創(chuàng)建一個(gè)Spring Boot項(xiàng)目來(lái)添加spring-boot-starter-actuator依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
上面的示例所示,我們添加了actuator和web兩個(gè)組件。spring-boot-starter-actuator除了可以監(jiān)控Web系統(tǒng)外,還可以監(jiān)控后臺(tái)服務(wù)等Spring Boot應(yīng)用。
然后,修改配置文件,配置Actuator端點(diǎn)
# 打開(kāi)所有的監(jiān)控點(diǎn)
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
最后,啟動(dòng)項(xiàng)目并在瀏覽器中輸入http://localhost:8080/actuator,我們可以看到返回的是Actuator提供的各種數(shù)據(jù)接口信息。
Actuator提供了豐富的數(shù)據(jù)接口,包括/health、/env、/metrics等。下面我們請(qǐng)求其中的一個(gè)地址/actuator/health,查看接口返回的詳細(xì)信息。
如圖上圖所示,/health接口返回了系統(tǒng)詳細(xì)的健康狀態(tài)信息,包括系統(tǒng)的狀態(tài)(UP為正常)、磁盤使用情況等信息。
三、自定義端點(diǎn)
Spring Boot支持自定義端點(diǎn),只需要在我們定義的類中使用@Endpoint、@JmxEndpoint、@WebEndpoint等注解,實(shí)現(xiàn)對(duì)應(yīng)的方法即可定義一個(gè)Actuator中的自定義端點(diǎn)。從Spring Boot 2.x版本開(kāi)始,Actuator支持CRUD(增刪改查)模型,而不是舊的RW(讀/寫(xiě))模型。我們可以按照3種策略來(lái)自定義:
- 使用@Endpoint注解,同時(shí)支持JMX和HTTP方式。
- 使用@JmxEndpoint 注解,只支持JMX技術(shù)。
- 使用@WebEndpoint注解,只支持HTTP。
編寫(xiě)自定義端點(diǎn)類很簡(jiǎn)單,首先需要在類前面使用@Endpoint注解,然后在類的方法上使用@ReadOperation、@WriteOperation或@DeleteOperation(分別對(duì)應(yīng)HTTP中的GET、POST、DELETE)等注解獲取、設(shè)置端點(diǎn)信息。
下面我們創(chuàng)建一個(gè)獲取系統(tǒng)當(dāng)前時(shí)間的自定義端點(diǎn)。
首先,創(chuàng)建自定義端點(diǎn)類SystemTimeEndpoint,使用@Endpoint注解聲明端點(diǎn)ID,同時(shí)需要使用@Component注解,將此類交給Spring Boot管理。示例代碼如下:
/*
* 自定義端點(diǎn)類
* @Endpoint //表示這是一個(gè)自定義事件端點(diǎn)類
* Endpoint 中有一個(gè)id //它是設(shè)置端點(diǎn)的URL路徑
* */
@Endpoint(id="systemtime") //端點(diǎn)路徑不要與系統(tǒng)自帶的重合
@Component
public class SystemTimeEndpoint {
//一般端點(diǎn)都是對(duì)象,或者一個(gè)json返回的格式,所以通常我們會(huì)將端點(diǎn)定義一個(gè)MAP的返回形式
//通過(guò)ReadOperation
//訪問(wèn)地址是根據(jù)前綴+ endpoint 的ID
///actuator/systemtime
private String format = "yyyy-MM-dd HH:mm:ss";
@ReadOperation //顯示監(jiān)控指標(biāo)
public Map<String,Object> info(){
Map<String,Object> info = new HashMap<>();
info.put("system","數(shù)據(jù)管理服務(wù)");
info.put("memo","系統(tǒng)當(dāng)前時(shí)間端點(diǎn)");
info.put("datetime",new SimpleDateFormat(format).format(new Date()));
return info;
}
//動(dòng)態(tài)修改指標(biāo)
@WriteOperation //動(dòng)態(tài)修改指標(biāo),是以post方式修改
public void setFormat(String format){
this.format = format;
}
}
上面的示例中,我們通過(guò)@Endpoint注解定義一個(gè)自定義端點(diǎn),參數(shù)id為自定義端點(diǎn)的唯一標(biāo)識(shí)和訪問(wèn)路徑,必須唯一不重復(fù)。
做好這些配置后,就能訪問(wèn)http://127.0.0.1:8080/actuator/systemtime端點(diǎn)了,如圖下圖所示。
最后
以上,Actuator到底是什么,如何在Spring Boot項(xiàng)目中快速集成Actuator介紹完了。Actuator是Spring Boot 提供的非常重要的應(yīng)用監(jiān)控組件,希望大家能熟悉掌握。后面還會(huì)介紹搭建完整的Spring Boot應(yīng)用監(jiān)控平臺(tái)。敬請(qǐng)關(guān)注。