Spring Boot Actuator詳解與深刻應用(一):Actuator 1.x

《Spring Boot Actuator詳解與深刻應用》預計包括三篇,第一篇重點講Spring Boot Actuator 1.x的應用與定製端點;第二篇將會對比Spring Boot Actuator 2.x 與1.x的區別,以及應用和定製2.x的端點;第三篇將會介紹Actuator metric指標與Prometheus和Grafana的使用結合。這部份內容很經常使用,且較爲入門,歡迎你們的關注。html

Actuator是什麼

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>
複製代碼

Spring Boot Actuator 1.x

在1.x中,Actuator遵循讀寫模型,這意味着咱們能夠從中讀取信息或寫入信息。咱們能夠檢索指標或咱們的應用程序的健康情況,固然咱們也能夠優雅地終止咱們的應用程序或更改咱們的日誌配置。Actuator經過Spring MVC暴露其HTTP端點。安全

端點

當引入的Actuator的版本爲1.x時,啓動應用服務,能夠控制檯輸出以下的端點信息:bash

咱們介紹一下經常使用的endpoints:微信

  • /health:顯示應用程序運行情況信息(經過未經身份驗證的鏈接訪問時的簡單「狀態」或通過身份驗證時的完整消息詳細信息),它默認不敏感
  • /info:顯示應用程序信息,默認狀況下不敏感
  • /metrics:顯示當前應用程序的「指標」信息,它默認也很敏感
  • /trace:顯示跟蹤信息(默認狀況下是最後幾個HTTP請求)

有些端點默認並不會被開啓,如/shutdown。網絡

配置端點

咱們能夠自定義每一個端點的屬性,按照以下的格式:

endpoints.[endpoint name].[property to customize]
複製代碼

能夠自定義的屬性有以下三個:

  • id,暴露的http端點地址
  • enabled,是否開啓
  • sensitive,當爲true時,須要認證以後纔會經過http獲取到敏感信息

咱們在配置文件中增長以下的配置,將會定製/beans端點。

endpoints.beans.id=springbeans
endpoints.beans.sensitive=false
endpoints.beans.enabled=true
複製代碼

/health端點

/health端點用於監控運行的服務實例狀態,當服務實例下線或者由於其餘的緣由變得異常(如DB鏈接不上,磁盤缺乏空間)時,將會及時通知運維人員。

在默認未受權的狀況下,經過HTTP的方式僅會返回以下的簡單信息:

{
	"status": "UP"
}
複製代碼

獲取詳細的health信息

咱們進行以下的配置:

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指示器。它能夠收集特定於應用程序的任何類型的自定義運行情況數據,並經過/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端點,咱們能夠爲應用服務定義一些基本信息:

info.app.name=Spring Sample Application
info.app.description=This is my first spring boot application
info.app.version=1.0.0
複製代碼

咱們在如上的配置中定義了服務名、描述和服務的版本號。

/metrics端點

/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端點

爲了收集自定義的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…

訂閱最新文章,歡迎關注個人公衆號

微信公衆號

參考

  1. Actuator docs
  2. Spring Boot Actuator
相關文章
相關標籤/搜索