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

前言

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

一點知識

Spring Boot Actuatorspring boot項目一個監控模塊,提供了不少原生的端點,包含了對應用系統的自省和監控的集成功能,能夠查看應用配置的詳細信息,好比應用程序上下文裏所有的Bean健康指標環境變量各種重要度量指標等等,這些都是使用可HTTP進行請求訪問。經過這些監控信息,咱們就能隨時瞭解應用的運行狀況了。java

官方定義

Actuator實踐

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

原生端點

原生端點是在應用程序裏提供衆多 Web 接口,經過它們瞭解應用程序運行時的內部情況。原生端點又能夠分紅三類:github

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

官網能夠看出,原生的端點不少redis

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

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

如:json

# 這裏的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.htmlspringboot

訪問/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/

相關文章
相關標籤/搜索