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服務監控與管理
