对千分尺指标的困惑--量规不是应该在提交之前自动计算数值吗? [英] Confusion about micrometer metrics - Isn't the gauge supposed to calculate the value automatically just before it is submitted?

查看:0
本文介绍了对千分尺指标的困惑--量规不是应该在提交之前自动计算数值吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在探索测微仪和AWS CloudWatch。
我认为有一些认识上的差距-
我已经创建了一个量规,它应该返回连接池中正在使用的连接数。

public MetricService(CloudWatchConfig config) {
    this.cloudwatchMeterRegistry = new CloudWatchMeterRegistry(config, Clock.SYSTEM, CloudWatchAsyncClient.create());

    gauge = Gauge.builder("ConnectionPoolGauge", this.connectionPool, value -> {
                Double usedConnections = 0.0;
                for (Map.Entry<String, Boolean> entry : value.entrySet()) {
                    if (entry.getValue().equals(Boolean.FALSE)) {
                        usedConnections++;
                    }
                }
                return usedConnections;
            })
            .tag("GaugeName", "Bhushan's Gauge")
            .strongReference(true)
            .baseUnit("UsedConnections")
            .description("Gauge to monitor connection pool")
            .register(Metrics.globalRegistry);

    Metrics.addRegistry(cloudwatchMeterRegistry);
}

如您所见,我当前正在构造函数中启动该量规。从外部传递connectionPool实例。
以下是使用连接的控制器方法-

@GetMapping("/hello")
        public String hello() {
    // connectionPool.consumeConnection();
    // finally { connectionPool.releaseConnection();}
    }
步长间隔设置为10秒。我的理解是-每10秒,千分尺应自动执行传递给量规的Double函数。
显然,它没有发生。
我在这里看到了一些代码示例,它们显式设置了量值(在单独的线程或计划的逻辑中)。

我还尝试使用只实例化一次的计数器,但我每次调用Hello方法时都会显式调用增量方法。我的预期是这个计数器将继续递增,但过了一段时间,它会下降到0,并再次开始计数。
我完全糊涂了。如果有人能阐明这个概念,我将不胜感激。

编辑: 已尝试使用以下方法创建仪表盘-仍未成功。

cloudwatchMeterRegistry.gauge("ConnectionPoolGauge", this.connectionPool, value -> {
    Double usedConnections = 0.0;
    System.out.println("Inside Guage Value function." + value.entrySet());
    for (Map.Entry<String, Boolean> entry : value.entrySet()) {
        if (entry.getValue().equals(Boolean.FALSE)) {
            usedConnections++;
        }
    }
    return usedConnections;
});

这不会返回Gauge的实例,因此我不能对其调用Value()。此外,该仪表在AWS Cloudwatch中不可见。我可以在CloudWatch中看到我在同一程序中创建的计数器。

推荐答案

千分尺采取的立场是应该采样而不是设置量规,因此不存在有关样本之间可能发生的情况的信息。毕竟,在量规上设置的任何中间值在将该量规的值报告给指标后端时都会丢失,因此在一开始设置这些中间值似乎没有什么价值。

如果它有帮助,可以将量规想象为海森-量规--一种只有在被观察到时才会改变的量规。每提供一种开箱即用的计量器类型,都会向将数据发送到指标后端的点累计中间计数。

因此,在发布指标时会更新量规,以下是解决此问题的一些提示:

  1. CloudWatchMeterRegistrypublish方法中放置一个刹车点,看看是否调用了它。
  2. 您正在使用全局注册表(Metrics.addRegistry),同时保留对CloudWatchMeterRegistry(this.cloudwatchMeterRegistry = new CloudWatchMeterRegistry)的引用。您不需要两者都需要,我建议不要使用全局注册表,而是将您拥有的注册表注入到您需要的任何地方。
  3. 我不确定您对连接池做了什么(您实现了自己的连接池吗?)但是有开箱即用的support for HikariCP,并且DBCP正在发布您可以绑定到测微计的JMX计数器。

这篇关于对千分尺指标的困惑--量规不是应该在提交之前自动计算数值吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆