From e8f77a456b35b1f33f8b8f5da16df477a8351c64 Mon Sep 17 00:00:00 2001 From: zengqiao Date: Thu, 20 Oct 2022 19:16:43 +0800 Subject: [PATCH] =?UTF-8?q?[Optimize]=20=E4=BC=98=E5=8C=96ZK=E6=8C=87?= =?UTF-8?q?=E6=A0=87=E7=9A=84=E8=8E=B7=E5=8F=96=EF=BC=8C=E5=87=8F=E5=B0=91?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E9=87=87=E9=9B=86=E7=9A=84=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=20(#709)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、避免不同集群,相同的ZK地址时,指标重复获取的情况; 2、避免集群某个ZK地址获取指标失败时,下一个周期还会继续尝试从该地址获取指标; --- .../km/core/cache/ZookeeperLocalCache.java | 46 ++++++++++ .../impl/ZookeeperMetricServiceImpl.java | 84 ++++++++++++------- 2 files changed, 100 insertions(+), 30 deletions(-) create mode 100644 km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/cache/ZookeeperLocalCache.java diff --git a/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/cache/ZookeeperLocalCache.java b/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/cache/ZookeeperLocalCache.java new file mode 100644 index 00000000..24f6c7f2 --- /dev/null +++ b/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/cache/ZookeeperLocalCache.java @@ -0,0 +1,46 @@ +package com.xiaojukeji.know.streaming.km.core.cache; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.xiaojukeji.know.streaming.km.common.bean.entity.zookeeper.fourletterword.BaseFourLetterWordCmdData; + +import java.util.concurrent.TimeUnit; + +public class ZookeeperLocalCache { + private static final Cache fourLetterCmdFailedServerCache = Caffeine.newBuilder() + .expireAfterWrite(10, TimeUnit.MINUTES) + .maximumSize(10000) + .build(); + + private static final Cache fourLetterCmdDataCache = Caffeine.newBuilder() + .expireAfterWrite(60, TimeUnit.SECONDS) + .maximumSize(10000) + .build(); + + public static boolean canUse(String host, int port, String cmd) { + String data = fourLetterCmdFailedServerCache.getIfPresent(gen4lwFailedKey(host, port, cmd)); + + return data == null; + } + + public static void setFailed(String host, int port, String cmd) { + fourLetterCmdFailedServerCache.put(gen4lwFailedKey(host, port, cmd), ""); + } + + public static BaseFourLetterWordCmdData getData(String host, int port, String cmd) { + return fourLetterCmdDataCache.getIfPresent(gen4lwFailedKey(host, port, cmd)); + } + + public static void putData(String host, int port, String cmd, BaseFourLetterWordCmdData cmdData) { + fourLetterCmdDataCache.put(gen4lwFailedKey(host, port, cmd), cmdData); + } + + /**************************************************** private method ****************************************************/ + + private static String gen4lwFailedKey(String host, int port, String cmd) { + return host + "@" + port + "@" + cmd; + } + + + +} diff --git a/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/zookeeper/impl/ZookeeperMetricServiceImpl.java b/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/zookeeper/impl/ZookeeperMetricServiceImpl.java index dea1d877..212513aa 100644 --- a/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/zookeeper/impl/ZookeeperMetricServiceImpl.java +++ b/km-core/src/main/java/com/xiaojukeji/know/streaming/km/core/service/zookeeper/impl/ZookeeperMetricServiceImpl.java @@ -10,6 +10,7 @@ import com.xiaojukeji.know.streaming.km.common.bean.entity.param.metric.Zookeepe import com.xiaojukeji.know.streaming.km.common.bean.entity.result.Result; import com.xiaojukeji.know.streaming.km.common.bean.entity.result.ResultStatus; import com.xiaojukeji.know.streaming.km.common.bean.entity.version.VersionJmxInfo; +import com.xiaojukeji.know.streaming.km.common.bean.entity.zookeeper.fourletterword.BaseFourLetterWordCmdData; import com.xiaojukeji.know.streaming.km.common.bean.entity.zookeeper.fourletterword.ServerCmdData; import com.xiaojukeji.know.streaming.km.common.bean.entity.zookeeper.fourletterword.parser.MonitorCmdDataParser; import com.xiaojukeji.know.streaming.km.common.bean.entity.zookeeper.fourletterword.parser.ServerCmdDataParser; @@ -26,8 +27,8 @@ import com.xiaojukeji.know.streaming.km.common.bean.entity.zookeeper.fourletterw import com.xiaojukeji.know.streaming.km.common.bean.entity.metrics.ZookeeperMetrics; import com.xiaojukeji.know.streaming.km.common.bean.po.metrice.ZookeeperMetricPO; import com.xiaojukeji.know.streaming.km.common.utils.zookeeper.FourLetterWordUtil; +import com.xiaojukeji.know.streaming.km.core.cache.ZookeeperLocalCache; import com.xiaojukeji.know.streaming.km.core.service.cluster.ClusterPhyService; -import com.xiaojukeji.know.streaming.km.core.service.kafkacontroller.KafkaControllerService; import com.xiaojukeji.know.streaming.km.core.service.version.BaseMetricService; import com.xiaojukeji.know.streaming.km.core.service.zookeeper.ZookeeperMetricService; import com.xiaojukeji.know.streaming.km.core.service.zookeeper.ZookeeperService; @@ -53,6 +54,7 @@ public class ZookeeperMetricServiceImpl extends BaseMetricService implements Zoo public static final String ZOOKEEPER_METHOD_GET_METRIC_FROM_MONITOR_CMD = "getMetricFromMonitorCmd"; public static final String ZOOKEEPER_METHOD_GET_METRIC_FROM_SERVER_CMD = "getMetricFromServerCmd"; public static final String ZOOKEEPER_METHOD_GET_METRIC_FROM_KAFKA_BY_JMX = "getMetricFromKafkaByJMX"; + public static final String ZOOKEEPER_METHOD_GET_METRIC_FROM_HEALTH_SERVICE = "getMetricFromHealthService"; @Autowired private ClusterPhyService clusterPhyService; @@ -66,9 +68,6 @@ public class ZookeeperMetricServiceImpl extends BaseMetricService implements Zoo @Autowired private KafkaJMXClient kafkaJMXClient; - @Autowired - private KafkaControllerService kafkaControllerService; - @Override protected VersionItemTypeEnum getVersionItemType() { return VersionItemTypeEnum.METRIC_ZOOKEEPER; @@ -171,24 +170,37 @@ public class ZookeeperMetricServiceImpl extends BaseMetricService implements Zoo Result rz = null; for (Tuple hostPort: param.getZkAddressList()) { - Result cmdDataResult = FourLetterWordUtil.executeFourLetterCmd( - param.getClusterPhyId(), - hostPort.getV1(), - hostPort.getV2(), - param.getZkConfig() != null ? param.getZkConfig().getOpenSecure(): false, - param.getZkConfig() != null ? param.getZkConfig().getRequestTimeoutUnitMs(): Constant.DEFAULT_REQUEST_TIMEOUT_UNIT_MS, - new ServerCmdDataParser() - ); + ServerCmdData cmdData = null; - if (cmdDataResult.failed()) { - rz = Result.buildFromIgnoreData(cmdDataResult); + BaseFourLetterWordCmdData baseCmdData = ZookeeperLocalCache.getData(hostPort.getV1(), hostPort.getV2(), FourLetterWordUtil.ServerCmd); + if (baseCmdData != null) { + cmdData = (ServerCmdData) baseCmdData; + } else if (ZookeeperLocalCache.canUse(hostPort.getV1(), hostPort.getV2(), FourLetterWordUtil.ServerCmd)) { + Result cmdDataResult = FourLetterWordUtil.executeFourLetterCmd( + param.getClusterPhyId(), + hostPort.getV1(), + hostPort.getV2(), + param.getZkConfig() != null ? param.getZkConfig().getOpenSecure(): false, + param.getZkConfig() != null ? param.getZkConfig().getRequestTimeoutUnitMs(): Constant.DEFAULT_REQUEST_TIMEOUT_UNIT_MS, + new ServerCmdDataParser() + ); + + if (cmdDataResult.failed()) { + ZookeeperLocalCache.setFailed(hostPort.getV1(), hostPort.getV2(), FourLetterWordUtil.ServerCmd); + + rz = Result.buildFromIgnoreData(cmdDataResult); + continue; + } + + cmdData = cmdDataResult.getData(); + ZookeeperLocalCache.putData(hostPort.getV1(), hostPort.getV2(), FourLetterWordUtil.ServerCmd, cmdData); + } else { + // baseCmdData为空 且 当前地址不可使用 continue; } - ServerCmdData cmdData = cmdDataResult.getData(); - ZookeeperMetrics metrics = new ZookeeperMetrics(param.getClusterPhyId()); - metrics.putMetric(ZOOKEEPER_METRIC_AVG_REQUEST_LATENCY, cmdData.getZkAvgLatency().floatValue()); + metrics.putMetric(ZOOKEEPER_METRIC_AVG_REQUEST_LATENCY, cmdData.getZkAvgLatency()); metrics.putMetric(ZOOKEEPER_METRIC_MIN_REQUEST_LATENCY, cmdData.getZkMinLatency().floatValue()); metrics.putMetric(ZOOKEEPER_METRIC_MAX_REQUEST_LATENCY, cmdData.getZkMaxLatency().floatValue()); metrics.putMetric(ZOOKEEPER_METRIC_OUTSTANDING_REQUESTS, cmdData.getZkOutstandingRequests().floatValue()); @@ -208,24 +220,36 @@ public class ZookeeperMetricServiceImpl extends BaseMetricService implements Zoo Result rz = null; for (Tuple hostPort: param.getZkAddressList()) { - Result cmdDataResult = FourLetterWordUtil.executeFourLetterCmd( - param.getClusterPhyId(), - hostPort.getV1(), - hostPort.getV2(), - param.getZkConfig() != null ? param.getZkConfig().getOpenSecure(): false, - param.getZkConfig() != null ? param.getZkConfig().getRequestTimeoutUnitMs(): Constant.DEFAULT_REQUEST_TIMEOUT_UNIT_MS, - new MonitorCmdDataParser() - ); + MonitorCmdData cmdData = null; - if (cmdDataResult.failed()) { - rz = Result.buildFromIgnoreData(cmdDataResult); + BaseFourLetterWordCmdData baseCmdData = ZookeeperLocalCache.getData(hostPort.getV1(), hostPort.getV2(), FourLetterWordUtil.MonitorCmd); + if (baseCmdData != null) { + cmdData = (MonitorCmdData) baseCmdData; + } else if (ZookeeperLocalCache.canUse(hostPort.getV1(), hostPort.getV2(), FourLetterWordUtil.MonitorCmd)) { + Result cmdDataResult = FourLetterWordUtil.executeFourLetterCmd( + param.getClusterPhyId(), + hostPort.getV1(), + hostPort.getV2(), + param.getZkConfig() != null ? param.getZkConfig().getOpenSecure(): false, + param.getZkConfig() != null ? param.getZkConfig().getRequestTimeoutUnitMs(): Constant.DEFAULT_REQUEST_TIMEOUT_UNIT_MS, + new MonitorCmdDataParser() + ); + + if (cmdDataResult.failed()) { + ZookeeperLocalCache.setFailed(hostPort.getV1(), hostPort.getV2(), FourLetterWordUtil.MonitorCmd); + + rz = Result.buildFromIgnoreData(cmdDataResult); + continue; + } + + cmdData = cmdDataResult.getData(); + ZookeeperLocalCache.putData(hostPort.getV1(), hostPort.getV2(), FourLetterWordUtil.MonitorCmd, cmdData); + } else { continue; } - MonitorCmdData cmdData = cmdDataResult.getData(); - ZookeeperMetrics metrics = new ZookeeperMetrics(param.getClusterPhyId()); - metrics.putMetric(ZOOKEEPER_METRIC_AVG_REQUEST_LATENCY, cmdData.getZkAvgLatency().floatValue()); + metrics.putMetric(ZOOKEEPER_METRIC_AVG_REQUEST_LATENCY, cmdData.getZkAvgLatency()); metrics.putMetric(ZOOKEEPER_METRIC_MIN_REQUEST_LATENCY, cmdData.getZkMinLatency().floatValue()); metrics.putMetric(ZOOKEEPER_METRIC_MAX_REQUEST_LATENCY, cmdData.getZkMaxLatency().floatValue()); metrics.putMetric(ZOOKEEPER_METRIC_OUTSTANDING_REQUESTS, cmdData.getZkOutstandingRequests().floatValue());