当前位置: 首页 > 知识库问答 >
问题:

Quakus指标-拦截指标endpoint

赵渊
2023-03-14

是否有办法在使用时监听 /metricsendpointhttps://quarkus.io/guides/micrometer?

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

例:

  • 我在库伯内特斯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);
    }
}

...也许这些仪表可能是计数器。。。但问题仍然是。。。

共有1个答案

柳宏深
2023-03-14

好啊正如我在评论中所说,当收集指标时(例如普罗米修斯的情况下,当endpoint被刮伤时),会观察到量具的值。

如果您正在谈论添加包含类似名称空间的标记,那么common tags示例可能会为您提供一些信息,您可以预先计算标签:

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(取决于您使用的注册表),因此,如果您希望使用以前的标记值注册的仪表保持不变,则需要使其成为强引用。

 类似资料:
  • 我有一个Spring 3 Web应用程序,它实现了两个拦截器。我正在使用一个带有@Configuration注释的配置类。代码如下: 无论我将拦截器添加到注册表的顺序是什么,allIntericetor的preHandle函数总是在home Intericetor的preHandle之前调用。有人知道如何控制拦截器调用的顺序吗? 谢谢

  • Tendermint 可以报告和提供普罗米修斯指标,而普罗米修斯指标反过来也可以被普罗米修斯收集器消耗。 默认情况下禁用此功能。 要启用普罗米修斯指标,请设置你的配置文件 instrumentation.prometheus=true 。默认情况下,指标将在 26660 端口的 /metrics 下提供。 监听地址可以在配置文件中更改(参见 instrumentation.prometheus\_

  • 指标(Metric) 一个指标视图为每个查询聚合显示一个单一的数字: 指标聚合: Count 计数 聚合返回所选索引模式中元素的原始计数。 Average 该聚合返回数字字段的平均值 。从下拉菜单中选择一个字段。 Sum 总和 聚合返回数字字段的总和。从下拉菜单中选择一个字段。 Min 最小值 聚合返回数字字段的最小值。从下拉菜单中选择一个字段。 Max 最大值 聚合返回数字字段的最大值。从下拉菜

  • 我为普罗米修斯和Actuator添加了依赖项: 但是,如果我去endpoint /actuator/promehteuslog4j2_events_total指标是不到位的,即使我还添加了log4j2依赖从Spring Boot启动器,我错过了一些额外的配置吗?

  • Spring Cloud Stream为粘合剂提供健康指标。它以binders的名义注册,可以通过设置management.health.binders.enabled属性启用或禁用。

  • Kubernetes中需要考虑三个级别的度量集合—节点、Pod和在Pod中运行的应用程序。 对于节点和应用程序指标,我有非常有效的解决方案,但我仍停留在pod指标上。 我尝试过cAdvisor和Kube状态指标,但它们都没有给我想要的东西。Kube状态指标仅提供已知的信息,例如pod CPU限制和请求。cAdvisor不会将pod标签插入容器名称,因此我无法知道哪个pod行为不端。 给定一个pod