首页 > 解决方案 > 对千分尺指标的困惑 - 仪表不应该在提交之前自动计算值吗?

问题描述

我正在探索千分尺和 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 秒,Micrometer 应该自动执行传递给仪表的双重功能。
显然,这并没有发生。
我在这里看到了一些代码示例,它们明确设置了仪表值(在单独的线程或预定逻辑中)。

我还尝试了一个只实例化一次的计数器,但是每次调用hello方法时我都会显式调用 increment方法。我的预期是这个计数器会继续增加,但过了一会儿,它会下降到 0 并再次开始计数。
我完全糊涂了。欣赏是否有人可以阐明这个概念。

编辑:尝试了以下方法来创建 Gauge - 仍然没有运气。

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 中看到计数器。

标签: metricsmicrometerspring-micrometerspring-actuator

解决方案


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

如果有帮助,请将仪表视为“海森仪表” - 一种仅在观察时才会改变的仪表。开箱即用提供的所有其他仪表类型都会在将数据发送到指标后端的位置累积中间计数。

因此,当指标发布时,仪表会更新,这里有一些解决此问题的技巧:

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

推荐阅读