SpringBoot集成Actuator健康指示器health


1.說明

本文詳細介紹Actuator提供的HealthIndicators,
即健康指示器的配置使用,
利用自動配置的健康指標,
檢查正在運行的應用程序的狀態,
以及自定義健康指標的方法。
監控軟件通過調用健康指示器接口,
在生產系統出現故障時發出提醒。

2.查看健康指示器

訪問health端點:

http://localhost:8011/actuator/health

返回結果:

{
    "status": "UP"
}

3.顯示詳細信息

health端點公開的信息可以配置,
通過management.endpoint.health.show-details屬性,
可以配置為以下值之一:

名稱 描述
never 詳細信息從不顯示。
when-authorized 詳細信息僅顯示給授權用戶,可以使用management.endpoint.health.roles配置授權角色。
always 詳細信息顯示給所有用戶。

默認值為never,
所以上面返回結果顯示的信息很少。

當用戶處於端點的一個或多個角色時,
該用戶被視為已被授權。
如果端點沒有配置授權角色(默認),
則所有經過身份驗證的用戶都被視為已授權,
可以使用management.endpoint.health.roles配置授權角色。

下面設置show-details屬性為always,
顯示所有的詳細信息:

management:
  endpoint:
    health:
      show-details: always

重啟后再次訪問health端點:

{
    "status": "UP",
    "components": {
        "diskSpace": {
            "status": "UP",
            "details": {
                "total": 2000397791232,
                "free": 831475470336,
                "threshold": 10485760,
                "exists": true
            }
        },
        "ping": {
            "status": "UP"
        }
    }
}

可以看到健康指示器下面多出來的兩個指標,
分別為diskSpace磁盤空間和ping檢查。

4.自動配置HealthIndicators

在應用程序使用到相關功能的情況下,
Spring Boot會自動配置以下HealthIndicators,
這樣訪問health端點的時候就能看到對應指標:

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

5.配置DataSource指標

下面演示配置DataSource指標的方法,
同樣的其他指標在引入相關功能后會自動配置。

在引入數據庫相關的starter之后,
就會自動配置DataSource指標。
在pom.xml中新增MySQL數據庫依賴:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

然后在application.yml中新增數據庫配置:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://10.21.6.30:3306/demodb
    username: demo
    password: demo123456

重啟后再次訪問health端點:

{
    "status": "UP",
    "components": {
        "db": {
            "status": "UP",
            "details": {
                "database": "MySQL",
                "validationQuery": "isValid()"
            }
        },
        "diskSpace": {
            "status": "UP",
            "details": {
                "total": 2000397791232,
                "free": 831475470336,
                "threshold": 10485760,
                "exists": true
            }
        },
        "ping": {
            "status": "UP"
        }
    }
}

可以看到多出來了db指標,
連接的是MySQL數據庫,
並且數據庫連接是正常的。

故意將數據庫的密碼配置錯誤,
重啟后再次訪問health端點:

{
    "status": "DOWN",
    "components": {
        "db": {
            "status": "DOWN",
            "details": {
                "error": "org.springframework.jdbc.CannotGetJdbcConnectionException: 
                Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: 
                Access denied for user 'demo'@'10.21.6.30' (using password: YES)"
            }
        },
        "diskSpace": {
            "status": "UP",
            "details": {
                "total": 2000397791232,
                "free": 831475466240,
                "threshold": 10485760,
                "exists": true
            }
        },
        "ping": {
            "status": "UP"
        }
    }
}

發現db指標是DOWN狀態了。

6.啟用和禁用指標

默認所有指標都是啟用的,
可以通過設置management.health.defaults.enabled屬性來禁用,
設置為false就是禁用所有指標,
然后可以單獨啟用某個指標。

下面演示禁用所有指標,
僅啟用db指標:

management:
  endpoint:
    health:
      show-details: always
  health:
    defaults:
      enabled: false
    db:
      enabled: true

重啟后再次訪問health端點,
就只能看到db指標了:

{
    "status": "UP",
    "components": {
        "db": {
            "status": "UP",
            "details": {
                "database": "MySQL",
                "validationQuery": "isValid()"
            }
        }
    }
}

如果應用程序使用了數據庫相關功能,
但是不想對外開放db指標,
可以單獨禁用db指標:

management:
  endpoint:
    health:
      show-details: always
  health:
    defaults:
      enabled: true
    db:
      enabled: false

7.自定義HealthIndicators方法1

要使用自定義健康信息,
可以注冊實現HealthIndicator接口的Spring beans。
提供health()方法的實現並返回Health響應。
Health響應應包括狀態,
並可以增加其他詳細信息。

以下代碼演示了一個HealthIndicator的實現,
名稱為MyHealthIndicator,
這樣指標名稱就是my,
注意實現類的名稱格式必須為XXXHealthIndicator:

package com.yuwen.spring.actuator.actuate.health;

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 {

    private static int num = 0;

    @Override
    public Health health() {
        // 進行一些特定的健康檢查
        int errorCode = check();
        if (errorCode != 0) {
            return Health.down().withDetail("Error Code", errorCode).build();
        }
        return Health.up().build();
    }

    // 這里模擬檢查,設置為一次正常一次異常
    private int check() {
        num++;
        return num % 2;
    }
}

重啟后訪問health端點,
檢查結果為異常:

{
    "status": "DOWN",
    "components": {
        "my": {
            "status": "DOWN",
            "details": {
                "Error Code": 1
            }
        }
    }
}

再次訪問health端點,
檢查結果為正常:

{
    "status": "UP",
    "components": {
        "my": {
            "status": "UP"
        }
    }
}

如果只想顯示my指標的結果:
可以修改application.yml,
禁用所有的內置指標:

management:
  endpoint:
    health:
      show-details: always
  health:
    defaults:
      enabled: false

8.修改自定義指標的名稱

如果不想修改實現類的名稱,
可以通過Component修改指標名稱:

@Component("my1")
public class MyHealthIndicator implements HealthIndicator

這樣指標名稱就從my改為my1了:

{
    "status": "DOWN",
    "components": {
        "my1": {
            "status": "DOWN",
            "details": {
                "Error Code": 1
            }
        }
    }
}
{
    "status": "UP",
    "components": {
        "my1": {
            "status": "UP"
        }
    }
}

9.自定義HealthIndicators方法2

通過繼承AbstractHealthIndicator抽象類,
重寫doHealthCheck方法,
而不是直接實現HealthIndicator接口,
功能比第一種要強大一點點,
默認的DataSourceHealthIndicator、
RedisHealthIndicator都是這種方法,
代碼回調中還做了異常的處理。

以下代碼演示了一個AbstractHealthIndicator的繼承類,
名稱為My2HealthIndicator,
這樣指標名稱就是my2:

package com.yuwen.spring.actuator.actuate.health;

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

@Component
public class My2HealthIndicator extends AbstractHealthIndicator {

    private static int num = 0;

    @Override
    protected void doHealthCheck(Builder builder) throws Exception {
        int errorCode = check();
        if (errorCode != 0) {
            builder.down().withDetail("code", errorCode).withDetail("num", num).build();
            return;
        }
        builder.up().withDetail("code", errorCode).withDetail("num", num).build();
    }

    // 這里模擬檢查,設置為一次成功一次失敗
    private int check() {
        num++;
        return num % 2;
    }
}

重啟后訪問health端點,
檢查結果為異常:

{
    "status": "DOWN",
    "components": {
        "my1": {
            "status": "DOWN",
            "details": {
                "Error Code": 1
            }
        },
        "my2": {
            "status": "DOWN",
            "details": {
                "code": 1,
                "num": 1
            }
        }
    }
}

再次訪問health端點,
檢查結果為正常:

{
    "status": "UP",
    "components": {
        "my1": {
            "status": "UP"
        },
        "my2": {
            "status": "UP",
            "details": {
                "code": 0,
                "num": 2
            }
        }
    }
}

10.參考文檔

Spring Boot Actuator: Production-ready Features
Spring Boot (27) actuator服務監控與管理


免責聲明!

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



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