gpt4 book ai didi

java - 将 Spring-Boot 与 StatsD 连接的最佳方式是什么,尤其是对于计时器?

转载 作者:行者123 更新时间:2023-11-30 10:40:43 25 4
gpt4 key购买 nike

所以我有一个使用 spring-boot-actuator 的 Spring Boot 应用程序。通过定义 spring.metrics.export.statsd.host 属性,StatsdMetricWriter 自动实例化,对于计数器和仪表,一切正常。

对于 timers然而,事情有点尴尬。对于 Java8,Spring Boot 会自动创建一个 BufferGaugeService 实例 - 这导致定时器值基本上像一个仪表一样被报告:每 5 秒的最后一个值(或者不管它是什么,也可以对其进行配置)。这基本上使计时器指标变得无用,因为 StatsD 用这些指标所做的所有美妙的事情都是有偏差的。

现在可以回退到使用 Java8 之前的默认 DefaultGaugeService,但话又说回来,对于计数器来说,BufferCounterService 就可以了。查看 MetricRepositoryAutoConfiguration,手动设置它似乎对 future 的更新来说非常重要且脆弱。

关于如何在这里进行的任何建议?或者是否有一些蓝图提供了一些灵感?

撇开当前情况不谈:是否有一些计划首先提出 BufferTimerServiceTimerService

最佳答案

就其值(value)而言,我找到了一个相当不引人注目的解决方案。不确定这是否是最佳方式,但它可以完美地工作:

@Autowired
@Bean
public static BeanPostProcessor wrapGaugeService(ApplicationContext applicationContext) {
return new BeanPostProcessor() {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
if (!GaugeService.class.isInstance(bean)) {
return bean;
}
final GaugeService gaugeService = GaugeService.class.cast(bean);
final MetricWriter metricWriter = applicationContext.getBean(MetricWriter.class);
return (GaugeService) (metricName, value) -> {
if (metricName.startsWith("timer.")) {
metricWriter.set(new Metric<>(metricName, value));
} else {
gaugeService.submit(metricName, value);
}
};
}
};
}

对于计时器值,我们正在模仿 Spring Boots 的 Java8 之前的行为。这包装了 Spring Boot 提供的 GaugeService:对于“timer.*”值,它调用 MetricWriter(这应该是 StatsdMetricWriter,否则整个设置毫无意义),否则它会将仪表值传递给 GaugeService

关于java - 将 Spring-Boot 与 StatsD 连接的最佳方式是什么,尤其是对于计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38794197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com