2016-08-05 26 views
2

所以我有一個使用spring-boot-actuator的Spring Boot應用程序。通過定義spring.metrics.export.statsd.host屬性,StatsdMetricWriter自動實例化,對於計數器和儀表,一切工作正常。Spring-Boot與StatsD連接的最佳方式是什麼,特別是對於定時器?

對於timers然而,事情有點尷尬。對於Java8,Spring Boot會自動創建一個BufferGaugeService實例 - 這會導致定時器值基本上像量表一樣報告:每5秒鐘最後一個值(或者其它值,也可以對其進行配置)。這基本上使計時器指標無用,StatsD所做的所有奇妙的事情都是錯位的。

現在人們可以回到使用Java8之前的默認DefaultGaugeService,但是再次,對於計數器BufferCounterService就好了。看着MetricRepositoryAutoConfiguration,手動設置它似乎對於將來的更新來說是不平凡和脆弱的。

有關如何在此處進行的任何建議?還是有一些藍圖提供了一些啓發?

目前的情況撇在一邊:有沒有計劃提出一個BufferTimerServiceTimerService首先?

回答

1

對於它的價值,我發現了一個相當不顯眼的解決方案。不知道這是否是最佳的方式,但它完美的作品:

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

對定時器的值,我們mimicing春靴的前Java8行爲。這包裝了Spring Boot提供的GaugeService:對於「timer。*」值,它調用MetricWriter(這應該是StatsdMetricWriter,否則這整個設置沒有意義),否則它將沿着標尺值傳遞到GaugeService

0

感謝您提供您的解決方案!
我有Dropwizard實現和以下覆蓋幫助捕捉計時器中的請求時間度量而不是量表。

@Bean 
DropwizardMetricServices dropwizardMetricServices(MetricRegistry metricRegistry, 
                ObjectProvider<ReservoirFactory> resFactoryProvider) { 
    return new DropwizardMetricServices(metricRegistry, resFactoryProvider.getIfAvailable()) { 
     @Override 
     public void submit(String name, double value) { 
      if (name.startsWith("response.")) { 
       super.submit("timer." + name, value); 
      } else { 
       super.submit(name, value); 
      } 
     } 
    }; 
} 

關於TimerService,這spring boot issue可能有關。

當我看到有下描述了在2.0春天啓動的指標主要改進計劃:Metrics themeImprovements to Actuator Metrics

+0

您使用DropWizard與StatsD? – skirsch

+0

對不起,我沒有看到這與StatsD有什麼關係...... – skirsch

相關問題