Spring Boot Actuator詳解

執(zhí)行器(Actuator)是一個(gè)制造業(yè)術(shù)語,指的是用于移動或控制東西的一個(gè)機(jī)械裝置,一個(gè)很小的改變就能讓執(zhí)行器產(chǎn)生大量的運(yùn)動。

前言

?在當(dāng)下流行的Service Mesh架構(gòu)中,由于Spring boot框架的種種優(yōu)點(diǎn),它特別適合作為其中的應(yīng)用開發(fā)框架。

Service Mesh的微服務(wù)架構(gòu),主要特點(diǎn)是將服務(wù)開發(fā)和服務(wù)治理分離開來,然后再結(jié)合容器化的Paas平臺,將它們?nèi)诤掀饋?,這依賴的都是互相之間默契的配合。也就是說各自都暴露出標(biāo)準(zhǔn)的接口,可以通過這些接口互相交織在一起。

?由于微服務(wù)之后,系統(tǒng)結(jié)構(gòu)拆分隨著業(yè)務(wù)發(fā)展越來越微型化,也意味著節(jié)點(diǎn)會呈現(xiàn)幾何數(shù)量級增長。每個(gè)一個(gè)節(jié)點(diǎn)都是系統(tǒng)組成部分,如何保持如此多節(jié)點(diǎn)的可用性是一件非常有挑戰(zhàn)的工作。全方位的監(jiān)控變得越來越重要,當(dāng)我們遇到bug時(shí),總是希望可以看到更多信息,因此一般我們選用的服務(wù)開發(fā)框架都需要有方便又強(qiáng)大的監(jiān)控功能支持。
?Spring Boot Actuator便可以幫助我們?nèi)矫姹O(jiān)控應(yīng)用節(jié)點(diǎn),比如健康檢查、審計(jì)、統(tǒng)計(jì)、HTTP追蹤等。我們可以通過JMX或者HTTP endpoints來獲得。spring Boot Admin配合下可以進(jìn)行頁面展示,也和可以與其它外部應(yīng)用系統(tǒng)系統(tǒng)整合。。

Actuator的使用方法

?在Spring Boot應(yīng)用中,要實(shí)現(xiàn)監(jiān)控的功能,只需要依賴組件spring-boot-starter-actuator。它提供了很多監(jiān)控和管理你的spring boot應(yīng)用的HTTP或者JMX端點(diǎn),并且你可以有選擇地開啟和關(guān)閉部分功能。當(dāng)你的spring boot應(yīng)用中引入依賴之后,將自動擁有審計(jì)、健康檢查、Metrics監(jiān)控功能。如下,組件依賴:

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

?在引入上述的組件jar之后,我們先看看actuator提供了哪些接口,這些接口提供了什么功能?

ednpoints

?在應(yīng)用啟動之后,我們首先訪問/actuator,如下所示:


actuator接口.png
  • /actuator:接口展示,顯示actuator提供的訪問接口,上圖顯示的是3個(gè),不過這只是默認(rèn)顯示,我們可以進(jìn)行配置管理。
  • /actuator/health:健康檢查,顯示應(yīng)用健康信息
  • /actuator/info:應(yīng)用信息,展示了關(guān)于應(yīng)用的一般信息,這些信息從編譯文件比如META-INF/build-info.properties或者Git文件比如git.properties或者任何環(huán)境的property中獲取。

?我們先看一下健康檢查接口,訪問http://localhost:8888/actuator/health,如下所示:

health接口.png

?status值為UP說明應(yīng)用是健康的,如果應(yīng)用不健康,將會顯示DOWN。
?默認(rèn)情況下,只有 health 和 info 通過 HTTP 暴露出來,所以 /actuator 只展示了 health 和 info endpoints。如何暴露其他的 endpoints ?首先,讓我們先了解一下其他的endpoints。我們可以在《endpoints官網(wǎng)說明》 查看完整的列表,下面介紹一些常用的:

Endpoint ID Description
auditevent 顯示應(yīng)用暴露的審計(jì)事件(比如認(rèn)證進(jìn)入、訂單失?。?/td>
info 顯示應(yīng)用的基本信息
health 顯示應(yīng)用的健康狀態(tài)
metrics 顯示應(yīng)用多樣的度量信息
loggers 顯示和修改配置的loggers
logfile 返回log file中的內(nèi)容(如果logging.file或者logging.path被設(shè)置)
httptrace 顯示HTTP足跡,最近100個(gè)HTTP request/reponse
env 顯示當(dāng)前的環(huán)境特性
flyway 顯示數(shù)據(jù)庫遷移路徑的詳細(xì)信息
shutdown 優(yōu)雅地逐步關(guān)閉應(yīng)用
mappings 顯示所有的@RequestMapping路徑
scheduledtasks 顯示應(yīng)用中的調(diào)度任務(wù)
threaddump 執(zhí)行一個(gè)線程dump
heapdump 返回一個(gè)GZip壓縮的JVM堆dump

metrics

?metrics endpoint展示了你可以追蹤的度量,例如jvm內(nèi)存、cpu使用、jvm線程等。如下所示:


metrics endpoint.png

?如果想要查看單個(gè)度量的詳細(xì)信息,我們需要度量名稱傳入到metrics request接口中,如下所示:

http://localhost:8080/actuator/metrics/{MetricName}

?比如我們想要查看system.cpu.count 度量,如下進(jìn)行訪問:


metrics度量查看.png

loggers

?loggers endpoint 展示了應(yīng)用中可配置的loggers列表和相關(guān)日志等級,我們可以訪問接口http://localhost:8878/actuator/loggers,如下所示:

loggers日志等級查看.png

?如果我們想要查看單個(gè)logger的日志配置信息,可以訪問如下格式的:

http://localhost:8878/actuator/loggers/{name}

?例如,我們想要查看com.netflix的日志級別信息,如下所示:


discoveryclient logger.png

?loggers endpoint 同時(shí)提供了在應(yīng)用運(yùn)行時(shí)改變?nèi)罩炯墑e的能力,比如你想要改變com.netflix.discovery.DiscoveryClient的logger等級為DEBUG,可以發(fā)送一個(gè)POST請求,如下所示:

POST http://localhost:8878/actuator/loggers/com.chandler
Content-Type application/json; charset=UTF-8
日志級別修改.png
loggers日志級別修改結(jié)果.png

動態(tài)修改日志級別的功能對于日常排查問題,是一個(gè)有利支持。同時(shí)可以傳遞null給configuredLevel來重置日志等級。

endpoint控制

?默認(rèn)情況,上述所有的endpints都是打開多,除了shutdown endpoint。如果我們想要控制單個(gè)endpoint 開關(guān),可以進(jìn)行如下配置:

management.endpoint.<id>.enabled=true/false

?例如,想要打開shutdown endpint,可以在application.properties文件中進(jìn)行如下配置:

management.endpoint.shutdown.enabled=true

參數(shù)配置

?剛剛介紹了如何通過配置來對endpoint開關(guān)的控制,Actuator為我們提供豐富的參數(shù)配置。接下來我將和大家一起去認(rèn)識,掌握一些常用的配置。

顯示詳細(xì)的監(jiān)控信息

?health endpoint 只展示了簡單的UP和DOWN狀態(tài),為了獲得健康檢查中所有指標(biāo)的詳細(xì)信息,我們可以在application.properties中增加如下配置:

management.endpoint.health.show-details=always

?配置之后,我們再次訪問http://localhost:8888/actuator/health,獲取信息如下:

{
    "status": "UP",
    "details": {
        "diskSpace": {
            "status": "UP",
            "details": {
                "total": 249788112896,
                "free": 80719609856,
                "threshold": 10485760
            }
        },
        "refreshScope": {
            "status": "UP"
        },
        "discoveryComposite": {
            "status": "UP",
            "details": {
                "discoveryClient": {
                    "status": "UP",
                    "details": {
                        "services": [
                            "service-instance-peer"
                        ]
                    }
                },
                "eureka": {
                    "description": "Remote status from Eureka server",
                    "status": "UNKNOWN",
                    "details": {
                        "applications": {
                            "SERVICE-INSTANCE-PEER": 1
                        }
                    }
                }
            }
        },
        "hystrix": {
            "status": "UP"
        }
    }
}

?從上面的應(yīng)用的詳細(xì)健康信息發(fā)現(xiàn),包含了磁盤空間、熔斷器hystrix、刷新refreshScope、服務(wù)注冊中心。說明spring boot應(yīng)用連接注冊中心,并開啟了刷新功能,熔斷器功能,而actuator自動將這些監(jiān)控了起來。

management.endpoint.health.show-details的默認(rèn)值為never,除了always之外還有when-authorized。

健康指標(biāo)

Abstracthealthindicator的子類

?從抽象類AbstractHealthIndicator可以看出,actuator原生封裝了很多的健康指標(biāo),例如ElasticsearchHealthIndicator、DataSourceHealthIndicator、RedisHealthIndicator、RabbitHealthIndicator等。這就意味著當(dāng)我們使用
Elasticsearch、DataSource、Redis等資源的時(shí)候,會自動增加健康指標(biāo)。不過我們有時(shí)候希望留下一些我們想要關(guān)注等健康指標(biāo),而過濾掉一些指標(biāo)。
?actuator提供了關(guān)閉健康指標(biāo)的功能,比如我們想要關(guān)閉 mongoDB 健康指標(biāo),可以在application.properties中添加如下配置:

management.health.mongo.enabled=false

?我對哪些可以關(guān)閉產(chǎn)生了好奇,所以深挖了源代碼發(fā)現(xiàn)如下的邏輯:


HealthIndicatorNameFactory.png

?HealthIndicatorNameFactory在管理健康指標(biāo)開關(guān)的時(shí)候,將類名進(jìn)行了截取做為key,如此我們可以在application.properties中管理如下的HealthIndicator:


健康指標(biāo)開關(guān)

?然而,我們可以發(fā)現(xiàn)actuator沒有提供consul和eureka健康指標(biāo)的管理。不過這樣也說了,我們可以創(chuàng)建自定義的健康指標(biāo),只要我們實(shí)現(xiàn)了HealthIndicator接口,如下所示:

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;

@Component
public class MyHealthIndicator 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();
    }

}

?我們也可以通過繼承抽象類AbstractHealthIndicator來實(shí)現(xiàn)自定義的健康指標(biāo),如下所示:

import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.stereotype.Component;

/**
 * 自定義健康指標(biāo)
 *
 * @author 錢丁君-chandler 2019/5/11下午6:07
 * @since 1.8
 */
@Component
public class CustomHealthIndicator extends AbstractHealthIndicator {

    protected void doHealthCheck(Health.Builder builder) throws Exception {
        // Use the builder to build the health status details that should be reported.
        // If you throw an exception, the status will be DOWN with the exception message.

        builder.up()
                .withDetail("app", "Alive")
                .withDetail("author", "chandler");
    }
}

?重現(xiàn)啟動spring boot應(yīng)用,再次訪問http://localhost:8888/actuator/health,如下所示:

自定義健康指標(biāo)

應(yīng)用信息

?info endpoint 展示了應(yīng)用的基本信息,它通過META-INF/build-info.properties來獲取編譯信息,通過git.properties來獲取當(dāng)前應(yīng)用的Git版本信息。同時(shí)它可以展示任何信息,只要應(yīng)用環(huán)境property中含有info key。

1.自定義信息

?如果我們進(jìn)行任何配置,info endpoint 展示信息為空,不過這也是一個(gè)很重要的端點(diǎn)。首先,我們嘗試在application.properties中進(jìn)行如下配置:

#info接口展示
info.app.name=${spring.application.name}
info.app.description=@project.description@
info.app.version=@project.version@
info.app.encoding=@project.build.sourceEncoding@
info.app.java.version=@java.version@

?如上所示,我們進(jìn)行一些信息配置,包含應(yīng)用名稱、應(yīng)用描述、應(yīng)用版本、編碼格式、JDK版本。當(dāng)我們再次訪問info endpoint 時(shí),能夠得到如下信息:


info endpoint
info顯示異常
info顯示異常

?也許你會遇到如上所示的情況,這就說明沒有從META-INF/build-info.properties讀取到信息,你可以檢查一下該文件。


build-info.png

?解決方法:使用spring boot插件構(gòu)建一次。

spring boot build.png

2.git.properties

?首先我們需要添加git-commit-id-plugin插件,該插件用來產(chǎn)生git的版本信息。如下所示:

<plugin>
    <groupId>pl.project13.maven</groupId>
    <artifactId>git-commit-id-plugin</artifactId>
</plugin>

?完成了上述配置之后,執(zhí)行g(shù)it-commit-id-plugin插件。


git-commit-id-plugin

?接下來,我們啟動應(yīng)用并訪問端點(diǎn)http://localhost:8888/actuator/info,如下所示:

info端點(diǎn)結(jié)果

?其中,包含了關(guān)于branch和commit的基礎(chǔ)信息,如果我們想要獲取更全面的git版本信息,可以在application.properties中進(jìn)行如下配置:

management.info.git.mode=full
全面的git信息

endpoint暴露控制

?前面所述,actuator提供了豐富的endpoint ,有部分是我們在意的,也會有我們不在意的。如你所愿,actuator提供了更加豐富的功能,請看如下配置信息:

management.endpoints.web.exposure.include=
management.endpoints.web.exposure.exclude=

?include表示需要暴露的endpoint,配置時(shí)使用“,”隔開,你也可以用*讓所有endpoint暴露出來,如下所示:

management.endpoints.web.exposure.include=*

management.endpoints.web.exposure.include=health,info 

?exclude表示在暴露endpoint時(shí),排除掉哪些,同樣使用“,”隔開,如下所示:

management.endpoints.web.exposure.exclude=info

security

?actuator可以配合security進(jìn)行權(quán)限控制,保護(hù)endpint。大家有興趣可以自行探索,在此本人就不贅述了。

如果需要給我修改意見的發(fā)送郵箱:erghjmncq6643981@163.com

本博客的代碼示例已上傳GitHub:重新學(xué)習(xí)Spring Cloud組件https://github.com/erghjmncq6643981/cloud-2019

資料參考:Spring Cloud Finchley.SR2官網(wǎng)

轉(zhuǎn)發(fā)博客,請注明,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容