MicroProfile Health API — это базовый API-интерфейс для отчета о состоянии вашего сервиса, основанный на одном или нескольких Health Probe. Это очень полезно в тех случаях, когда какой-либо сервер или контроллер кластера должны решить, следует ли перезапускать ваш экземпляр и когда.
Использовать MicroProfile Health API в вашем приложении так же просто, как реализовать один (или несколько) org.eclipse.microprofile.health.HealthCheck
и аннотировать класс с помощью @Health
.
Интерфейс HealthCheck
имеет один метод, который вы должны реализовать, а именно HealthCheckResponse call()
.
Итак, вы решаете, когда этот метод вызывается, если ваш экземпляр здоров.
Ваш ответ ( HealthCheckResponse
) содержит:
- имя для идентификации этого зонда от других зондов.
- флаг ВВЕРХ или ВНИЗ , чтобы указать состояние.
- любые другие метаданные, которые вы хотите включить в пару ключ-значение.
Основной пример.
Допустим, у нас есть приложение, которое использует базу данных, и если соединение с базой данных не работает (или очень медленно), мы должны сообщить, что это приложение не работает:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
@Health @ApplicationScoped public class MembershipHealthCheck implements HealthCheck { @Inject private DataSource datasource; @Override public HealthCheckResponse call() { HealthCheckResponseBuilder responseBuilder = HealthCheckResponse.named( "membership" ); try { Connection connection = datasource.getConnection(); boolean isValid = connection.isValid(timeout); DatabaseMetaData metaData = connection.getMetaData(); responseBuilder = responseBuilder .withData( "databaseProductName" , metaData.getDatabaseProductName()) .withData( "databaseProductVersion" , metaData.getDatabaseProductVersion()) .withData( "driverName" , metaData.getDriverName()) .withData( "driverVersion" , metaData.getDriverVersion()) .withData( "isValid" , isValid); return responseBuilder.state(isValid).build(); } catch (SQLException e) { log.log(Level.SEVERE, null , e); responseBuilder = responseBuilder .withData( "exceptionMessage" , e.getMessage()); return responseBuilder.down().build(); } } } |
(см. полный пример здесь )
В приведенном выше примере имя проверки работоспособности — «членство» и сообщает UP, если соединение с базой данных может быть установлено в течение определенного времени. Он также включает несколько полей метаданных в базе данных.
/здоровье.
Если вы перейдете к /health
на своем сервере, вы увидите агрегированный ответ от всех зондов и общее состояние (ВВЕРХ или ВНИЗ) сервера.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
{ "outcome" : "UP" , "checks" :[ { "name" : "membership" , "state" : "UP" , "data" :{ "databaseProductVersion" : "5.5.5-10.1.35-MariaDB" , "databaseProductName" : "MySQL" , "driverVersion" : "mysql-connector-java-8.0.11 (Revision: 6d4eaa273bc181b4cf1c8ad0821a2227f116fedf)" , "isValid" : "true" , "driverName" : "MySQL Connector/J" } } ] } |
Если база данных выходит из строя:
01
02
03
04
05
06
07
08
09
10
11
12
|
{ "outcome" : "DOWN" , "checks" :[ { "name" : "membership" , "state" : "DOWN" , "data" :{ "exceptionMessage" : "No operations allowed after connection closed." } } ] } |
Создание зондов многократного использования с конфигурацией MicroProfile.
Определенные датчики работоспособности могут быть повторно использованы любым вашим приложением, и вы можете перенести параметры настройки с помощью API-интерфейса Microprofile Config . Например, если нам нужен датчик работоспособности, который проверяет нагрузку на систему, мы можем вывести на внешний уровень, на каком этапе нагрузка на систему должна начать сообщать о сбое.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
@Health @ApplicationScoped public class SystemLoadHealthCheck implements HealthCheck { @Inject @ConfigProperty (name = "health.systemload.max" , defaultValue = "0.7" ) private double max; @Override public HealthCheckResponse call() { OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean(); String arch = operatingSystemMXBean.getArch(); String name = operatingSystemMXBean.getName(); String version = operatingSystemMXBean.getVersion(); int availableProcessors = operatingSystemMXBean.getAvailableProcessors(); double systemLoadAverage = operatingSystemMXBean.getSystemLoadAverage(); double systemLoadAveragePerProcessors = systemLoadAverage / availableProcessors; HealthCheckResponseBuilder responseBuilder = HealthCheckResponse.named( "system-load" ) .withData( "name" , name) .withData( "arch" , arch) .withData( "version" , version) .withData( "processors" , availableProcessors) .withData( "loadAverage" , String.valueOf(systemLoadAverage)) .withData( "loadAverage per processor" , String.valueOf(systemLoadAveragePerProcessors)) .withData( "loadAverage max" , String.valueOf(max)); if (systemLoadAverage> 0 ){ boolean status = systemLoadAveragePerProcessors < max; return responseBuilder.state(status).build(); } else { // Load average not available return responseBuilder.up().build(); } } } |
(см. полный пример здесь )
Выше мы теперь можем переопределить загрузку системы по умолчанию 0.7
к нашему собственному значению, изменив health.systemload.max
конфигурации health.systemload.max
.
Другие примеры могут включать:
- Память кучи
- Не куча памяти
- Число потоков
Используя это в вашем проекте
Вы можете использовать все вышеперечисленное в своем проекте, так как он доступен в maven central и github :
В вашем pom.xml
:
1
2
3
4
5
|
< dependency > < groupId >com.github.phillip-kruger.microprofile-extensions</ groupId > < artifactId >health-ext</ artifactId > < version >1.0.9</ version > </ dependency > |
Совокупный результат /health
может выглядеть примерно так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
{ "outcome" : "UP" , "checks" :[ { "name" : "system-load" , "state" : "UP" , "data" :{ "name" : "Linux" , "arch" : "amd64" , "processors" : "8" , "loadAverage" : "2.03" , "version" : "4.18.1-arch1-1-ARCH" , "loadAverage max" : "0.7" , "loadAverage per processor" : "0.25375" } }, { "name" : "membership" , "state" : "UP" , "data" :{ "databaseProductVersion" : "5.5.5-10.1.35-MariaDB" , "databaseProductName" : "MySQL" , "driverVersion" : "mysql-connector-java-8.0.11 (Revision: 6d4eaa273bc181b4cf1c8ad0821a2227f116fedf)" , "isValid" : "true" , "driverName" : "MySQL Connector/J" } }, { "name" : "non-heap-memory" , "state" : "UP" , "data" :{ "max %" : "0.9" , "max" : "-1" , "used" : "132792064" } }, { "name" : "threads" , "state" : "UP" , "data" :{ "max thread count" : "-1" , "daemon thread count" : "86" , "monitor deadlocked thread count" : "0" , "thread count" : "134" , "deadlocked thread count" : "0" , "started thread count" : "138" , "peak thread count" : "136" } }, { "name" : "heap-memory" , "state" : "UP" , "data" :{ "max %" : "0.9" , "max" : "14995161088" , "used" : "207556800" } } ] } |
Опубликовано на Java Code Geeks с разрешения Филиппа Крюгера, партнера нашей программы JCG . Смотрите оригинальную статью здесь: Многоразовые пробники MicroProfile Health
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |