带有Prometheus的弹簧执行器,从不调用自定义MetricWriter

时间:2016-11-29 12:41:04

标签: spring-boot-actuator prometheus

我想为我的Spring启动应用添加指标衡量指标。度量标准将通过grafana显示。

我找到了很好的article用于集成弹簧执行器和普罗米修斯。

根据示例,我应该实现我的自定义MetricWriter,以更新普罗米修斯Counter中的相应GaugeCollectorRegistry 它看起来像这样:

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`从未填充我的指标。

那么请告诉我如何解决这个问题呢?

1 个答案:

答案 0 :(得分:0)

因此,我找到了GaugeService实施for (char v = 'a'; i <= 'z'; ++v) { mutli_array.push_back(v); } 的原因。

根据春季文档:

  

50.10 Dropwizard指标

     

当你声明一个依赖项时,将创建一个默认的MetricRegistry Spring bean    io.dropwizard.metrics:metrics-core 库;你也可以注册   如果需要自定义,则拥有@Bean实例。 Dropwizard的用户   “Metrics”库将自动发现Spring Boot指标   发布到com.codahale.metrics.MetricRegistry。来自的指标   MetricRegistry也会通过/ metrics自动公开   端点

     

当使用Dropwizard指标时,默认的CounterService和   GaugeService替换为DropwizardMetricServices,它是一个   MetricRegistry周围的包装器(所以你可以@Autowired其中之一   服务并正常使用)。你也可以创建“特殊”   Dropwizard指标通过为您的指标名称添加适当的前缀   类型(即计时器。,直方图。用于仪表,仪表。*用于计数器。)

以某种方式 io.dropwizard.metrics:metrics-core 库包含在项目依赖项中。 之后,我删除它,一切都按预期开始工作。