如何使用Java prometheus-sdk创建带有标签的Gauge度量



我有一个springboot Kotlin web服务,它使用Actuator(spring-boot-starter-actuator(和千分尺(micrometer-registry-prometheus(将度量暴露给prometheus scraper。

为了监控队列中操作的大小,我使用了一个自定义的Gauge

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

谢谢。

我找到了解决方案:

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,而普罗米修斯文档将其称为tags

有两种创建仪表的方法:

千分尺芯

使用Micrometer,您可以从您想要检查的对象方法创建Gauge,例如从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"作为Gauge的名称、对象list和lambda(((->Double(这里是list::size。仪表将因此而更新。

然后仪表每次都会自动更新(这里有一个断言的例子,值是多少(:

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

普罗米修斯客户

与普罗米修斯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());

现在你可以选择了。

千分尺状态示例:

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);
}

最新更新