Quarkus度量-截取度量端点



在使用https://quarkus.io/guides/micrometer?

我想收集一些需要调用不同的API的指标。。。而不是制定时间表(https://quarkus.io/guides/scheduler-reference)。。。

示例:

  • 我向Kubernetes API查询一些自定义资源
  • 然后我想更新一些带有不同标签的仪表

第一个/metrics给了我们:

# HELP test_metric_a  
# TYPE test_metric_a gauge
test_metric_a{namespace="test123",user="admin",} 1.0
test_metric_a{namespace="testabc",user="admin",} 1.0
# HELP test_metric_b  
# TYPE test_metric_b gauge
test_metric_b 0.0

第二个/metrics可能给出:

# HELP test_metric_a  
# TYPE test_metric_a gauge
test_metric_a 0.0
# HELP test_metric_b  
# TYPE test_metric_b gauge
test_metric_b{namespace="testabc",user="admin",} 2.0

如何使用https://quarkus.io/guides/micrometer调用Kubernetes API,因为应用程序中可能没有任何更改来更新仪表/注册表,但外部事件或时间流逝会导致状态(所需的度量输出(发生变化

请注意,自定义度量(请参阅下面的注释(只被调用一次(我想这是一个单例度量?(。理想情况下,我希望每次/metrics被应答时都能调用。。。

进一步编辑以显示仪表是如何创建/更新的:

@ApplicationScoped
public class MyMetrics {
private final MeterRegistry registry;
MyMetrics(MeterRegistry registry) {
this.registry = registry;
}
//...
// somehow call this whenever /metrics is hit?
protected void updateGauges() {
// use KubernetesClient to query K8s API to gather some customer resources, then process that list... etc...
// there is a loop over the below for user/namespace pairs in the tags
//final Tags tags = getTags();
//int count = getCount();
//registry.gauge("test_metric_a", tags, count);
// so this could roll out to something like:
registry.gauge("test_metric_a", Tags.of("user", "user1", "namespace", "ns1"), 1);
registry.gauge("test_metric_a", Tags.of("user", "user2", "namespace", "ns1"), 2);
registry.gauge("test_metric_a", Tags.of("user", "user1", "namespace", "ns2"), 1);
registry.gauge("test_metric_b", Tags.of("user", "user1", "namespace", "ns1"), 1);
registry.gauge("test_metric_b", Tags.of("user", "user2", "namespace", "ns1"), 1);
}
}

也许这些gauges可能是counters。。。但问题仍然存在。。。

好的。正如我在评论中所说,当收集度量时(例如,在普罗米修斯的情况下,当刮取端点时(,会观察到度量的值。

如果您正在讨论添加包含命名空间之类内容的标签,那么常见标签示例可能会为您提供一些内容,您可以在其中预先计算标签:

registry.config().commonTags("stack", "prod", "region", "us-east-1");

这会将这些标签添加到所有指标中,但您可以使用MeterFilter来提高选择性(例如,仅将标签添加到符合某些条件的指标中(。

new MeterFilter() {
@Override
public Meter.Id map(Meter.Id id) {
if(id.getName().startsWith("test")) {
return id.withName("extra." + id.getName()).withTag("extra.tag", "value");
}
return id;
}
}

https://micrometer.io/docs/concepts#_common_tags

如果您试图根据从Kubernetes API检索到的数据更新标签/标签值,您可能需要运行一个定期任务(例如计划任务(,该任务将使用新标签重新注册仪表。

请注意,对于已被垃圾收集的仪表,千分尺将省略或返回NaN(取决于您使用的注册表(,因此,如果您希望使用以前的标记值注册的仪表保持不变,则需要使其成为强引用。

您可以使用以下MeterRegistry接口来实现您的目标:

public <T> T gauge(String name, Iterable<Tag> tags,
@Nullable T stateObject, ToDoubleFunction<T> valueFunction) 

CCD_ 7在任何时候/度量端点被命中时被执行。

public class MyMetrics {
@Inject
MeterRegistry registry;
void onApplicationStart(@Observes StartupEvent e) {
Tags tags = Tags.of("user", "user1", "namespace", "ns1");
GaugeUpdater gaugeUpdater = registry.gauge("test_metric_a", tags, 
new GaugeUpdater(registry), GaugeUpdater::getCount);
}
private static class GaugeUpdater {
private int count;
MeterRegistry registry;
public GaugeUpdater(MeterRegistry registry) {
this.registry = registry;
}
// this gets called whenever /metrics is hit!!!!
public double getCount(){
// use KubernetesClient to query K8s API to gather some customer resources, then process that list... etc...
// register further gauges
// registry.gauge("test_metric_a", Tags.of("user", "user1", "namespace", "ns1"), 1);
return count++;
}
}
}

最新更新