Spring Boot 2 Actuator不会发布JVM指标

时间:2018-09-03 11:07:57

标签: java spring-boot spring-boot-actuator micrometer spring-micrometer

我正在运行Spring Boot 2应用程序,并添加了执行器spring boot starter依赖项。我启用了所有Web终结点,然后调用:

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统计信息和其他内置指标。我在这里想念什么?我阅读的所有内容均表示这些指标应始终可用。

感谢任何提示。

5 个答案:

答案 0 :(得分:1)

我想与您分享调查结果。问题是第3方库(Shiro)和我的配置。千分尺的Bean加载混乱,导致初始化所需的PostProcessingBean太晚了,后者配置了MicroMeterRegistry(在我的情况下是PrometheusMeterRegistry)。

我不知道通过其他Bean(PostProcessor)进行注册表配置是否明智,这可能导致我遇到的情况...注册表应该自行配置而不依赖于可能构造得太晚的其他Bean。

答案 1 :(得分:1)

如我所料,这个问题是由bean的加载顺序引起的。

我在项目中使用了Shiro。

Shiro的验证方法使用MyBatis从数据库中读取数据。

我在MyBatis的Mapper文件中使用了@Autowired,这导致与Actuator指标相关的bean无法由SpringBoot组装(我不知道具体原因是什么。)

因此,我禁用了通过手动组装自动映射器文件的组装

代码如下:

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);

该问题暂时可以解决。这只是权宜之计,但目前我没有更好的办法。

答案 2 :(得分:1)

万一这件事发生在别人身上: 我遇到了类似的问题(除了不是Graphite而是Prometheus,而且我没有使用Shiro)。

基本上,我只有Hikari和HTTP指标,没有别的(没有像GC这样的JVM指标)。

在找出根本原因之前,我用力撞了一下墙:在Spring Boot Autoconfigure中有一个Hikari自动配置后处理器,它急切地检索了MeterRegistry,因此所有Metric Bean之前都没有时间进行初始化。

令我惊讶的是,在Github中查看此代码时,我没有找到它。因此,我将spring-boot-starter-parent的版本从2.0.4.RELEASE更改为2.1.0.RELEASE,现在一切正常。我正确地获得了所有指标。

答案 3 :(得分:0)

我在/ actuator / prometheus中找不到process_update_seconds,所以我花了一些时间解决我的问题。

我的解决方案:

重写HikariDataSourceMetricsPostProcessorMeterRegistryPostProcessor;

HikariDataSourceMetricsPostProcessor的顺序为Ordered.HIGHEST_PRECEDENCE +1;

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保存了用户会话ID。我发现MeterRegistryPostProcessorHikariDataSourceMetricsPostProcessor的顺序引起了问题。由于加载顺序,MeterRegistry未绑定该metirc。

也许我的解决方案可以帮助您解决问题。

答案 4 :(得分:-1)

我有a working sample with Spring Boot, Micrometer, and 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分支上的示例。

如果您可以按照自己的方式破坏样本,我可以再看一遍。