SpringBoot | 第二十七章:監控管理之Actuator使用


前言

隨着我們服務越來越多,部署的環境也越來越繁多時,由於各服務都部署在不同的機器上,每當出現問題或者異常時,想快速進行問題的定位就變的麻煩了。所以,本章節開始,開始講解SpringBoot的監控相關知識點。本章節就先來說一說,其自帶的Actuator功能。

一點知識

Spring Boot Actuatorspring boot項目一個監控模塊,提供了很多原生的端點,包含了對應用系統的自省和監控的集成功能,可以查看應用配置的詳細信息,比如應用程序上下文里全部的Bean健康指標環境變量各類重要度量指標等等,這些都是使用可HTTP進行請求訪問。通過這些監控信息,我們就能隨時了解應用的運行情況了。

官方定義

Actuator實踐

特別說明:
最近在編寫SpringCloud的教程,使用的是SpringBoot2.x的版本,其和1.x版本是有區別的,需要額外開啟端點,默認只開啟了info、health兩個端點,其他的需要額外去配置的。本教程還是沿用Spring Boot 1.5.15版本來示例。關於2.x的后續再來更新吧,不然會亂了。。

原生端點

原生端點是在應用程序里提供眾多 Web 接口,通過它們了解應用程序運行時的內部狀況。原生端點又可以分成三類:

  • 應用配置類:可以查看應用在運行期的靜態信息:例如自動配置信息、加載的springbean信息、yml文件配置信息、環境信息、請求映射信息;
  • 度量指標類:主要是運行期的動態信息,例如堆棧、請求連、一些健康指標、metrics信息等;
  • 操作控制類:主要是指shutdown,用戶可以發送一個請求將應用的監控功能關閉。

官網可以看出,原生的端點很多

以下列舉內置的端點相關說明:

ID 描述 是否需要鑒權
actuator 為其他端點提供“發現頁面”。要求Spring HATEOAS在classpath路徑上。 需要
auditevents 陳列當前應用程序的審計事件信息。 需要
autoconfig 展示自動配置信息並且顯示所有自動配置候選人以及他們“被不被”應用的原因。 需要
beans 顯示應用程序中所有Spring bean的完整列表。 需要
configprops 顯示所有配置信息。 需要
dump dump所有線程。 需要
env 陳列所有的環境變量。 需要
flyway Shows any Flyway database migrations that have been applied. 需要
health 顯示應用程序運行狀況信息 不需要
info 顯示應用信息。 不需要
loggers 顯示和修改應用程序中的loggers配置。 需要
liquibase 顯示已經應用的任何Liquibase數據庫遷移。 需要
metrics 顯示當前應用程序的“指標”信息。 需要
mappings 顯示所有@RequestMapping的url整理列表。 需要
shutdown 關閉應用(默認情況下不啟用)。 需要
trace 顯示跟蹤信息(默認最后100個HTTP請求)。 需要

從官網文檔也可以看出,可通過配置文件,修改某端點是否開啟,是否需要鑒權訪問等

Customizing endpoints

如:

# 這里的id 是指訪問的url路徑
endpoints.beans.id=springbeans
# 關閉鑒權
endpoints.beans.sensitive=false
# 開啟shutdown
endpoints.shutdown.enabled=true

至於以上每個端點實際輸出的信息,大家可以看看大佬們的文章或者訪問/docs端點里面也有的,常用的命令輸出都有示例,這里就不貼了。不然文章看起來就冗長了,哈哈~

命令詳解:http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html

訪問/docs端點(如何使用下文有說明):

docs端點訪問

上手實踐

0.加入POM依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- 加入doc文檔 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator-docs</artifactId>
        </dependency>
        <!-- 開啟安全認證 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>        

加入spring-boot-actuator-docs可查看相關文檔,如

docs

1.配置文件(可無),具體的可根據實際業務來配置。

# actuator的訪問路徑
management.context-path=/monitor
# 管理的端口調整成1234
management.port=1234

# 有些需要身份認證才能訪問,可直接關閉鑒權 
#management.security.enabled=true

# 開啟關閉應用端點
endpoints.shutdown.enabled=true

# 安全驗證的賬號密碼
security.user.name=oKong
security.user.password=123456

2.編寫啟動類(普通的啟動類),啟動后,訪問:http://127.0.0.1:1234/monitor/ (因為我們重新指定了訪問端口的上下文為monitor了)

monitor首頁

訪問/monitor/beans,是需要授權的,可以看見需要輸入用戶名和密碼了:

身份鑒權

輸入配置文件里面配置的用戶名和密碼,就可以正常訪問了:
beans

自定義端點

雖然本身SpringBoot已經自帶了很多端點,大部分情況下是夠用了。但對於某些特殊需要時,還是需要自定義端點來滿足的。接下來就簡單講解下自定義端點的創建。

自定義健康端點

健康信息可以用來檢查應用的運行狀態。所以經常被監控軟件用來提醒生產系統是否停止,數據庫是否正常,或者redis是否啟動等等,而且一般上健康端點的信息都是比較敏感的,應加入身份鑒權。

自動配置的健康端點有:

Auto-configured HealthIndicators

簡單說明下:

名稱 描述
CassandraHealthIndicator 檢查 Cassandra 數據庫是否啟動。
DiskSpaceHealthIndicator 檢查磁盤空間不足。
DataSourceHealthIndicator 檢查是否可以獲得連接 DataSource
ElasticsearchHealthIndicator 檢查 Elasticsearch 集群是否啟動。
InfluxDbHealthIndicator 檢查 InfluxDB 服務器是否啟動。
JmsHealthIndicator 檢查 JMS 代理是否啟動。
MailHealthIndicator 檢查郵件服務器是否啟動。
MongoHealthIndicator 檢查 Mongo 數據庫是否啟動。
Neo4jHealthIndicator 檢查 Neo4j 服務器是否啟動。
RabbitHealthIndicator 檢查 Rabbit 服務器是否啟動。
RedisHealthIndicator 檢查 Redis 服務器是否啟動。
SolrHealthIndicator 檢查 Solr 服務器是否已啟動。

這些端點,在spring-boot-starter-xxx包被依賴導入后,利用@Conditional等注解進行自動加載的,具體可以看看org.springframework.boot.actuate.autoconfigure包下的自動加載類。

HealthIndicatorAutoConfiguration

比如,上圖中的,當我們加入spring-boot-starter-data-redis依賴后,RedisHealthIndicator就會自動被裝載了,這個時候我們訪問下:http://127.0.0.1:1234/monitor/health ,可以看見redis節點有顯示了,狀態是關閉

health

其他的都是類似的,具體可以看看源碼。接下來,我們通過繼承AbstractHealthIndicator來自定義一個監控端點(當然也可以實現 HealthIndicator接口的)

CustomHealthIndicator.java

/**
 * 自定義健康端點 繼承AbstractHealthIndicator類 也可以實現 HealthIndicator接口的
 * @author oKong
 *
 */
//這里也可以使用 類似@ConditionalOnMissingBean寫法自動加載的
//這里的name 就是默認健康節點的名稱了
@Component("oKong")
public class CustomHealthIndicator extends AbstractHealthIndicator{

    @Override
    protected void doHealthCheck(Builder builder) throws Exception {
        //設置健康信息
        builder.withDetail("code", "0123")
               .withDetail("version", "v0.1")
               //有其他信息可繼續添加的
               .up().build();
    }

}

最后效果:

自定義健康端點

{
    "status": "DOWN",
    "oKong": {
        "status": "UP",
        "code": "0123",
        "version": "v0.1"
    },
    "diskSpace": {
        "status": "UP",
        "total": 120032587776,
        "free": 8374538240,
        "threshold": 10485760
    },
    "redis": {
        "status": "DOWN",
        "error": "org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool"
    }
}

這方面用的不多,至於其他詳細信息,可以查看官網:Security with HealthIndicators

Writing custom HealthIndicators

自定義端點

出來在原來內置的端點進行添加,訪問的路徑還是內置的路徑,我們還能通過完全自定義一個端點來實現我們的業務需求的。

首先,我們來看看健康端點對應的類org.springframework.boot.actuate.endpoint.HealthEndpoint,其是繼承了AbstractEndpoint<T>來實現的。通過IDE我們也能看到,大部分的端點都是繼承此抽象類來完成的。

AbstractEndpoint繼承類

所以,我們也通過繼承此類來實現自定義端點。
CustomEndPoint.java

/**
 * 自定義端點
 * @author oKong
 *
 */
@Component
@ConfigurationProperties(prefix = "endpoints.oKong")
public class CustomEndPoint extends AbstractEndpoint<Map<String,Object>>{

    public CustomEndPoint() {
        //設置ID 即訪問路徑 :/oKong
        super("oKong");    
    }

    /**
     * 返回信息
     */
    @Override
    public Map<String, Object> invoke() {
         Map<String, Object> result = new HashMap<>();
         result.put("author", "oKong");
         result.put("chapter", "chapter27");
         result.put("mp", "lqdevOps");
         return result;
    }

}

訪問oKong

加入了@ConfigurationProperties后可在配置文件中,設置是否開啟等等。當然也可以加入自定義的參數了,這里就默認了,沒有添加額外的參數。

參考資料

  1. https://docs.spring.io/spring-boot/docs/1.5.15.RELEASE/reference/htmlsingle/#production-ready

  2. https://www.jianshu.com/p/af9738634a21

總結

本注解主要介紹了一些原生端點和自定義端點的相關實踐。對於一般的信息,使用使用這些原生的端點就能基本滿足了,但由於返回的是json串,不夠明了。下一章節就介紹下,利用Spring Boot Admin進行可視化的監控,比如有圖表信息、查看日志輸出等等,通過界面來進行展現。

最后

目前互聯網上很多大佬都有SpringBoot系列教程,如有雷同,請多多包涵了。原創不易,碼字不易,還希望大家多多支持。若文中有所錯誤之處,還望提出,謝謝。

老生常談

  • 個人QQ:499452441
  • 微信公眾號:lqdevOps

公眾號

個人博客:http://blog.lqdev.cn

完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-27

原文地址:http://blog.lqdev.cn/2018/09/11/springboot/chapter-twenty-seven/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM