1

我想为我的 Spring Boot 应用程序添加度量标准。指标将通过 grafana 显示。

我找到了关于将弹簧执行器与普罗米修斯集成的好文章

根据示例,我应该实现我的自定义MetricWriter 以更新相应的CounterGauge在 Prometheus 中CollectorRegistry 它看起来像这样:

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 ' url 来查看收集到的指标。

结果应该是这样的:

# 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)

    }
}

PS:我注意到GaugeService有几个实现,在我的应用程序中这是DropwizardMetricServices. 这个实现已经包含它自己的指标注册表,它收集我的指标。因此,当我调用“/prometheus”端点时,我得到一个空页面,因为CollectorRegistry' in my customPrometheusMetricWriter 永远不会填充我的指标。

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

4

1 回答 1

0

DropwizardMetricServices所以,我找到了使用的实现的原因GaugeService

根据春季文档:

50.10 Dropwizard 指标

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

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

不知何故io.dropwizard.metrics:metrics-core库被包含在项目依赖项中。之后,我将其删除,一切都开始按预期工作。

于 2016-11-29T14:09:59.093 回答