Вопрос или проблема
В настоящее время я работаю над миграцией Spring-приложения с Wildfly 26 на Wildfly 33.
Согласно документации Wildfly 33, упоминается, что MicroProfile больше не поддерживается, и предлагается переходить на Micrometer. Смотрите здесь.
Мне не удается найти достаточную документацию по такой реализации.
Я попробовал реализовать, как указано ниже,
- Изменения в standalone.xml
<extension module="org.wildfly.extension.micrometer"/>
...
...
<subsystem xmlns="urn:wildfly:micrometer:1.0" exposed-subsystems="*"/>
Согласно документации, атрибуты endpoint
и step
могут использоваться выше, однако их использование приводит к ошибке,
Сообщение: WFLYCTL0376: Встречен неожиданный атрибут 'endpoint'. Допустимые атрибуты: 'exposed-subsystems, name'
- Зависимость Micrometer
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<version>1.13.4</version>
</dependency>
- Изменения в коде
@Inject
protected MeterRegistry meterRegistry;
// инкрементируем счётчик
Counter.builder("my_counter").register(meterRegistry).increment();
Вышеуказанная инъекция возвращает NoOpRegistry
(не SimpleMeterRegistry
или любую другую реализацию MeterRegistry), а также из документации WFY не ясно, на каком порту и по какому адресу эти метрики доступны. Я делаю что-то не так в этой реализации?
Ответ или решение
Перевод приложения Spring с Wildfly 26 на Wildfly 33 и интеграция системы микрометрии может вызвать ряд вопросов, особенно с учетом того, что поддержка MicroProfile больше не актуальна, и необходимо перейти на Micrometer. Давайте разберем шаги, которые вы уже предприняли, и укажем на возможные ошибки и недочеты.
1. Изменения в standalone.xml
Судя по вашему сообщению, вы правильно добавили расширение для Micrometer в standalone.xml
. Попробуйте изменить его следующим образом:
<extension module="org.wildfly.extension.micrometer"/>
...
<subsystem xmlns="urn:wildfly:micrometer:1.0" exposed-subsystems="metrics"/>
Имейте в виду, что в текущей версии Wildfly 33 не требуется атрибут endpoint
в описании подсистемы. Атрибут exposed-subsystems
просто указывает на то, какие подсистемы будут доступны. Вы можете специфицировать metrics
, чтобы это обозревалось корректно.
2. Зависимость Micrometer
Добавление зависимости micrometer-core
– это правильный шаг. Убедитесь, что у вас в pom.xml
правильно указаны версии зависимостей. Например:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<version>1.13.4</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId> <!-- если вам нужен Prometheus -->
<version>1.13.4</version>
</dependency>
Если вы используете другой движок или систему, убедитесь, что в ваших зависимостях присутствует соответствующий артефакт.
3. Изменения в коде
Ваш код для инъекции MeterRegistry
в порядке, но вы говорите, что injection возвращает NoOpRegistry
. Это может происходить по нескольким причинам:
- Убедитесь, что соответствующая часть вашего кода исполняется в контексте управления зависимостями CDI (например, в бине CDI).
- Проверьте, настроена ли у вас поддержка внедрения зависимостей в вашем приложении.
В идеале, если вы все настроили правильно, инъекция должна отдавать рабочий экземпляр MeterRegistry
. Если нет, вы можете получить доступ к MeterRegistry
через GlobalMeterRegistry
(это не рекомендуется в долгосрочной перспективе, но может помочь в отладке).
Пример инъекции:
import io.micrometer.core.instrument.MeterRegistry;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
@ApplicationScoped
public class MyMetrics {
@Inject
protected MeterRegistry meterRegistry;
public void incrementCounter() {
Counter.builder("my_counter").register(meterRegistry).increment();
}
}
4. Экспонирование метрик
Относительно вопроса о порте и конечной точке, по умолчанию, Micrometer может быть интегрирован с разными системами мониторинга. Чтобы экспонировать метрики, вы можете использовать инкапсуляцию через Prometheus или другой инструмент:
Если вы используете Prometheus:
- Добавьте зависимость
micrometer-registry-prometheus
. - Проверьте, что настроены следующие параметры в
standalone.xml
илиapplication.properties
, чтобы прописать необходимые метрики.
Предположим, что вы используете Prometheus, его конечная точка будет по умолчанию находиться по адресу /actuator/prometheus
(если включены соответствующие настройки).
Заключение
Если вы выполните вышеуказанные шаги и убедитесь, что все зависимости настроены правильно, а код указан верно, ваша интеграция Micrometer должна заработать. Также рекомендую проверять логи Wildfly на наличие ошибок во время загрузки приложения, что может дать понимание, что происходит не так. Если у вас remain вопросы, уточняйте, и я помогу вам дальше!