《Spring Boot Actuator詳解與深刻應用》預計包括三篇,第一篇重點講Spring Boot Actuator 1.x的應用與定製端點;第二篇將會對比Spring Boot Actuator 2.x 與1.x的區別,以及應用和定製2.x的端點;第三篇將會介紹Actuator metric指標與Prometheus和Grafana的使用結合。這部份內容很經常使用,且較爲入門,歡迎你們的關注。html
Spring Boot Actuator提供了生產上常常用到的功能(如健康檢查,審計,指標收集,HTTP跟蹤等),幫助咱們監控和管理Spring Boot應用程序。這些功能均可以經過JMX或HTTP端點訪問。java
經過引入相關的依賴,便可監控咱們的應用程序,收集指標、瞭解流量或數據庫的狀態變得很簡單。該庫的主要好處是咱們能夠得到生產級工具,而無需本身實際實現這些功能。與大多數Spring模塊同樣,咱們能夠經過多種方式輕鬆配置或擴展它。git
Actuator還能夠與外部應用監控系統集成,如Prometheus,Graphite,DataDog,Influx,Wavefront,New Relic等等。 這些系統爲您提供出色的儀表板,圖形,分析和警報,以幫助咱們在一個統一界面監控和管理應用服務。github
本文將會介紹Spring Boot Actuator 1.x 包括其中的端點(HTTP端點)、配置管理以及擴展和自定義端點。spring
引入以下的依賴:數據庫
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
複製代碼
在1.x中,Actuator遵循讀寫模型,這意味着咱們能夠從中讀取信息或寫入信息。咱們能夠檢索指標或咱們的應用程序的健康情況,固然咱們也能夠優雅地終止咱們的應用程序或更改咱們的日誌配置。Actuator經過Spring MVC暴露其HTTP端點。安全
當引入的Actuator的版本爲1.x時,啓動應用服務,能夠控制檯輸出以下的端點信息:bash
咱們介紹一下經常使用的endpoints:微信
有些端點默認並不會被開啓,如/shutdown。網絡
咱們能夠自定義每一個端點的屬性,按照以下的格式:
endpoints.[endpoint name].[property to customize]
複製代碼
能夠自定義的屬性有以下三個:
咱們在配置文件中增長以下的配置,將會定製/beans端點。
endpoints.beans.id=springbeans
endpoints.beans.sensitive=false
endpoints.beans.enabled=true
複製代碼
/health端點用於監控運行的服務實例狀態,當服務實例下線或者由於其餘的緣由變得異常(如DB鏈接不上,磁盤缺乏空間)時,將會及時通知運維人員。
在默認未受權的狀況下,經過HTTP的方式僅會返回以下的簡單信息:
{
"status": "UP"
}
複製代碼
咱們進行以下的配置:
endpoints:
health:
id: chealth
sensitive: false
management.security.enabled: false
複製代碼
如上一小節所述,咱們更改了/health端點的訪問路徑爲/chealth,並將安全受權關閉。訪問http://localhost:8005/chealth
將會獲得以下的結果。
{
"status": "UP",
"healthCheck": {
"status": "UP"
},
"diskSpace": {
"status": "UP",
"total": 999995129856,
"free": 762513104896,
"threshold": 10485760
}
}
複製代碼
咱們還能夠定製實現health指示器。它能夠收集特定於應用程序的任何類型的自定義運行情況數據,並經過/health端點訪問到定義的信息。
@Component
public class HealthCheck 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();
}
public int check() {
// Our logic to check health
return 0;
}
}
複製代碼
實現HealthIndicator
接口,並覆寫其中的health()
方法便可自定義咱們的/health端點。
經過/info端點,咱們能夠爲應用服務定義一些基本信息:
info.app.name=Spring Sample Application
info.app.description=This is my first spring boot application
info.app.version=1.0.0
複製代碼
咱們在如上的配置中定義了服務名、描述和服務的版本號。
/metrics端點展現了OS、JVM和應用級別的指標信息。當開啓以後,咱們能夠獲取內存、堆、線程、線程池、類加載和HTTP等信息。
{
"mem": 417304,
"mem.free": 231678,
"processors": 4,
"instance.uptime": 248325,
"uptime": 250921,
"systemload.average": 1.9541015625,
"heap.committed": 375296,
"heap.init": 393216,
"heap.used": 143617,
"heap": 5592576,
"nonheap.committed": 43104,
"nonheap.init": 2496,
"nonheap.used": 42010,
"nonheap": 0,
"threads.peak": 30,
"threads.daemon": 18,
"threads.totalStarted": 46,
"threads": 20,
"classes": 6020,
"classes.loaded": 6020,
"classes.unloaded": 0,
"gc.ps_scavenge.count": 3,
"gc.ps_scavenge.time": 35,
"gc.ps_marksweep.count": 1,
"gc.ps_marksweep.time": 29,
"httpsessions.max": -1,
"httpsessions.active": 0,
"gauge.response.info": 38.0,
"counter.status.200.info": 1
}
複製代碼
爲了收集自定義的metrics,Actuator支持單數值記錄的功能,簡單的增長/減小計數功能。以下的實現,咱們將登陸成功和失敗的次數做爲自定義指標記錄下來。
@Service
public class LoginServiceImpl implements LoginService {
private final CounterService counterService;
@Autowired
public LoginServiceImpl(CounterService counterService) {
this.counterService = counterService;
}
@Override
public Boolean login(String userName, char[] password) {
boolean success;
if (userName.equals("admin") && "secret".toCharArray().equals(password)) {
counterService.increment("counter.login.success");
success = true;
} else {
counterService.increment("counter.login.failure");
success = false;
}
return success;
}
}
複製代碼
再次訪問/metrics,發現多了以下的指標信息。登陸嘗試和其餘安全相關事件在Actuator中可用做審計事件。
{
"gauge.response.metrics": 2.0,
"gauge.response.test": 3.0,
"gauge.response.star-star.favicon.ico": 1.0,
"counter.status.200.star-star.favicon.ico": 10,
"counter.status.200.test": 6,
"counter.login.failure": 6,
"counter.status.200.metrics": 4
}
複製代碼
除了使用Spring Boot Actuator提供的端點,咱們也能夠定義一個全新的端點。
首先,咱們須要實現Endpoint
接口:
@Component
public class CustomEndpoint implements Endpoint<List<String>> {
@Override
public String getId() {
return "custom";
}
@Override
public boolean isEnabled() {
return true;
}
@Override
public boolean isSensitive() {
return false;
}
@Override
public List<String> invoke() {
// Custom logic to build the output
List<String> messages = new ArrayList<String>();
messages.add("This is message 1");
messages.add("This is message 2");
return messages;
}
}
複製代碼
getId()
方法用於匹配訪問這個端點,當咱們訪問/custom時,將會調用invoke()
咱們自定義的邏輯。 另外兩個方法,用於設置是否開啓和是否爲敏感的端點。
[ "This is message 1", "This is message 2" ]
複製代碼
出於安全考慮,咱們可能選擇經過非標準端口暴露Actuator端點。經過management.port屬性來配置它。
另外,正如咱們已經提到的那樣,在1.x. Actuator基於Spring Security配置本身的安全模型,但獨立於應用程序的其他部分。
所以,咱們能夠更改management.address屬性以限制能夠經過網絡訪問端點的位置:
#port used to expose actuator
management.port=8081
#CIDR allowed to hit actuator
management.address=127.0.0.1
複製代碼
此外,除了/info端點,其餘全部的端點默認都是敏感的,若是引入了Spring Security,咱們經過在配置文件中定義這些安全的屬性(username, password, role)來確保內置端點的安全。
Spring Boot Actuator爲咱們的應用服務在生產環境提供了不少開箱即用的功能。本文主要講解了Spring Boot Actuator 1.x的深刻使用。咱們既可使用內置的端點(如/health,/info等),能夠在這些端點的基礎進行擴展和定製,還能夠自定義全新的端點,在使用方式上顯得很是靈活。 本文源碼:github.com/keets2012/S…