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

关于千分尺度量的混淆-仪表不是应该在提交之前自动计算值吗?

井修雅
2023-03-14

我正在探索测微计和aws cloudwatch。< br >我认为存在一些理解上的差距-
我已经创建了一个计量器,它应该返回连接池中正在使用的连接数。

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秒钟,千分尺应该自动执行传递给量规的双重功能。< br >显然,这是不可能的。< br >我在这里看到了一些代码示例,它们明确地设置了规格值(在单独的线程或预定的逻辑中)。< br >

我还尝试了只实例化一次的计数器,但每次调用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个答案

宇文俊风
2023-03-14

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

如果有帮助的话,可以把仪表想象成“海森仪表”——一种只有在被观察到时才会改变的仪表。开箱即用提供的每一种其他仪表类型都会向数据发送到指标后端的点累积中间计数。

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

  1. 在<code>CloudWatchMeterRegistry
  2. 您正在使用全局注册表(Metrics.addRegistry),并保留对CloudWatchMeterRegistrythis.cloudwachmeterregistry=new.cloudWatchmeterrregistry的引用。您不需要两者,我建议不要使用全局注册表,并在需要时注入您拥有的注册表
  3. 我不确定您正在使用连接池做什么(您实现了自己的连接池吗?)但HikariCP有现成的支持,DBCP正在发布JMX计数器,您可以将其绑定到测微计
 类似资料:
  • 本文向大家介绍php中关于长度计算容易混淆的问题分析,包括了php中关于长度计算容易混淆的问题分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php中关于长度计算容易混淆的问题。分享给大家供大家参考,具体如下: 经常被php中数组和字符串的字符函数搞晕,下面总结一下: strlen($string)函数:计算字符串的长度; sizeof($string,$mode)函数:它是count

  • 我正在阅读关于线程的oracle java教程,我看到了这个示例 当有人可能使用这些方法签入他们的代码时?thread.interrupt(标志)是静态的,所以通过上面的检查,我们实际上检查是否有任何踏面被中断了?即使是这样,根据教程,当线程通过调用静态方法thread.interrupted检查中断时,中断状态将被清除。或任何通过抛出InterruptedException退出的方法在这样做时将

  • 我正在测试

  • 是否有任何方法可以测量实用程序如何使用线程池?我已经浏览了代码,但还没有看到任何直接的选项。

  • 更新千分尺是否会阻止调用线程(例如执行I/O)? 我相信答案是“不,I/O发生在单独的指标收集线程中”,但想知道这种情况的例外情况,边缘情况,… 谢谢Tarik

  • 我对两个说明都有点困惑。首先,让我们放弃扫描值为0和未定义的/bsr或bitsize/lzcnt结果的特殊情况--这个区别很明显,不是我的问题的一部分。 让我们取二进制值 计数,返回到位0(即lsb)的索引或距离。 如果CPU上没有可用的BMI,如何模拟为?或者在的情况下位0是MSB?英特尔规范中的两个“代码操作”也不同,一个从左边计数或索引,另一个从右边计数或索引。 也许有人能对此有所了解,我没