2016-11-29 30 views
1

我想爲我的Spring啓動應用程序添加度量標準。度量將通過grafana顯示。普羅米修斯彈簧驅動器,自定義MetricWriter永遠不會被稱爲

我發現很好article集成彈簧執行器與普羅米修斯。

根據樣品,我要實現我的自定義MetricWriter在普羅米修斯CollectorRegistry 更新相應CounterGauge它看起來像這樣:

class PrometheusMetricWriter implements MetricWriter { 

    CollectorRegistry registry 

    private final ConcurrentMap<String, Gauge> counters = new ConcurrentHashMap<>() 
    private final ConcurrentHashMap<String, Gauge> gauges = new ConcurrentHashMap<>() 

    @Autowired 
    PrometheusMetricWriter(CollectorRegistry registry) { 
     this.registry = registry 
    } 

    @Override 
    void increment(Delta<?> delta) { 
     counter(delta.name).inc(delta.value.doubleValue()) 
    } 

    @Override 
    void reset(String metricName) { 
     counter(metricName).clear() 
    } 

    @Override 
    void set(Metric<?> value) { 
     println "inside metric writer" 
     gauge(value.name).set(value.value.doubleValue()) 
    } 

    private Counter counter(String name) { 
     def key = sanitizeName(name) 
     counters.computeIfAbsent key, { k -> 
      Counter.build().name(k).help(k).register(registry) 
     } 
    } 

    private Gauge gauge(String name) { 
     def key = sanitizeName(name) 
     gauges.computeIfAbsent key, { k -> 
      Gauge.build().name(k).help(k).register(registry) 
     } 
    } 

    private String sanitizeName(String name) { 
     return name.replaceAll("[^a-zA-Z0-9_]", "_") 
    } 
} 

其他3個所需的要素是:PrometheusEndpointPrometheusMvcEndpointPrometheusEndpointContextConfiguration

畢竟,收集的指標可以通過調用'http://localhost:8080/prometheus'網址進行審查。

而結果應該是這樣的:

# HELP gauge_com_egalacoral_spark_stage_vto gauge_com_egalacoral_spark_stage_vto 
# TYPE gauge_com_egalacoral_spark_stage_vto gauge 
gauge_com_egalacoral_spark_stage_vto 4.0 
# HELP gauge_com_egalacoral_spark_test_vfl gauge_com_egalacoral_spark_test_vfl 
# TYPE gauge_com_egalacoral_spark_test_vfl gauge 
gauge_com_egalacoral_spark_test_vfl 16.0 

不過,我收到空白頁。 這裏是收集一些指標的測試類。

class Runner { 

    @Autowired 
    GaugeService gaugeService 

    private static final Logger logger = LoggerFactory.getLogger(Runner.class) 

    private ZoneId zoneId = ZoneId.of('Europe/London') 

    private Integer delay = 10 

    @Scheduled(fixedDelay = 10000L) 
    void runOnTest() throws Exception { 

     def now = ZonedDateTime.now(zoneId) 
     println "collect metrics" 
     gaugeService.submit("test", 2.0) 

    } 
} 

P.S:我注意到,GaugeService有幾個實現,並在我的應用程序,這是DropwizardMetricServices。這個實現已經包含它自己的度量註冊表,它收集了我的指標。 因此,當我打電話給'/ prometheus'端點時,我得到一個空白頁面,因爲CollectorRegistry' in my custom PrometheusMetricWriter`從未填充過我的度量標準。

那麼請告訴我,我該如何解決這個問題?

回答

0

那麼,我發現之所以執行GaugeService是用的。

根據彈簧文檔:

50.10 Dropwizard指標

在聲明依賴於 io.dropwizard.metrics默認MetricRegistry的Spring bean將被創建:metrics-核心庫;如果您需要定製,您還可以註冊您自己的@Bean實例 。 Dropwizard 'Metrics'庫的用戶會發現發佈到com.codahale.metrics.MetricRegistry的Spring Boot指標自動爲 。從 MetricRegistry指標也將自動通過/度 端點

當Dropwizard指標都在使用,默認CounterService和 GaugeService與一個DropwizardMetricServices取代,後者是圍繞MetricRegistry(所以你可以一個 包裝曝光@Outowired其中一個 服務和正常使用它)。您還可以通過在適當的 類型(即定時器,,直方圖)前加上指標名稱的前綴來創建「特殊」 下拉條條指標。用於計量器的,以及用於計數器的計量器)。

不知何故io.dropwizard.metrics:指標核心庫被列入該項目的依賴。 之後,我刪除它,一切都開始按預期工作。