我有一个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);
}