Функции, готовые к использованию в производстве
Spring Boot включает ряд дополнительных функций, которые помогут вам отслеживать и управлять вашим приложением при его развертывании в производстве. Вы можете управлять и отслеживать приложение, используя HTTP-точки доступа или JMX. Аудит, проверка работоспособности и сбор метрик также могут быть автоматически применены к вашему приложению.
1. Включение функций, готовых к использованию в производстве
Модуль spring-boot-actuator предоставляет все функции Spring Boot, готовые к использованию в производстве. Рекомендуемый способ включения функций — добавление зависимости от “Starter”.
Для добавления актуатора в проект на основе Maven добавьте следующую зависимость “Starter”:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies> Для Gradle используйте следующее объявление:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
} 2. Конечные точки
Конечные точки Actuator позволяют отслеживать и взаимодействовать с вашим приложением. Spring Boot включает несколько встроенных конечных точек и позволяет добавлять свои собственные. Например, конечная точка health предоставляет основную информацию о работоспособности приложения.
Вы можете включить или отключить каждую отдельную конечную точку и опубликовать их (сделать их удаленно доступными) по HTTP или JMX. Конечная точка считается доступной, когда она включена и опубликована. Встроенные конечные точки настраиваются автоматически только при их доступности. Большинство приложений выбирают публикацию по HTTP, где идентификатор конечной точки и префикс /actuator сопоставляются с URL-адресом. Например, по умолчанию конечная точка health сопоставляется с /actuator/health.
| Для получения дополнительной информации о конечных точках Actuator и форматах запросов и ответов см. отдельную документацию API (HTML или PDF). |
Доступны следующие технологически независимые конечные точки:
| ID | Описание |
|---|---|
| Отображает информацию об аудиторных событиях для текущего приложения. Требует bean |
| Отображает полный список всех Spring bean в вашем приложении. |
| Отображает доступные кэши. |
| Показ условий, которые были проверены в классах конфигурации и автоконфигурации, и причин, по которым они соответствуют или не соответствуют. |
| Отображает сводный список всех |
| Отображает свойства из |
| Отображает все примененные миграции базы данных Flyway. Требует один или несколько bean |
| Отображает информацию о работоспособности приложения. |
| Отображает информацию о HTTP обмене (по умолчанию последние 100 HTTP запросов-ответов). Требует bean |
| Отображает произвольную информацию об приложении. |
| Отображает граф Spring Integration. Требуется зависимость от |
| Отображает и изменяет конфигурацию логгеров в приложении. |
| Отображает все примененные миграции базы данных Liquibase. Требует один или несколько bean |
| Отображает информацию «метрики» для текущего приложения. |
| Отображает сводный список всех |
| Отображает информацию о задачах планировщика Quartz. |
| Отображает запланированные задачи в вашем приложении. |
| Позволяет извлекать и удалять пользовательские сессии из хранилища сессий Spring Session. Требуется приложение на основе сервлетов, использующее Spring Session. |
| Позволяет плавно завершить работу приложения. Работает только при использовании упаковки jar. Отключен по умолчанию. |
| Отображает данные о шагах запуска, собранные |
| Выполняет дамп потоков. |
Если ваше приложение является веб-приложением (Spring MVC, Spring WebFlux или Jersey), вы можете использовать следующие дополнительные конечные точки:
| ID | Описание |
|---|---|
| Возвращает файл дампа кучи. В JVM HotSpot возвращается файл в формате |
| Возвращает содержимое файла журнала (если установлено свойство |
| Отображает метрики в формате, который может быть собран сервером Prometheus. Требуется зависимость от |
2.1. Включение конечных точек
По умолчанию все конечные точки, кроме shutdown, включены. Для настройки включения конечной точки используйте свойство management.endpoint.<id>.enabled. Следующий пример включает конечную точку shutdown:
management.endpoint.shutdown.enabled=true management:
endpoint:
shutdown:
enabled: true Если вы предпочитаете, чтобы включение конечных точек было выборочным (opt-in), а не по умолчанию (opt-out), установите свойство management.endpoints.enabled-by-default в false и используйте отдельные свойства конечных точек enabled для повторного включения. Следующий пример включает конечную точку info и отключает все остальные конечные точки:
management.endpoints.enabled-by-default=false
management.endpoint.info.enabled=true management:
endpoints:
enabled-by-default: false
endpoint:
info:
enabled: true Отключенные конечные точки полностью удаляются из контекста приложения. Если вы хотите изменить только технологии, через которые доступна конечная точка, используйте свойства include и exclude вместо этого. |
2.2. Предоставление доступа к конечным точкам
По умолчанию доступны только конечная точка состояния и JMX. Поскольку конечные точки могут содержать конфиденциальную информацию, тщательно взвесьте, когда их следует предоставлять.
Чтобы изменить доступные конечные точки, используйте следующие свойства, специфичные для технологий: include и exclude.
| Свойство | Значение по умолчанию |
|---|---|
| |
|
|
| |
|
|
Свойство include перечисляет идентификаторы конечных точек, которые должны предоставляться. Свойство exclude перечисляет идентификаторы конечных точек, которые не должны предоставляться. Свойство exclude имеет приоритет над свойством include. Оба свойства include и exclude можно настроить, указав список идентификаторов конечных точек.
Например, чтобы предоставить доступ только к конечным точкам health и info через JMX, используйте следующее свойство:
management.endpoints.jmx.exposure.include=health,info management:
endpoints:
jmx:
exposure:
include: "health,info" * можно использовать для выбора всех конечных точек. Например, чтобы предоставить доступ ко всем конечным точкам через HTTP, за исключением конечных точек env и beans, используйте следующие свойства:
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans management:
endpoints:
web:
exposure:
include: "*"
exclude: "env,beans" * имеет специальное значение в YAML, поэтому убедитесь, что вы добавили кавычки, если хотите включить (или исключить) все конечные точки. |
| Если ваше приложение доступно публично, настоятельно рекомендуем также защитить конечные точки. |
Если необходимо реализовать собственную стратегию предоставления доступа к конечным точкам, можно зарегистрировать bean EndpointFilter. |
2.3. Безопасность
В целях безопасности по умолчанию доступна только конечная точка /health через HTTP. Для настройки доступных конечных точек используйте свойство management.endpoints.web.exposure.include.
Перед настройкой management.endpoints.web.exposure.include, убедитесь, что предоставляемые актуаторы не содержат конфиденциальной информации, защищены брандмауэром или защищены чем-то вроде Spring Security. |
Если Spring Security присутствует в classpath и нет других bean SecurityFilterChain, все актуаторы, кроме /health, защищены с помощью автоматической настройки Spring Boot. Если вы определите свой bean SecurityFilterChain, автоматическая настройка Spring Boot отключается, и вы получите полный контроль над правилами доступа к актуаторам.
Если требуется настроить пользовательскую безопасность для HTTP-конечных точек (например, разрешить доступ только пользователям с определённой ролью), Spring Boot предоставляет удобные объекты RequestMatcher, которые можно использовать совместно с Spring Security.
Типичная конфигурация Spring Security может выглядеть примерно так:
@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.securityMatcher(EndpointRequest.toAnyEndpoint());
http.authorizeHttpRequests((requests) -> requests.anyRequest().hasRole("ENDPOINT_ADMIN"));
http.httpBasic(withDefaults());
return http.build();
}
}
@Configuration(proxyBeanMethods = false)
class MySecurityConfiguration {
@Bean
fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
http.securityMatcher(EndpointRequest.toAnyEndpoint()).authorizeHttpRequests { requests ->
requests.anyRequest().hasRole("ENDPOINT_ADMIN")
}
http.httpBasic(withDefaults())
return http.build()
}
}
В приведенном примере используется EndpointRequest.toAnyEndpoint() для соответствия запроса любой конечной точке и гарантирует, что все имеют роль ENDPOINT_ADMIN. На объекте EndpointRequest доступны и другие методы сопоставления. Подробности см. в документации API (HTML или PDF).
Если приложения развернуты за брандмауэром, предпочтительнее, чтобы ко всем конечным точкам актуаторов можно было получить доступ без необходимости авторизации. Это можно сделать, изменив свойство management.endpoints.web.exposure.include следующим образом:
management.endpoints.web.exposure.include=* management:
endpoints:
web:
exposure:
include: "*" Кроме того, если Spring Security присутствует, необходимо добавить пользовательскую конфигурацию безопасности, позволяющую получить доступ к конечным точкам без авторизации, как показано в следующем примере:
@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.securityMatcher(EndpointRequest.toAnyEndpoint());
http.authorizeHttpRequests((requests) -> requests.anyRequest().permitAll());
return http.build();
}
}
@Configuration(proxyBeanMethods = false)
class MySecurityConfiguration {
@Bean
fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
http.securityMatcher(EndpointRequest.toAnyEndpoint()).authorizeHttpRequests { requests ->
requests.anyRequest().permitAll()
}
return http.build()
}
}
В обоих приведенных примерах конфигурация применяется только к конечным точкам актуатора. Поскольку конфигурация безопасности Spring Boot полностью отключается при наличии любого bean SecurityFilterChain, необходимо настроить дополнительный bean SecurityFilterChain с правилами, которые применяются к остальной части приложения. |
2.3.1. Защита от межсайтовых поддельных запросов (CSRF)
Поскольку Spring Boot полагается на значения по умолчанию Spring Security, защита от CSRF включена по умолчанию. Это означает, что для конечных точек актуаторов, требующих POST (конечные точки остановки и логгеров), PUT или DELETE, будет возвращаться ошибка 403 (запрещено), когда используется конфигурация безопасности по умолчанию.
| Рекомендуется полностью отключить защиту от CSRF только если вы создаете сервис, который используется не веб-клиентами. |
Дополнительную информацию о защите от CSRF можно найти в Руководстве по Spring Security.
2.4. Настройка конечных точек
Конечные точки автоматически кэшируют ответы для операций чтения, которые не принимают параметров. Чтобы настроить время, в течение которого конечная точка кэширует ответ, используйте свойство cache.time-to-live данной конечной точки. В следующем примере время жизни кэша конечной точки beans устанавливается в 10 секунд:
management.endpoint.beans.cache.time-to-live=10s management:
endpoint:
beans:
cache:
time-to-live: "10s" Префикс management.endpoint.<name> однозначно идентифицирует конфигурируемую конечную точку. |
2.5. Гипермедиа для веб-конечных точек актуатора
Добавлена страница «обнаружения» со ссылками на все конечные точки. Страница «обнаружения» доступна по адресу /actuator по умолчанию.
Чтобы отключить страницу «обнаружения», добавьте следующее свойство в свойства вашего приложения:
management.endpoints.web.discovery.enabled=false management:
endpoints:
web:
discovery:
enabled: false При настройке пользовательского пути контекста управления страница «обнаружения» автоматически перемещается с /actuator в корень пути контекста управления. Например, если путь контекста управления /management, страница «обнаружения» доступна по адресу /management. При установке пути контекста управления в / страница «обнаружения» отключается, чтобы предотвратить возможность конфликта с другими отображениями.
2.6. Поддержка CORS
Обмен ресурсами с разных доменов (CORS) — это спецификация W3C, которая позволяет гибко определять, какие запросы с разных доменов разрешены. Если вы используете Spring MVC или Spring WebFlux, вы можете настроить веб-точки доступа Actuator для поддержки таких сценариев.
Поддержка CORS по умолчанию отключена и включается только после настройки свойства management.endpoints.web.cors.allowed-origins. Следующая конфигурация разрешает GET и POST вызовы с домена example.com.
management.endpoints.web.cors.allowed-origins=https://example.com
management.endpoints.web.cors.allowed-methods=GET,POST management:
endpoints:
web:
cors:
allowed-origins: "https://example.com"
allowed-methods: "GET,POST" Смотрите CorsEndpointProperties для полного списка опций. |
2.7. Реализация пользовательских конечных точек
Если вы добавите @Bean с аннотацией @Endpoint, все методы, помеченные аннотациями @ReadOperation, @WriteOperation, или @DeleteOperation, будут автоматически доступны через JMX и, в веб-приложении, также через HTTP. Конечные точки могут быть доступны через HTTP с использованием Jersey, Spring MVC или Spring WebFlux. Если доступны как Jersey, так и Spring MVC, используется Spring MVC.
Следующий пример демонстрирует операцию чтения, возвращающую пользовательский объект:
@ReadOperation
public CustomData getData() {
return new CustomData("test", 5);
}
@ReadOperation
fun getData(): CustomData {
return CustomData("test", 5)
}
Вы также можете создавать технологически-специфичные конечные точки, используя @JmxEndpoint или @WebEndpoint. Эти конечные точки ограничены соответствующими технологиями. Например, @WebEndpoint доступна только через HTTP, а не через JMX.
Вы можете создавать технологически-специфичные расширения, используя @EndpointWebExtension и @EndpointJmxExtension. Эти аннотации позволяют вам предоставлять технологически-специфические операции для дополнения существующей конечной точки.
Наконец, если вам нужен доступ к функциональности, специфичной для веб-фреймворка, вы можете реализовать конечные точки сервлетов или Spring @Controller и @RestController, но в этом случае они не будут доступны через JMX или при использовании другого веб-фреймворка.
2.7.1. Получение ввода
Операции на конечной точке получают входные данные через свои параметры. При экспонировании через веб, значения этих параметров берутся из параметров запроса URL и из тела запроса JSON. При экспонировании через JMX, параметры сопоставляются с параметрами операций MBean. Параметры по умолчанию обязательны. Они могут быть сделаны необязательными, добавив аннотацию @javax.annotation.Nullable или @org.springframework.lang.Nullable.
Вы можете сопоставить каждую корневую свойство в теле запроса JSON с параметром конечной точки. Рассмотрим следующее тело запроса JSON:
{
"name": "test",
"counter": 42
} Вы можете использовать это для вызова операции записи, принимающей параметры String name и int counter, как показано в следующем примере:
@WriteOperation
public void updateData(String name, int counter) {
// injects "test" and 42
}
@WriteOperation
fun updateData(name: String?, counter: Int) {
// injects "test" and 42
}
Поскольку конечные точки технологически независимы, в сигнатуре метода могут быть указаны только простые типы. В частности, объявление единственного параметра с типом CustomData, определяющим свойства name и counter, не поддерживается. |
Чтобы входные данные могли быть сопоставлены с параметрами метода операции, код Java, реализующий конечную точку, должен быть скомпилирован с -parameters, а код Kotlin, реализующий конечную точку, должен быть скомпилирован с -java-parameters. Это произойдет автоматически, если вы используете плагин Spring Boot для Gradle или Maven и spring-boot-starter-parent. |
Преобразование типов ввода
Параметры, передаваемые методам операций конечной точки, при необходимости автоматически преобразуются в требуемый тип. Перед вызовом метода операции, ввод, полученный через JMX или HTTP, преобразуется в требуемые типы, используя экземпляр ApplicationConversionService, а также любые Converter или GenericConverter бин, квалифицированные с @EndpointConverter.
2.7.2. Пользовательские веб-конечные точки
Операции над @Endpoint, @WebEndpoint, или @EndpointWebExtension автоматически экспонируются через HTTP с использованием Jersey, Spring MVC или Spring WebFlux. Если доступны как Jersey, так и Spring MVC, используется Spring MVC.
Предикаты запросов веб-конечных точек
Для каждой операции на веб-конечной точке автоматически генерируется предикат запроса.
Путь
Путь предиката определяется идентификатором конечной точки и базовым путем веб-конечных точек. Базовый путь по умолчанию — /actuator. Например, конечная точка с идентификатором sessions использует /actuator/sessions в качестве пути в предикате.
Вы можете дополнительно настроить путь, добавив аннотацию @Selector к одному или нескольким параметрам метода операции. Такой параметр добавляется в предикат пути как переменная пути. Значение переменной передаётся в метод операции при вызове операции конечной точки. Если вы хотите захватить все оставшиеся элементы пути, добавьте @Selector(Match=ALL_REMAINING) к последнему параметру и сделайте его типом, совместимым с преобразованием с String[].
Метод HTTP
Метод HTTP предиката определяется типом операции, как показано в следующей таблице:
| Операция | Метод HTTP |
|---|---|
|
|
|
|
|
|
Consumes
Для @WriteOperation (HTTP POST) использующего тело запроса, consumes часть предиката — application/vnd.spring-boot.actuator.v2+json, application/json. Для всех остальных операций consumes часть предиката пустая.
Produces
Часть produces предиката может быть определена атрибутом produces аннотаций @DeleteOperation, @ReadOperation, и @WriteOperation. Атрибут необязателен. Если он не используется, часть produces предиката определяется автоматически.
Если метод операции возвращает void или Void, часть produces предиката пустая. Если метод операции возвращает org.springframework.core.io.Resource, часть produces предиката — application/octet-stream. Для всех остальных операций часть produces предиката — application/vnd.spring-boot.actuator.v2+json, application/json.
Статус ответа веб-конечной точки
Статус ответа по умолчанию для операции конечной точки зависит от типа операции (чтение, запись или удаление) и того, возвращает ли операция какое-либо значение.
Если операция @ReadOperation возвращает значение, статус ответа будет 200 (OK). Если она не возвращает значение, статус ответа будет 404 (Не найдено).
Если операция @WriteOperation или @DeleteOperation возвращает значение, статус ответа будет 200 (OK). Если она не возвращает значение, статус ответа будет 204 (Без содержимого).
Если операция вызывается без обязательного параметра или с параметром, который нельзя преобразовать в требуемый тип, метод операции не вызывается, и статус ответа будет 400 (Ошибка запроса).
Веб-конечные точки и запросы диапазона
Вы можете использовать запрос диапазона HTTP для запроса части HTTP-ресурса. При использовании Spring MVC или Spring WebFlux операции, возвращающие org.springframework.core.io.Resource, автоматически поддерживают запросы диапазона.
| Запросы диапазона не поддерживаются при использовании Jersey. |
Безопасность веб-конечной точки
Операция на веб-конечной точке или расширении веб-конечной точки может получить текущий java.security.Principal или org.springframework.boot.actuate.endpoint.SecurityContext в качестве параметра метода. Первый обычно используется совместно с @Nullable для предоставления различного поведения для авторизованных и неавторизованных пользователей. Второй обычно используется для выполнения проверок авторизации с помощью своего метода isUserInRole(String).
2.7.3. Конечные точки сервлетов
Сервлет может быть экспонирован как конечная точка путём реализации класса, помеченного аннотацией @ServletEndpoint, который также реализует Supplier<EndpointServlet>. Сервлет-конечные точки обеспечивают более глубокую интеграцию с контейнером сервлетов, но за счёт портативности. Они предназначены для экспонирования существующего сервлета как конечной точки. Для новых конечных точек аннотации @Endpoint и @WebEndpoint следует предпочесть, когда это возможно.
2.7.4. Конечные точки контроллера
Вы можете использовать @ControllerEndpoint и @RestControllerEndpoint для реализации конечной точки, доступной только в Spring MVC или Spring WebFlux. Методы отображаются с помощью стандартных аннотаций Spring MVC и Spring WebFlux, таких как @RequestMapping и @GetMapping, используя идентификатор конечной точки в качестве префикса для пути. Конечные точки контроллера обеспечивают более глубокую интеграцию с веб-фреймворками Spring, но ценой портативности. Аннотации @Endpoint и @WebEndpoint следует предпочитать, когда это возможно.
2.8. Информация о состоянии
Вы можете использовать информацию о состоянии, чтобы проверить состояние вашего работающего приложения. Она часто используется средствами мониторинга для оповещения, когда система в производстве выходит из строя. Информация, экспонируемая конечной точкой health, зависит от свойств management.endpoint.health.show-details и management.endpoint.health.show-components, которые можно настроить одним из следующих значений:
| Имя | Описание |
|---|---|
| Подробности никогда не отображаются. |
| Подробности отображаются только авторизованным пользователям. Авторизованные роли могут быть настроены с помощью |
| Подробности отображаются всем пользователям. |
Значение по умолчанию — never. Пользователь считается авторизованным, когда он находится в одной или нескольких ролях конечной точки. Если для конечной точки не настроены роли (по умолчанию), все аутентифицированные пользователи считаются авторизованными. Вы можете настроить роли, используя свойство management.endpoint.health.roles.
Если вы защитили свое приложение и хотите использовать always, ваша конфигурация безопасности должна разрешить доступ к конечной точке состояния как для аутентифицированных, так и для неаутентифицированных пользователей. |
Информация о состоянии собирается из содержимого HealthContributorRegistry (по умолчанию, все HealthContributor экземпляры, определенные в ApplicationContext). Spring Boot включает в себя ряд автоматически настроенных HealthContributors, и вы также можете написать свои собственные.
Контрибьютор HealthContributor может быть либо HealthIndicator, либо CompositeHealthContributor. HealthIndicator предоставляет фактическую информацию о состоянии, включая Status. CompositeHealthContributor предоставляет композицию других HealthContributors. Вместе контрибьюторы образуют древовидную структуру для представления общего состояния системы.
По умолчанию, окончательное состояние системы выводится с помощью StatusAggregator, который сортирует состояния каждого HealthIndicator по упорядоченному списку состояний. Первое состояние в отсортированном списке используется как общее состояние. Если ни один HealthIndicator не возвращает состояние, известное StatusAggregator, используется состояние UNKNOWN.
Вы можете использовать HealthContributorRegistry для регистрации и отмены регистрации индикаторов состояния во время выполнения. |
2.8.1. Автоматически настраиваемые HealthIndicators
При необходимости Spring Boot автоматически настраивает HealthIndicators перечисленные в следующей таблице. Вы также можете включить или отключить выбранные индикаторы, настроив management.health.key.enabled, с key перечисленными в следующей таблице:
| Ключ | Имя | Описание |
|---|---|---|
| Проверяет, запущена ли база данных Cassandra. | |
| Проверяет, запущен ли кластер Couchbase. | |
| Проверяет, можно ли получить соединение с | |
| Проверяет на наличие низкого свободного места на диске. | |
| Проверяет, запущен ли кластер Elasticsearch. | |
| Проверяет, запущен ли сервер Hazelcast. | |
| Проверяет, запущен ли сервер InfluxDB. | |
| Проверяет, запущен ли брокер JMS. | |
| Проверяет, запущен ли сервер LDAP. | |
| Проверяет, запущен ли почтовый сервер. | |
| Проверяет, запущена ли база данных Mongo. | |
| Проверяет, запущена ли база данных Neo4j. | |
| Всегда отвечает с | |
| Проверяет, запущен ли сервер Rabbit. | |
| Проверяет, запущен ли сервер Redis. |
Их всех можно отключить, установив свойство management.health.defaults.enabled. |
Доступны дополнительные HealthIndicators, но по умолчанию они не включены:
| Ключ | Имя | Описание |
|---|---|---|
| Предоставляет состояние доступности приложения «Liveness». | |
| Предоставляет состояние доступности приложения «Readiness». |
2.8.2. Написание пользовательских индикаторов состояния
Для предоставления пользовательской информации о состоянии вы можете зарегистрировать компоненты Spring, реализующие интерфейс HealthIndicator. Вам необходимо предоставить реализацию метода health() и вернуть ответ Health. Ответ Health должен включать статус и может необязательно содержать дополнительную информацию для отображения. Следующий код показывает пример реализации HealthIndicator:
@Component
public class MyHealthIndicator implements HealthIndicator {
@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() {
// perform some specific health check
return ...
}
}
@Component
class MyHealthIndicator : HealthIndicator {
override fun health(): Health {
val errorCode = check()
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build()
}
return Health.up().build()
}
private fun check(): Int {
// perform some specific health check
return ...
}
}
Идентификатор данного HealthIndicator — имя компонента без суффикса HealthIndicator, если он есть. В предыдущем примере информация о состоянии доступна в записи с именем my. |
Индикаторы состояния обычно вызываются по HTTP и должны ответить до истечения срока ожидания подключения. Spring Boot будет выводить сообщение об ошибке для любого индикатора состояния, который отвечает дольше 10 секунд. Если вы хотите настроить этот порог, вы можете использовать свойство management.endpoint.health.logging.slow-indicator-threshold. |
В дополнение к предопределённым типам Status Spring Boot, Health может возвращать пользовательский Status, представляющий новое состояние системы. В таких случаях вам также необходимо предоставить пользовательскую реализацию интерфейса StatusAggregator или настроить стандартную реализацию, используя конфигурационное свойство management.endpoint.health.status.order.
Например, предположим, что в одной из ваших реализаций HealthIndicator используется новый Status с кодом FATAL. Чтобы настроить порядок важности, добавьте следующее свойство в свои свойства приложения:
management.endpoint.health.status.order=fatal,down,out-of-service,unknown,up management:
endpoint:
health:
status:
order: "fatal,down,out-of-service,unknown,up" Код HTTP-статуса в ответе отражает общее состояние здоровья. По умолчанию OUT_OF_SERVICE и DOWN сопоставляются со значением 503. Любые несопоставленные статусы состояния, включая UP, сопоставляются со значением 200. Возможно, вам также потребуется зарегистрировать пользовательские сопоставления статусов, если вы обращаетесь к точке входа состояния по HTTP. Настройка пользовательского сопоставления отключает значения по умолчанию для DOWN и OUT_OF_SERVICE. Если вы хотите сохранить значения по умолчанию, вы должны явно настроить их, наряду с любыми пользовательскими сопоставлениями. Например, следующее свойство сопоставляет FATAL со значением 503 (отказ в обслуживании) и сохраняет значения по умолчанию для DOWN и OUT_OF_SERVICE:
management.endpoint.health.status.http-mapping.down=503
management.endpoint.health.status.http-mapping.fatal=503
management.endpoint.health.status.http-mapping.out-of-service=503 management:
endpoint:
health:
status:
http-mapping:
down: 503
fatal: 503
out-of-service: 503 Если вам нужен больший контроль, вы можете определить собственный компонент HttpCodeStatusMapper bean. |
В следующей таблице показаны значения по умолчанию для сопоставления статусов встроенных статусов:
| Статус | Сопоставление |
|---|---|
|
|
|
|
| Сопоставление по умолчанию отсутствует, поэтому HTTP-статус — |
| Сопоставление по умолчанию отсутствует, поэтому HTTP-статус — |
2.8.3. Реактивные индикаторы состояния
Для реактивных приложений, таких как те, которые используют Spring WebFlux, ReactiveHealthContributor предоставляет асинхронный интерфейс для получения состояния приложения. Аналогично традиционному HealthContributor, информация о состоянии собирается из содержимого ReactiveHealthContributorRegistry (по умолчанию, все HealthContributor и ReactiveHealthContributor экземпляры, определённые в вашем ApplicationContext). Стандартные HealthContributors проверки, не выполняемые с реактивным API, выполняются на эластичном планировщике.
В реактивном приложении вы должны использовать ReactiveHealthContributorRegistry для регистрации и отмены регистрации индикаторов состояния во время выполнения. Если вам нужно зарегистрировать обычный HealthContributor, вы должны обернуть его в ReactiveHealthContributor#adapt. |
Для предоставления пользовательской информации о состоянии из реактивного API вы можете зарегистрировать компоненты Spring, реализующие интерфейс ReactiveHealthIndicator. Следующий код показывает пример реализации ReactiveHealthIndicator:
@Component
public class MyReactiveHealthIndicator implements ReactiveHealthIndicator {
@Override
public Mono<Health> health() {
return doHealthCheck().onErrorResume((exception) ->
Mono.just(new Health.Builder().down(exception).build()));
}
private Mono<Health> doHealthCheck() {
// perform some specific health check
return ...
}
}
@Component
class MyReactiveHealthIndicator : ReactiveHealthIndicator {
override fun health(): Mono<Health> {
return doHealthCheck()!!.onErrorResume { exception: Throwable? ->
Mono.just(Health.Builder().down(exception).build())
}
}
private fun doHealthCheck(): Mono<Health>? {
// perform some specific health check
return ...
}
}
Чтобы автоматически обработать ошибку, рассмотрите возможность расширения от AbstractReactiveHealthIndicator. |
2.8.4. Автонастроенные реактивные индикаторы состояния
При необходимости Spring Boot автоматически настраивает следующие:
| Ключ | Имя | Описание |
|---|---|---|
| Проверяет, доступна ли база данных Cassandra. | |
| Проверяет, доступен ли кластер Couchbase. | |
| Проверяет, доступен ли кластер Elasticsearch. | |
| Проверяет, доступна ли база данных Mongo. | |
| Проверяет, доступна ли база данных Neo4j. | |
| Проверяет, доступен ли сервер Redis. |
При необходимости реактивные индикаторы заменяют стандартные. Кроме того, любые HealthIndicator , которые не обрабатываются явно, автоматически оборачиваются. |
2.8.5. Группы состояния
Иногда полезно группировать индикаторы состояния для различных целей.
Для создания группы индикаторов состояния можно использовать свойство management.endpoint.health.group.<name> и указать список идентификаторов индикаторов состояния для включения или исключения. Например, для создания группы, включающей только индикаторы баз данных, можно определить следующее:
management.endpoint.health.group.custom.include=db management:
endpoint:
health:
group:
custom:
include: "db" Затем можно проверить результат, обратившись по адресу localhost:8080/actuator/health/custom.
Аналогично, для создания группы, исключающей индикаторы баз данных и включающей все остальные, можно определить следующее:
management.endpoint.health.group.custom.exclude=db management:
endpoint:
health:
group:
custom:
exclude: "db" По умолчанию, запуск завершится неудачей, если группа состояния включает или исключает индикатор состояния, которого нет. Чтобы отключить это поведение, установите management.endpoint.health.validate-group-membership в false.
По умолчанию, группы наследуют те же настройки StatusAggregator и HttpCodeStatusMapper , что и общесистемное состояние. Однако, вы также можете определить их на уровне группы. Также можно переопределить свойства show-details и roles при необходимости:
management.endpoint.health.group.custom.show-details=when-authorized
management.endpoint.health.group.custom.roles=admin
management.endpoint.health.group.custom.status.order=fatal,up
management.endpoint.health.group.custom.status.http-mapping.fatal=500
management.endpoint.health.group.custom.status.http-mapping.out-of-service=500 management:
endpoint:
health:
group:
custom:
show-details: "when-authorized"
roles: "admin"
status:
order: "fatal,up"
http-mapping:
fatal: 500
out-of-service: 500 Можно использовать @Qualifier("groupname") , если необходимо зарегистрировать пользовательские StatusAggregator или HttpCodeStatusMapper компоненты для использования в группе. |
Группа состояния также может включать/исключать CompositeHealthContributor . Вы также можете включить/исключить только определенный компонент CompositeHealthContributor. Это можно сделать, используя полное имя компонента следующим образом:
management.endpoint.health.group.custom.include="test/primary"
management.endpoint.health.group.custom.exclude="test/primary/b" В приведенном выше примере группа custom будет включать HealthContributor с именем primary, который является компонентом составного test . Здесь primary сам является составным, и HealthContributor с именем b будет исключен из группы custom.
Группы состояния могут быть доступны по дополнительным путям на основном или управляющем порту. Это полезно в облачных средах, таких как Kubernetes, где часто используется отдельный управляющий порт для конечных точек актуатора по соображениям безопасности. Наличие отдельного порта может привести к ненадежным проверкам состояния, поскольку основное приложение может работать некорректно, даже если проверка состояния успешна. Группу состояния можно настроить с дополнительным путём следующим образом:
management.endpoint.health.group.live.additional-path="server:/healthz" Это сделает группу состояний live доступной на основном порту сервера по адресу /healthz . Префикс обязателен и должен быть либо server: (представляет основной порт сервера), либо management: (представляет управляющий порт, если он настроен). Путь должен быть единственным сегментом пути.
2.8.6. Состояние источника данных
Индикатор состояния DataSource отображает состояние как стандартных источников данных, так и компонентов-источников данных маршрутизации. Состояние маршрутизируемого источника данных включает состояние каждого из его целевых источников данных. В ответе конечной точки состояния каждый из целевых источников маршрутизируемого источника данных называется с использованием его ключа маршрутизации. Если вы предпочитаете не включать маршрутизируемые источники данных в вывод индикатора, установите management.health.db.ignore-routing-data-sources в true.
2.9. Зонды Kubernetes
Приложения, развернутые в Kubernetes, могут предоставлять информацию о своём внутреннем состоянии с помощью зондов контейнеров. В зависимости от конфигурации Kubernetes, kubelet вызывает эти зонды и реагирует на результат.
По умолчанию Spring Boot управляет состоянием доступности приложения Состояние доступности приложения. При развертывании в среде Kubernetes, Actuator собирает информацию о «жизнеспособности» и «готовности» из интерфейса ApplicationAvailability и использует эту информацию в специализированных показателях состояния: LivenessStateHealthIndicator и ReadinessStateHealthIndicator. Эти индикаторы отображаются на глобальном концевой точке состояния ("/actuator/health"). Они также доступны как отдельные HTTP зонды, используя группы состояния: "/actuator/health/liveness" и "/actuator/health/readiness".
Затем вы можете настроить свою инфраструктуру Kubernetes с помощью следующей информации об конечных точках:
livenessProbe:
httpGet:
path: "/actuator/health/liveness"
port: <actuator-port>
failureThreshold: ...
periodSeconds: ...
readinessProbe:
httpGet:
path: "/actuator/health/readiness"
port: <actuator-port>
failureThreshold: ...
periodSeconds: ... <actuator-port> должен быть установлен на порт, на котором доступны конечные точки Actuator. Это может быть основной порт веб-сервера или отдельный порт управления, если была установлена свойство "management.server.port" . |
Эти группы состояния автоматически активируются только если приложение работает в среде Kubernetes. Вы можете включить их в любой среде, используя свойство конфигурации management.endpoint.health.probes.enabled.
Если запуск приложения занимает больше времени, чем настроенный период жизнеспособности, Kubernetes указывает на "startupProbe" как возможное решение. В целом, "startupProbe" необязательно, поскольку "readinessProbe" терпит неудачу, пока не завершатся все задачи запуска. Это означает, что ваше приложение не будет получать трафик, пока не будет готово. Однако, если ваш запуск занимает много времени, рассмотрите использование "startupProbe" чтобы убедиться, что Kubernetes не завершит ваше приложение во время запуска. См. раздел, описывающий поведение зондов во время жизненного цикла приложения. |
Если ваши конечные точки Actuator развернуты в отдельном контексте управления, они не используют ту же веб-инфраструктуру (порт, пулы подключений, компоненты фреймворка), что и основное приложение. В этом случае проверка зонда может быть успешной, даже если основное приложение работает неправильно (например, не может принимать новые подключения). По этой причине рекомендуется сделать группы состояния liveness и readiness доступными на основном порте сервера. Это можно сделать, установив следующее свойство:
management.endpoint.health.probes.add-additional-paths=true Это сделает группу liveness доступной по адресу /livez и группу readiness доступной по адресу /readyz на основном порте сервера. Пути можно настроить с помощью свойства additional-path каждой группы, см. группы состояния для подробностей.
2.9.1. Проверка внешнего состояния с помощью зондов Kubernetes
Actuator настраивает зонды «жизнеспособности» и «готовности» как группы состояния. Это означает, что для них доступны все возможности функции групп состояния. Например, вы можете настроить дополнительные индикаторы состояния:
management.endpoint.health.group.readiness.include=readinessState,customCheck management:
endpoint:
health:
group:
readiness:
include: "readinessState,customCheck" По умолчанию Spring Boot не добавляет другие индикаторы состояния в эти группы.
Зонд «жизнеспособности» не должен зависеть от проверок внешних систем. Если состояние жизнеспособности приложения нарушено, Kubernetes пытается решить эту проблему, перезапустив экземпляр приложения. Это означает, что если внешняя система (например, база данных, веб-API или внешний кэш) выходит из строя, Kubernetes может перезапустить все экземпляры приложения и вызвать цепную реакцию сбоев.
Что касается зонда «готовности», выбор проверки внешних систем должен быть сделан разработчиками приложения со всей ответственностью. По этой причине Spring Boot не включает никаких дополнительных проверок состояния в зонд «готовности». Если состояние готовности экземпляра приложения не готово, Kubernetes не направляет трафик на этот экземпляр. Некоторые внешние системы могут не быть общими для экземпляров приложения, в этом случае они могут быть включены в зонд готовности. Другие внешние системы могут быть некритичными для приложения (у приложения могут быть предохранители и обходные пути), в этом случае их определенно не следует включать. К сожалению, внешняя система, которая общая для всех экземпляров приложения, является распространённой, и вам нужно принять решение: включить её в зонд готовности и ожидать, что приложение будет выведено из работы, когда внешний сервис недоступен, или исключить её и иметь дело с ошибками на более высоком уровне стека, возможно, используя предохранитель в вызывающей стороне.
Если все экземпляры приложения не готовы, служба Kubernetes с type=ClusterIP или NodePort не принимает никаких входящих подключений. Нет ответа с HTTP ошибкой (503 и т.д.), так как нет подключения. Служба с type=LoadBalancer может или не может принимать подключения, в зависимости от провайдера. Сервис с явным ingress также отвечает способом, зависящим от реализации - служба ingress сама должна решить, как обработать «отказ в подключении» от нижележащего уровня. HTTP 503 весьма вероятен в случае как балансировщика нагрузки, так и ingress. |
Также, если приложение использует автоматическое масштабирование Kubernetes horizontal-pod-autoscaling, его реакция на вывод приложений из балансировщика может отличаться в зависимости от конфигурации его автомасштабирования.
2.9.2. Жизненный цикл приложения и состояния зондирования
Важным аспектом поддержки зондирования Kubernetes является его согласованность с жизненным циклом приложения. Существует существенная разница между AvailabilityState (внутреннее состояние приложения в памяти) и фактическим зондированием (которое отображает это состояние). В зависимости от фазы жизненного цикла приложения, зондирование может быть недоступно.
Spring Boot публикует события приложения во время запуска и завершения, и зондирования могут подключаться к таким событиям и отображать AvailabilityState информацию.
В следующих таблицах показаны AvailabilityState и состояние HTTP-соединений на разных этапах.
При запуске приложения Spring Boot:
| Фаза запуска | LivenessState | ReadinessState | HTTP-сервер | Примечания |
|---|---|---|---|---|
Запуск |
|
| Не запущен | Kubernetes проверяет зондирование "liveness" и перезапускает приложение, если оно занимает слишком много времени. |
Запущен |
|
| Отклоняет запросы | Контекст приложения обновлен. Приложение выполняет задачи запуска и еще не принимает трафик. |
Готов |
|
| Принимает запросы | Задачи запуска завершены. Приложение принимает трафик. |
При завершении работы приложения Spring Boot:
| Фаза завершения | Состояние Liveness | Состояние Readiness | HTTP-сервер | Примечания |
|---|---|---|---|---|
Выполнение |
|
| Принимает запросы | Завершение запрошено. |
Плавное завершение |
|
| Новые запросы отклоняются | Если включено, процессы плавного завершения обрабатывают входящие запросы. |
Завершение | Н/Д | Н/Д | Сервер остановлен | Контекст приложения закрыт, и приложение остановлено. |
| Смотрите раздел жизненного цикла контейнера Kubernetes для получения дополнительной информации о развертывании Kubernetes. |
2.10. Информация о приложении
Информация о приложении предоставляет различные данные, собранные от всех InfoContributor бинов, определённых в вашем ApplicationContext. Spring Boot включает в себя ряд автоматически настроенных InfoContributor бинов, и вы можете написать свои собственные.
2.10.1. Автоматически настроенные InfoContributors
По возможности Spring автоматически настраивает следующие InfoContributor бины:
| ID | Имя | Описание | Предварительные условия |
|---|---|---|---|
| Отображает информацию о сборке. | Ресурс | |
| Отображает любую переменную из | Нет. | |
| Отображает информацию из Git. | Ресурс | |
| Отображает информацию о среде выполнения Java. | Нет. | |
| Отображает информацию об операционной системе. | Нет. |
Включённость отдельных участников контролируется свойством management.info.<id>.enabled . Разные участники имеют разные значения по умолчанию для этого свойства, в зависимости от их предварительных условий и характера отображаемой информации.
Участники env, java, и os по умолчанию отключены, так как у них нет предварительных условий, указывающих на их включение. Каждый из них можно включить, установив свойство management.info.<id>.enabled в true.
Участники build и git включены по умолчанию. Каждый из них можно отключить, установив свойство management.info.<id>.enabled в значение false. Также, чтобы отключить всех участников, обычно включённых по умолчанию, установите свойство management.info.defaults.enabled в значение false.
2.10.2. Кастомная информация о приложении
Когда включён участник env, вы можете настроить данные, отображаемые конечной точкой info, установив свойства Spring. Все свойства Environment под ключом info автоматически отображаются. Например, вы можете добавить следующие настройки в файл application.properties:
info.app.encoding=UTF-8
info.app.java.source=17
info.app.java.target=17 info:
app:
encoding: "UTF-8"
java:
source: "17"
target: "17" | Вместо жёсткого кодирования этих значений, вы также можете расширить свойства info во время сборки. Предполагая, что вы используете Maven, вы можете переписать предыдущий пример следующим образом: Свойства Yaml |
2.10.3. Информация о коммите Git
Ещё одна полезная функция конечной точки info — возможность публикации информации о состоянии вашего репозитория исходного кода git во время сборки проекта. Если доступен бин GitProperties, вы можете использовать конечную точку info для отображения этих свойств.
Бин GitProperties автоматически настраивается, если файл git.properties доступен в корневом каталоге classpath. Подробнее см. "как сгенерировать информацию о Git". |
По умолчанию конечная точка отображает свойства git.branch, git.commit.id, и git.commit.time, если они присутствуют. Если вы не хотите видеть эти свойства в ответе конечной точки, их нужно исключить из файла git.properties. Для отображения полной информации о Git (т.е. всего содержимого git.properties) используйте свойство management.info.git.mode, как показано ниже:
management.info.git.mode=full management:
info:
git:
mode: "full" Чтобы полностью отключить информацию о коммите Git из конечной точки info, установите свойство management.info.git.enabled в значение false, как показано ниже:
management.info.git.enabled=false management:
info:
git:
enabled: false 2.10.4. Информация о сборке
Если доступен бин BuildProperties, конечная точка info также может публиковать информацию о вашей сборке. Это происходит, если файл META-INF/build-info.properties доступен в classpath.
| Плагины Maven и Gradle могут генерировать этот файл. Подробнее см. "как сгенерировать информацию о сборке". |
2.10.5. Информация о Java
Конечная точка info публикует информацию о вашей среде выполнения Java, см. JavaInfo для получения дополнительной информации.
2.10.6. Информация об ОС
Конечная точка info публикует информацию о вашей операционной системе, см. OsInfo для получения дополнительной информации.
2.10.7. Создание собственных InfoContributors
Для предоставления кастомной информации о приложении вы можете зарегистрировать бины Spring, которые реализуют интерфейс InfoContributor.
Следующий пример вносит запись example с одним значением:
@Component
public class MyInfoContributor implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
builder.withDetail("example", Collections.singletonMap("key", "value"));
}
}
@Component
class MyInfoContributor : InfoContributor {
override fun contribute(builder: Info.Builder) {
builder.withDetail("example", Collections.singletonMap("key", "value"))
}
}
Если вы обратитесь к конечной точке info, вы увидите ответ, содержащий следующую дополнительную запись:
{
"example": {
"key" : "value"
}
} 3. Мониторинг и управление через HTTP
Если вы разрабатываете веб-приложение, Spring Boot Actuator автоматически настраивает все включенные конечные точки для экспонирования через HTTP. По умолчанию используется id конечной точки с префиксом /actuator в качестве пути URL. Например, health экспонируется как /actuator/health.
| Actuator поддерживается по умолчанию с Spring MVC, Spring WebFlux и Jersey. Если доступны как Jersey, так и Spring MVC, используется Spring MVC. |
| Jackson является необходимой зависимостью для получения корректных ответов JSON, как описано в документации API (HTML или PDF). |
3.1. Настройка путей конечных точек управления
Иногда полезно настроить префикс для конечных точек управления. Например, ваше приложение может уже использовать /actuator для другой цели. Вы можете использовать свойство management.endpoints.web.base-path для изменения префикса вашей конечной точки управления, как показано в следующем примере:
management.endpoints.web.base-path=/manage management:
endpoints:
web:
base-path: "/manage" Предыдущий application.properties пример изменяет конечную точку с /actuator/{id} на /manage/{id} (например, /manage/info).
Если порт управления не был настроен для экспонирования конечных точек с использованием другого порта HTTP, management.endpoints.web.base-path относит к server.servlet.context-path (для приложений веб-сервлетов) или spring.webflux.base-path (для реактивных веб-приложений). Если management.server.port настроен, management.endpoints.web.base-path относится к management.server.base-path. |
Если вы хотите сопоставить конечные точки с другим путем, вы можете использовать свойство management.endpoints.web.path-mapping.
Следующий пример пересопоставляет /actuator/health на /healthcheck:
management.endpoints.web.base-path=/
management.endpoints.web.path-mapping.health=healthcheck management:
endpoints:
web:
base-path: "/"
path-mapping:
health: "healthcheck" 3.2. Настройка порта сервера управления
Экспонирование конечных точек управления с использованием порта HTTP по умолчанию — разумный выбор для облачных развертываний. Однако, если ваше приложение работает внутри собственного дата-центра, вы можете предпочесть экспонировать конечные точки с использованием другого порта HTTP.
Вы можете установить свойство management.server.port для изменения порта HTTP, как показано в следующем примере:
management.server.port=8081 management:
server:
port: 8081 | В Cloud Foundry по умолчанию приложения получают запросы только на порту 8080 для маршрутизации HTTP и TCP. Если вы хотите использовать пользовательский порт управления в Cloud Foundry, вам нужно явно настроить маршруты приложения для перенаправления трафика на пользовательский порт. |
3.3. Настройка SSL для сервера управления
При настройке на использование пользовательского порта вы также можете настроить сервер управления с собственным SSL, используя различные свойства management.server.ssl.*. Например, это позволяет серверу управления быть доступным через HTTP, в то время как основное приложение использует HTTPS, как показано в следующих настройках свойств:
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:store.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=false server:
port: 8443
ssl:
enabled: true
key-store: "classpath:store.jks"
key-password: "secret"
management:
server:
port: 8080
ssl:
enabled: false В качестве альтернативы, и основной сервер, и сервер управления могут использовать SSL, но с различными хранилищами ключей, как показано ниже:
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=true
management.server.ssl.key-store=classpath:management.jks
management.server.ssl.key-password=secret server:
port: 8443
ssl:
enabled: true
key-store: "classpath:main.jks"
key-password: "secret"
management:
server:
port: 8080
ssl:
enabled: true
key-store: "classpath:management.jks"
key-password: "secret" 3.4. Настройка адреса сервера управления
Вы можете настроить адрес, на котором доступны конечные точки управления, задав свойство management.server.address. Это может быть полезно, если вы хотите прослушивать только внутреннюю или обслуживающую сеть или принимать подключения только от localhost.
| Вы можете прослушивать по другому адресу только в случае, если порт отличается от порта основного сервера. |
В следующем примере application.properties не разрешает удаленные подключения к управлению:
management.server.port=8081
management.server.address=127.0.0.1 management:
server:
port: 8081
address: "127.0.0.1" 3.5. Отключение конечных точек HTTP
Если вы не хотите экспонировать конечные точки через HTTP, вы можете установить порт управления на -1, как показано в следующем примере:
management.server.port=-1 management:
server:
port: -1 Это также можно сделать, используя свойство management.endpoints.web.exposure.exclude, как показано в следующем примере:
management.endpoints.web.exposure.exclude=* management:
endpoints:
web:
exposure:
exclude: "*" 4. Мониторинг и управление через JMX
Java Management Extensions (JMX) обеспечивают стандартный механизм для мониторинга и управления приложениями. По умолчанию эта функция отключена. Вы можете включить её, установив свойство конфигурации spring.jmx.enabled в значение true. Spring Boot экспонирует подходящий MBeanServer в качестве бин с идентификатором mbeanServer. Любые ваши бины, аннотированные аннотациями Spring JMX (@ManagedResource, @ManagedAttribute, или @ManagedOperation ), будут доступны для него.
Если ваша платформа предоставляет стандартный MBeanServer, Spring Boot использует его и по умолчанию использует VM MBeanServer, если это необходимо. В случае неудачи создаётся новый MBeanServer.
См. класс JmxAutoConfiguration для получения более подробной информации.
По умолчанию Spring Boot также экспонирует конечные точки управления в качестве MBeans JMX под доменом org.springframework.boot. Чтобы полностью контролировать регистрацию конечных точек в домене JMX, рассмотрите возможность регистрации собственной реализации EndpointObjectNameFactory.
4.1. Настройка имён MBean
Имя MBean обычно генерируется из id конечной точки. Например, конечная точка health экспонируется как org.springframework.boot:type=Endpoint,name=Health.
Если ваше приложение содержит более одного Spring ApplicationContext, могут возникнуть конфликты имён. Чтобы решить эту проблему, вы можете установить свойство spring.jmx.unique-names в значение true, чтобы имена MBean всегда были уникальными.
Вы также можете настроить домен JMX, под которым экспонируются конечные точки. В следующих настройках показан пример их выполнения в application.properties:
spring.jmx.unique-names=true
management.endpoints.jmx.domain=com.example.myapp spring:
jmx:
unique-names: true
management:
endpoints:
jmx:
domain: "com.example.myapp" 4.2. Отключение конечных точек JMX
Если вы не хотите экспонировать конечные точки через JMX, вы можете установить свойство management.endpoints.jmx.exposure.exclude в значение *, как показано в следующем примере:
management.endpoints.jmx.exposure.exclude=* management:
endpoints:
jmx:
exposure:
exclude: "*" 5. Наблюдаемость
Наблюдаемость — это способность наблюдать за внутренним состоянием работающей системы извне. Она состоит из трёх столпов: регистрация, метрики и трассировки.
Для метрик и трассировок Spring Boot использует Наблюдение Micrometer. Чтобы создать собственные наблюдения (которые приведут к метрикам и трассировкам), вы можете ввести ObservationRegistry.
@Component
public class MyCustomObservation {
private final ObservationRegistry observationRegistry;
public MyCustomObservation(ObservationRegistry observationRegistry) {
this.observationRegistry = observationRegistry;
}
public void doSomething() {
Observation.createNotStarted("doSomething", this.observationRegistry)
.lowCardinalityKeyValue("locale", "en-US")
.highCardinalityKeyValue("userId", "42")
.observe(() -> {
// Execute business logic here
});
}
}
| Метки с низкой кардинальностью будут добавлены к метрикам и трассировкам, в то время как метки с высокой кардинальностью будут добавлены только к трассировкам. |
Компоненты типа ObservationPredicate, GlobalObservationConvention и ObservationHandler будут автоматически зарегистрированы в ObservationRegistry. Вы также можете зарегистрировать любое количество компонентов ObservationRegistryCustomizer для дальнейшей настройки реестра.
Для получения дополнительной информации см. документацию по наблюдениям Micrometer.
| Наблюдаемость для JDBC и R2DBC может быть настроена с помощью отдельных проектов. Для JDBC проект Datasource Micrometer предоставляет стартовый набор Spring Boot, который автоматически создаёт наблюдения при вызове JDBC-операций. Подробнее читайте в справочной документации. Для R2DBC Автоконфигурация Spring Boot для наблюдений R2DBC создаёт наблюдения для вызовов запросов R2DBC. |
Следующие разделы предоставят больше подробностей о регистрации, метриках и трассировках.
6. Логгеры
Spring Boot Actuator включает возможность просмотра и настройки уровней логов вашего приложения во время выполнения. Вы можете просмотреть весь список или конфигурацию отдельного логгера, которая состоит как из явно настроенного уровня логов, так и из эффективного уровня логов, заданного фреймворком регистрации. Эти уровни могут быть:
-
TRACE -
DEBUG -
INFO -
WARN -
ERROR -
FATAL -
OFF -
null
null означает, что нет явной конфигурации.
6.1. Настройка логгера
Чтобы настроить данный логгер, POST частичную сущность в URI ресурса, как показано в следующем примере:
{
"configuredLevel": "DEBUG"
} Чтобы «сбросить» конкретный уровень логгера (и использовать вместо него значения по умолчанию), вы можете передать значение null в качестве configuredLevel. |
7. Метрики
Spring Boot Actuator предоставляет управление зависимостями и автоконфигурацию для Micrometer, фасада прикладных метрик, поддерживающего многочисленные системы мониторинга, включая:
| Чтобы узнать больше о возможностях Micrometer, см. его справочную документацию, в частности раздел понятия. |
7.1. Начало работы
Spring Boot автоматически настраивает составной MeterRegistry и добавляет реестр в составной для каждой поддерживаемой реализации, которую находит в пути к классам. Наличие зависимости от micrometer-registry-{system} в пути к классам во время выполнения достаточно для того, чтобы Spring Boot настраивал реестр.
Большинство реестров имеют общие функции. Например, вы можете отключить конкретный реестр, даже если реализация реестра Micrometer находится в пути к классам. В следующем примере отключается Datadog:
management.datadog.metrics.export.enabled=false management:
datadog:
metrics:
export:
enabled: false Вы также можете отключить все реестры, если не указано иное свойством конкретного реестра, как показано в следующем примере:
management.defaults.metrics.export.enabled=false management:
defaults:
metrics:
export:
enabled: false Spring Boot также добавляет все автоматически настроенные реестры в глобальный статический составной реестр в классе Metrics, если вы не скажете ему этого не делать:
management.metrics.use-global-registry=false management:
metrics:
use-global-registry: false Вы можете зарегистрировать любое количество компонентов MeterRegistryCustomizer для дальнейшей настройки реестра, например, для применения общих меток до регистрации любых счетчиков в реестре:
@Configuration(proxyBeanMethods = false)
public class MyMeterRegistryConfiguration {
@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return (registry) -> registry.config().commonTags("region", "us-east-1");
}
}
@Configuration(proxyBeanMethods = false)
class MyMeterRegistryConfiguration {
@Bean
fun metricsCommonTags(): MeterRegistryCustomizer<MeterRegistry> {
return MeterRegistryCustomizer { registry ->
registry.config().commonTags("region", "us-east-1")
}
}
}
Вы можете применить настройки к конкретным реализациям реестра, указав более конкретный тип:
@Configuration(proxyBeanMethods = false)
public class MyMeterRegistryConfiguration {
@Bean
public MeterRegistryCustomizer<GraphiteMeterRegistry> graphiteMetricsNamingConvention() {
return (registry) -> registry.config().namingConvention(this::name);
}
private String name(String name, Meter.Type type, String baseUnit) {
return ...
}
}
@Configuration(proxyBeanMethods = false)
class MyMeterRegistryConfiguration {
@Bean
fun graphiteMetricsNamingConvention(): MeterRegistryCustomizer<GraphiteMeterRegistry> {
return MeterRegistryCustomizer { registry: GraphiteMeterRegistry ->
registry.config().namingConvention(this::name)
}
}
private fun name(name: String, type: Meter.Type, baseUnit: String?): String {
return ...
}
}
Spring Boot также настраивает встроенную инструментировку, которую вы можете контролировать с помощью конфигурации или специальных аннотаций.
7.2. Поддерживаемые системы мониторинга
В этом разделе кратко описаны каждая из поддерживаемых систем мониторинга.
7.2.1. AppOptics
По умолчанию регистр AppOptics периодически отправляет метрики в api.appoptics.com/v1/measurements. Для экспорта метрик в SaaS-сервис AppOptics необходимо предоставить свой токен API:
management.appoptics.metrics.export.api-token=YOUR_TOKEN management:
appoptics:
metrics:
export:
api-token: "YOUR_TOKEN" 7.2.2. Atlas
По умолчанию метрики экспортируются в Atlas, работающий на вашем локальном компьютере. Вы можете указать расположение сервера Atlas:
management.atlas.metrics.export.uri=https://atlas.example.com:7101/api/v1/publish management:
atlas:
metrics:
export:
uri: "https://atlas.example.com:7101/api/v1/publish" 7.2.3. Datadog
Регистр Datadog периодически отправляет метрики в datadoghq. Для экспорта метрик в Datadog необходимо указать ваш API-ключ:
management.datadog.metrics.export.api-key=YOUR_KEY management:
datadog:
metrics:
export:
api-key: "YOUR_KEY" Если вы дополнительно укажете ключ приложения (необязательно), то также будут экспортированы метаданные, такие как описания метров, типы и базовые единицы:
management.datadog.metrics.export.api-key=YOUR_API_KEY
management.datadog.metrics.export.application-key=YOUR_APPLICATION_KEY management:
datadog:
metrics:
export:
api-key: "YOUR_API_KEY"
application-key: "YOUR_APPLICATION_KEY" По умолчанию метрики отправляются на сайт Datadog в США site (api.datadoghq.com). Если ваш проект Datadog размещён на одном из других сайтов или вам нужно отправлять метрики через прокси, настройте URI соответственно:
management.datadog.metrics.export.uri=https://api.datadoghq.eu management:
datadog:
metrics:
export:
uri: "https://api.datadoghq.eu" Вы также можете изменить интервал, с которым метрики отправляются в Datadog:
management.datadog.metrics.export.step=30s management:
datadog:
metrics:
export:
step: "30s" 7.2.4. Dynatrace
Dynatrace предлагает два API для приема метрик, оба из которых реализованы для Micrometer. Документацию Dynatrace по приему метрик Micrometer вы можете найти здесь. Параметры конфигурации в пространстве имен v1 применяются только при экспорте в API v1 временных рядов. Параметры конфигурации в пространстве имен v2 применяются только при экспорте в API v2 метрик. Обратите внимание, что эта интеграция может экспортировать только в версию API v1 или v2 в один момент, при этом v2 предпочтительнее. Если device-id (необходим для v1, но не используется в v2) установлен в пространстве имен v1, метрики экспортируются на конечную точку v1. В противном случае предполагается v2.
API v2
API v2 можно использовать двумя способами.
Автоконфигурация
Автоконфигурация Dynatrace доступна для хостов, которые отслеживаются OneAgent или оператором Dynatrace для Kubernetes.
Локальный OneAgent: Если на хосте запущен OneAgent, метрики автоматически экспортируются на локальную конечную точку приема OneAgent. Конечная точка приема передает метрики на бэкенд Dynatrace.
Оператор Dynatrace для Kubernetes: При работе в Kubernetes с установленным оператором Dynatrace регистр автоматически получит URI вашей конечной точки и токен API из оператора.
Это стандартное поведение и не требует специальной настройки помимо зависимости от io.micrometer:micrometer-registry-dynatrace.
Ручная настройка
Если автоматическая настройка недоступна, требуется конечная точка API v2 метрик и токен API. Токен API должен иметь разрешение «Принимать метрики» (metrics.ingest). Рекомендуется ограничить область действия токена только этим разрешением. Вы должны убедиться, что URI конечной точки содержит путь (например, /api/v2/metrics/ingest):
URL конечной точки приема API метрик v2 отличается в зависимости от вашего варианта развертывания:
-
SaaS:
https://{your-environment-id}.live.dynatrace.com/api/v2/metrics/ingest -
Развертывания в облаке:
https://{your-domain}/e/{your-environment-id}/api/v2/metrics/ingest
Пример ниже настраивает экспорт метрик с использованием идентификатора среды example:
management.dynatrace.metrics.export.uri=https://example.live.dynatrace.com/api/v2/metrics/ingest
management.dynatrace.metrics.export.api-token=YOUR_TOKEN management:
dynatrace:
metrics:
export:
uri: "https://example.live.dynatrace.com/api/v2/metrics/ingest"
api-token: "YOUR_TOKEN" При использовании API v2 Dynatrace доступны следующие необязательные функции (более подробную информацию можно найти в документации Dynatrace):
-
Префикс ключа метрики: Устанавливает префикс, который добавляется ко всем ключам экспортируемых метрик.
-
Обогащение данными Dynatrace: Если работает OneAgent или оператор Dynatrace, обогащайте метрики дополнительными метаданными (например, о хосте, процессе или под).
-
Стандартные измерения: Укажите пары «ключ-значение», которые добавляются ко всем экспортируемым метрикам. Если метки с одинаковым ключом указаны с помощью Micrometer, они перезаписывают стандартные измерения.
-
Использование инструментов Dynatrace Summary: В некоторых случаях регистр Micrometer Dynatrace создавал метрики, которые отклонялись. В Micrometer 1.9.x это было исправлено путем введения инструментов Dynatrace-специфических суммарных значений. Установка этого переключателя в
falseзаставляет Micrometer вернуться к поведению, которое было по умолчанию до 1.9.x. Его следует использовать только при возникновении проблем при миграции с Micrometer 1.8.x на 1.9.x.
Можно не указывать URI и токен API, как показано в следующем примере. В этом случае используется автоматически настроенная конечная точка:
management.dynatrace.metrics.export.v2.metric-key-prefix=your.key.prefix
management.dynatrace.metrics.export.v2.enrich-with-dynatrace-metadata=true
management.dynatrace.metrics.export.v2.default-dimensions.key1=value1
management.dynatrace.metrics.export.v2.default-dimensions.key2=value2
management.dynatrace.metrics.export.v2.use-dynatrace-summary-instruments=true management:
dynatrace:
metrics:
export:
# Specify uri and api-token here if not using the local OneAgent endpoint.
v2:
metric-key-prefix: "your.key.prefix"
enrich-with-dynatrace-metadata: true
default-dimensions:
key1: "value1"
key2: "value2"
use-dynatrace-summary-instruments: true # (default: true) API v1 (Устаревший)
Регистр метрик API v1 Dynatrace периодически отправляет метрики по указанному URI с использованием API v1 временных рядов. Для обратной совместимости с существующими настройками, когда device-id установлено (необходимо для v1, но не используется в v2), метрики экспортируются на конечную точку Timeseries v1. Для экспорта метрик в Dynatrace необходимо указать ваш токен API, идентификатор устройства и URI:
management.dynatrace.metrics.export.uri=https://{your-environment-id}.live.dynatrace.com
management.dynatrace.metrics.export.api-token=YOUR_TOKEN
management.dynatrace.metrics.export.v1.device-id=YOUR_DEVICE_ID management:
dynatrace:
metrics:
export:
uri: "https://{your-environment-id}.live.dynatrace.com"
api-token: "YOUR_TOKEN"
v1:
device-id: "YOUR_DEVICE_ID" Для API v1 необходимо указать базовый URI среды без пути, так как путь к конечной точке v1 добавляется автоматически.
Настройки, независимые от версии
В дополнение к конечной точке API и токену, вы также можете изменить интервал, с которым метрики отправляются в Dynatrace. Стандартный интервал экспорта составляет 60s. Следующий пример устанавливает интервал экспорта в 30 секунд:
management.dynatrace.metrics.export.step=30s management:
dynatrace:
metrics:
export:
step: "30s" Дополнительную информацию о настройке экспортера Dynatrace для Micrometer можно найти в документации Micrometer и документации Dynatrace.
7.2.5. Elastic
По умолчанию метрики экспортируются в Elastic, запущенный на вашем локальном компьютере. Вы можете указать расположение сервера Elastic, используя следующее свойство:
management.elastic.metrics.export.host=https://elastic.example.com:8086 management:
elastic:
metrics:
export:
host: "https://elastic.example.com:8086" 7.2.6. Ganglia
По умолчанию метрики экспортируются в Ganglia, запущенный на вашем локальном компьютере. Вы можете указать хост и порт сервера Ganglia, как показано в примере ниже:
management.ganglia.metrics.export.host=ganglia.example.com
management.ganglia.metrics.export.port=9649 management:
ganglia:
metrics:
export:
host: "ganglia.example.com"
port: 9649 7.2.7. Graphite
По умолчанию метрики экспортируются в Graphite, запущенный на вашем локальном компьютере. Вы можете указать хост и порт сервера Graphite, как показано в примере ниже:
management.graphite.metrics.export.host=graphite.example.com
management.graphite.metrics.export.port=9004 management:
graphite:
metrics:
export:
host: "graphite.example.com"
port: 9004 Micrometer предоставляет по умолчанию HierarchicalNameMapper, который управляет тем, как идентификатор измерения с несколькими измерениями отображается в плоские иерархические имена.
| Чтобы контролировать это поведение, определите свой Java Kotlin |
7.2.8. Humio
По умолчанию регистр Humio периодически отправляет метрики на cloud.humio.com. Чтобы экспортировать метрики в SaaS Humio, необходимо предоставить свой токен API:
management.humio.metrics.export.api-token=YOUR_TOKEN management:
humio:
metrics:
export:
api-token: "YOUR_TOKEN" Также следует настроить один или несколько тегов для идентификации источника данных, в который отправляются метрики:
management.humio.metrics.export.tags.alpha=a
management.humio.metrics.export.tags.bravo=b management:
humio:
metrics:
export:
tags:
alpha: "a"
bravo: "b" 7.2.9. Influx
По умолчанию метрики экспортируются в экземпляр Influx v1, запущенный на вашем локальном компьютере, с конфигурацией по умолчанию. Чтобы экспортировать метрики в InfluxDB v2, настройте org, bucket, и параметры аутентификации token для записи метрик. Вы можете указать расположение сервера Influx для использования, используя:
management.influx.metrics.export.uri=https://influx.example.com:8086 management:
influx:
metrics:
export:
uri: "https://influx.example.com:8086" 7.2.10. JMX
Micrometer предоставляет иерархическое отображение в JMX, прежде всего, как недорогой и портативный способ просмотра метрик локально. По умолчанию метрики экспортируются в JMX домен metrics. Вы можете указать используемый домен, используя:
management.jmx.metrics.export.domain=com.example.app.metrics management:
jmx:
metrics:
export:
domain: "com.example.app.metrics" Micrometer предоставляет по умолчанию HierarchicalNameMapper, который управляет тем, как идентификатор измерения с несколькими измерениями отображается в плоские иерархические имена.
| Чтобы контролировать это поведение, определите свой Java Kotlin |
7.2.11. KairosDB
По умолчанию метрики экспортируются в KairosDB, запущенный на вашем локальном компьютере. Вы можете указать расположение сервера KairosDB для использования, используя:
management.kairos.metrics.export.uri=https://kairosdb.example.com:8080/api/v1/datapoints management:
kairos:
metrics:
export:
uri: "https://kairosdb.example.com:8080/api/v1/datapoints" 7.2.12. New Relic
Регистр New Relic периодически отправляет метрики в New Relic. Чтобы экспортировать метрики в New Relic, необходимо предоставить свой API ключ и идентификатор учетной записи:
management.newrelic.metrics.export.api-key=YOUR_KEY
management.newrelic.metrics.export.account-id=YOUR_ACCOUNT_ID management:
newrelic:
metrics:
export:
api-key: "YOUR_KEY"
account-id: "YOUR_ACCOUNT_ID" Вы также можете изменить интервал, с которым метрики отправляются в New Relic:
management.newrelic.metrics.export.step=30s management:
newrelic:
metrics:
export:
step: "30s" По умолчанию метрики публикуются через REST-запросы, но вы также можете использовать API Java Agent, если он находится в вашем классе:
management.newrelic.metrics.export.client-provider-type=insights-agent management:
newrelic:
metrics:
export:
client-provider-type: "insights-agent" Наконец, вы можете полностью контролировать это, определив свою собственную NewRelicClientProvider bean.
7.2.13. OpenTelemetry
По умолчанию метрики экспортируются в OpenTelemetry, запущенный на вашем локальном компьютере. Вы можете указать расположение конечной точки OpenTelemetry метрик для использования, используя:
management.otlp.metrics.export.url=https://otlp.example.com:4318/v1/metrics management:
otlp:
metrics:
export:
url: "https://otlp.example.com:4318/v1/metrics" 7.2.14. Prometheus
Prometheus ожидает сканирования или опроса отдельных экземпляров приложения для получения метрик. Spring Boot предоставляет конечную точку актуатора по адресу /actuator/prometheus для представления сканирования Prometheus в соответствующем формате.
| По умолчанию конечная точка недоступна и должна быть открыта. Подробности см. в разделе открытие конечных точек. |
Следующий пример scrape_config добавляется к prometheus.yml.
scrape_configs:
- job_name: "spring"
metrics_path: "/actuator/prometheus"
static_configs:
- targets: ["HOST:PORT"] Примеры Prometheus также поддерживаются. Для активации этой функции должен быть доступен SpanContextSupplier bean. Если вы используете отслеживание Micrometer, то это будет автоматически настроено, но вы всегда можете создать свой собственный, если хотите. Обратитесь к документации Prometheus, так как эту функцию необходимо явно включить в Prometheus, и она поддерживается только в формате OpenMetrics.
Для эфемерных или пакетных задач, которые могут не существовать достаточно долго для сканирования, можно использовать поддержку Prometheus Pushgateway для экспорта метрик в Prometheus. Для включения поддержки Prometheus Pushgateway добавьте следующую зависимость в ваш проект:
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_pushgateway</artifactId>
</dependency> Когда зависимость Prometheus Pushgateway присутствует в классе и свойство management.prometheus.metrics.export.pushgateway.enabled установлено в значение true, PrometheusPushGatewayManager bean настраивается автоматически. Это позволяет управлять отправкой метрик в Prometheus Pushgateway.
Можно настроить PrometheusPushGatewayManager с помощью свойств в management.prometheus.metrics.export.pushgateway. Для расширенной конфигурации можно также предоставить свой собственный PrometheusPushGatewayManager bean.
7.2.15. SignalFx
Регистр SignalFx периодически отправляет метрики в SignalFx. Для экспорта метрик в SignalFx необходимо указать ваш токен доступа:
management.signalfx.metrics.export.access-token=YOUR_ACCESS_TOKEN management:
signalfx:
metrics:
export:
access-token: "YOUR_ACCESS_TOKEN" Также можно изменить интервал, с которым метрики отправляются в SignalFx:
management.signalfx.metrics.export.step=30s management:
signalfx:
metrics:
export:
step: "30s" 7.2.16. Simple
Micrometer поставляется с простым кеширующим бэкэндом, который автоматически используется по умолчанию, если не настроен никакой другой регистр. Это позволяет увидеть, какие метрики собираются в точке доступа метрик.
Кеширующий бэкэнд отключается, как только вы используете любой другой доступный бэкэнд. Вы также можете отключить его явно:
management.simple.metrics.export.enabled=false management:
simple:
metrics:
export:
enabled: false 7.2.17. Stackdriver
Регистр Stackdriver периодически отправляет метрики в Stackdriver. Для экспорта метрик в SaaS Stackdriver необходимо указать идентификатор вашего проекта Google Cloud:
management.stackdriver.metrics.export.project-id=my-project management:
stackdriver:
metrics:
export:
project-id: "my-project" Также можно изменить интервал, с которым метрики отправляются в Stackdriver:
management.stackdriver.metrics.export.step=30s management:
stackdriver:
metrics:
export:
step: "30s" 7.2.18. StatsD
Регистр StatsD активно отправляет метрики по UDP в агент StatsD. По умолчанию метрики экспортируются в StatsD агент, работающий на вашем локальном компьютере. Вы можете указать хост, порт и протокол StatsD агента, используя:
management.statsd.metrics.export.host=statsd.example.com
management.statsd.metrics.export.port=9125
management.statsd.metrics.export.protocol=udp management:
statsd:
metrics:
export:
host: "statsd.example.com"
port: 9125
protocol: "udp" Также можно изменить протокол строк StatsD (по умолчанию Datadog):
management.statsd.metrics.export.flavor=etsy management:
statsd:
metrics:
export:
flavor: "etsy" 7.2.19. Wavefront
Регистр Wavefront периодически отправляет метрики в Wavefront. Если вы экспортируете метрики напрямую в Wavefront, необходимо указать ваш токен API:
management.wavefront.api-token=YOUR_API_TOKEN management:
wavefront:
api-token: "YOUR_API_TOKEN" В качестве альтернативы вы можете использовать Wavefront sidecar или внутренний прокси в вашей среде для перенаправления данных метрик на хост API Wavefront:
management.wavefront.uri=proxy://localhost:2878 management:
wavefront:
uri: "proxy://localhost:2878" Если вы публикуете метрики в Wavefront прокси (как описано в документации Wavefront), хост должен быть в формате proxy://HOST:PORT. |
Также можно изменить интервал, с которым метрики отправляются в Wavefront:
management.wavefront.metrics.export.step=30s management:
wavefront:
metrics:
export:
step: "30s" 7.3. Поддерживаемые метрики и метры
Spring Boot предоставляет автоматическую регистрацию метров для широкого спектра технологий. В большинстве случаев, значения по умолчанию предоставляют разумные метрики, которые могут быть опубликованы в любой из поддерживаемых систем мониторинга.
7.3.1. Метрики JVM
Автоконфигурация включает метрики JVM, используя основные классы Micrometer. Метрики JVM публикуются под именем метра jvm..
Предоставляются следующие метрики JVM:
-
Различные данные о памяти и пулах буферов
-
Статистические данные, связанные с сборкой мусора
-
Использование потоков
-
Количество загруженных и выгруженных классов
-
Информация о версии JVM
-
Время компиляции JIT
7.3.2. Системные метрики
Автоконфигурация включает системные метрики, используя основные классы Micrometer. Системные метрики публикуются под именами метров system., process., и disk..
Предоставляются следующие системные метрики:
-
Метрики процессора
-
Метрики дескрипторов файлов
-
Метрики времени активности (как количество времени работы приложения, так и фиксированная метрика абсолютного начального времени)
-
Доступное дисковое пространство
7.3.3. Метрики запуска приложения
Автоконфигурация предоставляет метрики времени запуска приложения:
-
application.started.time: время, затраченное на запуск приложения. -
application.ready.time: время, затраченное на подготовку приложения к обработке запросов.
Метрики помечены полным квалифицированным именем класса приложения.
7.3.4. Метрики логгера
Автоконфигурация включает метрики событий для Logback и Log4J2. Подробная информация публикуется под именами метров log4j2.events. или logback.events..
7.3.5. Метрики выполнения и планирования задач
Автоконфигурация включает в себя инструментацию всех доступных ThreadPoolTaskExecutor и ThreadPoolTaskScheduler бинов, при условии, что подлежащий ThreadPoolExecutor доступен. Метрики помечены именем исполнителя, которое получено из имени бина.
7.3.6. Метрики Spring MVC
Автоконфигурация включает в себя инструментацию всех запросов, обрабатываемых контроллерами Spring MVC и функциональными обработчиками. По умолчанию метрики генерируются с именем http.server.requests. Вы можете настроить имя, установив свойство management.observations.http.server.requests.name.
См. документацию по Spring Framework для получения дополнительной информации о производимых наблюдениях.
Для добавления к меткам по умолчанию укажите @Bean, который расширяет DefaultServerRequestObservationConvention из пакета org.springframework.http.server.observation. Для замены меток по умолчанию укажите @Bean, который реализует ServerRequestObservationConvention.
| В некоторых случаях исключения, обрабатываемые в веб-контроллерах, не регистрируются как метки метрик запроса. Приложения могут включить регистрацию исключений, установив обрабатываемые исключения в качестве атрибутов запроса. |
По умолчанию обрабатываются все запросы. Для настройки фильтра укажите @Bean, который реализует FilterRegistrationBean<WebMvcMetricsFilter>.
7.3.7. Метрики Spring WebFlux
Автоконфигурация включает инструментацию всех запросов, обрабатываемых контроллерами и функциональными обработчиками Spring WebFlux. По умолчанию метрики генерируются с именем http.server.requests. Вы можете настроить имя, установив свойство management.observations.http.server.requests.name.
См. документацию по Spring Framework для получения дополнительной информации о производимых наблюдениях.
Для добавления к меткам по умолчанию укажите @Bean, который расширяет DefaultServerRequestObservationConvention из пакета org.springframework.http.server.reactive.observation. Для замены меток по умолчанию укажите @Bean, который реализует ServerRequestObservationConvention.
| В некоторых случаях исключения, обрабатываемые в контроллерах и обработчиках, не регистрируются как метки метрик запроса. Приложения могут включить регистрацию исключений, установив обрабатываемые исключения в качестве атрибутов запроса. |
7.3.8. Метрики сервера Jersey
Автоконфигурация включает инструментацию всех запросов, обрабатываемых реализацией Jersey JAX-RS. По умолчанию метрики генерируются с именем http.server.requests. Вы можете настроить имя, установив свойство management.observations.http.server.requests.name.
По умолчанию метрики сервера Jersey помечены следующей информацией:
| Метка | Описание |
|---|---|
| Простое имя класса любого исключения, которое было выброшено при обработке запроса. |
| Метод запроса (например, |
| Результат запроса, основанный на коде состояния ответа. 1xx - |
| Код HTTP состояния ответа (например, |
| Шаблон URI запроса до подстановки переменных, если это возможно (например, |
Для настройки меток укажите @Bean, который реализует JerseyTagsProvider.
7.3.9. Метрики HTTP-клиентов
Spring Boot Actuator управляет инструментацией как RestTemplate, так и WebClient. Для этого вам нужно внедрить настроенный билдер и использовать его для создания экземпляров:
-
RestTemplateBuilderдляRestTemplate -
WebClient.BuilderдляWebClient
Вы также можете вручную применить кастомайзеры, ответственные за эту инструментацию, а именно ObservationRestTemplateCustomizer и ObservationWebClientCustomizer.
По умолчанию метрики генерируются с именем http.client.requests. Вы можете настроить имя, установив свойство management.observations.http.client.requests.name.
См. документацию по Spring Framework для получения дополнительной информации о производимых наблюдениях.
Для настройки меток при использовании RestTemplate укажите @Bean, который реализует ClientRequestObservationConvention из пакета org.springframework.http.client.observation. Для настройки меток при использовании WebClient укажите @Bean, который реализует ClientRequestObservationConvention из пакета org.springframework.web.reactive.function.client.
7.3.10. Метрики Tomcat
Автоконфигурация включает инструментацию Tomcat только при включенном MBeanRegistry. По умолчанию MBeanRegistry выключен, но вы можете включить его, установив server.tomcat.mbeanregistry.enabled в значение true.
Метрики Tomcat публикуются под именем метра tomcat..
7.3.11. Метрики кэша
Автоконфигурация позволяет интегрировать все доступные Cache экземпляры при запуске, с метриками, имеющими префикс cache. Инструментация кэша стандартизирована для базового набора метрик. Доступны также дополнительные метрики, специфичные для кэша.
Поддерживаются следующие библиотеки кэширования:
-
Cache2k
-
Caffeine
-
Hazelcast
-
Любое соответствующее JCache (JSR-107) реализация
-
Redis
Метрики помечены именем кэша и именем CacheManager, которое получено из имени компонента.
В реестр добавляются только кэши, настроенные при запуске. Для кэшей, не определённых в конфигурации кэша, таких как кэши, созданные на лету или программно после фазы запуска, требуется явное регистрирование. Для упрощения этого процесса доступен компонент CacheMetricsRegistrar. |
7.3.12. Метрики Spring Batch
7.3.13. Метрики Spring GraphQL
7.3.14. Метрики источника данных
Автоконфигурация позволяет интегрировать все доступные объекты DataSource с метриками, имеющими префикс jdbc.connections. Инструментация источника данных приводит к индикаторам, которые представляют собой текущее количество активных, свободных, максимального и минимально допустимого подключений в пуле.
Метрики также помечены именем DataSource, полученным на основе имени компонента.
По умолчанию Spring Boot предоставляет метаданные для всех поддерживаемых источников данных. Вы можете добавить дополнительные компоненты DataSourcePoolMetadataProvider, если ваш любимый источник данных не поддерживается. См. DataSourcePoolMetadataProvidersConfiguration для примеров. |
Также доступны метрики, специфичные для Hikari, с префиксом hikaricp. Каждая метрика помечена именем пула (вы можете контролировать его с помощью spring.datasource.name).
7.3.15. Метрики Hibernate
Если org.hibernate.orm:hibernate-micrometer находится в классе, все доступные экземпляры Hibernate EntityManagerFactory с включённой статистикой инструментированы метрикой с именем hibernate.
Метрики также помечены именем EntityManagerFactory, которое получено из имени компонента.
Для включения статистики необходимо установить стандартное свойство JPA hibernate.generate_statistics в значение true. Вы можете включить это для автоматически настроенного EntityManagerFactory:
spring.jpa.properties[hibernate.generate_statistics]=true spring:
jpa:
properties:
"[hibernate.generate_statistics]": true 7.3.16. Метрики Spring Data Repository
Автоконфигурация включает инструментацию всех вызовов методов Spring Data Repository. По умолчанию метрики генерируются с именем spring.data.repository.invocations. Вы можете настроить имя, задав свойство management.metrics.data.repository.metric-name.
Аннотация @Timed из пакета io.micrometer.core.annotation поддерживается на интерфейсах и методах Repository. Если вы не хотите регистрировать метрики для всех вызовов Repository, вы можете установить management.metrics.data.repository.autotime.enabled в false и использовать только аннотации @Timed.
Аннотация @Timed с longTask = true позволяет использовать таймер задач со средним временем выполнения для метода. Таймеры задач со средним временем выполнения требуют отдельного имени метрики и могут быть совмещены с таймером задач с коротким временем выполнения. |
По умолчанию метрики, связанные с вызовами репозиториев, помечены следующей информацией:
| Тег | Описание |
|---|---|
| Простое имя класса исходного |
| Имя метода |
| Состояние результата ( |
| Простое имя класса любого исключения, которое было выброшено во время вызова. |
Для замены стандартных тегов предоставьте @Bean, который реализует RepositoryTagsProvider.
7.3.17. Метрики RabbitMQ
Автоконфигурация включает инструментацию всех доступных фабрик подключений RabbitMQ с метрикой с именем rabbitmq.
7.3.18. Метрики Spring Integration
Spring Integration автоматически предоставляет поддержку Micrometer всякий раз, когда доступен компонент MeterRegistry . Метрики публикуются под именем счетчика spring.integration..
7.3.19. Метрики Kafka
Автоконфигурация регистрирует MicrometerConsumerListener и MicrometerProducerListener для автоматически настроенных фабрики потребителей и фабрики производителей, соответственно. Также регистрируется KafkaStreamsMicrometerListener для StreamsBuilderFactoryBean. Более подробную информацию см. в разделе Micrometer Native Metrics документации Spring Kafka.
7.3.20. Метрики MongoDB
В этом разделе кратко описываются доступные метрики для MongoDB.
Метрики команд MongoDB
Автоконфигурация регистрирует MongoMetricsCommandListener с автоматически настроенным MongoClient.
Для каждой команды, выданной подключенному драйверу MongoDB, создается метрика таймера с именем mongodb.driver.commands. По умолчанию каждая метрика маркируется следующей информацией:
| Тэг | Описание |
|---|---|
| Имя выданной команды. |
| Идентификатор кластера, которому была отправлена команда. |
| Адрес сервера, которому была отправлена команда. |
| Результат команды ( |
Для замены тегов метрик по умолчанию определите bean MongoCommandTagsProvider, как показано в следующем примере:
@Configuration(proxyBeanMethods = false)
public class MyCommandTagsProviderConfiguration {
@Bean
public MongoCommandTagsProvider customCommandTagsProvider() {
return new CustomCommandTagsProvider();
}
}
@Configuration(proxyBeanMethods = false)
class MyCommandTagsProviderConfiguration {
@Bean
fun customCommandTagsProvider(): MongoCommandTagsProvider? {
return CustomCommandTagsProvider()
}
}
Чтобы отключить автоматически настроенные метрики команд, установите следующую свойство:
management.metrics.mongo.command.enabled=false management:
metrics:
mongo:
command:
enabled: false Метрики пула подключений MongoDB
Автоконфигурация регистрирует MongoMetricsConnectionPoolListener с автоматически настроенным MongoClient.
Для пула подключений создаются следующие метрики типа gauge:
-
mongodb.driver.pool.sizeотображает текущий размер пула подключений, включая простаивающие и активные члены. -
mongodb.driver.pool.checkedoutотображает количество подключений, которые в настоящее время используются. -
mongodb.driver.pool.waitqueuesizeотображает текущий размер очереди ожидания подключения из пула.
По умолчанию каждая метрика маркируется следующей информацией:
| Тэг | Описание |
|---|---|
| Идентификатор кластера, которому соответствует пул подключений. |
| Адрес сервера, которому соответствует пул подключений. |
Для замены тегов метрик по умолчанию определите bean MongoConnectionPoolTagsProvider:
@Configuration(proxyBeanMethods = false)
public class MyConnectionPoolTagsProviderConfiguration {
@Bean
public MongoConnectionPoolTagsProvider customConnectionPoolTagsProvider() {
return new CustomConnectionPoolTagsProvider();
}
}
@Configuration(proxyBeanMethods = false)
class MyConnectionPoolTagsProviderConfiguration {
@Bean
fun customConnectionPoolTagsProvider(): MongoConnectionPoolTagsProvider {
return CustomConnectionPoolTagsProvider()
}
}
Чтобы отключить автоматически настроенные метрики пула подключений, установите следующее свойство:
management.metrics.mongo.connectionpool.enabled=false management:
metrics:
mongo:
connectionpool:
enabled: false 7.3.21. Метрики Jetty
Автоконфигурация связывает метрики для ThreadPool Jetty, используя JettyServerThreadPoolMetrics Micrometer. Метрики для Connector Jetty связываются с помощью JettyConnectionMetrics Micrometer и, когда server.ssl.enabled установлено в true, с помощью JettySslHandshakeMetrics Micrometer.
7.3.22. Поддержка аннотации @Timed
Чтобы использовать @Timed в тех случаях, когда это не поддерживается напрямую Spring Boot, обратитесь к документации Micrometer.
7.3.23. Метрики Redis
Автоконфигурация регистрирует MicrometerCommandLatencyRecorder для автоматически настроенного LettuceConnectionFactory. Более подробная информация представлена в разделе Метрики Micrometer документации Lettuce.
7.4. Регистрация пользовательских метрик
Для регистрации пользовательских метрик введите MeterRegistry в свой компонент:
@Component
public class MyBean {
private final Dictionary dictionary;
public MyBean(MeterRegistry registry) {
this.dictionary = Dictionary.load();
registry.gauge("dictionary.size", Tags.empty(), this.dictionary.getWords().size());
}
}
@Component
class MyBean(registry: MeterRegistry) {
private val dictionary: Dictionary
init {
dictionary = Dictionary.load()
registry.gauge("dictionary.size", Tags.empty(), dictionary.words.size)
}
}
Если ваши метрики зависят от других bean, рекомендуется использовать MeterBinder для их регистрации:
public class MyMeterBinderConfiguration {
@Bean
public MeterBinder queueSize(Queue queue) {
return (registry) -> Gauge.builder("queueSize", queue::size).register(registry);
}
}
class MyMeterBinderConfiguration {
@Bean
fun queueSize(queue: Queue): MeterBinder {
return MeterBinder { registry ->
Gauge.builder("queueSize", queue::size).register(registry)
}
}
}
Использование MeterBinder гарантирует правильную настройку зависимостей и доступность bean при получении значения метрики. Реализация MeterBinder также может быть полезной, если вы обнаружите, что многократно используете набор метрик в разных компонентах или приложениях.
По умолчанию метрики всех bean типа MeterBinder автоматически привязываются к управляемому Spring MeterRegistry. |
7.5. Настройка отдельных метрик
Если вам нужно применить настройки к конкретным Meter экземплярам, вы можете использовать интерфейс io.micrometer.core.instrument.config.MeterFilter.
Например, если вы хотите переименовать тег mytag.region на mytag.area для всех идентификаторов счётчиков, начинающихся с com.example, вы можете сделать следующее:
@Configuration(proxyBeanMethods = false)
public class MyMetricsFilterConfiguration {
@Bean
public MeterFilter renameRegionTagMeterFilter() {
return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area");
}
}
@Configuration(proxyBeanMethods = false)
class MyMetricsFilterConfiguration {
@Bean
fun renameRegionTagMeterFilter(): MeterFilter {
return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area")
}
}
По умолчанию все MeterFilter бины автоматически привязаны к управляемому Spring MeterRegistry. Убедитесь, что вы регистрируете свои метрики, используя управляемый Spring MeterRegistry, а не статические методы Metrics. Эти методы используют глобальную регистрацию, которая не управляема Spring. |
7.5.1. Общие теги
Общие теги обычно используются для детализации по измерениям рабочей среды, такие как хост, экземпляр, регион, стек и другие. Общие теги применяются ко всем счётчикам и могут быть настроены, как показано в следующем примере:
management.metrics.tags.region=us-east-1
management.metrics.tags.stack=prod management:
metrics:
tags:
region: "us-east-1"
stack: "prod" В приведенном примере к всем счётчикам добавляются теги region и stack со значениями us-east-1 и prod соответственно.
Порядок общих тегов важен, если вы используете Graphite. Поскольку порядок общих тегов не может быть гарантирован с помощью этого подхода, пользователям Graphite рекомендуется определить пользовательский MeterFilter вместо этого. |
7.5.2. Свойства по счётчику
В дополнение к MeterFilter бинам, вы можете применить ограниченный набор настроек на основе каждого счётчика, используя свойства. Настройки по счётчику применяются с помощью PropertiesMeterFilter Spring Boot для всех идентификаторов счётчиков, начинающихся с заданного имени. Следующий пример отфильтровывает все счётчики, имеющие идентификатор, начинающийся с example.remote.
management.metrics.enable.example.remote=false management:
metrics:
enable:
example:
remote: false Следующие свойства позволяют настраивать метрики по счётчикам:
| Свойство | Описание |
|---|---|
| Принимать ли счётчики с определёнными идентификаторами. Счётчики, которые не принимаются, отфильтровываются из |
| Публиковать ли гистограмму, подходящую для вычисления аппроксимаций перцентилей, агрегируемых по измерениям. |
| Публиковать меньше бинов гистограммы, ограничив диапазон ожидаемых значений. |
| Публиковать значения перцентилей, вычисленные в вашем приложении. |
| Придавать больший вес последним выборкам, накапливая их в кольцевых буферах, которые вращаются после настраиваемого срока действия, с настраиваемой длиной буфера. |
| Опубликовать кумулятивную гистограмму с бинами, определёнными вашими целевыми показателями уровня обслуживания. |
Дополнительную информацию о концепциях percentiles-histogram, percentiles и slo см. в разделе “Гистограммы и перцентили” документации Micrometer.
7.6. Конечная точка метрик
Spring Boot предоставляет конечную точку metrics, которую можно использовать для диагностики, чтобы просмотреть метрики, собранные приложением. Конечная точка недоступна по умолчанию и должна быть экспонирована. Подробности см. в разделе экспонирование конечных точек.
Перейдя к /actuator/metrics, отобразится список доступных имён метрик. Вы можете углубиться, чтобы просмотреть информацию о конкретной метрике, указав её имя в качестве селектора — например, /actuator/metrics/jvm.memory.max.
| Используемое здесь имя должно соответствовать имени, используемому в коде, а не имени после нормализации именования для системы мониторинга, в которую оно отправляется. Другими словами, если |
Вы также можете добавить любое количество tag=KEY:VALUE параметров запроса в конец URL-адреса, чтобы углубиться в метрику по измерениям — например, /actuator/metrics/jvm.memory.max?tag=area:nonheap.
| Отчётные измерения — это сумма статистик всех метрик, соответствующих имени метрики и любым применённым тегам. В предыдущем примере возвращённая статистика |
7.7. Интеграция с Micrometer Observation
На DefaultMeterObservationHandler автоматически зарегистрирована ObservationRegistry, которая создаёт метрики для каждой завершённой наблюдения.
8. Отслеживание
Spring Boot Actuator предоставляет управление зависимостями и автоконфигурацию для отслеживания Micrometer, фасада для популярных библиотек отслеживания.
| Чтобы узнать больше о возможностях отслеживания Micrometer, см. его документацию по справке. |
8.1. Поддерживаемые инструменты отслеживания
Spring Boot поставляется с автоконфигурацией для следующих инструментов отслеживания:
-
OpenTelemetry с Zipkin, Wavefront или OTLP
-
OpenZipkin Brave с Zipkin или Wavefront
8.2. Начало работы
Нам нужен пример приложения, который мы можем использовать для начала работы с отслеживанием. В наших целях подойдет простое веб-приложение «Hello World!», о котором рассказывается в разделе «getting-started.html». Мы будем использовать инструмент отслеживания OpenTelemetry с Zipkin в качестве бэкенда трассировки.
Для справки, наш основной код приложения выглядит следующим образом:
@RestController
@SpringBootApplication
public class MyApplication {
private static final Log logger = LogFactory.getLog(MyApplication.class);
@RequestMapping("/")
String home() {
logger.info("home() has been called");
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
В методе home() добавлена запись в логгер, которая будет важна позже. |
Теперь нам нужно добавить следующие зависимости:
-
org.springframework.boot:spring-boot-starter-actuator -
io.micrometer:micrometer-tracing-bridge-otel— связывает API наблюдения Micrometer с OpenTelemetry. -
io.opentelemetry:opentelemetry-exporter-zipkin— отправляет трассы в Zipkin.
Добавьте следующие свойства приложения:
management.tracing.sampling.probability=1.0 management:
tracing:
sampling:
probability: 1.0 По умолчанию Spring Boot отбирает только 10% запросов, чтобы избежать перегрузки бэкенда отслеживания. Это свойство переключает его на 100%, так что каждый запрос отправляется в бэкенд отслеживания.
Для сбора и визуализации трасс нам нужен работающий бэкенд отслеживания. Здесь мы используем Zipkin в качестве бэкенда отслеживания. Руководство по быстрой настройке Zipkin содержит инструкции по запуску Zipkin локально.
После запуска Zipkin можно запустить ваше приложение.
Если открыть веб-браузер по адресу localhost:8080, вы должны увидеть следующий вывод:
Hello World!
За кулисами было создано наблюдение для HTTP-запроса, которое в свою очередь передается в OpenTelemetry, который отправляет новую трассу в Zipkin.
Теперь откройте интерфейс Zipkin по адресу localhost:9411 и нажмите кнопку «Запустить запрос», чтобы перечислить все собранные трассы. Вы должны увидеть одну трассу. Нажмите кнопку «Показать», чтобы увидеть подробности этой трассы.
Вы можете включить текущий идентификатор трассы и раздела в журналы, установив свойство logging.pattern.level в значение %5p [${spring.application.name:},%X{traceId:-},%X{spanId:-}] |
8.3. Распространение трасс
Для автоматического распространения трасс по сети используйте автоматически настроенный RestTemplateBuilder или WebClient.Builder для создания клиента.
Если вы создаете WebClient или RestTemplate без использования автоматически настроенных билдеров, автоматическое распространение трасс не сработает! |
8.4. Реализации инструментов отслеживания
Поскольку Micrometer Tracer поддерживает несколько реализаций инструментов отслеживания, существуют различные комбинации зависимостей с Spring Boot.
Все реализации инструментов отслеживания требуют зависимости org.springframework.boot:spring-boot-starter-actuator.
8.4.1. OpenTelemetry с Zipkin
Отслеживание с OpenTelemetry и отчетность в Zipkin требуют следующих зависимостей:
-
io.micrometer:micrometer-tracing-bridge-otel- связывает API наблюдения Micrometer с OpenTelemetry. -
io.opentelemetry:opentelemetry-exporter-zipkin- отправляет трассы в Zipkin.
Используйте свойства конфигурации management.zipkin.tracing.* для настройки отправки в Zipkin.
8.4.2. OpenTelemetry с Wavefront
Отслеживание с OpenTelemetry и отчетность в Wavefront требуют следующих зависимостей:
-
io.micrometer:micrometer-tracing-bridge-otel- связывает API наблюдения Micrometer с OpenTelemetry. -
io.micrometer:micrometer-tracing-reporter-wavefront- отправляет трассы в Wavefront.
Используйте свойства конфигурации management.wavefront.* для настройки отправки в Wavefront.
8.4.3. OpenTelemetry с OTLP
Отслеживание с OpenTelemetry и отчетность с использованием OTLP требуют следующих зависимостей:
-
io.micrometer:micrometer-tracing-bridge-otel- связывает API наблюдения Micrometer с OpenTelemetry. -
io.opentelemetry:opentelemetry-exporter-otlp- отправляет трассы в коллектор, который может принимать OTLP.
Используйте свойства конфигурации management.otlp.tracing.* для настройки отправки с использованием OTLP.
8.4.4. OpenZipkin Brave с Zipkin
Отслеживание с OpenZipkin Brave и отчетность в Zipkin требуют следующих зависимостей:
-
io.micrometer:micrometer-tracing-bridge-brave- связывает API наблюдения Micrometer с Brave. -
io.zipkin.reporter2:zipkin-reporter-brave- отправляет трассы в Zipkin.
Если ваш проект не использует Spring MVC или Spring WebFlux, также необходима зависимость io.zipkin.reporter2:zipkin-sender-urlconnection . |
Используйте свойства конфигурации management.zipkin.tracing.* для настройки отправки в Zipkin.
8.4.5. OpenZipkin Brave с Wavefront
Отслеживание с OpenZipkin Brave и отчетность в Wavefront требуют следующих зависимостей:
-
io.micrometer:micrometer-tracing-bridge-brave- связывает API наблюдения Micrometer с Brave. -
io.micrometer:micrometer-tracing-reporter-wavefront- отправляет трассы в Wavefront.
Используйте свойства конфигурации management.wavefront.* для настройки отправки в Wavefront.
8.5. Интеграция с Micrometer Observation
На ObservationRegistry автоматически регистрируется TracingAwareMeterObservationHandler, который создаёт разделы для каждого завершенного наблюдения.
8.6. Создание собственных разделов
Вы можете создавать собственные разделы, начав наблюдение. Для этого внедрите ObservationRegistry в ваш компонент:
@Component
class CustomObservation {
private final ObservationRegistry observationRegistry;
CustomObservation(ObservationRegistry observationRegistry) {
this.observationRegistry = observationRegistry;
}
void someOperation() {
Observation observation = Observation.createNotStarted("some-operation", this.observationRegistry);
observation.lowCardinalityKeyValue("some-tag", "some-value");
observation.observe(() -> {
// Business logic ...
});
}
}
Это создаст наблюдение с именем «some-operation» и меткой «some-tag=some-value».
Если вы хотите создать раздел без создания метрики, вам нужно использовать низкоуровневый API Tracer из Micrometer. |
8.7. Багаж
Вы можете создать багаж с помощью API Tracer:
@Component
class CreatingBaggage {
private final Tracer tracer;
CreatingBaggage(Tracer tracer) {
this.tracer = tracer;
}
void doSomething() {
try (BaggageInScope scope = this.tracer.createBaggageInScope("baggage1", "value1")) {
// Business logic
}
}
}
Этот пример создает багаж с именем baggage1 и значением value1. Багаж автоматически передаётся по сети, если вы используете распространение W3C. Если вы используете распространение B3, багаж не передается автоматически. Для ручного распространения багажа по сети используйте свойство конфигурации management.tracing.baggage.remote-fields (это работает и для W3C). Для приведенного выше примера установка этого свойства в значение baggage1 приводит к HTTP-заголовку baggage1: value1.
Если вы хотите распространить багаж в MDC, используйте свойство конфигурации management.tracing.baggage.correlation.fields . Для примера выше, установка этого свойства в значение baggage1 приводит к записи в MDC с именем baggage1.
9. Аудит
После включения Spring Security, Spring Boot Actuator имеет гибкую систему аудита, которая публикует события (по умолчанию, «успешная авторизация», «ошибка авторизации» и «отказ в доступе»). Эта функция может быть очень полезной для отчетности и для реализации политики блокировки на основе ошибок авторизации.
Вы можете включить аудит, предоставив бин типа AuditEventRepository в конфигурации вашего приложения. Для удобства Spring Boot предлагает InMemoryAuditEventRepository. InMemoryAuditEventRepository обладает ограниченными возможностями, и мы рекомендуем использовать его только для сред разработки. Для производственных сред рекомендуется создать собственное альтернативное реализацию AuditEventRepository.
9.1. Настройка аудита
Чтобы настроить публикуемые события безопасности, вы можете предоставить свои собственные реализации AbstractAuthenticationAuditListener и AbstractAuthorizationAuditListener.
Вы также можете использовать службы аудита для своих бизнес-событий. Для этого либо введите бин AuditEventRepository в свои компоненты и используйте его напрямую, либо опубликуйте AuditApplicationEvent с помощью Spring ApplicationEventPublisher (реализовав ApplicationEventPublisherAware).
10. Запись HTTP-обменов
Вы можете включить запись HTTP-обменов, предоставив бин типа HttpExchangeRepository в конфигурации вашего приложения. Для удобства Spring Boot предлагает InMemoryHttpExchangeRepository, который по умолчанию хранит последние 100 запросов-ответов. InMemoryHttpExchangeRepository имеет ограниченные возможности по сравнению с решениями отслеживания, и мы рекомендуем использовать его только для сред разработки. Для производственных сред рекомендуется использовать готовое к производству решение для отслеживания или наблюдаемости, такое как Zipkin или OpenTelemetry. В качестве альтернативы вы можете создать собственное HttpExchangeRepository.
Вы можете использовать конечную точку httpexchanges для получения информации об обменах запросов и ответов, хранящихся в HttpExchangeRepository.
10.1. Настройка записи HTTP-обменов
Чтобы настроить элементы, включаемые в каждую записанную операцию обмена, используйте свойство конфигурации management.httpexchanges.recording.include.
Чтобы полностью отключить запись, установите management.httpexchanges.recording.enabled в false.
11. Мониторинг процессов
В модуле spring-boot вы найдете два класса для создания файлов, которые часто полезны для мониторинга процессов:
-
ApplicationPidFileWriterсоздает файл, содержащий идентификатор процесса приложения (по умолчанию, в каталоге приложения с именем файлаapplication.pid). -
WebServerPortFileWriterсоздает файл (или файлы), содержащие порты работающего веб-сервера (по умолчанию, в каталоге приложения с именем файлаapplication.port).
По умолчанию эти записи не активированы, но вы можете их включить:
11.1. Расширение конфигурации
В файле META-INF/spring.factories вы можете активировать слушатель (или слушателей), который записывает файл с PID:
org.springframework.context.ApplicationListener=\ org.springframework.boot.context.ApplicationPidFileWriter,\ org.springframework.boot.web.context.WebServerPortFileWriter
11.2. Программное включение мониторинга процессов
Вы также можете активировать слушатель, вызвав метод SpringApplication.addListeners(…) и передав соответствующий объект Writer. Этот метод также позволяет настроить имя и путь к файлу в конструкторе Writer.
12. Поддержка Cloud Foundry
Модуль Actuator Spring Boot включает дополнительную поддержку, которая активируется при развертывании в совместимом экземпляре Cloud Foundry. Путь /cloudfoundryapplication предоставляет альтернативный защищенный маршрут ко всем бин @Endpoint.
Расширенная поддержка позволяет управлять пользовательскими интерфейсами Cloud Foundry (например, веб-приложением, с помощью которого можно просматривать развернутые приложения) с информацией Spring Boot actuator. Например, страница состояния приложения может включать полную информацию о состоянии вместо стандартного состояния «работает» или «остановлен».
Путь /cloudfoundryapplication не доступен обычным пользователям. Чтобы использовать конечную точку, вы должны передать действительный токен UAA в запросе. |
12.1. Отключение расширенной поддержки Cloud Foundry Actuator
Если вы хотите полностью отключить конечные точки /cloudfoundryapplication, вы можете добавить следующее свойство в свой файл application.properties:
management.cloudfoundry.enabled=false management:
cloudfoundry:
enabled: false 12.2. Самозаверяющие сертификаты Cloud Foundry
По умолчанию проверка безопасности для конечных точек /cloudfoundryapplication выполняет SSL-вызовы к различным службам Cloud Foundry. Если службы UAA или Cloud Controller Cloud Foundry используют самозаверяющие сертификаты, вам нужно установить следующее свойство:
management.cloudfoundry.skip-ssl-validation=true management:
cloudfoundry:
skip-ssl-validation: true 12.3. Настройка пользовательского контекстного пути
Если контекстный путь сервера настроен на значение, отличное от /, конечные точки Cloud Foundry недоступны в корне приложения. Например, если server.servlet.context-path=/app, конечные точки Cloud Foundry доступны по адресу /app/cloudfoundryapplication/*.
Если вы ожидаете, что конечные точки Cloud Foundry всегда будут доступны по адресу /cloudfoundryapplication/*, независимо от контекстного пути сервера, вам необходимо явно настроить это в вашем приложении. Конфигурация отличается в зависимости от используемого веб-сервера. Для Tomcat вы можете добавить следующую конфигурацию:
@Configuration(proxyBeanMethods = false)
public class MyCloudFoundryConfiguration {
@Bean
public TomcatServletWebServerFactory servletWebServerFactory() {
return new TomcatServletWebServerFactory() {
@Override
protected void prepareContext(Host host, ServletContextInitializer[] initializers) {
super.prepareContext(host, initializers);
StandardContext child = new StandardContext();
child.addLifecycleListener(new Tomcat.FixContextListener());
child.setPath("/cloudfoundryapplication");
ServletContainerInitializer initializer = getServletContextInitializer(getContextPath());
child.addServletContainerInitializer(initializer, Collections.emptySet());
child.setCrossContext(true);
host.addChild(child);
}
};
}
private ServletContainerInitializer getServletContextInitializer(String contextPath) {
return (classes, context) -> {
Servlet servlet = new GenericServlet() {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
ServletContext context = req.getServletContext().getContext(contextPath);
context.getRequestDispatcher("/cloudfoundryapplication").forward(req, res);
}
};
context.addServlet("cloudfoundry", servlet).addMapping("/*");
};
}
}
@Configuration(proxyBeanMethods = false)
class MyCloudFoundryConfiguration {
@Bean
fun servletWebServerFactory(): TomcatServletWebServerFactory {
return object : TomcatServletWebServerFactory() {
override fun prepareContext(host: Host, initializers: Array<ServletContextInitializer>) {
super.prepareContext(host, initializers)
val child = StandardContext()
child.addLifecycleListener(FixContextListener())
child.path = "/cloudfoundryapplication"
val initializer = getServletContextInitializer(contextPath)
child.addServletContainerInitializer(initializer, emptySet())
child.crossContext = true
host.addChild(child)
}
}
}
private fun getServletContextInitializer(contextPath: String): ServletContainerInitializer {
return ServletContainerInitializer { classes: Set<Class<*>?>?, context: ServletContext ->
val servlet: Servlet = object : GenericServlet() {
@Throws(ServletException::class, IOException::class)
override fun service(req: ServletRequest, res: ServletResponse) {
val servletContext = req.servletContext.getContext(contextPath)
servletContext.getRequestDispatcher("/cloudfoundryapplication").forward(req, res)
}
}
context.addServlet("cloudfoundry", servlet).addMapping("/*")
}
}
}
13. Что читать дальше
Возможно, вам следует прочитать об инструментах визуализации данных, таких как Graphite.
В противном случае вы можете продолжить чтение о “вариантах развертывания” или перейти к углубленному изучению плагинов для инструментов сборки Spring Boot.
Copyright © 2012-2023 VMware, Inc.
Licensed under the Apache License, Version 2.0.
https://docs.spring.io/spring-boot/docs/3.1.3/reference/html/actuator.html