我正在探索千分尺和 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 中看到计数器。