春季执行器与普罗米修斯(Prometheus),从未被调用



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

我找到了与Prometheus集成的精美文章。

根据示例,我应该在Prometheus CollectorRegistry中实现自定义MetricWriter以更新相应的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'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)
    }
}

P.S:我注意到GaugeService具有多个实现,在我的应用中,这是DropwizardMetricServices。该实现已经包含其自己的指标注册表,该注册表收集了我的指标。因此,当我打电话给'/prometheus'端点时,我会得到一个空页面,因为CollectorRegistry' in my custom Prometheusmetricwriter从未用我的指标填充。

所以请告诉我如何解决这个问题?

因此,我找到了DropwizardMetricServices使用GaugeService使用的原因。

根据春季文档:

50.10 DropWizard Metrics

当您声明对依赖关系时,将创建默认的度量弹簧bean io.dropwizard.metrics:指标核库;你也可以注册你 拥有@Bean实例,如果您需要自定义。Dropwizard的用户 "指标"库会发现春季启动指标是自动的 出版给com.codahale.metrics.metricregistry。来自 指标也会通过/指标自动暴露 端点

当使用DropWizard指标时,默认的counterservice和 仪表服务被DropwizardMetricServices取代,这是 围绕度量的包装器(因此,您可以@Autowired其中一个 服务并正常使用)。您还可以创建"特殊" DropWizard指标通过将您的指标名称加上适当的名称前缀 键入(即计时器。,直方图。用于仪表和仪表。

某种程度上 io.dropwizard.metrics:指标核库中包含在项目依赖项中。之后,我将其删除,所有这些都开始按预期工作。

最新更新