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..c42fb4ac 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,13 @@ 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.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 +36,72 @@ 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 - ); + monitorContext.setApolloClientMetricsExporter( + exporterFactory.getMetricsReporter(monitorContext.getCollectors())); } public static ApolloClientMessageProducerComposite initializeMessageProducerComposite() { List producers = ServiceBootstrap.loadAllOrdered(MessageProducer.class); - if (CONFIG_UTIL.getClientMonitorEnabled()) { + if (m_configUtil.isClientMonitorEnabled()) { producers.add(new ApolloClientMonitorMessageProducer()); } @@ -139,11 +115,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..6f457ad8 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,7 @@ */ package com.ctrip.framework.apollo.monitor.api; +import java.util.Collections; import java.util.Map; /** @@ -24,65 +25,113 @@ public interface ApolloClientBootstrapArgsMonitorApi { /** - * get bootstrap args map + * get startup params by key */ - Map getBootstrapArgs(); + default String getStartupArg(String key) { + return getBootstrapArgs().get(key); + } /** - * get startup params by key + * get bootstrap args map */ - String getStartupParams(String key); + default Map getBootstrapArgs() { + return Collections.emptyMap(); + } /** - * config service url + * config service url */ - String getConfigServiceUrl(); + default String getConfigServiceUrl() { + return ""; + } /** - * access key secret + * access key secret */ - String getAccessKeySecret(); + default String getAccessKeySecret() { + return ""; + } /** * auto update injected spring properties */ - Boolean getAutoUpdateInjectedSpringProperties(); + default Boolean getAutoUpdateInjectedSpringProperties() { + return false; + } - Boolean getBootstrapEnabled(); + default Boolean isBootstrapEnabled() { + return false; + } - String getBootstrapNamespaces(); + default String getBootstrapNamespaces() { + return ""; + } - Boolean getBootstrapEagerLoadEnabled(); + default Boolean isBootstrapEagerLoadEnabled() { + return false; + } - Boolean getOverrideSystemProperties(); + default Boolean isOverrideSystemProperties() { + return false; + } - String getCacheDir(); + default String getCacheDir() { + return ""; + } - String getCluster(); + default String getCluster() { + return ""; + } - String getConfigService(); + default String getConfigService() { + return ""; + } - Boolean getClientMonitorEnabled(); + default Boolean isClientMonitorEnabled() { + return false; + } - Boolean getClientMonitorJmxEnabled(); + default Boolean isClientMonitorJmxEnabled() { + return false; + } - String getClientMonitorExternalForm(); + default String getClientMonitorExternalForm() { + return ""; + } - long getClientMonitorExternalExportPeriod(); + default long getClientMonitorExternalExportPeriod() { + return 0; + } - int getClientMonitorExceptionSaveSize(); + default int getClientMonitorExceptionSaveSize() { + return 0; + } - String getApolloMeta(); + default String getApolloMeta() { + return ""; + } - String getMetaLatestFreshTime(); + default String getMetaLatestFreshTime() { + return ""; + } - Boolean getPropertyNamesCacheEnable(); + default Boolean isPropertyNamesCacheEnable() { + return false; + } - Boolean getPropertyOrderEnable(); + default Boolean isPropertyOrderEnable() { + return false; + } - String getVersion(); + default String getVersion() { + return ""; + } - String getEnv(); + default String getEnv() { + return ""; + } - String getAppId(); + default String getAppId() { + return ""; + } } 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..7db023cd 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,9 +16,10 @@ */ 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; +import java.util.Set; /** * @author Rawven @@ -31,14 +32,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 +52,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..6d8f4a8b 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,51 @@ public interface ApolloClientThreadPoolMonitorApi { * AbstractApolloClientMetricsExporter.m_executorService */ ApolloThreadPoolInfo getMetricsExporterThreadPoolInfo(); + + + 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 getQueueRemainingCapacity() { + return executor.getQueue().remainingCapacity(); + } + + } } 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..ba42a480 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 @@ -72,22 +72,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..c42b693b --- /dev/null +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorContext.java @@ -0,0 +1,97 @@ +/* + * 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.ArrayList; +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..6123f06e 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,6 +16,7 @@ */ 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; @@ -35,46 +36,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..3cdd0ca1 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 @@ -65,10 +65,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..027019e4 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,12 +26,12 @@ */ 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()) { + public static void onApolloClientMonitorEvent(ApolloClientMonitorEvent event) { + if (m_configUtil.isClientMonitorEnabled()) { for (ApolloClientMonitorEventListener collector : COLLECTOR_MANAGER.getCollectors()) { if (collector.isSupport(event)) { collector.collect(event); @@ -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..960edf27 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,9 +33,9 @@ */ 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; @@ -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/jmx/mbean/ApolloClientJmxNamespaceMBean.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/jmx/mbean/ApolloClientJmxNamespaceMBean.java index 569a6a2a..81cd41ef 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 @@ -17,12 +17,42 @@ package com.ctrip.framework.apollo.monitor.internal.jmx.mbean; import com.ctrip.framework.apollo.monitor.api.ApolloClientNamespaceMonitorApi; +import com.ctrip.framework.apollo.monitor.api.ApolloClientNamespaceMonitorApi.NamespaceMetrics; +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 NamespaceMetrics 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(); } 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..a2899aef 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,14 @@ 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.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; /** - * 抽象的 Metrics 收集器 用于收集数据和导出指标样本 - * * @author Rawven */ public abstract class AbstractApolloClientMonitorEventListener implements @@ -44,7 +45,7 @@ public AbstractApolloClientMonitorEventListener(String tag) { } @Override - public String mBeanName() { + public String getName() { return tag; } @@ -71,42 +72,70 @@ 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) { + if (!counterSamples.containsKey(mapKey)) { + counterSamples.put(mapKey, + (CounterModel) CounterModel.create(metricsName, 0) + .putTags(getTags(tagKeys, tagValues))); + } + counterSamples.get(mapKey).increase(value); + } else { + if (!gaugeSamples.containsKey(mapKey)) { + gaugeSamples.put(mapKey, + (GaugeModel) GaugeModel.create(metricsName, 0).putTags(getTags(tagKeys, tagValues))); + } + gaugeSamples.get(mapKey).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..364bb322 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,7 +29,7 @@ public interface ApolloClientMonitorEventListener { /** * mbean name */ - String mBeanName(); + String getName(); /** * is support the 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..1ae5b69f 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()); @@ -97,11 +96,6 @@ public boolean isMetricsSampleUpdated() { return false; } - @Override - public String getStartupParams(String key) { - return Optional.ofNullable(bootstrapArgs.get(key)).orElse("").toString(); - } - @Override public String getConfigServiceUrl() { return bootstrapArgs.get(CONFIG_SERVICE_URL).toString(); @@ -119,7 +113,7 @@ public Boolean getAutoUpdateInjectedSpringProperties() { } @Override - public Boolean getBootstrapEnabled() { + public Boolean isBootstrapEnabled() { return (Boolean) bootstrapArgs.get(APOLLO_BOOTSTRAP_ENABLED); } @@ -129,12 +123,12 @@ public String getBootstrapNamespaces() { } @Override - public Boolean getBootstrapEagerLoadEnabled() { + public Boolean isBootstrapEagerLoadEnabled() { return (Boolean) bootstrapArgs.get(APOLLO_BOOTSTRAP_EAGER_LOAD_ENABLED); } @Override - public Boolean getOverrideSystemProperties() { + public Boolean isOverrideSystemProperties() { return (Boolean) bootstrapArgs.get(APOLLO_OVERRIDE_SYSTEM_PROPERTIES); } @@ -159,12 +153,12 @@ public String getClientMonitorExternalForm() { } @Override - public Boolean getClientMonitorEnabled() { + public Boolean isClientMonitorEnabled() { return (Boolean) bootstrapArgs.get(APOLLO_CLIENT_MONITOR_ENABLED); } @Override - public Boolean getClientMonitorJmxEnabled() { + public Boolean isClientMonitorJmxEnabled() { return (Boolean) bootstrapArgs.get(APOLLO_CLIENT_MONITOR_JMX_ENABLED); } @@ -184,12 +178,12 @@ public String getApolloMeta() { } @Override - public Boolean getPropertyNamesCacheEnable() { + public Boolean isPropertyNamesCacheEnable() { return (Boolean) bootstrapArgs.get(APOLLO_PROPERTY_NAMES_CACHE_ENABLE); } @Override - public Boolean getPropertyOrderEnable() { + public Boolean isPropertyOrderEnable() { return (Boolean) bootstrapArgs.get(APOLLO_PROPERTY_ORDER_ENABLE); } 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..deb343f7 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,36 @@ 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 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..7860d593 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> result = Maps.newHashMap(); + namespaces.forEach((namespace, metrics) -> { + Map metricsMap = Maps.newHashMap(); + metricsMap.put("usageCount", String.valueOf(metrics.getUsageCount())); + metricsMap.put("firstLoadTimeSpendInMs", String.valueOf(metrics.getFirstLoadTimeSpendInMs())); + metricsMap.put("latestUpdateTime", metrics.getLatestUpdateTime().toString()); + metricsMap.put("releaseKey", metrics.getReleaseKey()); + result.put(namespace, metricsMap); + }); + return result; + } + + @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..571c4b63 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 @@ -68,26 +68,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 +129,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..e3b0836a 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 @@ -27,123 +27,4 @@ public class NullClientBootstrapArgsMonitorApi implements ApolloClientBootstrapArgsMonitorApi, 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() { - return Collections.emptyMap(); - } } 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..503f1d77 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,10 +18,10 @@ 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; +import java.util.Set; /** * @author Rawven @@ -46,13 +46,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..9d9d5e35 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; 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..ebefa5da 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,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; import com.google.common.util.concurrent.AtomicDouble; /** @@ -29,7 +29,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..84518be3 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 @@ -18,7 +18,7 @@ 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 +32,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 +52,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/ApolloClientMonitorMessageProducer.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/tracer/ApolloClientMonitorMessageProducer.java index 9397b5e5..5c7ff4e3 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,8 +21,8 @@ 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; @@ -69,13 +69,6 @@ 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: @@ -110,68 +103,76 @@ private void handleTaggedEvent(String type, String name) { } } + + private void publishErrorEvent(String tag, Throwable cause) { + ApolloClientMonitorEventPublisher.onApolloClientMonitorEvent( + ApolloClientMonitorEventFactory.getInstance().createEvent(tag) + .withTag(tag) + .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.onApolloClientMonitorEvent( + 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.onApolloClientMonitorEvent( + ApolloClientMonitorEventFactory.getInstance().createEvent(META_FRESH) + .withTag(TAG_BOOTSTRAP) + .putAttachment(META_FRESH, DATE_FORMATTER.format(Instant.now()))); } private void publishConfigServiceEvent(String name) { - ApolloClientMonitorEventFactory.getInstance().createEvent(CONFIG_SERVICE_URL) - .withTag(TAG_BOOTSTRAP) - .putAttachment(CONFIG_SERVICE_URL, name) - .publish(); + ApolloClientMonitorEventPublisher.onApolloClientMonitorEvent( + 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.onApolloClientMonitorEvent( + 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.onApolloClientMonitorEvent( + 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.onApolloClientMonitorEvent( + 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.onApolloClientMonitorEvent( + 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.onApolloClientMonitorEvent( + ApolloClientMonitorEventFactory.getInstance() + .createEvent(APOLLO_CLIENT_NAMESPACE_FIRST_LOAD_SPEND) + .putAttachment(NAMESPACE, namespace) + .putAttachment(TIMESTAMP, firstLoadTime) + .withTag(TAG_NAMESPACE)); } @Override @@ -183,10 +184,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.onApolloClientMonitorEvent( + 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..ec2bb85f 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 @@ -543,7 +543,7 @@ private void initClientMonitorEnabled() { clientMonitorEnabled = Boolean.parseBoolean(enabled); } - public boolean getClientMonitorEnabled() { + public boolean isClientMonitorEnabled() { return clientMonitorEnabled; } @@ -555,7 +555,7 @@ private void initClientMonitorJmxEnabled() { } clientMonitorJmxEnabled = Boolean.parseBoolean(enabled); } - public boolean getClientMonitorJmxEnabled() { + public boolean isClientMonitorJmxEnabled() { return clientMonitorJmxEnabled; } private void initClientMonitorExceptionQueueSize() { @@ -566,6 +566,9 @@ private void initClientMonitorExceptionQueueSize() { } } public int getMonitorExceptionQueueSize() { + if(monitorExceptionQueueSize <= 0){ + monitorExceptionQueueSize = 25; + } return monitorExceptionQueueSize; } 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 deleted file mode 100644 index 6db638c7..00000000 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/internals/ConfigMonitorInitializerTest.java +++ /dev/null @@ -1,117 +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.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.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 - } - - @Test - public void testInitialize_WhenAlreadyInitialized() { - ConfigMonitorInitializer.hasInitialized = true; - - 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); - - ConfigMonitorInitializer.initializeJmxMonitoring(collectors); - verify(metricsCollector).mBeanName(); - } - -} \ No newline at end of file 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 deleted file mode 100644 index beeaf45c..00000000 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/DefaultConfigMonitorTest.java +++ /dev/null @@ -1,90 +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; - -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; - -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 org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -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; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - 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(); - } - - @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" - } -} \ 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..29baa6c9 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,51 +29,51 @@ 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); - ApolloClientMonitorEventPublisher.publish(mockEvent); + ApolloClientMonitorEventPublisher.onApolloClientMonitorEvent(mockEvent); verify(mockCollector).collect(mockEvent); } @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); - ApolloClientMonitorEventPublisher.publish(mockEvent); + ApolloClientMonitorEventPublisher.onApolloClientMonitorEvent(mockEvent); verify(mockCollector, never()).collect(mockEvent); } @Test public void testPublish_WhenClientMonitorDisabled() { - when(mockConfigUtil.getClientMonitorEnabled()).thenReturn(false); + when(mockConfigUtil.isClientMonitorEnabled()).thenReturn(false); - ApolloClientMonitorEventPublisher.publish(mockEvent); + ApolloClientMonitorEventPublisher.onApolloClientMonitorEvent(mockEvent); verify(mockCollectorManager, never()).getCollectors(); } 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/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..4be3c9d7 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 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..19456859 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; 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..9d29edba 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,8 +20,10 @@ 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; @@ -29,9 +31,9 @@ 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 +42,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.onApolloClientMonitorEvent( + ApolloClientMonitorEventFactory.getInstance() + .createEvent(APOLLO_CLIENT_NAMESPACE_USAGE) + .putAttachment(NAMESPACE, "application")); } } 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