【问题标题】:Spring actuator with Prometheus, custom MetricWriter is never called带有 Prometheus 的弹簧执行器,从不调用自定义 MetricWriter
【发布时间】:2016-11-29 12:41:03
【问题描述】:

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

我找到了很好的 article 用于将弹簧执行器与 prometheus 集成。

根据示例,我应该实现我的自定义 MetricWriter 以更新 Prometheus 中对应的 CounterGauge 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”网址来查看收集到的指标。

结果应该是这样的:

# 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 customPrometheusMetricWriter` 从来没有填充我的指标。

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

【问题讨论】:

    标签: spring-boot-actuator prometheus


    【解决方案1】:

    所以,我找到了使用GaugeServiceDropwizardMetricServices 实现的原因。

    根据春季文档:

    50.10 Dropwizard 指标

    当您声明对 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 库被包含在项目依赖项中。 之后,我将其删除,一切都开始按预期工作。

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2017-09-08
      • 1970-01-01
      • 2015-02-08
      • 2020-08-01
      • 2021-03-16
      • 1970-01-01
      • 2018-11-09
      • 2013-08-08
      相关资源
      最近更新 更多