我正在运行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统计信息和其他内置指标。我在这里想念什么?我阅读的所有内容均表示这些指标应始终可用。
感谢任何提示。
答案 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,所以我花了一些时间解决我的问题。
我的解决方案:
重写HikariDataSourceMetricsPostProcessor
和MeterRegistryPostProcessor
;
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。我发现MeterRegistryPostProcessor
和HikariDataSourceMetricsPostProcessor
的顺序引起了问题。由于加载顺序,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
分支上的示例。
如果您可以按照自己的方式破坏样本,我可以再看一遍。