系統健康檢查利器-Spring Boot-Actuator

前言

實例因爲出現故障、部署或自動縮放的狀況,會進行持續啓動、從新啓動或中止操做。它可能致使它們暫時或永久不可用。爲避免問題,您的負載均衡器應該從路由中跳過不健康的實例,由於它們當前沒法爲客戶或子系統提供服務。
應用實例健康情況能夠經過外部觀察來肯定。您能夠經過重複調用GET /health端點或經過自我報告來實現。如今主流的服務發現解決方案,會持續從實例中收集健康信息,並配置負載均衡器,將流量僅路由到健康的組件上。spring

Spring Boot-Actuator 就是幫助咱們監控咱們的Spring Boot 項目的。數據庫

使用

Spring Boot 最主要的特性就是AutoConfig(自動配置),而對於咱們這些使用者來講也就是各類starter,
Spring Boot-Actuator 也提供了starter,爲咱們自動配置,在使用上咱們只須要添加starter到咱們的依賴中,而後啓動項目便可。bash

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
複製代碼

經常使用Endpoint負載均衡

Spring Boot-actuator,提供了許多有用的EndPoint,對Spring Boot應用提供各類監控,下面說一下我經常使用的EndPoint:dom

/health 應用的健康狀態
/configprops 獲取應用的配置信息,由於Spring Boot 可能發佈時是單獨的Jar包,配置文件可能包含其中, 當咱們須要檢查配置文件時可使用 ConfigpropsEndPoint 進行查看一些配置是否正確。
/trace 最近幾回的http請求信息ide

HealthEndPoint

當咱們訪問 http://localhost:8088/health 時,能夠看到 HealthEndPoint 給咱們提供默認的監控結果,包含 磁盤檢測和數據庫檢測。spring-boot

{
    "status": "UP",
    "diskSpace": {
        "status": "UP",
        "total": 398458875904,
        "free": 315106918400,
        "threshold": 10485760
    },
    "db": {
        "status": "UP",
        "database": "MySQL",
        "hello": 1
    }
}
複製代碼

其實看 Spring Boot-actuator 源碼,你會發現 HealthEndPoint 提供的信息不只限於此,org.springframework.boot.actuate.health 包下 你會發現 ElasticsearchHealthIndicator、RedisHealthIndicator、RabbitHealthIndicator 等
也就是 HealthEndPoint 也提供 ES, Redis 等組件的健康信息。ui

自定義Indicator 擴展 HealthEndPointspa

看源碼 其實 磁盤和數據庫健康信息就是 DiskSpaceHealthIndicator、DataSourceHealthIndicator 來實現的,當咱們對一些咱們自定義的組件進行監控時, 咱們也能夠實現個Indicator :code

@Component
public class User implements HealthIndicator {
    /**
     * user監控 訪問: http://localhost:8088/health
     *
     * @return 自定義Health監控
     */
    @Override
    public Health health() {

        return new Health.Builder().withDetail("usercount", 10) //自定義監控內容
                .withDetail("userstatus", "up").up().build();
    }
}
複製代碼

這時咱們再次訪問: http://localhost:8088/health 這時返回的結果以下,包含了咱們自定義的 User 健康信息。

{
    "status": "UP",
    "user": {
        "status": "UP",
        "usercount": 10,
        "userstatus": "up"
    },
    "diskSpace": {
        "status": "UP",
        "total": 398458875904,
        "free": 315097989120,
        "threshold": 10485760
    },
    "db": {
        "status": "UP",
        "database": "MySQL",
        "hello": 1
    }
}
複製代碼

自定義EndPoint

其實除了擴展 HealthEndPoint 來添加一些健康檢查, 咱們也能夠自定定義一些EndPoint 來提供程序運行時一些信息的展現:

@Configuration
public class EndPointAutoConfig {
    @Bean
    public Endpoint<Map<String, Object>> customEndPoint() {
        return new SystemEndPoint();
    }
}

@ConfigurationProperties(prefix="endpoints.customsystem")
public class SystemEndPoint extends AbstractEndpoint<Map<String, Object>> {

    public SystemEndPoint(){
        super("customsystem");
    }
    @Override
    public Map<String, Object> invoke() {
        Map<String,Object> result= new HashMap<>();
        Map<String, String> map = System.getenv();
        result.put("username",map.get("USERNAME"));
        result.put("computername",map.get("COMPUTERNAME"));
        result.put("userdomain",map.get("USERDOMAIN"));
        return result;
    }
}
複製代碼

訪問 http://localhost:8088/customsystem 來查看咱們自定義的EndPoint ,返回結果以下:

{
    "username": "xxx",
    "userdomain": "DESKTOP-6EAN1H4",
    "computername": "DESKTOP-6EAN1H4"
}複製代碼

相關文章
相關標籤/搜索