我有一个 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
谢谢。
我找到了解决方案:
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
创建仪表有两种方法:
使用 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());
现在你可以选择了。
千分尺统计示例:
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);
}