Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';什么是连接Spring Boot和StatsD的最佳方式,特别是对于计时器?_Java_Spring Boot_Statsd_Spring Boot Actuator - Fatal编程技术网

Java 什么';什么是连接Spring Boot和StatsD的最佳方式,特别是对于计时器?

Java 什么';什么是连接Spring Boot和StatsD的最佳方式,特别是对于计时器?,java,spring-boot,statsd,spring-boot-actuator,Java,Spring Boot,Statsd,Spring Boot Actuator,所以我有一个使用Spring Boot启动器的Spring Boot应用程序。通过定义spring.metrics.export.statsd.host属性,自动实例化StatsdMetricWriter,对于计数器和仪表,一切正常 然而,事情有点尴尬。对于Java8,Spring Boot自动创建了一个BufferGaugeService实例——这导致计时器值的报告基本上就像一个仪表:每5秒报告一次最后一个值(或者不管它是什么,也可以配置它)。这基本上使计时器度量变得无用,因为StatsD使用

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

然而,事情有点尴尬。对于Java8,Spring Boot自动创建了一个
BufferGaugeService
实例——这导致计时器值的报告基本上就像一个仪表:每5秒报告一次最后一个值(或者不管它是什么,也可以配置它)。这基本上使计时器度量变得无用,因为StatsD使用这些度量所做的一切都是不正确的

现在我们可以回头使用Java8之前的默认
DefaultGaugeService
,但是对于计数器,
BufferCounterService
也很好。查看
MetricRepositoryAutoConfiguration
,手动设置此设置对于将来的更新来说似乎是非常重要和脆弱的

关于如何在这里进行有什么建议吗?还是有一些蓝图提供了一些灵感


撇开目前的情况不谈:是否有一些计划首先提出一个
BufferTimerService
TimerService

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

@Autowired
@豆子
公共静态BeanPostProcessor wrapGaugeService(ApplicationContext ApplicationContext){
返回新的BeanPostProcessor(){
@凌驾
初始化前的公共对象后处理(对象bean、字符串bean名称){
返回豆;
}
@凌驾
公共对象后处理后初始化(对象bean、字符串bean名称){
如果(!GaugeService.class.isInstance(bean)){
返回豆;
}
最终仪表服务仪表服务=仪表服务.class.cast(bean);
final MetricWriter MetricWriter=applicationContext.getBean(MetricWriter.class);
返回(计量服务)(计量名称、值)->{
if(metricName.startsWith(“timer”)){
set(新度量(metricName,value));
}否则{
gaugeService.submit(度量名称、值);
}
};
}
};
}

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

感谢您提供解决方案
我使用Dropwizard实现和以下覆盖帮助捕获计时器中的请求时间度量,而不是仪表

@Bean
DropwizardMetricServices DropwizardMetricServices(MetricRegistry MetricRegistry,
ObjectProvider(resFactoryProvider){
返回新的DropwizardMetricServices(metricRegistry、resFactoryProvider.getIfAvailable()){
@凌驾
public void submit(字符串名称,双值){
if(name.startsWith(“response”)){
super.submit(“计时器”+名称、值);
}否则{
super.submit(名称、值);
}
}
};
}
关于
TimerService
,这可能是相关的


正如我所见,有计划对2.0版的spring引导指标进行重大改进,如:和

您正在将DropWizard与StatsD一起使用?