如何使用Java prometheus sdk创建带有标签的Gauge指标?

问题描述 投票:0回答:3

我有一个 springboot Kotlin Web 服务,它使用 Actuator (

spring-boot-starter-actuator
) 和千分尺 (
micrometer-registry-prometheus
) 将指标公开给 prometheus scraper。

为了监控队列中操作的大小,我使用自定义仪表

val gauge = Gauge.build()
        .name("operation_queue_size")
        .help("Size of queue")
        .register(collectorRegistry)

# later
gauge.inc()
# or
gauge.dec()

我想改进这个指标,添加一个代表队列中操作类型的标签,但在 Builder 类上没有找到任何合适的方法。

目标是公开如下指标:

operation_queue_size{op_type="deletions"} 999
operation_queue_size{op_type="insertions"} 999

谢谢。

spring-boot prometheus spring-boot-actuator micrometer spring-micrometer
3个回答
3
投票

我找到了解决方案:

val gauge = Gauge.build()
        .name("ic_queue_size")
        .help("Size of queue")
        .labelNames("op_type")
        .register(collectorRegistry)

# later
gauge.labels("deletions").inc()
# or
gauge.labels("deletions").dec()

很难找到的原因是这个库使用术语

labels
而 prometheus 文档将它们称为
tags


3
投票

创建仪表有两种方法:

测微芯

使用 Micrometer,您可以从要检查的对象方法创建量具,例如 from baeldung:

import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;

List<String> list = new ArrayList<>(4);

Gauge gauge = Gauge
  .builder("cache.size", list, List::size)
  .tags("example", "list size")
  .register(registry);

它需要一个字符串

"cache.size"
作为仪表的名称,一个对象
list
和一个 lambda (() -> Double),这里是
list::size
。由于这一点,仪表将得到更新。

然后仪表每次都会自动更新(这是一个带有断言的示例,其值是什么):

assertEquals(0.0, gauge.value());
list.add("1");
assertEquals(1.0, gauge.value());

普罗米修斯客户端

使用 prometheus sdk 是:

import io.prometheus.client.CollectorRegistry;
import io.prometheus.client.Gauge;

Gauge gauge = Gauge.build()
        .build("cache.size", "size of the cache")
        .labelNames("type")
        .register(collectorRegistry);

但是您需要手动更改仪表值:

# Increase
gauge.labels("list size").inc();
# Decrease
gauge.labels("list size").dec();
# Set value
gauge.labels("list size").set(list.size());

现在你可以选择了。


0
投票

千分尺统计示例:

import io.micrometer.core.instrument.*;
import io.micrometer.statsd.StatsdMeterRegistry;

//...

Map<String, Long> metrics = new HashMap<>();
metrics.put("brand1", 4l);
metrics.put("brand2", 4l);


for (Map.Entry<String, Long> entry : metrics.entrySet()) {
    String key = entry.getKey();
    Tags tag = Tags.of("brand", key);
    Gauge.builder("app.metrics", metrics, map -> map.get(key))
            .tags(tag)
            .register(statsdMeterRegistry);
}
© www.soinside.com 2019 - 2024. All rights reserved.