From 8a09ec8897c9cc3fb0bad7be29674bed1631c644 Mon Sep 17 00:00:00 2001 From: Rawven <121878866+rawven@users.noreply.github.com> Date: Sat, 31 Aug 2024 21:50:59 +0800 Subject: [PATCH] feat(): refactor --- .../internals/ConfigMonitorInitializer.java | 106 +++++------- .../apollo/internals/DefaultInjector.java | 6 +- .../internals/RemoteConfigRepository.java | 2 +- .../ApolloClientBootstrapArgsMonitorApi.java | 160 +++++++++++------- .../api/ApolloClientExceptionMonitorApi.java | 5 +- .../api/ApolloClientNamespaceMonitorApi.java | 51 +++++- .../api/ApolloClientThreadPoolMonitorApi.java | 53 +++++- .../internal/ApolloClientMonitorConstant.java | 45 +++-- .../internal/ApolloClientMonitorContext.java | 96 +++++++++++ .../internal/DefaultConfigMonitor.java | 36 +--- .../{MeterEnums.java => MetricTypeEnums.java} | 2 +- .../event/ApolloClientMonitorEvent.java | 9 +- .../ApolloClientMonitorEventPublisher.java | 12 +- .../AbstractApolloClientMetricsExporter.java | 6 +- ...ultApolloClientMetricsExporterFactory.java | 3 - .../impl/NullApolloClientMetricsExporter.java | 9 +- .../ApolloClientJmxBootstrapArgsMBean.java | 11 +- .../mbean/ApolloClientJmxExceptionMBean.java | 4 +- .../mbean/ApolloClientJmxNamespaceMBean.java | 73 +++++++- ...tractApolloClientMonitorEventListener.java | 71 +++++--- .../ApolloClientMonitorEventListener.java | 4 +- ...olloClientMonitorEventListenerManager.java | 36 ---- ...olloClientMonitorEventListenerManager.java | 43 ----- .../DefaultApolloClientBootstrapArgsApi.java | 122 +------------ .../impl/DefaultApolloClientExceptionApi.java | 43 ++--- .../impl/DefaultApolloClientNamespaceApi.java | 103 ++++------- .../DefaultApolloClientThreadPoolApi.java | 105 +++--------- .../NullClientBootstrapArgsMonitorApi.java | 117 +------------ .../impl/NullClientExceptionMonitorApi.java | 5 + .../impl/NullClientNamespaceMonitorApi.java | 12 +- .../impl/NullClientThreadPoolMonitorApi.java | 11 +- .../monitor/internal/model/CounterModel.java | 4 +- .../monitor/internal/model/GaugeModel.java | 5 +- .../monitor/internal/model/SampleModel.java | 12 +- .../ApolloClientMessageProducerComposite.java | 1 - .../ApolloClientMonitorMessageProducer.java | 111 ++++++------ .../framework/apollo/util/ConfigUtil.java | 118 +++++++------ .../ConfigMonitorInitializerTest.java | 153 +++++++---------- .../ApolloClientMonitorContextTest.java | 99 +++++++++++ .../internal/DefaultConfigMonitorTest.java | 69 ++++---- ...ApolloClientMonitorEventPublisherTest.java | 18 +- ...stractApolloClientMetricsExporterTest.java | 4 +- ...polloClientMetricsExporterFactoryTest.java | 4 +- ...tApolloClientMonitorEventListenerTest.java | 112 ------------ ...ClientMonitorEventListenerManagerTest.java | 67 -------- ...faultApolloClientBootstrapArgsApiTest.java | 2 +- .../DefaultApolloClientExceptionApiTest.java | 9 +- .../DefaultApolloClientNamespaceApiTest.java | 12 +- .../DefaultApolloClientThreadPoolApiTest.java | 8 +- ...NullClientBootstrapArgsMonitorApiTest.java | 32 ++-- .../NullClientNamespaceMonitorApiTest.java | 13 +- .../NullClientThreadPoolMonitorApiTest.java | 22 +-- .../stress/ApolloClientMonitorStressTest.java | 15 +- .../framework/apollo/util/ConfigUtilTest.java | 86 ++++++++++ .../resources/application-stress-test.yml | 17 -- ...PrometheusApolloClientMetricsExporter.java | 18 +- ...PrometheusApolloClientMetricsExporter.java | 94 ---------- 57 files changed, 1111 insertions(+), 1355 deletions(-) create mode 100644 apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorContext.java rename apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/enums/{MeterEnums.java => MetricTypeEnums.java} (96%) delete mode 100644 apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/ApolloClientMonitorEventListenerManager.java delete mode 100644 apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/DefaultApolloClientMonitorEventListenerManager.java create mode 100644 apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorContextTest.java delete mode 100644 apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/AbstractApolloClientMonitorEventListenerTest.java delete mode 100644 apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/DefaultApolloClientMonitorEventListenerManagerTest.java delete mode 100644 apollo-client/src/test/resources/application-stress-test.yml delete mode 100644 apollo-plugin/apollo-plugin-client-prometheus/src/main/java/com/ctrip/framework/apollo/plugin/prometheus/PrometheusApolloClientMetricsExporter.java diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/ConfigMonitorInitializer.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/ConfigMonitorInitializer.java index a6d50f5f..20ab2640 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/ConfigMonitorInitializer.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/ConfigMonitorInitializer.java @@ -20,18 +20,14 @@ import com.ctrip.framework.apollo.build.ApolloInjector; import com.ctrip.framework.apollo.core.utils.ClassLoaderUtil; -import com.ctrip.framework.apollo.monitor.api.ConfigMonitor; -import com.ctrip.framework.apollo.monitor.internal.DefaultConfigMonitor; import com.ctrip.framework.apollo.monitor.internal.exporter.AbstractApolloClientMetricsExporter; +import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporter; import com.ctrip.framework.apollo.monitor.internal.jmx.ApolloClientJmxMBeanRegister; -import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListener; -import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListenerManager; +import com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorContext; import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientBootstrapArgsApi; import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientExceptionApi; import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientNamespaceApi; import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientThreadPoolApi; -import com.ctrip.framework.apollo.monitor.internal.listener.DefaultApolloClientMonitorEventListenerManager; -import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporter; import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporterFactory; import com.ctrip.framework.apollo.monitor.internal.tracer.ApolloClientMonitorMessageProducer; import com.ctrip.framework.apollo.monitor.internal.tracer.ApolloClientMessageProducerComposite; @@ -41,91 +37,75 @@ import com.ctrip.framework.apollo.tracer.spi.MessageProducer; import com.ctrip.framework.apollo.util.ConfigUtil; import com.ctrip.framework.foundation.internals.ServiceBootstrap; -import com.google.common.collect.Lists; import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * ConfigMonitorInitializer initializes the Apollo Config Monitor. */ public class ConfigMonitorInitializer { - private static final Logger logger = LoggerFactory.getLogger(ConfigMonitorInitializer.class); protected static boolean hasInitialized = false; - private static ConfigUtil CONFIG_UTIL = ApolloInjector.getInstance(ConfigUtil.class); + private static ConfigUtil m_configUtil = ApolloInjector.getInstance(ConfigUtil.class); + private static ApolloClientMonitorContext monitorContext = ApolloInjector.getInstance( + ApolloClientMonitorContext.class); public static void initialize() { - if (CONFIG_UTIL.getClientMonitorEnabled() && !hasInitialized) { - hasInitialized = true; - logger.debug("Initializing ConfigMonitor"); - DefaultApolloClientMonitorEventListenerManager manager = initializeMetricsEventListenerManager(); - List collectors = initializeCollectors(manager); - ApolloClientMetricsExporter metricsExporter = initializeMetricsExporter(collectors); - initializeJmxMonitoring(collectors); - initializeConfigMonitor(collectors, metricsExporter); - logger.debug("ConfigMonitor initialized successfully."); + if (m_configUtil.isClientMonitorEnabled() && !hasInitialized) { + synchronized (ConfigMonitorInitializer.class) { + if (!hasInitialized) { + doInit(); + hasInitialized = true; + } + } } } - protected static DefaultApolloClientMonitorEventListenerManager initializeMetricsEventListenerManager() { - return (DefaultApolloClientMonitorEventListenerManager) ApolloInjector.getInstance( - ApolloClientMonitorEventListenerManager.class); + private static void doInit() { + initializeMetricsEventListener(); + initializeMetricsExporter(); + initializeJmxMonitoring(); + hasInitialized = true; } - - protected static void initializeJmxMonitoring(List collectors) { - if (CONFIG_UTIL.getClientMonitorJmxEnabled()) { - collectors.forEach(metricsCollector -> + + + private static void initializeJmxMonitoring() { + if (m_configUtil.isClientMonitorJmxEnabled()) { + monitorContext.getCollectors().forEach(metricsCollector -> ApolloClientJmxMBeanRegister.register( - MBEAN_NAME + metricsCollector.mBeanName(), metricsCollector) + MBEAN_NAME + metricsCollector.getName(), metricsCollector) ); } } - protected static List initializeCollectors( - DefaultApolloClientMonitorEventListenerManager manager) { - + private static void initializeMetricsEventListener() { DefaultConfigManager configManager = (DefaultConfigManager) ApolloInjector.getInstance( ConfigManager.class); - - List collectors = Lists.newArrayList( - new DefaultApolloClientExceptionApi(), - new DefaultApolloClientNamespaceApi(configManager.m_configs, configManager.m_configFiles), - new DefaultApolloClientThreadPoolApi(RemoteConfigRepository.m_executorService, - AbstractConfig.m_executorService, AbstractConfigFile.m_executorService, - AbstractApolloClientMetricsExporter.m_executorService), - new DefaultApolloClientBootstrapArgsApi(CONFIG_UTIL) - ); - - manager.setCollectors(collectors); - return collectors; + monitorContext.setApolloClientBootstrapArgsMonitorApi(new DefaultApolloClientBootstrapArgsApi( + m_configUtil)); + monitorContext.setApolloClientExceptionMonitorApi(new DefaultApolloClientExceptionApi()); + monitorContext.setApolloClientNamespaceMonitorApi(new DefaultApolloClientNamespaceApi( + configManager.m_configs, configManager.m_configFiles)); + monitorContext.setApolloClientThreadPoolMonitorApi(new DefaultApolloClientThreadPoolApi( + RemoteConfigRepository.m_executorService, + AbstractConfig.m_executorService, AbstractConfigFile.m_executorService, + AbstractApolloClientMetricsExporter.m_executorService)); } - protected static ApolloClientMetricsExporter initializeMetricsExporter( - List collectors) { + private static void initializeMetricsExporter( + ) { ApolloClientMetricsExporterFactory exporterFactory = ApolloInjector.getInstance( ApolloClientMetricsExporterFactory.class); - return exporterFactory.getMetricsReporter(collectors); - } - - protected static void initializeConfigMonitor(List collectors, - ApolloClientMetricsExporter metricsExporter) { - - DefaultConfigMonitor configMonitor = (DefaultConfigMonitor) ApolloInjector.getInstance( - ConfigMonitor.class); - configMonitor.init( - (DefaultApolloClientNamespaceApi) collectors.get(1), - (DefaultApolloClientThreadPoolApi) collectors.get(2), - (DefaultApolloClientExceptionApi) collectors.get(0), - (DefaultApolloClientBootstrapArgsApi) collectors.get(3), - metricsExporter - ); + ApolloClientMetricsExporter metricsReporter = exporterFactory.getMetricsReporter( + monitorContext.getCollectors()); + if(metricsReporter != null) { + monitorContext.setApolloClientMetricsExporter(metricsReporter); + } } public static ApolloClientMessageProducerComposite initializeMessageProducerComposite() { List producers = ServiceBootstrap.loadAllOrdered(MessageProducer.class); - if (CONFIG_UTIL.getClientMonitorEnabled()) { + if (m_configUtil.isClientMonitorEnabled()) { producers.add(new ApolloClientMonitorMessageProducer()); } @@ -139,11 +119,11 @@ public static ApolloClientMessageProducerComposite initializeMessageProducerComp return new ApolloClientMessageProducerComposite(producers); } - + // for test only protected static void reset() { hasInitialized = false; - CONFIG_UTIL = ApolloInjector.getInstance(ConfigUtil.class); + m_configUtil = ApolloInjector.getInstance(ConfigUtil.class); } } \ No newline at end of file diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/DefaultInjector.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/DefaultInjector.java index a4d0fca8..f561d278 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/DefaultInjector.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/DefaultInjector.java @@ -20,8 +20,7 @@ import com.ctrip.framework.apollo.monitor.api.ConfigMonitor; import com.ctrip.framework.apollo.monitor.internal.DefaultConfigMonitor; import com.ctrip.framework.apollo.monitor.internal.exporter.impl.DefaultApolloClientMetricsExporterFactory; -import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListenerManager; -import com.ctrip.framework.apollo.monitor.internal.listener.DefaultApolloClientMonitorEventListenerManager; +import com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorContext; import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporterFactory; import com.ctrip.framework.apollo.spi.ApolloInjectorCustomizer; import com.ctrip.framework.apollo.spi.ConfigFactory; @@ -113,8 +112,7 @@ protected void configure() { bind(YamlParser.class).in(Singleton.class); bind(PropertiesFactory.class).to(DefaultPropertiesFactory.class).in(Singleton.class); bind(ConfigMonitor.class).to(DefaultConfigMonitor.class).in(Singleton.class); - bind(ApolloClientMonitorEventListenerManager.class).to( - DefaultApolloClientMonitorEventListenerManager.class).in(Singleton.class); + bind(ApolloClientMonitorContext.class).in(Singleton.class); bind(ApolloClientMetricsExporterFactory.class).to(DefaultApolloClientMetricsExporterFactory.class).in(Singleton.class); } } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/RemoteConfigRepository.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/RemoteConfigRepository.java index be19f42e..dd4f63ee 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/RemoteConfigRepository.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/RemoteConfigRepository.java @@ -115,7 +115,7 @@ public Properties getConfig() { if (m_configCache.get() == null) { long start = System.currentTimeMillis(); this.sync(); - Tracer.logEvent(APOLLO_CLIENT_NAMESPACE_FIRST_LOAD_SPEND+m_namespace, + Tracer.logEvent(APOLLO_CLIENT_NAMESPACE_FIRST_LOAD_SPEND+":"+m_namespace, String.valueOf(System.currentTimeMillis() - start)); } return transformApolloConfigToProperties(m_configCache.get()); diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientBootstrapArgsMonitorApi.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientBootstrapArgsMonitorApi.java index 5b0e0adb..cd5c33cc 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientBootstrapArgsMonitorApi.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientBootstrapArgsMonitorApi.java @@ -16,6 +16,12 @@ */ package com.ctrip.framework.apollo.monitor.api; +import static com.ctrip.framework.apollo.core.ApolloClientSystemConsts.*; +import static com.ctrip.framework.apollo.core.ConfigConsts.APOLLO_AUTO_UPDATE_INJECTED_SPRING_PROPERTIES; +import static com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorConstant.*; +import static com.ctrip.framework.apollo.spring.config.PropertySourcesConstants.*; + +import java.util.Collections; import java.util.Map; /** @@ -23,66 +29,106 @@ */ public interface ApolloClientBootstrapArgsMonitorApi { - /** - * get bootstrap args map - */ - Map getBootstrapArgs(); - /** * get startup params by key */ - String getStartupParams(String key); - - /** - * config service url - */ - String getConfigServiceUrl(); + default Object getStartupArg(String key) { + return getBootstrapArgs().get(key); + } /** - * access key secret - */ - String getAccessKeySecret(); - - /** - * auto update injected spring properties + * get bootstrap args map */ - Boolean getAutoUpdateInjectedSpringProperties(); - - Boolean getBootstrapEnabled(); - - String getBootstrapNamespaces(); - - Boolean getBootstrapEagerLoadEnabled(); - - Boolean getOverrideSystemProperties(); - - String getCacheDir(); - - String getCluster(); - - String getConfigService(); - - Boolean getClientMonitorEnabled(); - - Boolean getClientMonitorJmxEnabled(); - - String getClientMonitorExternalForm(); - - long getClientMonitorExternalExportPeriod(); - - int getClientMonitorExceptionSaveSize(); - - String getApolloMeta(); - - String getMetaLatestFreshTime(); - - Boolean getPropertyNamesCacheEnable(); - - Boolean getPropertyOrderEnable(); - - String getVersion(); - - String getEnv(); - - String getAppId(); -} + default Map getBootstrapArgs() { + return Collections.emptyMap(); + } + + default String getConfigServiceUrl() { + return (String) getBootstrapArgs().getOrDefault(CONFIG_SERVICE_URL, ""); + } + + default String getAccessKeySecret() { + return (String) getBootstrapArgs().getOrDefault(APOLLO_ACCESS_KEY_SECRET, ""); + } + + default Boolean getAutoUpdateInjectedSpringProperties() { + return (Boolean) getBootstrapArgs().getOrDefault(APOLLO_AUTO_UPDATE_INJECTED_SPRING_PROPERTIES, + false); + } + + default Boolean isBootstrapEnabled() { + return (Boolean) getBootstrapArgs().getOrDefault(APOLLO_BOOTSTRAP_ENABLED, false); + } + + default String getBootstrapNamespaces() { + return (String) getBootstrapArgs().getOrDefault(APOLLO_BOOTSTRAP_NAMESPACES, ""); + } + + default Boolean isBootstrapEagerLoadEnabled() { + return (Boolean) getBootstrapArgs().getOrDefault(APOLLO_BOOTSTRAP_EAGER_LOAD_ENABLED, false); + } + + default Boolean isOverrideSystemProperties() { + return (Boolean) getBootstrapArgs().getOrDefault(APOLLO_OVERRIDE_SYSTEM_PROPERTIES, false); + } + + default String getCacheDir() { + return (String) getBootstrapArgs().getOrDefault(APOLLO_CACHE_DIR, ""); + } + + default String getCluster() { + return (String) getBootstrapArgs().getOrDefault(APOLLO_CLUSTER, ""); + } + + default String getConfigService() { + return (String) getBootstrapArgs().getOrDefault(APOLLO_CONFIG_SERVICE, ""); + } + + default String getClientMonitorExternalForm() { + return (String) getBootstrapArgs().getOrDefault(APOLLO_CLIENT_MONITOR_EXTERNAL_TYPE, ""); + } + + default Boolean isClientMonitorEnabled() { + return (Boolean) getBootstrapArgs().getOrDefault(APOLLO_CLIENT_MONITOR_ENABLED, false); + } + + default Boolean isClientMonitorJmxEnabled() { + return (Boolean) getBootstrapArgs().getOrDefault(APOLLO_CLIENT_MONITOR_JMX_ENABLED, false); + } + + default long getClientMonitorExternalExportPeriod() { + return (Long) getBootstrapArgs().getOrDefault(APOLLO_CLIENT_MONITOR_EXTERNAL_EXPORT_PERIOD, 0L); + } + + default int getClientMonitorExceptionSaveSize() { + return (Integer) getBootstrapArgs().getOrDefault(APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE, 0); + } + + default String getApolloMeta() { + return (String) getBootstrapArgs().getOrDefault(APOLLO_META, ""); + } + + default String getMetaLatestFreshTime() { + return (String) getBootstrapArgs().getOrDefault(META_FRESH, ""); + } + + default Boolean isPropertyNamesCacheEnable() { + return (Boolean) getBootstrapArgs().getOrDefault(APOLLO_PROPERTY_NAMES_CACHE_ENABLE, false); + } + + default Boolean isPropertyOrderEnable() { + return (Boolean) getBootstrapArgs().getOrDefault(APOLLO_PROPERTY_ORDER_ENABLE, false); + } + + default String getVersion() { + return (String) getBootstrapArgs().getOrDefault(VERSION, ""); + } + + default String getEnv() { + return (String) getBootstrapArgs().getOrDefault(ENV, ""); + } + + default String getAppId() { + return (String) getBootstrapArgs().getOrDefault(APP_ID, ""); + } +} \ No newline at end of file diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientExceptionMonitorApi.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientExceptionMonitorApi.java index 14b45d49..29d2b207 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientExceptionMonitorApi.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientExceptionMonitorApi.java @@ -24,8 +24,11 @@ public interface ApolloClientExceptionMonitorApi { /** - * get ApolloConfigException details + * Get exception information the number is limited and can be configured through + * apollo.client.monitor.exception-queue-size */ List getApolloConfigExceptionList(); + Integer getExceptionCountFromStartup(); + } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientNamespaceMonitorApi.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientNamespaceMonitorApi.java index 57d5efe6..78ac35f3 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientNamespaceMonitorApi.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientNamespaceMonitorApi.java @@ -16,7 +16,7 @@ */ package com.ctrip.framework.apollo.monitor.api; -import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientNamespaceApi.NamespaceMetrics; +import java.time.LocalDateTime; import java.util.List; import java.util.Map; @@ -31,14 +31,14 @@ public interface ApolloClientNamespaceMonitorApi { Map getNamespaceMetrics(); /** - * get Namespace Config.ItemsNum + * get Namespace Config.ItemsNum */ - Integer getNamespaceItemsNum(String namespace); + Integer getNamespacePropertySize(String namespace); /** - * get ConfigFile num + * get ConfigFile namespaces */ - Integer getConfigFileNum(); + List getConfigFileNamespaces(); /** * get not found namespaces @@ -51,4 +51,45 @@ public interface ApolloClientNamespaceMonitorApi { List getTimeoutNamespaces(); + class NamespaceMetrics { + + private int usageCount; + private long firstLoadTimeSpendInMs; + private LocalDateTime latestUpdateTime = LocalDateTime.now(); + private String releaseKey = ""; + + public String getReleaseKey() { + return releaseKey; + } + + public void setReleaseKey(String releaseKey) { + this.releaseKey = releaseKey; + } + + public int getUsageCount() { + return usageCount; + } + + public void incrementUsageCount() { + usageCount++; + } + + public long getFirstLoadTimeSpendInMs() { + return firstLoadTimeSpendInMs; + } + + public void setFirstLoadTimeSpendInMs(long firstLoadTimeSpendInMs) { + this.firstLoadTimeSpendInMs = firstLoadTimeSpendInMs; + } + + public LocalDateTime getLatestUpdateTime() { + return latestUpdateTime; + } + + public void setLatestUpdateTime(LocalDateTime latestUpdateTime) { + this.latestUpdateTime = latestUpdateTime; + } + } + + } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientThreadPoolMonitorApi.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientThreadPoolMonitorApi.java index db3315d7..d38555e4 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientThreadPoolMonitorApi.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/api/ApolloClientThreadPoolMonitorApi.java @@ -16,8 +16,8 @@ */ package com.ctrip.framework.apollo.monitor.api; -import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientThreadPoolApi.ApolloThreadPoolInfo; import java.util.Map; +import java.util.concurrent.ThreadPoolExecutor; /** * @author Rawven @@ -48,4 +48,55 @@ public interface ApolloClientThreadPoolMonitorApi { * AbstractApolloClientMetricsExporter.m_executorService */ ApolloThreadPoolInfo getMetricsExporterThreadPoolInfo(); + + + class ApolloThreadPoolInfo { + + private ThreadPoolExecutor executor; + + public ApolloThreadPoolInfo(ThreadPoolExecutor executor) { + this.executor = executor; + } + + public ApolloThreadPoolInfo() { + } + + + public int getActiveTaskCount() { + return executor != null ? executor.getActiveCount() : 0; + } + + public int getQueueSize() { + return executor != null ? executor.getQueue().size() : 0; + } + + public int getCorePoolSize() { + return executor != null ? executor.getCorePoolSize() : 0; + } + + public int getMaximumPoolSize() { + return executor != null ? executor.getMaximumPoolSize() : 0; + } + + public int getPoolSize() { + return executor != null ? executor.getPoolSize() : 0; + } + + public long getTotalTaskCount() { + return executor != null ? executor.getTaskCount() : 0; + } + + public long getCompletedTaskCount() { + return executor != null ? executor.getCompletedTaskCount() : 0; + } + + public int getLargestPoolSize() { + return executor != null ? executor.getLargestPoolSize() : 0; + } + + public int getQueueRemainingCapacity() { + return executor != null ? executor.getQueue().remainingCapacity() : 0; + } + + } } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorConstant.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorConstant.java index 4f615c7d..de9ea0c6 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorConstant.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorConstant.java @@ -24,12 +24,6 @@ */ public class ApolloClientMonitorConstant { - /** - * util - */ - public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern( - "yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()); - /** * common */ @@ -38,7 +32,6 @@ public class ApolloClientMonitorConstant { public static final String TIMESTAMP = "timestamp"; public static final String THROWABLE = "throwable"; public static final String NAMESPACE_RELEASE_KEY = "releaseKey"; - public static final String APOLLO_CLIENT = "apollo_client_"; public static final String ENV = "env"; public static final String VERSION = "version"; public static final String META_FRESH = "metaFreshTime"; @@ -53,13 +46,13 @@ public class ApolloClientMonitorConstant { public static final String APOLLO_CONFIG_SERVICES = "Apollo.Config.Services"; public static final String APOLLO_CLIENT_VERSION = "Apollo.Client.Version"; public static final String APOLLO_CONFIGSERVICE = "Apollo.ConfigService"; + public static final String APOLLO_CONFIGSERVICE_HELP_STR = "periodicRefresh: "; public static final String APOLLO_CLIENT_CONFIGS = "Apollo.Client.Configs."; public static final String APOLLO_CLIENT_CONFIGMETA = "Apollo.Client.ConfigMeta"; public static final String APOLLO_CLIENT_NAMESPACE_NOT_FOUND = "Apollo.Client.NamespaceNotFound"; public static final String APOLLO_CLIENT_NAMESPACE_TIMEOUT = "Apollo.Client.NamespaceTimeout"; public static final String APOLLO_CLIENT_NAMESPACE_USAGE = "Apollo.Client.NamespaceUsage"; public static final String APOLLO_CLIENT_NAMESPACE_FIRST_LOAD_SPEND = "Apollo.Client.NamespaceFirstLoadSpendTime"; - public static final String HELP_STR = "periodicRefresh: "; /** * collector tag @@ -72,22 +65,22 @@ public class ApolloClientMonitorConstant { /** * metrics */ - public static final String METRICS_NAMESPACE_LATEST_UPDATE_TIME = "namespace_latest_update_time"; - public static final String METRICS_NAMESPACE_ITEM_NUM = "namespace_item_num"; - public static final String METRICS_CONFIG_FILE_NUM = "config_file_num"; - public static final String METRICS_EXCEPTION_NUM = "exception_num"; - public static final String METRICS_NAMESPACE_FIRST_LOAD_SPEND = "namespace_first_load_spend"; - public static final String METRICS_NAMESPACE_USAGE = "namespace_usage"; - public static final String METRICS_NAMESPACE_NOT_FOUND = "namespace_not_found"; - public static final String METRICS_NAMESPACE_TIMEOUT = "namespace_timeout"; - public static final String METRICS_THREAD_POOL = "thread_pool_"; - public static final String[] METRICS_THREAD_POOL_PARAMS = new String[]{ - METRICS_THREAD_POOL + "name", - METRICS_THREAD_POOL + "active_task_count", METRICS_THREAD_POOL + "queue_size", - METRICS_THREAD_POOL + "completed_task_count", - METRICS_THREAD_POOL + "pool_size", METRICS_THREAD_POOL + "total_task_count", - METRICS_THREAD_POOL + "core_pool_size", METRICS_THREAD_POOL + "maximum_pool_size", - METRICS_THREAD_POOL + "largest_pool_size", - METRICS_THREAD_POOL + "queue_capacity", METRICS_THREAD_POOL + "queue_remaining_capacity", - METRICS_THREAD_POOL + "current_load"}; + public static final String METRICS_NAMESPACE_LATEST_UPDATE_TIME = "apollo_client_namespace_latest_update_time"; + public static final String METRICS_NAMESPACE_ITEM_NUM = "apollo_client_namespace_item_num"; + public static final String METRICS_CONFIG_FILE_NUM = "apollo_client_config_file_num"; + public static final String METRICS_EXCEPTION_NUM = "apollo_client_exception_num"; + public static final String METRICS_NAMESPACE_FIRST_LOAD_SPEND = "apollo_client_namespace_first_load_time_spend_in_ms"; + public static final String METRICS_NAMESPACE_USAGE = "apollo_client_namespace_usage"; + public static final String METRICS_NAMESPACE_NOT_FOUND = "apollo_client_namespace_not_found"; + public static final String METRICS_NAMESPACE_TIMEOUT = "apollo_client_namespace_timeout"; + public static final String METRICS_THREAD_POOL_NAME = "thread_pool_name"; + public static final String METRICS_THREAD_POOL_ACTIVE_TASK_COUNT = "apollo_client_thread_pool_active_task_count"; + public static final String METRICS_THREAD_POOL_QUEUE_SIZE = "apollo_client_thread_pool_queue_size"; + public static final String METRICS_THREAD_POOL_COMPLETED_TASK_COUNT = "apollo_client_thread_pool_completed_task_count"; + public static final String METRICS_THREAD_POOL_POOL_SIZE = "apollo_client_thread_pool_pool_size"; + public static final String METRICS_THREAD_POOL_TOTAL_TASK_COUNT = "apollo_client_thread_pool_total_task_count"; + public static final String METRICS_THREAD_POOL_CORE_POOL_SIZE = "apollo_client_thread_pool_core_pool_size"; + public static final String METRICS_THREAD_POOL_MAXIMUM_POOL_SIZE = "apollo_client_thread_pool_maximum_pool_size"; + public static final String METRICS_THREAD_POOL_LARGEST_POOL_SIZE = "apollo_client_thread_pool_largest_pool_size"; + public static final String METRICS_THREAD_POOL_QUEUE_REMAINING_CAPACITY = "apollo_client_thread_pool_queue_remaining_capacity"; } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorContext.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorContext.java new file mode 100644 index 00000000..a036a2a2 --- /dev/null +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorContext.java @@ -0,0 +1,96 @@ +/* + * Copyright 2022 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.monitor.internal; + +import com.ctrip.framework.apollo.monitor.api.ApolloClientBootstrapArgsMonitorApi; +import com.ctrip.framework.apollo.monitor.api.ApolloClientExceptionMonitorApi; +import com.ctrip.framework.apollo.monitor.api.ApolloClientNamespaceMonitorApi; +import com.ctrip.framework.apollo.monitor.api.ApolloClientThreadPoolMonitorApi; +import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporter; +import com.ctrip.framework.apollo.monitor.internal.exporter.impl.NullApolloClientMetricsExporter; +import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListener; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientBootstrapArgsMonitorApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientExceptionMonitorApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientNamespaceMonitorApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientThreadPoolMonitorApi; +import com.google.common.collect.Lists; +import java.util.List; + +/** + * @author Rawven + */ +public class ApolloClientMonitorContext { + + private ApolloClientExceptionMonitorApi apolloClientExceptionMonitorApi = new NullClientExceptionMonitorApi(); + private ApolloClientNamespaceMonitorApi apolloClientNamespaceMonitorApi = new NullClientNamespaceMonitorApi(); + private ApolloClientBootstrapArgsMonitorApi apolloClientBootstrapArgsMonitorApi = new NullClientBootstrapArgsMonitorApi(); + private ApolloClientThreadPoolMonitorApi apolloClientThreadPoolMonitorApi = new NullClientThreadPoolMonitorApi(); + private ApolloClientMetricsExporter apolloClientMetricsExporter = new NullApolloClientMetricsExporter(); + + public void setApolloClientExceptionMonitorApi( + ApolloClientExceptionMonitorApi apolloClientExceptionMonitorApi) { + this.apolloClientExceptionMonitorApi = apolloClientExceptionMonitorApi; + } + + public void setApolloClientNamespaceMonitorApi( + ApolloClientNamespaceMonitorApi apolloClientNamespaceMonitorApi) { + this.apolloClientNamespaceMonitorApi = apolloClientNamespaceMonitorApi; + } + + public void setApolloClientBootstrapArgsMonitorApi( + ApolloClientBootstrapArgsMonitorApi apolloClientBootstrapArgsMonitorApi) { + this.apolloClientBootstrapArgsMonitorApi = apolloClientBootstrapArgsMonitorApi; + } + + public void setApolloClientThreadPoolMonitorApi( + ApolloClientThreadPoolMonitorApi apolloClientThreadPoolMonitorApi) { + this.apolloClientThreadPoolMonitorApi = apolloClientThreadPoolMonitorApi; + } + + public void setApolloClientMetricsExporter( + ApolloClientMetricsExporter apolloClientMetricsExporter) { + this.apolloClientMetricsExporter = apolloClientMetricsExporter; + } + + public List getCollectors() { + return Lists.newArrayList( + (ApolloClientMonitorEventListener) apolloClientBootstrapArgsMonitorApi, + (ApolloClientMonitorEventListener) apolloClientThreadPoolMonitorApi, + (ApolloClientMonitorEventListener) apolloClientExceptionMonitorApi, + (ApolloClientMonitorEventListener) apolloClientNamespaceMonitorApi); + } + + public ApolloClientExceptionMonitorApi getExceptionApi() { + return apolloClientExceptionMonitorApi; + } + + public ApolloClientNamespaceMonitorApi getNamespaceApi() { + return apolloClientNamespaceMonitorApi; + } + + public ApolloClientBootstrapArgsMonitorApi getBootstrapArgsApi() { + return apolloClientBootstrapArgsMonitorApi; + } + + public ApolloClientThreadPoolMonitorApi getThreadPoolApi() { + return apolloClientThreadPoolMonitorApi; + } + + public ApolloClientMetricsExporter getMetricsExporter() { + return apolloClientMetricsExporter; + } +} diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/DefaultConfigMonitor.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/DefaultConfigMonitor.java index c296496d..4925f408 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/DefaultConfigMonitor.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/DefaultConfigMonitor.java @@ -16,17 +16,12 @@ */ package com.ctrip.framework.apollo.monitor.internal; +import com.ctrip.framework.apollo.build.ApolloInjector; import com.ctrip.framework.apollo.monitor.api.ApolloClientBootstrapArgsMonitorApi; import com.ctrip.framework.apollo.monitor.api.ApolloClientExceptionMonitorApi; import com.ctrip.framework.apollo.monitor.api.ApolloClientNamespaceMonitorApi; import com.ctrip.framework.apollo.monitor.api.ApolloClientThreadPoolMonitorApi; import com.ctrip.framework.apollo.monitor.api.ConfigMonitor; -import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientBootstrapArgsMonitorApi; -import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientExceptionMonitorApi; -import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientNamespaceMonitorApi; -import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientThreadPoolMonitorApi; -import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporter; -import com.ctrip.framework.apollo.monitor.internal.exporter.impl.NullApolloClientMetricsExporter; /** * exposes all collected data through ConfigService @@ -35,46 +30,31 @@ */ public class DefaultConfigMonitor implements ConfigMonitor { - private ApolloClientMetricsExporter reporter = new NullApolloClientMetricsExporter(); - private ApolloClientThreadPoolMonitorApi threadPoolMonitorApi = new NullClientThreadPoolMonitorApi(); - private ApolloClientExceptionMonitorApi exceptionMonitorApi = new NullClientExceptionMonitorApi(); - private ApolloClientNamespaceMonitorApi apolloClientNamespaceMonitorApi = new NullClientNamespaceMonitorApi(); - private ApolloClientBootstrapArgsMonitorApi apolloClientBootstrapArgsMonitorApi = new NullClientBootstrapArgsMonitorApi(); + private ApolloClientMonitorContext apolloClientMonitorContext = ApolloInjector.getInstance( + ApolloClientMonitorContext.class); @Override public ApolloClientThreadPoolMonitorApi getThreadPoolMonitorApi() { - return threadPoolMonitorApi; + return apolloClientMonitorContext.getThreadPoolApi(); } @Override public ApolloClientExceptionMonitorApi getExceptionMonitorApi() { - return exceptionMonitorApi; + return apolloClientMonitorContext.getExceptionApi(); } @Override public ApolloClientNamespaceMonitorApi getNamespaceMonitorApi() { - return apolloClientNamespaceMonitorApi; + return apolloClientMonitorContext.getNamespaceApi(); } @Override public ApolloClientBootstrapArgsMonitorApi getRunningParamsMonitorApi() { - return apolloClientBootstrapArgsMonitorApi; + return apolloClientMonitorContext.getBootstrapArgsApi(); } @Override public String getExporterData() { - return reporter.response(); - } - - public void init(ApolloClientNamespaceMonitorApi apolloClientNamespaceMonitorApi, - ApolloClientThreadPoolMonitorApi threadPoolMonitorApi, - ApolloClientExceptionMonitorApi exceptionMonitorApi, - ApolloClientBootstrapArgsMonitorApi apolloClientBootstrapArgsMonitorApi, - ApolloClientMetricsExporter reporter) { - this.apolloClientNamespaceMonitorApi = apolloClientNamespaceMonitorApi; - this.threadPoolMonitorApi = threadPoolMonitorApi; - this.exceptionMonitorApi = exceptionMonitorApi; - this.apolloClientBootstrapArgsMonitorApi = apolloClientBootstrapArgsMonitorApi; - this.reporter = reporter; + return apolloClientMonitorContext.getMetricsExporter().response(); } } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/enums/MeterEnums.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/enums/MetricTypeEnums.java similarity index 96% rename from apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/enums/MeterEnums.java rename to apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/enums/MetricTypeEnums.java index 1009d3ed..c4c73440 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/enums/MeterEnums.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/enums/MetricTypeEnums.java @@ -19,7 +19,7 @@ /** * @author Rawven */ -public enum MeterEnums { +public enum MetricTypeEnums { /** * counter */ diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEvent.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEvent.java index 91c6eb4b..e7b4f077 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEvent.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEvent.java @@ -16,6 +16,7 @@ */ package com.ctrip.framework.apollo.monitor.internal.event; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -31,7 +32,7 @@ public class ApolloClientMonitorEvent { public ApolloClientMonitorEvent(String name, String tag, Map attachments) { this.name = name; this.tag = tag; - this.attachments = attachments != null ? new HashMap<>(attachments) : new HashMap<>(); + this.attachments = attachments != null ? new HashMap<>(attachments) : Collections.emptyMap(); } public ApolloClientMonitorEvent withTag(String tag) { @@ -65,10 +66,4 @@ public T getAttachmentValue(String key) { throw new IllegalArgumentException("Value for key " + key + " is not of expected type", e); } } - - - public void publish() { - ApolloClientMonitorEventPublisher.publish(this); - } - } \ No newline at end of file diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEventPublisher.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEventPublisher.java index 7388b888..e6843a72 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEventPublisher.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEventPublisher.java @@ -18,7 +18,7 @@ import com.ctrip.framework.apollo.build.ApolloInjector; import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListener; -import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListenerManager; +import com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorContext; import com.ctrip.framework.apollo.util.ConfigUtil; /** @@ -26,14 +26,14 @@ */ public class ApolloClientMonitorEventPublisher { - private static ApolloClientMonitorEventListenerManager COLLECTOR_MANAGER = ApolloInjector.getInstance( - ApolloClientMonitorEventListenerManager.class); + private static ApolloClientMonitorContext COLLECTOR_MANAGER = ApolloInjector.getInstance( + ApolloClientMonitorContext.class); private static ConfigUtil m_configUtil = ApolloInjector.getInstance(ConfigUtil.class); public static void publish(ApolloClientMonitorEvent event) { - if (m_configUtil.getClientMonitorEnabled()) { + if (m_configUtil.isClientMonitorEnabled()) { for (ApolloClientMonitorEventListener collector : COLLECTOR_MANAGER.getCollectors()) { - if (collector.isSupport(event)) { + if (collector.isSupported(event)) { collector.collect(event); return; } @@ -43,7 +43,7 @@ public static void publish(ApolloClientMonitorEvent event) { protected static void reset() { COLLECTOR_MANAGER = ApolloInjector.getInstance( - ApolloClientMonitorEventListenerManager.class); + ApolloClientMonitorContext.class); m_configUtil = ApolloInjector.getInstance(ConfigUtil.class); } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/AbstractApolloClientMetricsExporter.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/AbstractApolloClientMetricsExporter.java index c85625ce..50550ad5 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/AbstractApolloClientMetricsExporter.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/AbstractApolloClientMetricsExporter.java @@ -33,15 +33,15 @@ */ public abstract class AbstractApolloClientMetricsExporter implements ApolloClientMetricsExporter { + public static final ScheduledExecutorService m_executorService; private static final Logger log = DeferredLoggerFactory.getLogger( AbstractApolloClientMetricsExporter.class); - public static final ScheduledExecutorService m_executorService; private static final long INITIAL_DELAY = 5L; private static final int THREAD_POOL_SIZE = 1; static { m_executorService = Executors.newScheduledThreadPool(THREAD_POOL_SIZE, - ApolloThreadFactory.create("MetricsReporter", true)); + ApolloThreadFactory.create(ApolloClientMetricsExporter.class.getName(), true)); } protected List collectors; @@ -75,7 +75,7 @@ protected void updateMetricsData() { log.debug("Start to update metrics data job"); collectors.forEach(collector -> { if (collector.isMetricsSampleUpdated()) { - log.debug("Collector {} has updated samples.", collector.mBeanName()); + log.debug("Collector {} has updated samples.", collector.getName()); collector.export().forEach(this::registerSample); } }); diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/DefaultApolloClientMetricsExporterFactory.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/DefaultApolloClientMetricsExporterFactory.java index 3476a0c5..a9a280e9 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/DefaultApolloClientMetricsExporterFactory.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/DefaultApolloClientMetricsExporterFactory.java @@ -16,15 +16,12 @@ */ package com.ctrip.framework.apollo.monitor.internal.exporter.impl; -import static com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorConstant.MBEAN_NAME; - import com.ctrip.framework.apollo.build.ApolloInjector; import com.ctrip.framework.apollo.core.utils.DeferredLoggerFactory; import com.ctrip.framework.apollo.exceptions.ApolloConfigException; import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListener; import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporter; import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporterFactory; -import com.ctrip.framework.apollo.monitor.internal.jmx.ApolloClientJmxMBeanRegister; import com.ctrip.framework.apollo.tracer.Tracer; import com.ctrip.framework.apollo.util.ConfigUtil; import com.ctrip.framework.foundation.internals.ServiceBootstrap; diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/NullApolloClientMetricsExporter.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/NullApolloClientMetricsExporter.java index 6c3214ef..237f024f 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/NullApolloClientMetricsExporter.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/NullApolloClientMetricsExporter.java @@ -16,16 +16,22 @@ */ package com.ctrip.framework.apollo.monitor.internal.exporter.impl; +import com.ctrip.framework.apollo.core.utils.DeferredLoggerFactory; +import com.ctrip.framework.apollo.monitor.internal.exporter.AbstractApolloClientMetricsExporter; import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListener; import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporter; import java.util.List; import java.util.Map; +import org.slf4j.Logger; /** * @author Rawven */ public class NullApolloClientMetricsExporter implements ApolloClientMetricsExporter { + private static final Logger log = DeferredLoggerFactory.getLogger( + AbstractApolloClientMetricsExporter.class); + @Override public void init(List collectors, long collectPeriod) { } @@ -48,6 +54,7 @@ public void registerOrUpdateGaugeSample(String name, Map tag, do @Override public String response() { - return "No Reporter Use"; + log.warn("No metrics exporter found, response empty string"); + return ""; } } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/jmx/mbean/ApolloClientJmxBootstrapArgsMBean.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/jmx/mbean/ApolloClientJmxBootstrapArgsMBean.java index 024cbd8c..d00597b5 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/jmx/mbean/ApolloClientJmxBootstrapArgsMBean.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/jmx/mbean/ApolloClientJmxBootstrapArgsMBean.java @@ -16,13 +16,20 @@ */ package com.ctrip.framework.apollo.monitor.internal.jmx.mbean; -import com.ctrip.framework.apollo.monitor.api.ApolloClientBootstrapArgsMonitorApi; +import java.util.Map; import javax.management.MXBean; /** * @author Rawven */ @MXBean -public interface ApolloClientJmxBootstrapArgsMBean extends ApolloClientBootstrapArgsMonitorApi { +public interface ApolloClientJmxBootstrapArgsMBean { + // Because JMX does not support all type return values + // declare the interface separately. + + /** + * get bootstrap args map + */ + Map getBootstrapArgsString(); } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/jmx/mbean/ApolloClientJmxExceptionMBean.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/jmx/mbean/ApolloClientJmxExceptionMBean.java index 016c5451..076b8639 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/jmx/mbean/ApolloClientJmxExceptionMBean.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/jmx/mbean/ApolloClientJmxExceptionMBean.java @@ -24,11 +24,13 @@ */ @MXBean public interface ApolloClientJmxExceptionMBean { - // Because JMX does not support Exception type return values + // Because JMX does not support all type return values // declare the interface separately. /** * get exception details */ List getApolloConfigExceptionDetails(); + + Integer getExceptionCountFromStartup(); } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/jmx/mbean/ApolloClientJmxNamespaceMBean.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/jmx/mbean/ApolloClientJmxNamespaceMBean.java index 569a6a2a..1290344a 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/jmx/mbean/ApolloClientJmxNamespaceMBean.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/jmx/mbean/ApolloClientJmxNamespaceMBean.java @@ -16,13 +16,82 @@ */ package com.ctrip.framework.apollo.monitor.internal.jmx.mbean; -import com.ctrip.framework.apollo.monitor.api.ApolloClientNamespaceMonitorApi; +import java.util.List; +import java.util.Map; import javax.management.MXBean; /** * @author Rawven */ @MXBean -public interface ApolloClientJmxNamespaceMBean extends ApolloClientNamespaceMonitorApi { +public interface ApolloClientJmxNamespaceMBean { + // Because JMX does not support all type return values + // declare the interface separately. + + /** + * NamespaceMetrics: 1.usageCount 2.firstLoadSpend 3.latestUpdateTime 4.releaseKey + */ + Map getNamespaceMetricsString(); + + /** + * get Namespace Config.ItemsNum + */ + Integer getNamespacePropertySize(String namespace); + + /** + * get ConfigFile namespaces + */ + List getConfigFileNamespaces(); + + /** + * get not found namespaces + */ + List getNotFoundNamespaces(); + + /** + * get timeout namespaces + */ + List getTimeoutNamespaces(); + + + class NamespaceMetricsString { + + private int usageCount; + private long firstLoadTimeSpendInMs; + private String latestUpdateTime; + private String releaseKey = ""; + + public int getUsageCount() { + return usageCount; + } + + public void setUsageCount(int usageCount) { + this.usageCount = usageCount; + } + + public long getFirstLoadTimeSpendInMs() { + return firstLoadTimeSpendInMs; + } + + public void setFirstLoadTimeSpendInMs(long firstLoadTimeSpendInMs) { + this.firstLoadTimeSpendInMs = firstLoadTimeSpendInMs; + } + + public String getLatestUpdateTime() { + return latestUpdateTime; + } + + public void setLatestUpdateTime(String latestUpdateTime) { + this.latestUpdateTime = latestUpdateTime; + } + + public String getReleaseKey() { + return releaseKey; + } + + public void setReleaseKey(String releaseKey) { + this.releaseKey = releaseKey; + } + } } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/AbstractApolloClientMonitorEventListener.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/AbstractApolloClientMonitorEventListener.java index bffb55ed..847410f7 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/AbstractApolloClientMonitorEventListener.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/AbstractApolloClientMonitorEventListener.java @@ -22,13 +22,13 @@ import com.ctrip.framework.apollo.monitor.internal.model.SampleModel; import com.google.common.collect.Maps; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; /** - * 抽象的 Metrics 收集器 用于收集数据和导出指标样本 - * * @author Rawven */ public abstract class AbstractApolloClientMonitorEventListener implements @@ -44,12 +44,12 @@ public AbstractApolloClientMonitorEventListener(String tag) { } @Override - public String mBeanName() { + public String getName() { return tag; } @Override - public boolean isSupport(ApolloClientMonitorEvent event) { + public boolean isSupported(ApolloClientMonitorEvent event) { return tag.equals(event.getTag()); } @@ -71,42 +71,67 @@ public List export() { samples.addAll(gaugeSamples.values()); return samples; } - + /** * Specific collection logic */ - protected void collect0(ApolloClientMonitorEvent event){} + protected void collect0(ApolloClientMonitorEvent event) { + } /** * Convenient for indicators that can only be obtained from the status object */ - protected void export0(){} - + protected void export0() { + } /** * tool method for updating indicator model */ - public void createOrUpdateGaugeSample(String mapKey, String metricsName, Map tags, + public void createOrUpdateGaugeSample(String metricsName, String[] tagKeys, String[] tagValues, double value) { - if (!gaugeSamples.containsKey(mapKey)) { - GaugeModel builder = (GaugeModel) GaugeModel.create(metricsName, 0).putTags(tags); - gaugeSamples.put(mapKey, builder); - } - gaugeSamples.get(mapKey).setValue(value); + createOrUpdateSample(metricsName, tagKeys, tagValues, value, false); } - /** - * tool method for updating indicator model - */ - public void createOrUpdateCounterSample(String mapKey, String metricsName, - Map tags, + public void createOrUpdateGaugeSample(String metricsName, double value) { + createOrUpdateSample(metricsName, null, null, value, false); + } + + public void createOrUpdateCounterSample(String metricsName, String[] tagKeys, String[] tagValues, double increaseValue) { - if (!counterSamples.containsKey(mapKey)) { - CounterModel builder = (CounterModel) CounterModel.create(metricsName, 0).putTags(tags); - counterSamples.put(mapKey, builder); + createOrUpdateSample(metricsName, tagKeys, tagValues, increaseValue, true); + } + + public void createOrUpdateCounterSample(String metricsName, double increaseValue) { + createOrUpdateSample(metricsName, null, null, increaseValue, true); + } + + private void createOrUpdateSample(String metricsName, String[] tagKeys, String[] tagValues, + double value, boolean isCounter) { + String mapKey = metricsName + (tagValues != null ? Arrays.toString(tagValues) : ""); + + if (isCounter) { + CounterModel counter = counterSamples.computeIfAbsent(mapKey, + key -> (CounterModel) CounterModel.create(metricsName, 0) + .putTags(getTags(tagKeys, tagValues))); + counter.increase(value); + } else { + GaugeModel gauge = gaugeSamples.computeIfAbsent(mapKey, + key -> (GaugeModel) GaugeModel.create(metricsName, 0) + .putTags(getTags(tagKeys, tagValues))); + gauge.setValue(value); + } + } + + private Map getTags(String[] tagKeys, String[] tagValues) { + if (tagKeys != null && tagValues != null && tagKeys.length == tagValues.length) { + Map tags = Maps.newHashMap(); + for (int i = 0; i < tagKeys.length; i++) { + tags.put(tagKeys[i], tagValues[i]); + } + return tags; } - counterSamples.get(mapKey).increase(increaseValue); + return Collections.emptyMap(); } } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/ApolloClientMonitorEventListener.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/ApolloClientMonitorEventListener.java index 000fd480..d808d24d 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/ApolloClientMonitorEventListener.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/ApolloClientMonitorEventListener.java @@ -29,12 +29,12 @@ public interface ApolloClientMonitorEventListener { /** * mbean name */ - String mBeanName(); + String getName(); /** * is support the event */ - boolean isSupport(ApolloClientMonitorEvent event); + boolean isSupported(ApolloClientMonitorEvent event); /** * collect metrics from event diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/ApolloClientMonitorEventListenerManager.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/ApolloClientMonitorEventListenerManager.java deleted file mode 100644 index 4b72834b..00000000 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/ApolloClientMonitorEventListenerManager.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2022 Apollo Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.ctrip.framework.apollo.monitor.internal.listener; - -import com.ctrip.framework.apollo.core.spi.Ordered; -import java.util.List; - -/** - * @author Rawven - */ -public interface ApolloClientMonitorEventListenerManager extends Ordered { - - /** - * get collectors - */ - List getCollectors(); - - @Override - default int getOrder() { - return 0; - } -} diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/DefaultApolloClientMonitorEventListenerManager.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/DefaultApolloClientMonitorEventListenerManager.java deleted file mode 100644 index 8cc0444f..00000000 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/DefaultApolloClientMonitorEventListenerManager.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2022 Apollo Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.ctrip.framework.apollo.monitor.internal.listener; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Rawven - */ -public class DefaultApolloClientMonitorEventListenerManager implements - ApolloClientMonitorEventListenerManager { - - private List collectors = new ArrayList<>(); - - public DefaultApolloClientMonitorEventListenerManager() { - } - - @Override - public List getCollectors() { - return collectors; - } - - public void setCollectors(List collectors) { - this.collectors.clear(); - this.collectors.addAll(collectors); - } - -} diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientBootstrapArgsApi.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientBootstrapArgsApi.java index b1fd2256..19ca9b30 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientBootstrapArgsApi.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientBootstrapArgsApi.java @@ -30,7 +30,6 @@ import com.ctrip.framework.apollo.util.ConfigUtil; import com.google.common.collect.Maps; import java.util.Map; -import java.util.Optional; import org.slf4j.Logger; /** @@ -62,13 +61,13 @@ public DefaultApolloClientBootstrapArgsApi(ConfigUtil configUtil) { bootstrapArgs.put(APOLLO_CONFIG_SERVICE, System.getProperty(APOLLO_CONFIG_SERVICE)); bootstrapArgs.put(APOLLO_CLIENT_MONITOR_EXTERNAL_TYPE, configUtil.getMonitorExternalType()); - bootstrapArgs.put(APOLLO_CLIENT_MONITOR_ENABLED, configUtil.getClientMonitorEnabled()); + bootstrapArgs.put(APOLLO_CLIENT_MONITOR_ENABLED, configUtil.isClientMonitorEnabled()); bootstrapArgs.put(APOLLO_CLIENT_MONITOR_EXTERNAL_EXPORT_PERIOD, configUtil.getMonitorExternalExportPeriod()); bootstrapArgs.put(APOLLO_META, configUtil.getMetaServerDomainName()); bootstrapArgs.put(APOLLO_PROPERTY_NAMES_CACHE_ENABLE, configUtil.isPropertyNamesCacheEnabled()); bootstrapArgs.put(APOLLO_PROPERTY_ORDER_ENABLE, configUtil.isPropertiesOrderEnabled()); - bootstrapArgs.put(APOLLO_CLIENT_MONITOR_JMX_ENABLED, configUtil.getClientMonitorJmxEnabled()); + bootstrapArgs.put(APOLLO_CLIENT_MONITOR_JMX_ENABLED, configUtil.isClientMonitorJmxEnabled()); bootstrapArgs.put(APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE, configUtil.getMonitorExceptionQueueSize()); bootstrapArgs.put(APP_ID, configUtil.getAppId()); @@ -98,123 +97,12 @@ public boolean isMetricsSampleUpdated() { } @Override - public String getStartupParams(String key) { - return Optional.ofNullable(bootstrapArgs.get(key)).orElse("").toString(); + public Map getBootstrapArgs() { + return bootstrapArgs; } @Override - public String getConfigServiceUrl() { - return bootstrapArgs.get(CONFIG_SERVICE_URL).toString(); - } - - - @Override - public String getAccessKeySecret() { - return bootstrapArgs.getOrDefault(APOLLO_ACCESS_KEY_SECRET, "").toString(); - } - - @Override - public Boolean getAutoUpdateInjectedSpringProperties() { - return (Boolean) bootstrapArgs.get(APOLLO_AUTO_UPDATE_INJECTED_SPRING_PROPERTIES); - } - - @Override - public Boolean getBootstrapEnabled() { - return (Boolean) bootstrapArgs.get(APOLLO_BOOTSTRAP_ENABLED); - } - - @Override - public String getBootstrapNamespaces() { - return (String) bootstrapArgs.get(APOLLO_BOOTSTRAP_NAMESPACES); - } - - @Override - public Boolean getBootstrapEagerLoadEnabled() { - return (Boolean) bootstrapArgs.get(APOLLO_BOOTSTRAP_EAGER_LOAD_ENABLED); - } - - @Override - public Boolean getOverrideSystemProperties() { - return (Boolean) bootstrapArgs.get(APOLLO_OVERRIDE_SYSTEM_PROPERTIES); - } - - @Override - public String getCacheDir() { - return bootstrapArgs.get(APOLLO_CACHE_DIR).toString(); - } - - @Override - public String getCluster() { - return bootstrapArgs.get(APOLLO_CLUSTER).toString(); - } - - @Override - public String getConfigService() { - return bootstrapArgs.get(APOLLO_CONFIG_SERVICE).toString(); - } - - @Override - public String getClientMonitorExternalForm() { - return bootstrapArgs.get(APOLLO_CLIENT_MONITOR_EXTERNAL_TYPE).toString(); - } - - @Override - public Boolean getClientMonitorEnabled() { - return (Boolean) bootstrapArgs.get(APOLLO_CLIENT_MONITOR_ENABLED); - } - - @Override - public Boolean getClientMonitorJmxEnabled() { - return (Boolean) bootstrapArgs.get(APOLLO_CLIENT_MONITOR_JMX_ENABLED); - } - - @Override - public long getClientMonitorExternalExportPeriod() { - return (Long) bootstrapArgs.get(APOLLO_CLIENT_MONITOR_EXTERNAL_EXPORT_PERIOD); - } - - @Override - public int getClientMonitorExceptionSaveSize() { - return (int) bootstrapArgs.get(APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE); - } - - @Override - public String getApolloMeta() { - return bootstrapArgs.get(APOLLO_META).toString(); - } - - @Override - public Boolean getPropertyNamesCacheEnable() { - return (Boolean) bootstrapArgs.get(APOLLO_PROPERTY_NAMES_CACHE_ENABLE); - } - - @Override - public Boolean getPropertyOrderEnable() { - return (Boolean) bootstrapArgs.get(APOLLO_PROPERTY_ORDER_ENABLE); - } - - @Override - public String getMetaLatestFreshTime() { - return bootstrapArgs.get(META_FRESH).toString(); - } - - @Override - public String getVersion() { - return bootstrapArgs.get(VERSION).toString(); - } - - @Override - public String getEnv() { - return bootstrapArgs.get(ENV).toString(); - } - - @Override - public String getAppId() { - return bootstrapArgs.get(APP_ID).toString(); - } - - @Override - public Map getBootstrapArgs() { + public Map getBootstrapArgsString() { return bootstrapArgsString; } } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientExceptionApi.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientExceptionApi.java index f39f6ba0..c7897c1c 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientExceptionApi.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientExceptionApi.java @@ -27,11 +27,11 @@ import com.ctrip.framework.apollo.monitor.internal.listener.AbstractApolloClientMonitorEventListener; import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEvent; import com.ctrip.framework.apollo.util.ConfigUtil; +import com.google.common.collect.EvictingQueue; +import com.google.common.collect.Queues; import java.util.ArrayList; -import java.util.Collections; import java.util.List; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; +import java.util.Queue; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; @@ -42,48 +42,41 @@ public class DefaultApolloClientExceptionApi extends AbstractApolloClientMonitorEventListener implements ApolloClientExceptionMonitorApi, ApolloClientJmxExceptionMBean { - private final AtomicInteger exceptionNum = new AtomicInteger(0); - private int monitorExceptionQueueSize; - private final BlockingQueue exceptions; + private final AtomicInteger exceptionCountFromStartup = new AtomicInteger(0); + private final Queue exceptionsQueue; public DefaultApolloClientExceptionApi() { super(TAG_ERROR); - monitorExceptionQueueSize = ApolloInjector.getInstance(ConfigUtil.class) + int monitorExceptionQueueSize = ApolloInjector.getInstance(ConfigUtil.class) .getMonitorExceptionQueueSize(); - if (monitorExceptionQueueSize <= 0) { - monitorExceptionQueueSize = 25; - } - exceptions = new ArrayBlockingQueue<>( + EvictingQueue evictingQueue = EvictingQueue.create( monitorExceptionQueueSize); + exceptionsQueue = Queues.synchronizedQueue(evictingQueue); } @Override public List getApolloConfigExceptionList() { - return new ArrayList<>(exceptions); + return new ArrayList<>(exceptionsQueue); + } + + @Override + public Integer getExceptionCountFromStartup() { + return exceptionCountFromStartup.get(); } @Override public void collect0(ApolloClientMonitorEvent event) { ApolloConfigException exception = event.getAttachmentValue(THROWABLE); if (exception != null) { - addExceptionToQueue(exception); - exceptionNum.incrementAndGet(); - createOrUpdateCounterSample(METRICS_EXCEPTION_NUM, METRICS_EXCEPTION_NUM, - Collections.emptyMap(), - 1); - } - } - - private void addExceptionToQueue(ApolloConfigException exception) { - if (exceptions.size() >= monitorExceptionQueueSize) { - exceptions.poll(); + exceptionsQueue.add(exception); + exceptionCountFromStartup.incrementAndGet(); + createOrUpdateCounterSample(METRICS_EXCEPTION_NUM, 1); } - exceptions.add(exception); } @Override public List getApolloConfigExceptionDetails() { - return exceptions.stream() + return exceptionsQueue.stream() .map(ApolloConfigException::getMessage) .collect(Collectors.toList()); } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientNamespaceApi.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientNamespaceApi.java index 3fc072ed..a28ee09f 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientNamespaceApi.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientNamespaceApi.java @@ -29,6 +29,7 @@ import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEvent; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -77,14 +78,6 @@ public void collect0(ApolloClientMonitorEvent event) { } } - private void handleNamespaceNotFound(String namespace) { - namespace404.add(namespace); - } - - private void handleNamespaceTimeout(String namespace) { - namespaceTimeout.add(namespace); - } - private void handleNormalNamespace(String namespace, ApolloClientMonitorEvent event) { namespace404.remove(namespace); namespaceTimeout.remove(namespace); @@ -115,23 +108,30 @@ private void collectMetrics(ApolloClientMonitorEvent event, NamespaceMetrics nam } } + private void handleNamespaceNotFound(String namespace) { + namespace404.add(namespace); + } + + private void handleNamespaceTimeout(String namespace) { + namespaceTimeout.add(namespace); + } + + private void handleUsageEvent(NamespaceMetrics namespaceMetrics, String namespace) { namespaceMetrics.incrementUsageCount(); - String mapKey = namespace + ApolloClientMonitorConstant.METRICS_NAMESPACE_USAGE; - createOrUpdateCounterSample(mapKey, ApolloClientMonitorConstant.METRICS_NAMESPACE_USAGE, - Collections.singletonMap(NAMESPACE, namespace), 1); + createOrUpdateCounterSample(ApolloClientMonitorConstant.METRICS_NAMESPACE_USAGE, + new String[]{NAMESPACE}, new String[]{namespace}, 1); } private void handleUpdateTimeEvent(ApolloClientMonitorEvent event, NamespaceMetrics namespaceMetrics) { - long updateTime = event.getAttachmentValue(ApolloClientMonitorConstant.TIMESTAMP); - namespaceMetrics.setLatestUpdateTime(updateTime); + namespaceMetrics.setLatestUpdateTime(LocalDateTime.now()); } private void handleFirstLoadSpendEvent(ApolloClientMonitorEvent event, NamespaceMetrics namespaceMetrics) { long firstLoadSpendTime = event.getAttachmentValue(ApolloClientMonitorConstant.TIMESTAMP); - namespaceMetrics.setFirstLoadSpend(firstLoadSpendTime); + namespaceMetrics.setFirstLoadTimeSpendInMs(firstLoadSpendTime); } private void handleReleaseKeyEvent(ApolloClientMonitorEvent event, @@ -144,32 +144,26 @@ private void handleReleaseKeyEvent(ApolloClientMonitorEvent event, public void export0() { namespaces.forEach((namespace, metrics) -> { // update NamespaceMetrics - createOrUpdateGaugeSample(namespace + METRICS_NAMESPACE_FIRST_LOAD_SPEND, + createOrUpdateGaugeSample( METRICS_NAMESPACE_FIRST_LOAD_SPEND, - Collections.singletonMap(NAMESPACE, namespace), - metrics.getFirstLoadSpend()); + new String[]{NAMESPACE}, new String[]{namespace}, + metrics.getFirstLoadTimeSpendInMs()); - createOrUpdateGaugeSample(namespace + METRICS_NAMESPACE_ITEM_NUM, + createOrUpdateGaugeSample( METRICS_NAMESPACE_ITEM_NUM, - Collections.singletonMap(NAMESPACE, namespace), + new String[]{NAMESPACE}, new String[]{namespace}, m_configs.get(namespace).getPropertyNames().size()); }); // update ConfigFile num createOrUpdateGaugeSample(METRICS_CONFIG_FILE_NUM, - METRICS_CONFIG_FILE_NUM, - Collections.emptyMap(), m_configFiles.size()); // update NamespaceStatus metrics createOrUpdateGaugeSample(METRICS_NAMESPACE_NOT_FOUND, - METRICS_NAMESPACE_NOT_FOUND, - Collections.emptyMap(), namespace404.size()); createOrUpdateGaugeSample(METRICS_NAMESPACE_TIMEOUT, - METRICS_NAMESPACE_TIMEOUT, - Collections.emptyMap(), namespaceTimeout.size()); } @@ -189,53 +183,28 @@ public List getTimeoutNamespaces() { } @Override - public Integer getNamespaceItemsNum(String namespace) { + public Map getNamespaceMetricsString() { + Map namespaceMetricsStringMap = Maps.newHashMap(); + namespaces.forEach((namespace, metrics) -> { + NamespaceMetricsString namespaceMetricsString = new NamespaceMetricsString(); + namespaceMetricsString.setFirstLoadTimeSpendInMs(metrics.getFirstLoadTimeSpendInMs()); + namespaceMetricsString.setLatestUpdateTime(metrics.getLatestUpdateTime().toString()); + namespaceMetricsString.setUsageCount(metrics.getUsageCount()); + namespaceMetricsString.setReleaseKey(metrics.getReleaseKey()); + namespaceMetricsStringMap.put(namespace, namespaceMetricsString); + }); + return namespaceMetricsStringMap; + } + + @Override + public Integer getNamespacePropertySize(String namespace) { Config config = m_configs.get(namespace); return (config != null) ? config.getPropertyNames().size() : 0; } @Override - public Integer getConfigFileNum() { - return m_configFiles.size(); + public List getConfigFileNamespaces() { + return new ArrayList<>(m_configFiles.keySet()); } - public static class NamespaceMetrics { - - private int usageCount; - private long firstLoadSpend; - private long latestUpdateTime = System.currentTimeMillis(); - private String releaseKey = ""; - - public String getReleaseKey() { - return releaseKey; - } - - public void setReleaseKey(String releaseKey) { - this.releaseKey = releaseKey; - } - - public int getUsageCount() { - return usageCount; - } - - public void incrementUsageCount() { - usageCount++; - } - - public long getFirstLoadSpend() { - return firstLoadSpend; - } - - public void setFirstLoadSpend(long firstLoadSpend) { - this.firstLoadSpend = firstLoadSpend; - } - - public long getLatestUpdateTime() { - return latestUpdateTime; - } - - public void setLatestUpdateTime(long latestUpdateTime) { - this.latestUpdateTime = latestUpdateTime; - } - } } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientThreadPoolApi.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientThreadPoolApi.java index 91113eca..84316629 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientThreadPoolApi.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientThreadPoolApi.java @@ -25,11 +25,7 @@ import com.ctrip.framework.apollo.monitor.internal.exporter.AbstractApolloClientMetricsExporter; import com.ctrip.framework.apollo.monitor.internal.jmx.mbean.ApolloClientJmxThreadPoolMBean; import com.ctrip.framework.apollo.monitor.internal.listener.AbstractApolloClientMonitorEventListener; -import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEvent; import com.google.common.collect.Maps; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; @@ -68,26 +64,34 @@ public void export0() { executorMap.forEach((key, value) -> exportThreadPoolMetrics(value, key)); } - private void exportThreadPoolMetrics(ApolloThreadPoolInfo info, String name) { - List metrics = Arrays.asList( - (double) info.getActiveTaskCount(), - (double) info.getQueueSize(), - (double) info.getCompletedTaskCount(), - (double) info.getPoolSize(), - (double) info.getTotalTaskCount(), - (double) info.getCorePoolSize(), - (double) info.getMaximumPoolSize(), - (double) info.getLargestPoolSize(), - (double) info.getQueueCapacity(), - (double) info.getQueueRemainingCapacity(), - info.getCurrentLoad() - ); - - for (int i = 0; i < metrics.size(); i++) { - String key = name + METRICS_THREAD_POOL_PARAMS[i + 1]; - createOrUpdateGaugeSample(key, METRICS_THREAD_POOL_PARAMS[i + 1], - Collections.singletonMap(METRICS_THREAD_POOL_PARAMS[0], name), metrics.get(i)); - } + private void exportThreadPoolMetrics(ApolloThreadPoolInfo info, String threadPoolName) { + + createOrUpdateGaugeSample(METRICS_THREAD_POOL_ACTIVE_TASK_COUNT, + new String[]{METRICS_THREAD_POOL_NAME}, new String[]{threadPoolName}, + info.getActiveTaskCount()); + createOrUpdateGaugeSample(METRICS_THREAD_POOL_QUEUE_SIZE, + new String[]{METRICS_THREAD_POOL_NAME}, new String[]{threadPoolName}, + info.getQueueSize()); + createOrUpdateGaugeSample(METRICS_THREAD_POOL_COMPLETED_TASK_COUNT, + new String[]{METRICS_THREAD_POOL_NAME}, new String[]{threadPoolName}, + (double) info.getCompletedTaskCount()); + createOrUpdateGaugeSample(METRICS_THREAD_POOL_POOL_SIZE, new String[]{METRICS_THREAD_POOL_NAME}, + new String[]{threadPoolName}, info.getPoolSize()); + createOrUpdateGaugeSample(METRICS_THREAD_POOL_TOTAL_TASK_COUNT, + new String[]{METRICS_THREAD_POOL_NAME}, new String[]{threadPoolName}, + (double) info.getTotalTaskCount()); + createOrUpdateGaugeSample(METRICS_THREAD_POOL_CORE_POOL_SIZE, + new String[]{METRICS_THREAD_POOL_NAME}, new String[]{threadPoolName}, + info.getCorePoolSize()); + createOrUpdateGaugeSample(METRICS_THREAD_POOL_MAXIMUM_POOL_SIZE, + new String[]{METRICS_THREAD_POOL_NAME}, new String[]{threadPoolName}, + info.getMaximumPoolSize()); + createOrUpdateGaugeSample(METRICS_THREAD_POOL_LARGEST_POOL_SIZE, + new String[]{METRICS_THREAD_POOL_NAME}, new String[]{threadPoolName}, + info.getLargestPoolSize()); + createOrUpdateGaugeSample(METRICS_THREAD_POOL_QUEUE_REMAINING_CAPACITY, + new String[]{METRICS_THREAD_POOL_NAME}, new String[]{threadPoolName}, + info.getQueueRemainingCapacity()); } @@ -121,57 +125,4 @@ public ApolloThreadPoolInfo getAbstractConfigFileThreadPoolInfo() { public ApolloThreadPoolInfo getMetricsExporterThreadPoolInfo() { return executorMap.get(METRICS_EXPORTER); } - - public static class ApolloThreadPoolInfo { - - private final ThreadPoolExecutor executor; - - public ApolloThreadPoolInfo(ThreadPoolExecutor executor) { - this.executor = executor; - } - - public int getActiveTaskCount() { - return executor.getActiveCount(); - } - - public int getQueueSize() { - return executor.getQueue().size(); - } - - public int getCorePoolSize() { - return executor.getCorePoolSize(); - } - - public int getMaximumPoolSize() { - return executor.getMaximumPoolSize(); - } - - public int getPoolSize() { - return executor.getPoolSize(); - } - - public long getTotalTaskCount() { - return executor.getTaskCount(); - } - - public long getCompletedTaskCount() { - return executor.getCompletedTaskCount(); - } - - public int getLargestPoolSize() { - return executor.getLargestPoolSize(); - } - - public int getQueueCapacity() { - return executor.getQueue().remainingCapacity() + executor.getQueue().size(); - } - - public int getQueueRemainingCapacity() { - return executor.getQueue().remainingCapacity(); - } - - public double getCurrentLoad() { - return (double) executor.getPoolSize() / executor.getMaximumPoolSize(); - } - } } \ No newline at end of file diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientBootstrapArgsMonitorApi.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientBootstrapArgsMonitorApi.java index f7b442f1..88ddd7b8 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientBootstrapArgsMonitorApi.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientBootstrapArgsMonitorApi.java @@ -28,122 +28,7 @@ public class NullClientBootstrapArgsMonitorApi implements ApolloClientBootstrapA ApolloClientJmxBootstrapArgsMBean { @Override - public String getStartupParams(String key) { - return ""; - } - - @Override - public String getConfigServiceUrl() { - return ""; - } - - @Override - public String getAccessKeySecret() { - return ""; - } - - @Override - public Boolean getAutoUpdateInjectedSpringProperties() { - return false; - } - - @Override - public Boolean getBootstrapEnabled() { - return null; - } - - @Override - public String getBootstrapNamespaces() { - return ""; - } - - @Override - public Boolean getBootstrapEagerLoadEnabled() { - return null; - } - - @Override - public Boolean getOverrideSystemProperties() { - return null; - } - - @Override - public String getCacheDir() { - return ""; - } - - @Override - public String getCluster() { - return ""; - } - - @Override - public String getConfigService() { - return ""; - } - - @Override - public Boolean getClientMonitorEnabled() { - return null; - } - - @Override - public Boolean getClientMonitorJmxEnabled() { - return null; - } - - @Override - public String getClientMonitorExternalForm() { - return ""; - } - - @Override - public long getClientMonitorExternalExportPeriod() { - return 0; - } - - @Override - public int getClientMonitorExceptionSaveSize() { - return 0; - } - - @Override - public String getApolloMeta() { - return ""; - } - - @Override - public String getMetaLatestFreshTime() { - return ""; - } - - @Override - public Boolean getPropertyNamesCacheEnable() { - return null; - } - - @Override - public Boolean getPropertyOrderEnable() { - return null; - } - - @Override - public String getVersion() { - return ""; - } - - @Override - public String getEnv() { - return ""; - } - - @Override - public String getAppId() { - return ""; - } - - @Override - public Map getBootstrapArgs() { + public Map getBootstrapArgsString() { return Collections.emptyMap(); } } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientExceptionMonitorApi.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientExceptionMonitorApi.java index 3f0a4bdd..5a21f802 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientExceptionMonitorApi.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientExceptionMonitorApi.java @@ -32,6 +32,11 @@ public List getApolloConfigExceptionList() { return Collections.emptyList(); } + @Override + public Integer getExceptionCountFromStartup() { + return 0; + } + @Override public List getApolloConfigExceptionDetails() { return Collections.emptyList(); diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientNamespaceMonitorApi.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientNamespaceMonitorApi.java index 051d00d3..9585823b 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientNamespaceMonitorApi.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientNamespaceMonitorApi.java @@ -18,7 +18,6 @@ import com.ctrip.framework.apollo.monitor.api.ApolloClientNamespaceMonitorApi; import com.ctrip.framework.apollo.monitor.internal.jmx.mbean.ApolloClientJmxNamespaceMBean; -import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientNamespaceApi.NamespaceMetrics; import java.util.Collections; import java.util.List; import java.util.Map; @@ -46,13 +45,18 @@ public List getTimeoutNamespaces() { } @Override - public Integer getNamespaceItemsNum(String namespace) { - return 0; + public Map getNamespaceMetricsString() { + return Collections.emptyMap(); } @Override - public Integer getConfigFileNum() { + public Integer getNamespacePropertySize(String namespace) { return 0; } + @Override + public List getConfigFileNamespaces() { + return Collections.emptyList(); + } + } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientThreadPoolMonitorApi.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientThreadPoolMonitorApi.java index 0a779adf..03e5c1b5 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientThreadPoolMonitorApi.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientThreadPoolMonitorApi.java @@ -18,7 +18,6 @@ import com.ctrip.framework.apollo.monitor.api.ApolloClientThreadPoolMonitorApi; import com.ctrip.framework.apollo.monitor.internal.jmx.mbean.ApolloClientJmxThreadPoolMBean; -import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientThreadPoolApi.ApolloThreadPoolInfo; import java.util.Collections; import java.util.Map; @@ -28,6 +27,8 @@ public class NullClientThreadPoolMonitorApi implements ApolloClientThreadPoolMonitorApi, ApolloClientJmxThreadPoolMBean { + private final ApolloThreadPoolInfo NULL_THREAD_POOL_INFO = new ApolloThreadPoolInfo(); + @Override public Map getThreadPoolInfo() { return Collections.emptyMap(); @@ -35,21 +36,21 @@ public Map getThreadPoolInfo() { @Override public ApolloThreadPoolInfo getRemoteConfigRepositoryThreadPoolInfo() { - return null; + return NULL_THREAD_POOL_INFO; } @Override public ApolloThreadPoolInfo getAbstractConfigThreadPoolInfo() { - return null; + return NULL_THREAD_POOL_INFO; } @Override public ApolloThreadPoolInfo getAbstractConfigFileThreadPoolInfo() { - return null; + return NULL_THREAD_POOL_INFO; } @Override public ApolloThreadPoolInfo getMetricsExporterThreadPoolInfo() { - return null; + return NULL_THREAD_POOL_INFO; } } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/model/CounterModel.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/model/CounterModel.java index 610d61cd..566ce718 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/model/CounterModel.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/model/CounterModel.java @@ -16,7 +16,7 @@ */ package com.ctrip.framework.apollo.monitor.internal.model; -import com.ctrip.framework.apollo.monitor.internal.enums.MeterEnums; +import com.ctrip.framework.apollo.monitor.internal.enums.MetricTypeEnums; /** * @author Rawven @@ -31,7 +31,7 @@ private CounterModel(String name, double num) { throw new IllegalArgumentException("Number must be a valid double"); } setName(name); - setType(MeterEnums.COUNTER); + setType(MetricTypeEnums.COUNTER); this.value.set(num); } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/model/GaugeModel.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/model/GaugeModel.java index 91150100..0abf0699 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/model/GaugeModel.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/model/GaugeModel.java @@ -16,8 +16,7 @@ */ package com.ctrip.framework.apollo.monitor.internal.model; -import com.ctrip.framework.apollo.monitor.internal.enums.MeterEnums; -import com.google.common.util.concurrent.AtomicDouble; +import com.ctrip.framework.apollo.monitor.internal.enums.MetricTypeEnums; /** * @author Rawven @@ -29,7 +28,7 @@ private GaugeModel(String name, double value) { throw new IllegalArgumentException("Name cannot be null or empty"); } setName(name); - setType(MeterEnums.GAUGE); + setType(MetricTypeEnums.GAUGE); this.value.set(value); } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/model/SampleModel.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/model/SampleModel.java index c59c80b4..177d7bd3 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/model/SampleModel.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/model/SampleModel.java @@ -16,9 +16,7 @@ */ package com.ctrip.framework.apollo.monitor.internal.model; -import static com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorConstant.APOLLO_CLIENT; - -import com.ctrip.framework.apollo.monitor.internal.enums.MeterEnums; +import com.ctrip.framework.apollo.monitor.internal.enums.MetricTypeEnums; import com.google.common.util.concurrent.AtomicDouble; import java.util.Collections; import java.util.HashMap; @@ -32,14 +30,14 @@ public class SampleModel { protected final AtomicDouble value = new AtomicDouble(); private final Map tags = new HashMap<>(1); private String name; - private MeterEnums type; + private MetricTypeEnums type; public String getName() { return name; } public void setName(String name) { - this.name = APOLLO_CLIENT + name; + this.name = name; } public SampleModel putTag(String key, String value) { @@ -52,11 +50,11 @@ public SampleModel putTags(Map tags) { return this; } - public MeterEnums getType() { + public MetricTypeEnums getType() { return type; } - public void setType(MeterEnums type) { + public void setType(MetricTypeEnums type) { this.type = type; } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/tracer/ApolloClientMessageProducerComposite.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/tracer/ApolloClientMessageProducerComposite.java index 319baa38..8ae27a72 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/tracer/ApolloClientMessageProducerComposite.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/tracer/ApolloClientMessageProducerComposite.java @@ -20,7 +20,6 @@ import com.ctrip.framework.apollo.tracer.spi.MessageProducer; import com.ctrip.framework.apollo.tracer.spi.Transaction; import java.util.List; -import java.util.Objects; /** * message producer composite diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/tracer/ApolloClientMonitorMessageProducer.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/tracer/ApolloClientMonitorMessageProducer.java index 9397b5e5..b744ce2d 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/tracer/ApolloClientMonitorMessageProducer.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/tracer/ApolloClientMonitorMessageProducer.java @@ -21,11 +21,12 @@ import com.ctrip.framework.apollo.exceptions.ApolloConfigException; -import com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorConstant; import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEventFactory; +import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEventPublisher; import com.ctrip.framework.apollo.tracer.spi.MessageProducer; import com.ctrip.framework.apollo.tracer.spi.Transaction; -import java.time.Instant; + +import java.time.LocalDate; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -50,12 +51,12 @@ public class ApolloClientMonitorMessageProducer implements MessageProducer { @Override public void logError(Throwable cause) { - publishErrorEvent(TAG_ERROR, cause); + publishErrorEvent(cause); } @Override public void logError(String message, Throwable cause) { - publishErrorEvent(TAG_ERROR, cause); + publishErrorEvent(cause); } @Override @@ -69,17 +70,10 @@ public void logEvent(String type, String name) { } } - private void publishErrorEvent(String tag, Throwable cause) { - ApolloClientMonitorEventFactory.getInstance().createEvent(tag) - .withTag(tag) - .putAttachment(THROWABLE, cause) - .publish(); - } - private void handleTaggedEvent(String type, String name) { switch (type) { case APOLLO_CONFIGSERVICE: - name = name.substring(HELP_STR.length()); + name = name.substring(APOLLO_CONFIGSERVICE_HELP_STR.length()); // fall through case APOLLO_CLIENT_CONFIGCHANGES: publishConfigChangeEvent(name); @@ -110,68 +104,76 @@ private void handleTaggedEvent(String type, String name) { } } + + private void publishErrorEvent(Throwable cause) { + ApolloClientMonitorEventPublisher.publish( + ApolloClientMonitorEventFactory.getInstance().createEvent(TAG_ERROR) + .withTag(TAG_ERROR) + .putAttachment(THROWABLE, cause)); + } + private void publishConfigChangeEvent(String name) { - ApolloClientMonitorEventFactory.getInstance() - .createEvent(METRICS_NAMESPACE_LATEST_UPDATE_TIME) - .putAttachment(NAMESPACE, name) - .putAttachment(TIMESTAMP, System.currentTimeMillis()) - .withTag(TAG_NAMESPACE) - .publish(); + ApolloClientMonitorEventPublisher.publish( + ApolloClientMonitorEventFactory.getInstance() + .createEvent(METRICS_NAMESPACE_LATEST_UPDATE_TIME) + .putAttachment(NAMESPACE, name) + .withTag(TAG_NAMESPACE)); } private void publishMetaServiceEvent() { - ApolloClientMonitorEventFactory.getInstance().createEvent(META_FRESH) - .withTag(TAG_BOOTSTRAP) - .putAttachment(META_FRESH, DATE_FORMATTER.format(Instant.now())) - .publish(); + ApolloClientMonitorEventPublisher.publish( + ApolloClientMonitorEventFactory.getInstance().createEvent(META_FRESH) + .withTag(TAG_BOOTSTRAP) + .putAttachment(META_FRESH, LocalDate.now().toString())); } private void publishConfigServiceEvent(String name) { - ApolloClientMonitorEventFactory.getInstance().createEvent(CONFIG_SERVICE_URL) - .withTag(TAG_BOOTSTRAP) - .putAttachment(CONFIG_SERVICE_URL, name) - .publish(); + ApolloClientMonitorEventPublisher.publish( + ApolloClientMonitorEventFactory.getInstance().createEvent(CONFIG_SERVICE_URL) + .withTag(TAG_BOOTSTRAP) + .putAttachment(CONFIG_SERVICE_URL, name)); } private void publishClientVersionEvent(String name) { - ApolloClientMonitorEventFactory.getInstance().createEvent(VERSION) - .withTag(TAG_BOOTSTRAP) - .putAttachment(VERSION, name) - .publish(); + ApolloClientMonitorEventPublisher.publish( + ApolloClientMonitorEventFactory.getInstance().createEvent(VERSION) + .withTag(TAG_BOOTSTRAP) + .putAttachment(VERSION, name)); } private void publishNamespaceTimeoutEvent(String name) { - ApolloClientMonitorEventFactory.getInstance().createEvent(APOLLO_CLIENT_NAMESPACE_TIMEOUT) - .putAttachment(NAMESPACE, name) - .withTag(TAG_NAMESPACE) - .publish(); + ApolloClientMonitorEventPublisher.publish( + ApolloClientMonitorEventFactory.getInstance().createEvent(APOLLO_CLIENT_NAMESPACE_TIMEOUT) + .putAttachment(NAMESPACE, name) + .withTag(TAG_NAMESPACE)); } private void publishNamespaceNotFoundEvent(String name) { - ApolloClientMonitorEventFactory.getInstance().createEvent(APOLLO_CLIENT_NAMESPACE_NOT_FOUND) - .withTag(TAG_NAMESPACE) - .putAttachment(NAMESPACE, name) - .publish(); + ApolloClientMonitorEventPublisher.publish( + ApolloClientMonitorEventFactory.getInstance().createEvent(APOLLO_CLIENT_NAMESPACE_NOT_FOUND) + .withTag(TAG_NAMESPACE) + .putAttachment(NAMESPACE, name)); } private void handleClientConfigEvent(String type, String name) { String namespace = type.substring(APOLLO_CLIENT_CONFIGS.length()); - ApolloClientMonitorEventFactory.getInstance().createEvent(NAMESPACE_RELEASE_KEY) - .withTag(TAG_NAMESPACE) - .putAttachment(NAMESPACE_RELEASE_KEY, name) - .putAttachment(NAMESPACE, namespace) - .publish(); + ApolloClientMonitorEventPublisher.publish( + ApolloClientMonitorEventFactory.getInstance().createEvent(NAMESPACE_RELEASE_KEY) + .withTag(TAG_NAMESPACE) + .putAttachment(NAMESPACE_RELEASE_KEY, name) + .putAttachment(NAMESPACE, namespace)); } private void handleFirstLoadTimeEvent(String type, String name) { - String namespace = type.substring(APOLLO_CLIENT_NAMESPACE_FIRST_LOAD_SPEND.length()); + String[] split = type.split(":"); + String namespace = split[1]; long firstLoadTime = Long.parseLong(name); - ApolloClientMonitorEventFactory.getInstance() - .createEvent(APOLLO_CLIENT_NAMESPACE_FIRST_LOAD_SPEND) - .putAttachment(NAMESPACE, namespace) - .putAttachment(TIMESTAMP, firstLoadTime) - .withTag(TAG_NAMESPACE) - .publish(); + ApolloClientMonitorEventPublisher.publish( + ApolloClientMonitorEventFactory.getInstance() + .createEvent(APOLLO_CLIENT_NAMESPACE_FIRST_LOAD_SPEND) + .putAttachment(NAMESPACE, namespace) + .putAttachment(TIMESTAMP, firstLoadTime) + .withTag(TAG_NAMESPACE)); } @Override @@ -183,10 +185,11 @@ public void logEvent(String type, String name, String status, String nameValuePa public void logMetricsForCount(String name) { String[] split = name.split(":"); if (split.length == 2 && APOLLO_CLIENT_NAMESPACE_USAGE.equals(split[0])) { - ApolloClientMonitorEventFactory.getInstance().createEvent(APOLLO_CLIENT_NAMESPACE_USAGE) - .putAttachment(ApolloClientMonitorConstant.NAMESPACE, split[1]) - .withTag(TAG_NAMESPACE) - .publish(); + ApolloClientMonitorEventPublisher.publish( + ApolloClientMonitorEventFactory.getInstance() + .createEvent(APOLLO_CLIENT_NAMESPACE_USAGE) + .putAttachment(NAMESPACE, split[1]) + .withTag(TAG_NAMESPACE)); } } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java index 123c69df..24f674e6 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java @@ -38,21 +38,18 @@ public class ConfigUtil { private static final Logger logger = LoggerFactory.getLogger(ConfigUtil.class); - private final RateLimiter warnLogRateLimiter; + /** * qps limit: discovery config service from meta *

* 1 times per second */ private int discoveryQPS = 1; - /** - * 1 second - */ + /** 1 second */ private int discoveryConnectTimeout = 1000; - /** - * 1 second - */ + /** 1 second */ private int discoveryReadTimeout = 1000; + private int refreshInterval = 5; private TimeUnit refreshIntervalTimeUnit = TimeUnit.MINUTES; private int connectTimeout = 1000; //1 second @@ -69,6 +66,7 @@ public class ConfigUtil { private TimeUnit configCacheExpireTimeUnit = TimeUnit.MINUTES;//1 minute private long longPollingInitialDelayInMills = 2000;//2 seconds private boolean autoUpdateInjectedSpringProperties = true; + private final RateLimiter warnLogRateLimiter; private boolean propertiesOrdered = false; private boolean propertyNamesCacheEnabled = false; private boolean propertyFileCacheEnabled = true; @@ -100,19 +98,6 @@ public ConfigUtil() { initClientMonitorExceptionQueueSize(); } - - static Integer getCustomizedIntegerValue(String systemKey) { - String customizedValue = System.getProperty(systemKey); - if (!Strings.isNullOrEmpty(customizedValue)) { - try { - return Integer.parseInt(customizedValue); - } catch (Throwable ex) { - logger.error("Config for {} is invalid: {}", systemKey, customizedValue); - } - } - return null; - } - /** * Get the app id for the current application. * @@ -247,6 +232,18 @@ public TimeUnit getRefreshIntervalTimeUnit() { return refreshIntervalTimeUnit; } + static Integer getCustomizedIntegerValue(String systemKey) { + String customizedValue = System.getProperty(systemKey); + if (!Strings.isNullOrEmpty(customizedValue)) { + try { + return Integer.parseInt(customizedValue); + } catch (Throwable ex) { + logger.error("Config for {} is invalid: {}", systemKey, customizedValue); + } + } + return null; + } + private void initQPS() { { Integer value = getCustomizedIntegerValue("apollo.discoveryConnectTimeout"); @@ -353,8 +350,7 @@ private String getDeprecatedCustomizedCacheRoot() { } if (Strings.isNullOrEmpty(cacheRoot)) { // 2. Get from OS environment variable - cacheRoot = System.getenv( - ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR_ENVIRONMENT_VARIABLES); + cacheRoot = System.getenv(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR_ENVIRONMENT_VARIABLES); if (!Strings.isNullOrEmpty(cacheRoot)) { DeprecatedPropertyNotifyUtil .warn(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR_ENVIRONMENT_VARIABLES, @@ -363,8 +359,7 @@ private String getDeprecatedCustomizedCacheRoot() { } if (Strings.isNullOrEmpty(cacheRoot)) { // 3. Get from server.properties - cacheRoot = Foundation.server() - .getProperty(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR, null); + cacheRoot = Foundation.server().getProperty(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR, null); if (!Strings.isNullOrEmpty(cacheRoot)) { DeprecatedPropertyNotifyUtil.warn(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR, ApolloClientSystemConsts.APOLLO_CACHE_DIR); @@ -372,8 +367,7 @@ private String getDeprecatedCustomizedCacheRoot() { } if (Strings.isNullOrEmpty(cacheRoot)) { // 4. Get from app.properties - cacheRoot = Foundation.app() - .getProperty(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR, null); + cacheRoot = Foundation.app().getProperty(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR, null); if (!Strings.isNullOrEmpty(cacheRoot)) { DeprecatedPropertyNotifyUtil.warn(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR, ApolloClientSystemConsts.APOLLO_CACHE_DIR); @@ -490,30 +484,30 @@ public boolean isOverrideSystemProperties() { } private void initPropertyNamesCacheEnabled() { - propertyNamesCacheEnabled = getPropertyBoolean( - ApolloClientSystemConsts.APOLLO_PROPERTY_NAMES_CACHE_ENABLE, - ApolloClientSystemConsts.APOLLO_PROPERTY_NAMES_CACHE_ENABLE_ENVIRONMENT_VARIABLES, - propertyNamesCacheEnabled); + propertyNamesCacheEnabled = getPropertyBoolean(ApolloClientSystemConsts.APOLLO_PROPERTY_NAMES_CACHE_ENABLE, + ApolloClientSystemConsts.APOLLO_PROPERTY_NAMES_CACHE_ENABLE_ENVIRONMENT_VARIABLES, + propertyNamesCacheEnabled); } private void initPropertyFileCacheEnabled() { propertyFileCacheEnabled = getPropertyBoolean(ApolloClientSystemConsts.APOLLO_CACHE_FILE_ENABLE, - ApolloClientSystemConsts.APOLLO_CACHE_FILE_ENABLE_ENVIRONMENT_VARIABLES, - propertyFileCacheEnabled); + ApolloClientSystemConsts.APOLLO_CACHE_FILE_ENABLE_ENVIRONMENT_VARIABLES, + propertyFileCacheEnabled); } private void initOverrideSystemProperties() { - overrideSystemProperties = getPropertyBoolean( - ApolloClientSystemConsts.APOLLO_OVERRIDE_SYSTEM_PROPERTIES, - ApolloClientSystemConsts.APOLLO_OVERRIDE_SYSTEM_PROPERTIES, - overrideSystemProperties); + overrideSystemProperties = getPropertyBoolean(ApolloClientSystemConsts.APOLLO_OVERRIDE_SYSTEM_PROPERTIES, + ApolloClientSystemConsts.APOLLO_OVERRIDE_SYSTEM_PROPERTIES, + overrideSystemProperties); } - + + private void initClientMonitorExternalType() { monitorExternalType = System.getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_TYPE); + if (Strings.isNullOrEmpty(monitorExternalType)) { monitorExternalType = Foundation.app() - .getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_TYPE, null); + .getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_TYPE, null); } } @@ -522,10 +516,15 @@ public String getMonitorExternalType() { } private void initClientMonitorExternalCollectPeriod() { - Integer value = getCustomizedIntegerValue( - ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_EXPORT_PERIOD); - if (null != value){ - monitorExternalExportPeriod = value; + Integer value = getCustomizedIntegerValue(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_EXPORT_PERIOD); + + if (value != null) { + if (value <= 0) { + logger.warn("Config for {} is invalid: {}, remain default value: 10", + ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_EXPORT_PERIOD, value); + } else { + monitorExternalExportPeriod = value; + } } } @@ -533,42 +532,53 @@ public long getMonitorExternalExportPeriod() { return monitorExternalExportPeriod; } - private void initClientMonitorEnabled() { String enabled = System.getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_ENABLED); + if (enabled == null) { enabled = Foundation.app() - .getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_ENABLED, "false"); + .getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_ENABLED, "false"); } + clientMonitorEnabled = Boolean.parseBoolean(enabled); } - public boolean getClientMonitorEnabled() { + public boolean isClientMonitorEnabled() { return clientMonitorEnabled; } private void initClientMonitorJmxEnabled() { String enabled = System.getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_JMX_ENABLED); + if (enabled == null) { enabled = Foundation.app() - .getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_JMX_ENABLED, "false"); + .getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_JMX_ENABLED, "false"); } + clientMonitorJmxEnabled = Boolean.parseBoolean(enabled); } - public boolean getClientMonitorJmxEnabled() { + + public boolean isClientMonitorJmxEnabled() { return clientMonitorJmxEnabled; } + private void initClientMonitorExceptionQueueSize() { - Integer value = getCustomizedIntegerValue( - ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE); - if (null != value){ - monitorExceptionQueueSize = value; + Integer value = getCustomizedIntegerValue(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE); + + if (value != null) { + if (value <= 0) { + logger.warn("Config for {} is invalid: {}, remain default value: 25", + ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE, value); + } else { + monitorExceptionQueueSize = value; + } } } + public int getMonitorExceptionQueueSize() { return monitorExceptionQueueSize; } - + private boolean getPropertyBoolean(String propertyName, String envName, boolean defaultVal) { String enablePropertyNamesCache = System.getProperty(propertyName); if (Strings.isNullOrEmpty(enablePropertyNamesCache)) { @@ -582,9 +592,9 @@ private boolean getPropertyBoolean(String propertyName, String envName, boolean return Boolean.parseBoolean(enablePropertyNamesCache); } catch (Throwable ex) { logger.warn("Config for {} is invalid: {}, set default value: {}", - propertyName, enablePropertyNamesCache, defaultVal); + propertyName, enablePropertyNamesCache, defaultVal); } } return defaultVal; } -} +} \ No newline at end of file diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/internals/ConfigMonitorInitializerTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/internals/ConfigMonitorInitializerTest.java index 6db638c7..25be1005 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/internals/ConfigMonitorInitializerTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/internals/ConfigMonitorInitializerTest.java @@ -16,102 +16,71 @@ */ package com.ctrip.framework.apollo.internals; -import static org.mockito.Mockito.*; -import static org.junit.Assert.*; - import com.ctrip.framework.apollo.build.MockInjector; -import com.ctrip.framework.apollo.monitor.api.ConfigMonitor; -import com.ctrip.framework.apollo.monitor.internal.DefaultConfigMonitor; -import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporter; -import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListener; -import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListenerManager; -import com.ctrip.framework.apollo.monitor.internal.listener.DefaultApolloClientMonitorEventListenerManager; -import com.ctrip.framework.apollo.monitor.internal.tracer.ApolloClientMessageProducerComposite; +import com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorContext; +import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporterFactory; import com.ctrip.framework.apollo.util.ConfigUtil; -import java.util.Collections; -import java.util.List; import org.junit.Before; import org.junit.Test; -import org.slf4j.Logger; - -public class ConfigMonitorInitializerTest { - - private ConfigUtil mockConfigUtil; - private Logger mockLogger; - private DefaultApolloClientMonitorEventListenerManager mockManager; - private ApolloClientMetricsExporter mockMetricsExporter; - private DefaultConfigManager mockConfigManager; - private DefaultConfigMonitor mockConfigMonitor; - - @Before - public void setUp() { - mockConfigUtil = mock(ConfigUtil.class); - when(mockConfigUtil.getMonitorExceptionQueueSize()).thenReturn(100); - when(mockConfigUtil.getClientMonitorEnabled()).thenReturn(false); - mockLogger = mock(Logger.class); - mockManager = mock(DefaultApolloClientMonitorEventListenerManager.class); - mockMetricsExporter = mock(ApolloClientMetricsExporter.class); - mockConfigManager = mock(DefaultConfigManager.class); - mockConfigMonitor = mock(DefaultConfigMonitor.class); - - - // Mock static methods - MockInjector.setInstance(ConfigUtil.class, mockConfigUtil); - MockInjector.setInstance(ApolloClientMonitorEventListenerManager.class, mockManager); - MockInjector.setInstance(ConfigManager.class, mockConfigManager); - MockInjector.setInstance(ConfigMonitor.class, mockConfigMonitor); - - // Reset static state before each test - ConfigMonitorInitializer.reset(); - } - - @Test - public void testInitialize_WhenEnabledAndNotInitialized() { - when(mockManager.getCollectors()).thenReturn(Collections.emptyList()); - doReturn(true).when(mockConfigUtil).getClientMonitorEnabled(); - ConfigMonitorInitializer.initialize(); - - verify(mockManager).setCollectors(anyList()); - verify(mockConfigMonitor).init(any(), any(), any(), any(), any()); - assertTrue(ConfigMonitorInitializer.hasInitialized); // Check hasInitialized flag - } +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; - @Test - public void testInitialize_WhenAlreadyInitialized() { - ConfigMonitorInitializer.hasInitialized = true; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; - ConfigMonitorInitializer.initialize(); - - verify(mockConfigMonitor, never()).init(any(), any(), any(), any(), any()); - } - - @Test - public void testInitialize_WhenClientMonitorDisabled() { - when(mockConfigUtil.getClientMonitorEnabled()).thenReturn(false); - - ConfigMonitorInitializer.initialize(); - - verify(mockManager, never()).setCollectors(anyList()); - verify(mockConfigMonitor, never()).init(any(), any(), any(), any(), any()); - } - - @Test - public void testInitializeMessageProducerComposite() { - when(mockConfigUtil.getClientMonitorEnabled()).thenReturn(true); - - ApolloClientMessageProducerComposite composite = ConfigMonitorInitializer.initializeMessageProducerComposite(); - - assertNotNull(composite); - // Additional assertions can be added based on expected behavior - } - @Test - public void testInitializeJmxMonitoring() { - when(mockConfigUtil.getClientMonitorJmxEnabled()).thenReturn(true); - ApolloClientMonitorEventListener metricsCollector = mock(ApolloClientMonitorEventListener.class); - List collectors = Collections.singletonList(metricsCollector); +public class ConfigMonitorInitializerTest { - ConfigMonitorInitializer.initializeJmxMonitoring(collectors); - verify(metricsCollector).mBeanName(); - } - -} \ No newline at end of file + @Mock + private ConfigUtil mockConfigUtil; + @Mock + private ApolloClientMonitorContext mockMonitorContext; + @Mock + private ApolloClientMetricsExporterFactory mockExporterFactory; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + MockInjector.setInstance(ConfigUtil.class, mockConfigUtil); + MockInjector.setInstance(ApolloClientMonitorContext.class, mockMonitorContext); + MockInjector.setInstance(ApolloClientMetricsExporterFactory.class, mockExporterFactory); + resetConfigMonitorInitializer(); + } + + @Test + public void testInitializeWhenMonitorEnabledAndNotInitialized() { + when(mockConfigUtil.isClientMonitorEnabled()).thenReturn(true); + ConfigMonitorInitializer.initialize(); + assertTrue(ConfigMonitorInitializer.hasInitialized); + //ConfigMonitorInitializer.53line + DefaultApolloClientBootstrapArgsApi.64line + verify(mockConfigUtil, times(2)).isClientMonitorEnabled(); + } + + @Test + public void testInitializeWhenMonitorDisabled() { + when(mockConfigUtil.isClientMonitorEnabled()).thenReturn(false); + ConfigMonitorInitializer.initialize(); + assertFalse(ConfigMonitorInitializer.hasInitialized); + } + + @Test + public void testInitializeWhenAlreadyInitialized() { + when(mockConfigUtil.isClientMonitorEnabled()).thenReturn(true); + ConfigMonitorInitializer.hasInitialized = true; + ConfigMonitorInitializer.initialize(); + verify(mockConfigUtil, times(1)).isClientMonitorEnabled(); + } + + @Test + public void testReset() { + ConfigMonitorInitializer.reset(); + assertFalse(ConfigMonitorInitializer.hasInitialized); + } + + private void resetConfigMonitorInitializer() { + ConfigMonitorInitializer.reset(); + } + +} diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorContextTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorContextTest.java new file mode 100644 index 00000000..f2fad224 --- /dev/null +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorContextTest.java @@ -0,0 +1,99 @@ +/* + * Copyright 2022 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.monitor.internal; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporter; +import com.ctrip.framework.apollo.monitor.internal.exporter.impl.NullApolloClientMetricsExporter; +import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListener; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientBootstrapArgsApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientExceptionApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientNamespaceApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientThreadPoolApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientBootstrapArgsMonitorApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientExceptionMonitorApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientNamespaceMonitorApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientThreadPoolMonitorApi; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.List; + +public class ApolloClientMonitorContextTest { + + @Mock + private DefaultApolloClientExceptionApi exceptionMonitorApi; + @Mock + private DefaultApolloClientNamespaceApi namespaceMonitorApi; + @Mock + private DefaultApolloClientBootstrapArgsApi bootstrapArgsMonitorApi; + @Mock + private DefaultApolloClientThreadPoolApi threadPoolMonitorApi; + @Mock + private ApolloClientMetricsExporter metricsExporter; + + private ApolloClientMonitorContext monitorContext; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + monitorContext = new ApolloClientMonitorContext(); + } + + @Test + public void testInitContext(){ + assertTrue(monitorContext.getBootstrapArgsApi() instanceof NullClientBootstrapArgsMonitorApi); + assertTrue(monitorContext.getNamespaceApi() instanceof NullClientNamespaceMonitorApi); + assertTrue(monitorContext.getThreadPoolApi() instanceof NullClientThreadPoolMonitorApi); + assertTrue(monitorContext.getExceptionApi() instanceof NullClientExceptionMonitorApi); + assertTrue(monitorContext.getMetricsExporter() instanceof NullApolloClientMetricsExporter); + } + + @Test + public void testSettingAndGettingApis() { + monitorContext.setApolloClientExceptionMonitorApi(exceptionMonitorApi); + monitorContext.setApolloClientNamespaceMonitorApi(namespaceMonitorApi); + monitorContext.setApolloClientBootstrapArgsMonitorApi(bootstrapArgsMonitorApi); + monitorContext.setApolloClientThreadPoolMonitorApi(threadPoolMonitorApi); + monitorContext.setApolloClientMetricsExporter(metricsExporter); + + assertSame(exceptionMonitorApi, monitorContext.getExceptionApi()); + assertSame(namespaceMonitorApi, monitorContext.getNamespaceApi()); + assertSame(bootstrapArgsMonitorApi, monitorContext.getBootstrapArgsApi()); + assertSame(threadPoolMonitorApi, monitorContext.getThreadPoolApi()); + assertSame(metricsExporter, monitorContext.getMetricsExporter()); + } + + @Test + public void testGetCollectors() { + monitorContext.setApolloClientExceptionMonitorApi(exceptionMonitorApi); + monitorContext.setApolloClientNamespaceMonitorApi(namespaceMonitorApi); + monitorContext.setApolloClientBootstrapArgsMonitorApi(bootstrapArgsMonitorApi); + monitorContext.setApolloClientThreadPoolMonitorApi(threadPoolMonitorApi); + + List collectors = monitorContext.getCollectors(); + + assertEquals(4, collectors.size()); + assertTrue(collectors.contains(exceptionMonitorApi)); + assertTrue(collectors.contains(namespaceMonitorApi)); + assertTrue(collectors.contains(bootstrapArgsMonitorApi)); + assertTrue(collectors.contains(threadPoolMonitorApi)); + } +} diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/DefaultConfigMonitorTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/DefaultConfigMonitorTest.java index beeaf45c..2f1ffc6c 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/DefaultConfigMonitorTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/DefaultConfigMonitorTest.java @@ -15,10 +15,11 @@ * */ package com.ctrip.framework.apollo.monitor.internal; - import static org.junit.Assert.*; import static org.mockito.Mockito.*; +import com.ctrip.framework.apollo.build.ApolloInjector; +import com.ctrip.framework.apollo.build.MockInjector; import com.ctrip.framework.apollo.monitor.api.ApolloClientBootstrapArgsMonitorApi; import com.ctrip.framework.apollo.monitor.api.ApolloClientExceptionMonitorApi; import com.ctrip.framework.apollo.monitor.api.ApolloClientNamespaceMonitorApi; @@ -31,60 +32,48 @@ public class DefaultConfigMonitorTest { - private DefaultConfigMonitor configMonitor; - - @Mock - private ApolloClientMetricsExporter reporter; - - @Mock - private ApolloClientThreadPoolMonitorApi threadPoolMonitorApi; - @Mock private ApolloClientExceptionMonitorApi exceptionMonitorApi; - @Mock private ApolloClientNamespaceMonitorApi namespaceMonitorApi; - @Mock private ApolloClientBootstrapArgsMonitorApi bootstrapArgsMonitorApi; + @Mock + private ApolloClientThreadPoolMonitorApi threadPoolMonitorApi; + @Mock + private ApolloClientMetricsExporter metricsExporter; + @Mock + private ApolloClientMonitorContext monitorContext; + + private DefaultConfigMonitor configMonitor; @Before - public void setUp() { + public void setUp(){ MockitoAnnotations.initMocks(this); + when(monitorContext.getExceptionApi()).thenReturn(exceptionMonitorApi); + when(monitorContext.getNamespaceApi()).thenReturn(namespaceMonitorApi); + when(monitorContext.getBootstrapArgsApi()).thenReturn(bootstrapArgsMonitorApi); + when(monitorContext.getThreadPoolApi()).thenReturn(threadPoolMonitorApi); + when(monitorContext.getMetricsExporter()).thenReturn(metricsExporter); + MockInjector.setInstance(ApolloClientMonitorContext.class, monitorContext); + configMonitor = new DefaultConfigMonitor(); - } - @Test - public void testInit() { - configMonitor.init(namespaceMonitorApi, threadPoolMonitorApi, exceptionMonitorApi, - bootstrapArgsMonitorApi, reporter); - - assertEquals(namespaceMonitorApi, configMonitor.getNamespaceMonitorApi()); - assertEquals(threadPoolMonitorApi, configMonitor.getThreadPoolMonitorApi()); - assertEquals(exceptionMonitorApi, configMonitor.getExceptionMonitorApi()); - assertEquals(bootstrapArgsMonitorApi, configMonitor.getRunningParamsMonitorApi()); } @Test - public void testGetExporterData() { - when(reporter.response()).thenReturn("exporter data"); - - configMonitor.init(namespaceMonitorApi, threadPoolMonitorApi, exceptionMonitorApi, - bootstrapArgsMonitorApi, reporter); - - String result = configMonitor.getExporterData(); - - assertEquals("exporter data", result); - verify(reporter).response(); + public void testApis(){ + assertSame(exceptionMonitorApi, configMonitor.getExceptionMonitorApi()); + assertSame(namespaceMonitorApi, configMonitor.getNamespaceMonitorApi()); + assertSame(bootstrapArgsMonitorApi, configMonitor.getRunningParamsMonitorApi()); + assertSame(threadPoolMonitorApi, configMonitor.getThreadPoolMonitorApi()); } @Test - public void testDefaultInstances() { - assertNotNull(configMonitor.getThreadPoolMonitorApi()); - assertNotNull(configMonitor.getExceptionMonitorApi()); - assertNotNull(configMonitor.getNamespaceMonitorApi()); - assertNotNull(configMonitor.getRunningParamsMonitorApi()); - assertEquals("No Reporter Use", - configMonitor.getExporterData()); // Assuming NullApolloClientMetricsExporter returns "null" + public void testExporterData(){ + String data = "data"; + when(metricsExporter.response()).thenReturn(data); + + assertEquals(data, configMonitor.getExporterData()); } -} \ No newline at end of file +} diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEventPublisherTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEventPublisherTest.java index 2119b25a..aed0cdd9 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEventPublisherTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEventPublisherTest.java @@ -20,7 +20,7 @@ import com.ctrip.framework.apollo.build.MockInjector; import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListener; -import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListenerManager; +import com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorContext; import com.ctrip.framework.apollo.util.ConfigUtil; import org.junit.Before; import org.junit.Test; @@ -29,29 +29,29 @@ public class ApolloClientMonitorEventPublisherTest { - private ApolloClientMonitorEventListenerManager mockCollectorManager; + private ApolloClientMonitorContext mockCollectorManager; private ConfigUtil mockConfigUtil; private ApolloClientMonitorEventListener mockCollector; private ApolloClientMonitorEvent mockEvent; @Before public void setUp() { - mockCollectorManager = mock(ApolloClientMonitorEventListenerManager.class); + mockCollectorManager = mock(ApolloClientMonitorContext.class); mockConfigUtil = mock(ConfigUtil.class); mockCollector = mock(ApolloClientMonitorEventListener.class); mockEvent = mock(ApolloClientMonitorEvent.class); // 使用 Mockito 来模拟静态方法 - MockInjector.setInstance(ApolloClientMonitorEventListenerManager.class, mockCollectorManager); + MockInjector.setInstance(ApolloClientMonitorContext.class, mockCollectorManager); MockInjector.setInstance(ConfigUtil.class, mockConfigUtil); ApolloClientMonitorEventPublisher.reset(); } @Test public void testPublish_WhenClientMonitorEnabled_CollectorSupportsEvent() { - when(mockConfigUtil.getClientMonitorEnabled()).thenReturn(true); + when(mockConfigUtil.isClientMonitorEnabled()).thenReturn(true); when(mockCollectorManager.getCollectors()).thenReturn(Collections.singletonList(mockCollector)); - when(mockCollector.isSupport(mockEvent)).thenReturn(true); + when(mockCollector.isSupported(mockEvent)).thenReturn(true); ApolloClientMonitorEventPublisher.publish(mockEvent); @@ -60,9 +60,9 @@ public void testPublish_WhenClientMonitorEnabled_CollectorSupportsEvent() { @Test public void testPublish_WhenClientMonitorEnabled_CollectorDoesNotSupportEvent() { - when(mockConfigUtil.getClientMonitorEnabled()).thenReturn(true); + when(mockConfigUtil.isClientMonitorEnabled()).thenReturn(true); when(mockCollectorManager.getCollectors()).thenReturn(Collections.singletonList(mockCollector)); - when(mockCollector.isSupport(mockEvent)).thenReturn(false); + when(mockCollector.isSupported(mockEvent)).thenReturn(false); ApolloClientMonitorEventPublisher.publish(mockEvent); @@ -71,7 +71,7 @@ public void testPublish_WhenClientMonitorEnabled_CollectorDoesNotSupportEvent() @Test public void testPublish_WhenClientMonitorDisabled() { - when(mockConfigUtil.getClientMonitorEnabled()).thenReturn(false); + when(mockConfigUtil.isClientMonitorEnabled()).thenReturn(false); ApolloClientMonitorEventPublisher.publish(mockEvent); diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/exporter/AbstractApolloClientMetricsExporterTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/exporter/AbstractApolloClientMetricsExporterTest.java index 8728c0c2..15df2204 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/exporter/AbstractApolloClientMetricsExporterTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/exporter/AbstractApolloClientMetricsExporterTest.java @@ -19,7 +19,7 @@ import static org.junit.Assert.*; import static org.mockito.Mockito.*; -import com.ctrip.framework.apollo.monitor.internal.enums.MeterEnums; +import com.ctrip.framework.apollo.monitor.internal.enums.MetricTypeEnums; import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListener; import com.ctrip.framework.apollo.monitor.internal.model.CounterModel; import com.ctrip.framework.apollo.monitor.internal.model.GaugeModel; @@ -58,7 +58,7 @@ public void testInit() { public void testUpdateMetricsData() { List samples = new ArrayList<>(); GaugeModel gauge = mock(GaugeModel.class); - when(gauge.getType()).thenReturn(MeterEnums.GAUGE); + when(gauge.getType()).thenReturn(MetricTypeEnums.GAUGE); when(gauge.getName()).thenReturn("testGauge"); when(gauge.getValue()).thenReturn(10.0); samples.add(gauge); diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/exporter/DefaultApolloClientMetricsExporterFactoryTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/exporter/DefaultApolloClientMetricsExporterFactoryTest.java index f8c32b0d..57908315 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/exporter/DefaultApolloClientMetricsExporterFactoryTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/exporter/DefaultApolloClientMetricsExporterFactoryTest.java @@ -61,9 +61,9 @@ public void testGetMetricsReporter_NoExternalSystemType() { @Test public void testGetMetricsReporter_ExporterFound() { when(configUtil.getMonitorExternalType()).thenReturn("mocktheus"); - when(configUtil.getClientMonitorJmxEnabled()).thenReturn(true); + when(configUtil.isClientMonitorJmxEnabled()).thenReturn(true); when(configUtil.getMonitorExternalExportPeriod()).thenReturn(1000L); - when(metricsCollector.mBeanName()).thenReturn("testMBean"); + when(metricsCollector.getName()).thenReturn("testMBean"); List collectors = Collections.singletonList(metricsCollector); ApolloClientMetricsExporter result = factory.getMetricsReporter(collectors); diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/AbstractApolloClientMonitorEventListenerTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/AbstractApolloClientMonitorEventListenerTest.java deleted file mode 100644 index 1a60c02f..00000000 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/AbstractApolloClientMonitorEventListenerTest.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2022 Apollo Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.ctrip.framework.apollo.monitor.internal.listener; - -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; - -import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEvent; -import com.ctrip.framework.apollo.monitor.internal.model.CounterModel; -import com.ctrip.framework.apollo.monitor.internal.model.GaugeModel; -import com.ctrip.framework.apollo.monitor.internal.model.SampleModel; -import org.junit.Before; -import org.junit.Test; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class AbstractApolloClientMonitorEventListenerTest { - - private TestMonitorEventListener listener; - private ApolloClientMonitorEvent event; - - @Before - public void setUp() { - listener = new TestMonitorEventListener("testTag"); - event = mock(ApolloClientMonitorEvent.class); - when(event.getTag()).thenReturn("testTag"); - } - - @Test - public void testCollect() { - listener.collect(event); - assertTrue(listener.isMetricsSampleUpdated()); - } - - @Test - public void testIsSupport() { - assertTrue(listener.isSupport(event)); - when(event.getTag()).thenReturn("otherTag"); - assertFalse(listener.isSupport(event)); - } - - @Test - public void testExport() { - listener.collect(event); - List samples = listener.export(); - assertNotNull(samples); - assertTrue(samples.isEmpty()); // 应为空,因为尚未添加样本 - } - - @Test - public void testCreateOrUpdateGaugeSample() { - String mapKey = "gauge1"; - String metricsName = "testGauge"; - Map tags = new HashMap<>(); - tags.put("key", "value"); - - listener.createOrUpdateGaugeSample(mapKey, metricsName, tags, 42.0); - - List samples = listener.export(); - assertEquals(1, samples.size()); - assertTrue(samples.get(0) instanceof GaugeModel); - assertEquals(42.0, ((GaugeModel) samples.get(0)).getValue(), 0.01); - } - - @Test - public void testCreateOrUpdateCounterSample() { - String mapKey = "counter1"; - String metricsName = "testCounter"; - Map tags = new HashMap<>(); - tags.put("key", "value"); - - listener.createOrUpdateCounterSample(mapKey, metricsName, tags, 5.0); - - List samples = listener.export(); - assertEquals(1, samples.size()); - assertTrue(samples.get(0) instanceof CounterModel); - assertEquals(5.0, ((CounterModel) samples.get(0)).getValue(), 0.01); - } - - private class TestMonitorEventListener extends AbstractApolloClientMonitorEventListener { - - public TestMonitorEventListener(String tag) { - super(tag); - } - - @Override - protected void collect0(ApolloClientMonitorEvent event) { - // 简单的收集逻辑 - } - - @Override - protected void export0() { - // 模拟导出逻辑 - } - } -} \ No newline at end of file diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/DefaultApolloClientMonitorEventListenerManagerTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/DefaultApolloClientMonitorEventListenerManagerTest.java deleted file mode 100644 index 46e3cf8e..00000000 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/DefaultApolloClientMonitorEventListenerManagerTest.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2022 Apollo Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.ctrip.framework.apollo.monitor.internal.listener; - -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; - -import org.junit.Before; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class DefaultApolloClientMonitorEventListenerManagerTest { - - private DefaultApolloClientMonitorEventListenerManager manager; - - @Before - public void setUp() { - manager = new DefaultApolloClientMonitorEventListenerManager(); - } - - @Test - public void testInitialCollectors() { - List collectors = manager.getCollectors(); - assertNotNull(collectors); - assertTrue(collectors.isEmpty()); // 初始状态应该为空列表 - } - - @Test - public void testSetCollectors() { - ApolloClientMonitorEventListener mockListener = mock(ApolloClientMonitorEventListener.class); - List newCollectors = new ArrayList<>(); - newCollectors.add(mockListener); - - manager.setCollectors(newCollectors); - List collectors = manager.getCollectors(); - - assertNotNull(collectors); - assertEquals(1, collectors.size()); - assertEquals(mockListener, collectors.get(0)); // 验证设置的监听器 - } - - @Test - public void testSetEmptyCollectors() { - manager.setCollectors(Collections.emptyList()); - List collectors = manager.getCollectors(); - - assertNotNull(collectors); - assertTrue(collectors.isEmpty()); // 设置为空列表后应该为空 - } -} diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientBootstrapArgsApiTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientBootstrapArgsApiTest.java index 12a1b63b..c37699e1 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientBootstrapArgsApiTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientBootstrapArgsApiTest.java @@ -83,7 +83,7 @@ public void testUnhandledEvent() { @Test public void testGetBootstrapArgs() { - Map bootstrapArgs = api.getBootstrapArgs(); + Map bootstrapArgs = api.getBootstrapArgs(); assertNotNull(bootstrapArgs); assertTrue(bootstrapArgs.containsKey(APOLLO_ACCESS_KEY_SECRET)); } diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientExceptionApiTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientExceptionApiTest.java index 2391e2bd..f683993a 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientExceptionApiTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientExceptionApiTest.java @@ -20,6 +20,7 @@ import static org.mockito.Mockito.*; import static org.junit.Assert.*; +import com.ctrip.framework.apollo.core.ApolloClientSystemConsts; import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEvent; import com.ctrip.framework.apollo.exceptions.ApolloConfigException; import org.junit.Before; @@ -33,6 +34,8 @@ public class DefaultApolloClientExceptionApiTest { @Before public void setUp() { + int someQueueSize = 10; + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE, String.valueOf(someQueueSize)); exceptionApi = new DefaultApolloClientExceptionApi(); } @@ -83,14 +86,14 @@ public void testGetApolloConfigExceptionDetails() { @Test public void testCollect0_HandlesMaxQueueSize() { - for (int i = 0; i < 25; i++) { + for (int i = 0; i < 10; i++) { ApolloClientMonitorEvent event = mock(ApolloClientMonitorEvent.class); when(event.getAttachmentValue(THROWABLE)).thenReturn( new ApolloConfigException("Exception " + i)); exceptionApi.collect0(event); } - assertEquals(25, exceptionApi.getApolloConfigExceptionList().size()); + assertEquals(10, exceptionApi.getApolloConfigExceptionList().size()); // Add one more to exceed the size. ApolloClientMonitorEvent overflowEvent = mock(ApolloClientMonitorEvent.class); @@ -98,6 +101,6 @@ public void testCollect0_HandlesMaxQueueSize() { new ApolloConfigException("Overflow Exception")); exceptionApi.collect0(overflowEvent); - assertEquals(25, exceptionApi.getApolloConfigExceptionList().size()); + assertEquals(10, exceptionApi.getApolloConfigExceptionList().size()); } } \ No newline at end of file diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientNamespaceApiTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientNamespaceApiTest.java index 11fd102b..73621a13 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientNamespaceApiTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientNamespaceApiTest.java @@ -26,6 +26,8 @@ import com.ctrip.framework.apollo.Config; import com.ctrip.framework.apollo.ConfigFile; import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEvent; +import java.util.List; +import java.util.Set; import org.junit.Before; import org.junit.Test; @@ -82,19 +84,19 @@ public void testCollectNamespaceUsage() { } @Test - public void testGetNamespaceItemsNum() { + public void testGetNamespacePropertySize() { Config mockConfig = mock(Config.class); when(mockConfig.getPropertyNames()).thenReturn(Sets.newSet("key1", "key2")); configs.put("testNamespace", mockConfig); - Integer testNamespace = api.getNamespaceItemsNum("testNamespace"); + Integer testNamespace = api.getNamespacePropertySize("testNamespace"); assertEquals(2, testNamespace.intValue()); } @Test - public void testGetConfigFileNum() { + public void testGetConfigFileNamespaces() { ConfigFile mockConfigFile = mock(ConfigFile.class); configFiles.put("testNamespace", mockConfigFile); - Integer testNamespace = api.getConfigFileNum(); - assertEquals(1, testNamespace.intValue()); + List configFileNum = api.getConfigFileNamespaces(); + assertEquals(1, configFileNum.size()); } } \ No newline at end of file diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientThreadPoolApiTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientThreadPoolApiTest.java index 9c12fdfe..f1d93b23 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientThreadPoolApiTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientThreadPoolApiTest.java @@ -16,15 +16,13 @@ */ package com.ctrip.framework.apollo.monitor.internal.listener.impl; -import static org.mockito.Mockito.*; import static org.junit.Assert.*; -import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientThreadPoolApi.ApolloThreadPoolInfo; +import com.ctrip.framework.apollo.monitor.api.ApolloClientThreadPoolMonitorApi.ApolloThreadPoolInfo; import lombok.SneakyThrows; import org.junit.Before; import org.junit.Test; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; @@ -89,6 +87,6 @@ public void testGetAbstractConfigFileThreadPoolInfo() { ApolloThreadPoolInfo info = threadPoolApi.getAbstractConfigFileThreadPoolInfo(); assertNotNull(info); } - - + + } diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientBootstrapArgsMonitorApiTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientBootstrapArgsMonitorApiTest.java index 04304a55..d8ece6a1 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientBootstrapArgsMonitorApiTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientBootstrapArgsMonitorApiTest.java @@ -34,7 +34,7 @@ public void setUp() { @Test public void testGetStartupParams() { - assertEquals("", bootstrapArgsMonitorApi.getStartupParams("testKey")); + assertEquals(null, bootstrapArgsMonitorApi.getStartupArg("testKey")); } @Test @@ -53,8 +53,8 @@ public void testGetAutoUpdateInjectedSpringProperties() { } @Test - public void testGetBootstrapEnabled() { - assertNull(bootstrapArgsMonitorApi.getBootstrapEnabled()); + public void testIsBootstrapEnabled() { + assertFalse(bootstrapArgsMonitorApi.isBootstrapEnabled()); } @Test @@ -63,13 +63,13 @@ public void testGetBootstrapNamespaces() { } @Test - public void testGetBootstrapEagerLoadEnabled() { - assertNull(bootstrapArgsMonitorApi.getBootstrapEagerLoadEnabled()); + public void testIsBootstrapEagerLoadEnabled() { + assertFalse(bootstrapArgsMonitorApi.isBootstrapEagerLoadEnabled()); } @Test - public void testGetOverrideSystemProperties() { - assertNull(bootstrapArgsMonitorApi.getOverrideSystemProperties()); + public void testIsOverrideSystemProperties() { + assertFalse(bootstrapArgsMonitorApi.isOverrideSystemProperties()); } @Test @@ -88,13 +88,13 @@ public void testGetConfigService() { } @Test - public void testGetClientMonitorEnabled() { - assertNull(bootstrapArgsMonitorApi.getClientMonitorEnabled()); + public void testIsClientMonitorEnabled() { + assertFalse(bootstrapArgsMonitorApi.isClientMonitorEnabled()); } @Test - public void testGetClientMonitorJmxEnabled() { - assertNull(bootstrapArgsMonitorApi.getClientMonitorJmxEnabled()); + public void testIsClientMonitorJmxEnabled() { + assertFalse(bootstrapArgsMonitorApi.isClientMonitorJmxEnabled()); } @Test @@ -123,13 +123,13 @@ public void testGetMetaLatestFreshTime() { } @Test - public void testGetPropertyNamesCacheEnable() { - assertNull(bootstrapArgsMonitorApi.getPropertyNamesCacheEnable()); + public void testIsPropertyNamesCacheEnable() { + assertFalse(bootstrapArgsMonitorApi.isPropertyNamesCacheEnable()); } @Test - public void testGetPropertyOrderEnable() { - assertNull(bootstrapArgsMonitorApi.getPropertyOrderEnable()); + public void testIsPropertyOrderEnable() { + assertFalse(bootstrapArgsMonitorApi.isPropertyOrderEnable()); } @Test @@ -149,7 +149,7 @@ public void testGetAppId() { @Test public void testGetBootstrapArgs() { - Map bootstrapArgs = bootstrapArgsMonitorApi.getBootstrapArgs(); + Map bootstrapArgs = bootstrapArgsMonitorApi.getBootstrapArgs(); assertNotNull(bootstrapArgs); assertTrue(bootstrapArgs.isEmpty()); diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientNamespaceMonitorApiTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientNamespaceMonitorApiTest.java index cddf6b2c..8bfea39e 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientNamespaceMonitorApiTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientNamespaceMonitorApiTest.java @@ -18,7 +18,8 @@ import static org.junit.Assert.*; -import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientNamespaceApi.NamespaceMetrics; +import com.ctrip.framework.apollo.monitor.api.ApolloClientNamespaceMonitorApi.NamespaceMetrics; +import java.util.Set; import org.junit.Before; import org.junit.Test; @@ -44,15 +45,15 @@ public void testGetNamespaceMetrics() { @Test public void testGetNamespaceItemNames() { - Integer testNamespace = namespaceMonitorApi.getNamespaceItemsNum("testNamespace"); + Integer testNamespace = namespaceMonitorApi.getNamespacePropertySize("testNamespace"); assertEquals(0, testNamespace.intValue()); } - + @Test - public void testGetConfigFileNum() { - Integer configFileNum = namespaceMonitorApi.getConfigFileNum(); - assertEquals(0, configFileNum.intValue()); + public void testGetConfigFileNamespaces() { + List configFileNamespaces = namespaceMonitorApi.getConfigFileNamespaces(); + assertEquals(0, configFileNamespaces.size()); } @Test diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientThreadPoolMonitorApiTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientThreadPoolMonitorApiTest.java index 2bd393f2..81f812c7 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientThreadPoolMonitorApiTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/NullClientThreadPoolMonitorApiTest.java @@ -17,9 +17,8 @@ package com.ctrip.framework.apollo.monitor.internal.listener.impl; import static org.junit.Assert.*; -import static org.mockito.Mockito.*; -import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientThreadPoolApi.ApolloThreadPoolInfo; +import com.ctrip.framework.apollo.monitor.api.ApolloClientThreadPoolMonitorApi.ApolloThreadPoolInfo; import org.junit.Before; import org.junit.Test; @@ -45,21 +44,8 @@ public void testGetThreadPoolInfo() { @Test public void testGetRemoteConfigRepositoryThreadPoolInfo() { ApolloThreadPoolInfo info = monitorApi.getRemoteConfigRepositoryThreadPoolInfo(); - - assertNull(info); - } - - @Test - public void testGetAbstractConfigThreadPoolInfo() { - ApolloThreadPoolInfo info = monitorApi.getAbstractConfigThreadPoolInfo(); - - assertNull(info); - } - - @Test - public void testGetAbstractConfigFileThreadPoolInfo() { - ApolloThreadPoolInfo info = monitorApi.getAbstractConfigFileThreadPoolInfo(); - - assertNull(info); + assertNotNull(info); + assertEquals(0, info.getPoolSize()); } + } diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/stress/ApolloClientMonitorStressTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/stress/ApolloClientMonitorStressTest.java index 4e4149e3..778bd527 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/stress/ApolloClientMonitorStressTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/stress/ApolloClientMonitorStressTest.java @@ -20,18 +20,19 @@ import com.ctrip.framework.apollo.ConfigService; import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEventFactory; +import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEventPublisher; import com.github.noconnor.junitperf.JUnitPerfRule; import com.github.noconnor.junitperf.JUnitPerfTest; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +@Ignore("Stress test") @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = ApolloClientMonitorStressTest.class) -@ActiveProfiles("stress-test") public class ApolloClientMonitorStressTest { @Rule @@ -40,14 +41,16 @@ public class ApolloClientMonitorStressTest { @Test @JUnitPerfTest(threads = 25, durationMs = 10000, warmUpMs = 1000, maxExecutionsPerSecond = 1000) public void testConfigMonitor() { - String exporterData = ConfigService.getConfigMonitor().getExporterData(); + System.out.println("abcdeft"); + ConfigService.getConfigMonitor().getExporterData(); } @Test @JUnitPerfTest(threads = 50, durationMs = 10000, warmUpMs = 1000, maxExecutionsPerSecond = 1000) public void testPublishEvent() { - ApolloClientMonitorEventFactory.getInstance() - .createEvent(APOLLO_CLIENT_NAMESPACE_USAGE) - .putAttachment(NAMESPACE, "application").publish(); + ApolloClientMonitorEventPublisher.publish( + ApolloClientMonitorEventFactory.getInstance() + .createEvent(APOLLO_CLIENT_NAMESPACE_USAGE) + .putAttachment(NAMESPACE, "application")); } } diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/util/ConfigUtilTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/util/ConfigUtilTest.java index 23a37362..18cda2dd 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/util/ConfigUtilTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/util/ConfigUtilTest.java @@ -255,6 +255,92 @@ public void testCustomizePropertiesOrdered() { configUtil.isPropertiesOrderEnabled()); } + @Test + public void testMonitorExternalType() { + String someMonitorExternalType = "someType"; + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_TYPE, someMonitorExternalType); + + ConfigUtil configUtil = new ConfigUtil(); + + assertEquals(someMonitorExternalType, configUtil.getMonitorExternalType()); + } + + @Test + public void testCustomizeMonitorExternalCollectPeriod() { + int somePeriod = 5; + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_EXPORT_PERIOD, String.valueOf(somePeriod)); + + ConfigUtil configUtil = new ConfigUtil(); + + assertEquals(somePeriod, configUtil.getMonitorExternalExportPeriod()); + } + + @Test + public void testCustomizeInvalidMonitorExternalCollectPeriod() { + String someInvalidPeriod = "a"; + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_EXPORT_PERIOD, someInvalidPeriod); + + ConfigUtil configUtil = new ConfigUtil(); + + assertEquals(10, configUtil.getMonitorExternalExportPeriod()); // Default value + } + + @Test + public void testClientMonitorEnabled() { + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_ENABLED, "true"); + + ConfigUtil configUtil = new ConfigUtil(); + + assertTrue(configUtil.isClientMonitorEnabled()); + } + + @Test + public void testClientMonitorEnabledDefault() { + System.clearProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_ENABLED); + + ConfigUtil configUtil = new ConfigUtil(); + + assertFalse(configUtil.isClientMonitorEnabled()); // Default value + } + + @Test + public void testClientMonitorJmxEnabled() { + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_JMX_ENABLED, "true"); + + ConfigUtil configUtil = new ConfigUtil(); + + assertTrue(configUtil.isClientMonitorJmxEnabled()); + } + + @Test + public void testClientMonitorJmxEnabledDefault() { + System.clearProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_JMX_ENABLED); + + ConfigUtil configUtil = new ConfigUtil(); + + assertFalse(configUtil.isClientMonitorJmxEnabled()); // Default value + } + + @Test + public void testCustomizeMonitorExceptionQueueSize() { + int someQueueSize = 10; + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE, String.valueOf(someQueueSize)); + + ConfigUtil configUtil = new ConfigUtil(); + + assertEquals(someQueueSize, configUtil.getMonitorExceptionQueueSize()); + } + + @Test + public void testCustomizeInvalidMonitorExceptionQueueSize() { + String someInvalidQueueSize = "a"; + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE, someInvalidQueueSize); + + ConfigUtil configUtil = new ConfigUtil(); + + assertEquals(25, configUtil.getMonitorExceptionQueueSize()); // Default value + } + @Test public void test() { ConfigUtil configUtil = new ConfigUtil(); diff --git a/apollo-client/src/test/resources/application-stress-test.yml b/apollo-client/src/test/resources/application-stress-test.yml deleted file mode 100644 index 430bf695..00000000 --- a/apollo-client/src/test/resources/application-stress-test.yml +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright 2022 Apollo Authors -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# just for apollo client monitor stress test \ No newline at end of file diff --git a/apollo-plugin/apollo-plugin-client-prometheus/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/PrometheusApolloClientMetricsExporter.java b/apollo-plugin/apollo-plugin-client-prometheus/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/PrometheusApolloClientMetricsExporter.java index d6f56401..a07e3209 100644 --- a/apollo-plugin/apollo-plugin-client-prometheus/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/PrometheusApolloClientMetricsExporter.java +++ b/apollo-plugin/apollo-plugin-client-prometheus/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/PrometheusApolloClientMetricsExporter.java @@ -20,6 +20,7 @@ import com.ctrip.framework.apollo.monitor.internal.exporter.AbstractApolloClientMetricsExporter; import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporter; import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientNamespaceApi; +import com.google.common.collect.Maps; import io.prometheus.client.Collector; import io.prometheus.client.CollectorRegistry; import io.prometheus.client.Counter; @@ -41,12 +42,12 @@ public class PrometheusApolloClientMetricsExporter extends private final Logger logger = DeferredLoggerFactory.getLogger( DefaultApolloClientNamespaceApi.class); protected CollectorRegistry registry; - protected Map map; + protected Map map; @Override public void doInit() { registry = new CollectorRegistry(); - map = new HashMap<>(); + map = Maps.newConcurrentMap(); } @Override @@ -58,11 +59,8 @@ public boolean isSupport(String form) { @Override public void registerOrUpdateCounterSample(String name, Map tags, double incrValue) { - Counter counter = (Counter) map.get(name); - if (counter == null) { - counter = createCounter(name, tags); - map.put(name, counter); - } + Counter counter = (Counter) map.computeIfAbsent(name, + key -> createCounter(key, tags)); counter.labels(tags.values().toArray(new String[0])).inc(incrValue); } @@ -76,11 +74,7 @@ private Counter createCounter(String name, Map tags) { @Override public void registerOrUpdateGaugeSample(String name, Map tags, double value) { - Gauge gauge = (Gauge) map.get(name); - if (gauge == null) { - gauge = createGauge(name, tags); - map.put(name, gauge); - } + Gauge gauge = (Gauge) map.computeIfAbsent(name, key -> createGauge(key, tags)); gauge.labels(tags.values().toArray(new String[0])).set(value); } diff --git a/apollo-plugin/apollo-plugin-client-prometheus/src/main/java/com/ctrip/framework/apollo/plugin/prometheus/PrometheusApolloClientMetricsExporter.java b/apollo-plugin/apollo-plugin-client-prometheus/src/main/java/com/ctrip/framework/apollo/plugin/prometheus/PrometheusApolloClientMetricsExporter.java deleted file mode 100644 index df518054..00000000 --- a/apollo-plugin/apollo-plugin-client-prometheus/src/main/java/com/ctrip/framework/apollo/plugin/prometheus/PrometheusApolloClientMetricsExporter.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright 2022 Apollo Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package com.ctrip.framework.apollo.plugin.prometheus; - -import com.ctrip.framework.apollo.core.utils.DeferredLoggerFactory; -import com.ctrip.framework.apollo.monitor.internal.exporter.AbstractApolloClientMetricsExporter; -import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporter; -import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientNamespaceApi; -import io.prometheus.client.Collector; -import io.prometheus.client.CollectorRegistry; -import io.prometheus.client.Counter; -import io.prometheus.client.Gauge; -import io.prometheus.client.exporter.common.TextFormat; -import java.io.IOException; -import java.io.StringWriter; -import java.util.HashMap; -import java.util.Map; -import org.slf4j.Logger; - -/** - * @author Rawven - */ -public class PrometheusApolloClientMetricsExporter extends - AbstractApolloClientMetricsExporter implements ApolloClientMetricsExporter { - private final Logger logger = DeferredLoggerFactory.getLogger( - DefaultApolloClientNamespaceApi.class); - private static final String PROMETHEUS = "prometheus"; - private final CollectorRegistry registry; - private final Map map = new HashMap<>(); - - - public PrometheusApolloClientMetricsExporter() { - this.registry = new CollectorRegistry(); - } - - @Override - public void doInit() { - - } - - @Override - public boolean isSupport(String form) { - return PROMETHEUS.equals(form); - } - - - @Override - public void registerOrUpdateCounterSample(String name, Map tags, double incrValue) { - Counter counter = (Counter) map.computeIfAbsent(name, k -> Counter.build() - .name(name) - .help("apollo") - .labelNames(tags.keySet().toArray(new String[0])) - .register(registry)); - counter.labels(tags.values().toArray(new String[0])).inc(incrValue); -} - - - @Override - public void registerOrUpdateGaugeSample(String name, Map tags, double value) { - Gauge gauge = (Gauge) map.computeIfAbsent(name, k -> Gauge.build() - .name(name) - .help("apollo") - .labelNames(tags.keySet().toArray(new String[0])) - .register(registry)); - gauge.labels(tags.values().toArray(new String[0])).set(value); - } - - - @Override - public String response() { - try (StringWriter writer = new StringWriter()){ - TextFormat.writeFormat(TextFormat.CONTENT_TYPE_OPENMETRICS_100, writer, registry.metricFamilySamples()); - return writer.toString(); - } catch (IOException e) { - logger.error("Write metrics to Prometheus format failed", e); - return ""; - } - } -} - \ No newline at end of file