Привод Spring Boot 2 не публикует метрику jvm

Я запускаю приложение Spring Boot 2 и добавляю зависимость от стартера пружины привода. Я включил все веб-конечные точки, а затем позвонил:

http://localhost:8080/actuator/metrics

результат:

{
    "names": ["jdbc.connections.active", 
              "jdbc.connections.max", 
              "jdbc.connections.min", 
              "hikaricp.connections.idle", 
              "hikaricp.connections.pending", 
              "hikaricp.connections", 
              "hikaricp.connections.active", 
              "hikaricp.connections.creation", 
              "hikaricp.connections.max", 
              "hikaricp.connections.min", 
              "hikaricp.connections.usage", 
              "hikaricp.connections.timeout", 
              "hikaricp.connections.acquire"]
}

Но мне не хватает всей статистики JVM и других встроенных показателей. Что мне здесь не хватает? Все, что я читал, говорит о том, что эти показатели должны быть доступны в любое время.

Спасибо за любые подсказки.


person Logemann    schedule 03.09.2018    source источник
comment
некоторые выводы после изучения кода. Возможно, основной разработчик что-то знает: по какой-то причине MeterRegistryPostProcessor не будет применяться к моему GraphiteMeterRegistry и, следовательно, не будет настроен. Это то, что я догадываюсь, прочитав (весь) код. Но GraphiteMeterRegistry определенно загружается как bean (как показано в / actator / beans)   -  person Logemann    schedule 03.09.2018
comment
У меня точно такая же проблема с Spring Boot v2.0.4.RELEASE.   -  person Robert Kornmesser    schedule 07.09.2018
comment
та же проблема с Spring Boot 2.1.2 при включении @EnableGlobalMethodSecurity   -  person moskauerst    schedule 02.04.2019


Ответы (5)


Хочу поделиться с вами находками. Проблема заключалась в том, что сторонняя библиотека (Shiro) и моя конфигурация для нее. Загрузка bean-компонентов микрометра запуталась, что привело к слишком поздней инициализации необходимого PostProcessingBean, который настраивает MicroMeterRegistry (в моем случае PrometheusMeterRegistry).

Я не знаю, разумно ли выполнять настройку реестров через другой Bean (PostProcessor), что может привести к ситуациям, которые у меня были ... реестры должны настраиваться, не полагаясь на другие Bean-компоненты, которые могут быть созданы слишком поздно.

person Logemann    schedule 07.09.2018

На случай, если это когда-нибудь случится с кем-нибудь еще: у меня была аналогичная проблема (за исключением того, что это был не Graphite, а Prometheus, и я не использовал Shiro).

В основном у меня были только метрики Hikari и HTTP, ничего больше (никаких метрик JVM, таких как GC).

Я ударился головой о несколько стен, прежде чем выяснить основную причину: в Spring Boot Autoconfigure был постпроцессор с автоматической настройкой Hikari, который с нетерпением извлекал MeterRegistry, поэтому у всех компонентов Metric не было времени на инициализацию раньше.

И, к моему удивлению, когда я посмотрел этот код в Github, я его не нашел. Я изменил свою spring-boot-starter-parent версию с 2.0.4.RELEASE на 2.1.0.RELEASE, и теперь все работает нормально. Я правильно получаю все метрики.

person Sir4ur0n    schedule 02.11.2018

Как я и ожидал, эта проблема вызвана порядком загрузки bean-компонентов.

Я использовал Широ в проекте.

Метод проверки Широ использовал MyBatis для чтения данных из базы данных.

Я использовал @Autowired для файла Mapper MyBatis, из-за которого SpringBoot не собирал bean-компоненты, связанные с метриками Actuator (я не знаю, в чем конкретная причина).

Итак, я отключил автоматическую сборку файла Mapper вручную.

Код выглядит следующим образом:

public class SpringContextUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String beanId) throws BeansException {
        return applicationContext.getBean(beanId);
    }
}

потом

StoreMapper userMapper = (UserMapper) SpringContextUtil.getBean("userMapper");
UserModel userModel = userMapper.findUserByName(name);

Проблему пока можно решить. Это всего лишь временная мера, но на данный момент у меня нет лучшего способа.

person woniuGoGoGo    schedule 23.10.2018

Я не могу найти process_update_seconds в / actator / prometheus, поэтому я потратил некоторое время на решение своей проблемы.

Мое решение:

Перепишите HikariDataSourceMetricsPostProcessor и MeterRegistryPostProcessor;

Упорядочено HikariDataSourceMetricsPostProcessor.

package org.springframework.boot.actuate.autoconfigure.metrics.jdbc;
...

class HikariDataSourceMetricsPostProcessor implements BeanPostProcessor, Ordered {

    ...

    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE + 1;
    }
}

Порядок MeterRegistryPostProcessor - Ordered.HIGHEST_PRECEDENCE;

package org.springframework.boot.actuate.autoconfigure.metrics;
...
import org.springframework.core.Ordered;

class MeterRegistryPostProcessor implements BeanPostProcessor, Ordered {
    ...
    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

В моем случае я использовал shiro и jpa для сохранения идентификатора сеанса пользователя. Я обнаружил, что порядок MeterRegistryPostProcessor и HikariDataSourceMetricsPostProcessor вызывает проблему. MeterRegistry не привязал счетчик из-за порядка загрузки.

Возможно мое решение поможет вам решить проблему.

person sweatOtt    schedule 01.12.2020

У меня есть рабочий образец с Spring Boot, Micrometer и Graphite и подтвердил, что готовые MeterBinder работают следующим образом:

{
  "names" : [ "jvm.memory.max", "process.files.max", "jvm.gc.memory.promoted", "tomcat.cache.hit", "system.load.average.1m", "tomcat.cache.access", "jvm.memory.used", "jvm.gc.max.data.size", "jvm.gc.pause", "jvm.memory.committed", "system.cpu.count", "logback.events", "tomcat.global.sent", "jvm.buffer.memory.used", "tomcat.sessions.created", "jvm.threads.daemon", "system.cpu.usage", "jvm.gc.memory.allocated", "tomcat.global.request.max", "tomcat.global.request", "tomcat.sessions.expired", "jvm.threads.live", "jvm.threads.peak", "tomcat.global.received", "process.uptime", "tomcat.sessions.rejected", "process.cpu.usage", "tomcat.threads.config.max", "jvm.classes.loaded", "jvm.classes.unloaded", "tomcat.global.error", "tomcat.sessions.active.current", "tomcat.sessions.alive.max", "jvm.gc.live.data.size", "tomcat.servlet.request.max", "tomcat.threads.current", "tomcat.servlet.request", "process.files.open", "jvm.buffer.count", "jvm.buffer.total.capacity", "tomcat.sessions.active.max", "tomcat.threads.busy", "my.counter", "process.start.time", "tomcat.servlet.error" ]
}

Обратите внимание, что образец в ветке graphite, а не в ветке master.

Если бы вы могли разбить образец так, как видите, я могу еще раз взглянуть.

person Johnny Lim    schedule 03.09.2018