From 6b7ddbbe92c91f8098c738ef9b809a68651fbfb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sunxien=C2=AE?= <81640257+sunxien@users.noreply.github.com> Date: Fri, 16 May 2025 15:09:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(canal/prometheus):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=BB=B6=E8=BF=9F=E6=8C=87=E6=A0=87=E7=9A=84=E7=BC=BA=E9=99=B7?= =?UTF-8?q?=20(#5426)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -【缺陷描述】 Admin控制台修改canal.properties配置后,Server自动进行重启,在Grafan上观测到同步实例的PUT/GET/ACK延迟居高不下。 -【原因定位】 源库心跳正常触发,MemoryStoreWithBuffer正常推进位点,profiling 正常统计,但是延迟指标依然是越来越来越高。Prometheus调用collect接口采集到的exec time时间始终是固定不变的。经debug排查到StoreCollector采集器内存hold的StoreMetricsHolder与CanalInstance实例中的引用已经不同啦,CanalIntance重启时已经被重建过一份新的实例,但是StoreMetricsHolder却没有保存到内存Hold中。原因是Map.putIfAbsent调用引起。 -【修复效果】 - 修复后,重启Server心跳正常推进,延迟瞬间降下来。梳理其他Collector代码都是调用Map.put,只有这里使用putIfAbsent可能是粗心导致吧。修复效果 --- .../com/alibaba/otter/canal/prometheus/impl/StoreCollector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/StoreCollector.java b/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/StoreCollector.java index e22eb251..81b90ba7 100644 --- a/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/StoreCollector.java +++ b/prometheus/src/main/java/com/alibaba/otter/canal/prometheus/impl/StoreCollector.java @@ -162,7 +162,7 @@ public class StoreCollector extends Collector implements InstanceRegistry { Preconditions.checkNotNull(holder.putMemSize); Preconditions.checkNotNull(holder.ackMemSize); } - StoreMetricsHolder old = instances.putIfAbsent(destination, holder); + StoreMetricsHolder old = instances.put(destination, holder); if (old != null) { logger.warn("Remote stale StoreCollector for instance {}.", destination); }