2

我正在运行 Spring Boot 2 应用程序并添加了执行器 spring boot 启动器依赖项。我启用了所有 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 统计信息和其他内置指标。我在这里想念什么?我读到的所有内容都说这些指标应该随时可用。

感谢您的任何提示。

4

5 回答 5

3

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

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

在找出根本原因之前,我敲了几堵墙:Spring Boot Autoconfigure 中有一个 Hikari 自动配置后处理器急切地检索 MeterRegistry,因此所有 Metric bean 之前都没有时间初始化。

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

于 2018-11-02T14:01:34.730 回答
3

我想和你分享这些发现。问题是第 3 方库(Shiro)和我的配置。micrometer 的 bean 加载混淆了,导致配置 MicroMeterRegistry(在我的情况下为 PrometheusMeterRegistry)的所需 PostProcessingBean 初始化太晚。

我不知道通过不同的 Bean(后处理器)配置注册表是否明智,这可能会导致我遇到的情况......注册表应该配置自己而不依赖其他可能构建得太晚的 Bean。

于 2018-09-07T09:21:09.137 回答
2

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

我在项目中使用了 Shiro。

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

我对MyBatis的Mapper文件使用了@Autowired,导致SpringBoot无法组装Actuator metrics相关的bean(具体原因我不知道)。

所以我通过手动组装禁用了 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);

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

于 2018-10-23T13:24:55.390 回答
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。

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

于 2020-12-01T06:32:21.307 回答
-1

我有一个使用 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分支。

如果你能以你所看到的方式破坏样本,我可以再看看。

于 2018-09-03T14:29:10.877 回答