SpringBoot 指標監控actuator的專題

1.寫在前面

首先肯定要說一下SpringBoot的四大核心瞭:

  • 自動裝配:簡單配置甚至零配置即可運行項目
  • 起步依賴:場景啟動器
  • Actuator:指標監控
  • 命令行界面 :命令行

這篇文章呢,我來和大傢聊聊指標監控這個東西。

2.SpringBoot Actuator

未來每一個微服務在雲上部署以後,我們都需要對其進行監控、追蹤、審計、控制等。SpringBoot就抽取瞭Actuator場景,使得我們每個微服務快速引用即可獲得生產級別的應用監控、審計等功能。

要開啟指標監控功能,首先需要在pom文件種添加如下依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

然後在配置文件中先做如下配置:

server:
  port: 8080
 
# 暴露所有監控信息為HTTP
management:
  endpoints:
    enabled-by-default: true # 默認開啟所有監控端點信息
    web:
      exposure:
        include: '*' # 以web方式暴露所有端點

然後啟動項目,進行測試:

下圖中測試得到的內容就是目前項目中可以監控到的各種指標參數信息。

在指標監控這個功能中,有一個經常提到的詞叫:端點。那麼常用常見的端點如下圖:👇👇👇

上面我們訪問指標監控的url是:http://localhost:8080/actuator/ 即可獲取到所有端點信息。那麼如果想要獲取某個端點信息,url就應該是:

http://localhost:8080/actuator/endpointName/detailPath。

健康檢查端點,我們一般用於在雲平臺,平臺會定時的檢查應用的健康狀況,我們就需要Health Endpoint可以為平臺返回當前應用的一系列組件健康狀況的集合。

重要的幾點:

  • health endpoint返回的結果,應該是一系列健康檢查後的一個匯總報告
  • 很多的健康檢查默認已經自動配置好瞭,比如:數據庫、redis等
  • 可以很容易的添加自定義的健康檢查機制

提供詳細的、層級的、空間指標信息,這些信息可以被pull(主動推送)或者push(被動獲取)方式得到;

  • 通過Metrics對接多種監控系統
  • 簡化核心Metrics開發
  • 添加自定義Metrics或者擴展已有Metrics

上面的這些測試結果就是我們根據當前項目,獲取到某個端點的詳細指標信息。

除此之外,我們也可以對這些端點進行手動開啟或者禁用。(參見下面的配置文件)

server:
  port: 8080
 
# 暴露所有監控信息為HTTP
management:
  endpoints:
    enabled-by-default: false # 默認開啟所有監控端點信息
    web:
      exposure:
        include: '*' # 以web方式暴露所有端點
# 需要開啟或者禁用某個Endpoint
# 配置模式為 management.endpoint.<endpointName>.enabled = true/false
  endpoint:
    health:
      show-details: always # 總是顯示health端點的詳細信息
      enabled: true
    info:
      enabled: true
    beans:
      enabled: true
 

上面的測試截圖就是我們手動的開啟某些端點、同時關閉瞭某些端點之後的結果。

3.定制化Endpoint

3.1 定制health端點信息

以上的所有內容都是在使用SpringBoot為我們提供的官方的Endpoint,那麼我們也是可以自定義Endpoint的(也即定制化Endpoint)。

有兩種方式:①繼承AbstractHealthIndicator抽象類(doHealthCheck(Health.Builder builder)方法);②實現HealthIndicator接口(重寫health()方法)。我是用第一種方法簡單做個測試吧。

package com.szh.boot.health;
 
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.Status;
import org.springframework.stereotype.Component;
 
import java.util.HashMap;
import java.util.Map;
 
/**
 *
 */
@Component
public class MyComHealthIndicator extends AbstractHealthIndicator {
 
    /**
     * 真實的檢查方法
     * @param builder
     * @throws Exception
     */
    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        Map<String,Object> map = new HashMap<>();
        //模擬檢查過程
        if (1 == 1) {
//            builder.up(); //健康
            builder.status(Status.UP);
            map.put("count",1);
            map.put("ms",100);
        } else {
//            builder.down(); //宕機
            builder.status(Status.DOWN);
            map.put("error","連接超時");
            map.put("ms",3000);
        }
 
        builder.withDetail("code",20001)
                .withDetails(map);
    }
}

配置文件如下:👇👇👇

server:
  port: 8080
 
# 暴露所有監控信息為HTTP
management:
  endpoints:
    enabled-by-default: false # 默認開啟所有監控端點信息
    web:
      exposure:
        include: '*' # 以web方式暴露所有端點
# 需要開啟或者禁用某個Endpoint
# 配置模式為 management.endpoint.<endpointName>.enabled = true/false
  endpoint:
    health:
      show-details: always # 總是顯示health端點的詳細信息
      enabled: true

然後我們啟動測試,訪問路徑:http://localhost:8080/actuator/health。從結果中看到有一個端點myCom就是我們自定義的(命名方式就是 MyComHealthIndicator 類去掉後面的 HealthIndicator)。

3.2 定制info端點信息

首先在配置文件中添加如下內容:(最後幾行)

server:
  port: 8080
 
# 暴露所有監控信息為HTTP
management:
  endpoints:
    enabled-by-default: false # 默認開啟所有監控端點信息
    web:
      exposure:
        include: '*' # 以web方式暴露所有端點
# 需要開啟或者禁用某個Endpoint
# 配置模式為 management.endpoint.<endpointName>.enabled = true/false
  endpoint:
    health:
      show-details: always # 總是顯示health端點的詳細信息
      enabled: true
    info:
      enabled: true
    beans:
      enabled: true
info:
  appName: spring-boot-actuator-endpoint-info
  version: 2.0.0
  mavenProjectName: @project.artifactId@
  mavenProjectVersion: @project.version@

然後創建一個類,實現 InfoContributor 這個接口,並且重寫接口中的 contribute(Info.Builder builder) 方法。

package com.szh.boot.info;
 
import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;
 
import java.util.Collections;
 
/**
 *
 */
@Component
public class ExampleInfoContributor implements InfoContributor {
 
    @Override
    public void contribute(Info.Builder builder) {
        builder.withDetail("example", Collections.singletonMap("key","value"));
    }
 
}

最後我們啟動測試一下,訪問路徑:http://localhost:8080/actuator/info。得到的數據就是我們上面通過代碼寫好的內容。

到此這篇關於SpringBoot 指標監控actuator的專題的文章就介紹到這瞭,更多相關SpringBoot 指標監控內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: