diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/ConfigManager.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/ConfigManager.java index 0fedcbea..e7252a58 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/ConfigManager.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/internals/ConfigManager.java @@ -38,4 +38,6 @@ public interface ConfigManager { * @return the config file instance for the namespace */ ConfigFile getConfigFile(String namespace, ConfigFileFormat configFileFormat); + + } 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 20ab2640..f3eec9a5 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 @@ -24,6 +24,7 @@ import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporter; import com.ctrip.framework.apollo.monitor.internal.jmx.ApolloClientJmxMBeanRegister; import com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorContext; +import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListener; import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientBootstrapArgsApi; import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientExceptionApi; import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientNamespaceApi; @@ -37,6 +38,7 @@ 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; /** @@ -64,31 +66,37 @@ private static void doInit() { initializeMetricsEventListener(); initializeMetricsExporter(); initializeJmxMonitoring(); - hasInitialized = true; } private static void initializeJmxMonitoring() { if (m_configUtil.isClientMonitorJmxEnabled()) { - monitorContext.getCollectors().forEach(metricsCollector -> + monitorContext.getApolloClientMonitorEventListeners().forEach(metricsListener -> ApolloClientJmxMBeanRegister.register( - MBEAN_NAME + metricsCollector.getName(), metricsCollector) + MBEAN_NAME + metricsListener.getName(), metricsListener) ); } } private static void initializeMetricsEventListener() { - DefaultConfigManager configManager = (DefaultConfigManager) ApolloInjector.getInstance( + ConfigManager configManager = ApolloInjector.getInstance( ConfigManager.class); - monitorContext.setApolloClientBootstrapArgsMonitorApi(new DefaultApolloClientBootstrapArgsApi( - m_configUtil)); - monitorContext.setApolloClientExceptionMonitorApi(new DefaultApolloClientExceptionApi()); - monitorContext.setApolloClientNamespaceMonitorApi(new DefaultApolloClientNamespaceApi( - configManager.m_configs, configManager.m_configFiles)); - monitorContext.setApolloClientThreadPoolMonitorApi(new DefaultApolloClientThreadPoolApi( + DefaultApolloClientBootstrapArgsApi defaultApolloClientBootstrapArgsApi = new DefaultApolloClientBootstrapArgsApi( + m_configUtil); + DefaultApolloClientExceptionApi defaultApolloClientExceptionApi = new DefaultApolloClientExceptionApi(); + DefaultApolloClientNamespaceApi defaultApolloClientNamespaceApi = new DefaultApolloClientNamespaceApi( + configManager); + DefaultApolloClientThreadPoolApi defaultApolloClientThreadPoolApi = new DefaultApolloClientThreadPoolApi( RemoteConfigRepository.m_executorService, AbstractConfig.m_executorService, AbstractConfigFile.m_executorService, - AbstractApolloClientMetricsExporter.m_executorService)); + AbstractApolloClientMetricsExporter.m_executorService); + + monitorContext.setApolloClientBootstrapArgsMonitorApi(defaultApolloClientBootstrapArgsApi); + monitorContext.setApolloClientExceptionMonitorApi(defaultApolloClientExceptionApi); + monitorContext.setApolloClientNamespaceMonitorApi(defaultApolloClientNamespaceApi); + monitorContext.setApolloClientThreadPoolMonitorApi(defaultApolloClientThreadPoolApi); + monitorContext.setApolloClientMonitorEventListeners(Lists.newArrayList(defaultApolloClientBootstrapArgsApi, + defaultApolloClientNamespaceApi,defaultApolloClientThreadPoolApi,defaultApolloClientExceptionApi)); } private static void initializeMetricsExporter( @@ -96,7 +104,7 @@ private static void initializeMetricsExporter( ApolloClientMetricsExporterFactory exporterFactory = ApolloInjector.getInstance( ApolloClientMetricsExporterFactory.class); ApolloClientMetricsExporter metricsReporter = exporterFactory.getMetricsReporter( - monitorContext.getCollectors()); + monitorContext.getApolloClientMonitorEventListeners()); if(metricsReporter != null) { monitorContext.setApolloClientMetricsExporter(metricsReporter); } 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 78ac35f3..9ad07d0e 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 @@ -35,11 +35,6 @@ public interface ApolloClientNamespaceMonitorApi { */ Integer getNamespacePropertySize(String namespace); - /** - * get ConfigFile namespaces - */ - List getConfigFileNamespaces(); - /** * get not found namespaces */ 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 68512392..9ca7f9fa 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorConstant.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorConstant.java @@ -24,12 +24,6 @@ */ public class ApolloClientMonitorConstant { - /** - * util - */ - public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern( - "yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()); - /** * common */ @@ -61,7 +55,7 @@ public class ApolloClientMonitorConstant { public static final String APOLLO_CLIENT_NAMESPACE_FIRST_LOAD_SPEND = "Apollo.Client.NamespaceFirstLoadSpendTime"; /** - * collector tag + * listener tag */ public static final String TAG_ERROR = "ErrorMonitor"; public static final String TAG_NAMESPACE = "NamespaceMonitor"; 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 index a036a2a2..6ed15ad1 100644 --- 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 @@ -40,7 +40,20 @@ public class ApolloClientMonitorContext { private ApolloClientBootstrapArgsMonitorApi apolloClientBootstrapArgsMonitorApi = new NullClientBootstrapArgsMonitorApi(); private ApolloClientThreadPoolMonitorApi apolloClientThreadPoolMonitorApi = new NullClientThreadPoolMonitorApi(); private ApolloClientMetricsExporter apolloClientMetricsExporter = new NullApolloClientMetricsExporter(); - + private List listener = Lists.newArrayList(); + + public void addApolloClientMonitorEventListener(ApolloClientMonitorEventListener listener){ + this.listener.add(listener); + } + + public void setApolloClientMonitorEventListeners(List listeners){ + listener = listeners; + } + + public List getApolloClientMonitorEventListeners(){ + return listener; + } + public void setApolloClientExceptionMonitorApi( ApolloClientExceptionMonitorApi apolloClientExceptionMonitorApi) { this.apolloClientExceptionMonitorApi = apolloClientExceptionMonitorApi; @@ -66,14 +79,6 @@ public void setApolloClientMetricsExporter( this.apolloClientMetricsExporter = apolloClientMetricsExporter; } - public List getCollectors() { - return Lists.newArrayList( - (ApolloClientMonitorEventListener) apolloClientBootstrapArgsMonitorApi, - (ApolloClientMonitorEventListener) apolloClientThreadPoolMonitorApi, - (ApolloClientMonitorEventListener) apolloClientExceptionMonitorApi, - (ApolloClientMonitorEventListener) apolloClientNamespaceMonitorApi); - } - public ApolloClientExceptionMonitorApi getExceptionApi() { return apolloClientExceptionMonitorApi; } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEventFactory.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEventFactory.java index 30865c6b..0bd51ecf 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEventFactory.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/event/ApolloClientMonitorEventFactory.java @@ -24,7 +24,7 @@ */ public class ApolloClientMonitorEventFactory { - public static volatile ApolloClientMonitorEventFactory INSTANCE; + private static volatile ApolloClientMonitorEventFactory INSTANCE; private ApolloClientMonitorEventFactory() { } 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 e6843a72..7e11b0bb 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 @@ -26,15 +26,15 @@ */ public class ApolloClientMonitorEventPublisher { - private static ApolloClientMonitorContext COLLECTOR_MANAGER = ApolloInjector.getInstance( + private static ApolloClientMonitorContext MONITOR_CONTEXT = ApolloInjector.getInstance( ApolloClientMonitorContext.class); private static ConfigUtil m_configUtil = ApolloInjector.getInstance(ConfigUtil.class); public static void publish(ApolloClientMonitorEvent event) { if (m_configUtil.isClientMonitorEnabled()) { - for (ApolloClientMonitorEventListener collector : COLLECTOR_MANAGER.getCollectors()) { - if (collector.isSupported(event)) { - collector.collect(event); + for (ApolloClientMonitorEventListener listener : MONITOR_CONTEXT.getApolloClientMonitorEventListeners()) { + if (listener.isSupported(event)) { + listener.collect(event); return; } } @@ -42,7 +42,7 @@ public static void publish(ApolloClientMonitorEvent event) { } protected static void reset() { - COLLECTOR_MANAGER = ApolloInjector.getInstance( + MONITOR_CONTEXT = ApolloInjector.getInstance( 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 50550ad5..d5f677b4 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 @@ -44,14 +44,14 @@ public abstract class AbstractApolloClientMetricsExporter implements ApolloClien ApolloThreadFactory.create(ApolloClientMetricsExporter.class.getName(), true)); } - protected List collectors; + protected List listeners; @Override - public void init(List collectors, long collectPeriod) { - log.info("Initializing metrics exporter with {} collectors and collect period of {} seconds.", - collectors.size(), collectPeriod); + public void init(List listeners, long collectPeriod) { + log.info("Initializing metrics exporter with {} listeners and collect period of {} seconds.", + listeners.size(), collectPeriod); doInit(); - this.collectors = collectors; + this.listeners = listeners; initScheduleMetricsCollectSync(collectPeriod); log.info("Metrics collection scheduled with a period of {} seconds.", collectPeriod); } @@ -73,10 +73,10 @@ private void initScheduleMetricsCollectSync(long collectPeriod) { protected void updateMetricsData() { log.debug("Start to update metrics data job"); - collectors.forEach(collector -> { - if (collector.isMetricsSampleUpdated()) { - log.debug("Collector {} has updated samples.", collector.getName()); - collector.export().forEach(this::registerSample); + listeners.forEach(listeners -> { + if (listeners.isMetricsSampleUpdated()) { + log.debug("Listener {} has updated samples.", listeners.getName()); + listeners.export().forEach(this::registerSample); } }); } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/ApolloClientMetricsExporter.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/ApolloClientMetricsExporter.java index c9913633..83f32b5c 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/ApolloClientMetricsExporter.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/ApolloClientMetricsExporter.java @@ -29,7 +29,7 @@ public interface ApolloClientMetricsExporter extends Ordered { /** * init method */ - void init(List collectors, long collectPeriod); + void init(List listeners, long collectPeriod); /** * Used to access custom monitoring systems diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/ApolloClientMetricsExporterFactory.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/ApolloClientMetricsExporterFactory.java index a59ab930..f00aec67 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/ApolloClientMetricsExporterFactory.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/ApolloClientMetricsExporterFactory.java @@ -24,5 +24,5 @@ */ public interface ApolloClientMetricsExporterFactory { - ApolloClientMetricsExporter getMetricsReporter(List collectors); + ApolloClientMetricsExporter getMetricsReporter(List listeners); } diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/DefaultApolloClientMetricsExporterFactory.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/DefaultApolloClientMetricsExporterFactory.java index a9a280e9..d8ba640d 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/DefaultApolloClientMetricsExporterFactory.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/DefaultApolloClientMetricsExporterFactory.java @@ -40,18 +40,18 @@ public class DefaultApolloClientMetricsExporterFactory implements @Override public ApolloClientMetricsExporter getMetricsReporter( - List collectors) { + List listeners) { String externalSystemType = configUtil.getMonitorExternalType(); - if (externalSystemType == null) { + if (externalSystemType.equals("NONE")) { return null; } - return findAndInitializeExporter(collectors, externalSystemType); + return findAndInitializeExporter(listeners, externalSystemType); } private ApolloClientMetricsExporter findAndInitializeExporter( - List collectors, String externalSystemType) { + List listeners, String externalSystemType) { List exporters = ServiceBootstrap.loadAllOrdered( ApolloClientMetricsExporter.class); ApolloClientMetricsExporter reporter = exporters.stream() @@ -60,7 +60,7 @@ private ApolloClientMetricsExporter findAndInitializeExporter( .orElse(null); if (reporter != null) { - reporter.init(collectors, configUtil.getMonitorExternalExportPeriod()); + reporter.init(listeners, configUtil.getMonitorExternalExportPeriod()); } else { String errorMessage = "No matching exporter found with monitor-external-type " + externalSystemType; diff --git a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/NullApolloClientMetricsExporter.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/NullApolloClientMetricsExporter.java index 237f024f..46a3657b 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/NullApolloClientMetricsExporter.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/exporter/impl/NullApolloClientMetricsExporter.java @@ -33,7 +33,7 @@ public class NullApolloClientMetricsExporter implements ApolloClientMetricsExpor AbstractApolloClientMetricsExporter.class); @Override - public void init(List collectors, long collectPeriod) { + public void init(List listeners, long collectPeriod) { } @Override 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 1290344a..2877915e 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 @@ -38,11 +38,6 @@ public interface ApolloClientJmxNamespaceMBean { */ Integer getNamespacePropertySize(String namespace); - /** - * get ConfigFile namespaces - */ - List getConfigFileNamespaces(); - /** * get not found namespaces */ 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 a28ee09f..b6527b8b 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 @@ -22,6 +22,7 @@ import com.ctrip.framework.apollo.Config; import com.ctrip.framework.apollo.ConfigFile; import com.ctrip.framework.apollo.core.utils.DeferredLoggerFactory; +import com.ctrip.framework.apollo.internals.ConfigManager; 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.ApolloClientMonitorConstant; @@ -46,18 +47,15 @@ public class DefaultApolloClientNamespaceApi extends private static final Logger logger = DeferredLoggerFactory.getLogger( DefaultApolloClientNamespaceApi.class); - private final Map m_configs; - private final Map m_configFiles; + private final ConfigManager configManager; private final Map namespaces = Maps.newConcurrentMap(); private final Set namespace404 = Sets.newCopyOnWriteArraySet(); private final Set namespaceTimeout = Sets.newCopyOnWriteArraySet(); - public DefaultApolloClientNamespaceApi(Map m_configs, - Map m_configFiles + public DefaultApolloClientNamespaceApi(ConfigManager configManager ) { super(TAG_NAMESPACE); - this.m_configs = m_configs; - this.m_configFiles = m_configFiles; + this.configManager = configManager; } @Override @@ -152,13 +150,9 @@ public void export0() { createOrUpdateGaugeSample( METRICS_NAMESPACE_ITEM_NUM, new String[]{NAMESPACE}, new String[]{namespace}, - m_configs.get(namespace).getPropertyNames().size()); + configManager.getConfig(namespace).getPropertyNames().size()); }); - // update ConfigFile num - createOrUpdateGaugeSample(METRICS_CONFIG_FILE_NUM, - m_configFiles.size()); - // update NamespaceStatus metrics createOrUpdateGaugeSample(METRICS_NAMESPACE_NOT_FOUND, namespace404.size()); @@ -198,13 +192,8 @@ public Map getNamespaceMetricsString() { @Override public Integer getNamespacePropertySize(String namespace) { - Config config = m_configs.get(namespace); + Config config = configManager.getConfig(namespace); return (config != null) ? config.getPropertyNames().size() : 0; } - @Override - public List getConfigFileNamespaces() { - return new ArrayList<>(m_configFiles.keySet()); - } - } 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 9585823b..70a9b2ae 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 @@ -54,9 +54,4 @@ 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/tracer/ApolloClientMonitorMessageProducer.java b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/tracer/ApolloClientMonitorMessageProducer.java index 6fb681c7..b744ce2d 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/tracer/ApolloClientMonitorMessageProducer.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/monitor/internal/tracer/ApolloClientMonitorMessageProducer.java @@ -25,7 +25,8 @@ import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEventPublisher; import com.ctrip.framework.apollo.tracer.spi.MessageProducer; import com.ctrip.framework.apollo.tracer.spi.Transaction; -import java.time.Instant; + +import java.time.LocalDate; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -50,12 +51,12 @@ public class ApolloClientMonitorMessageProducer implements MessageProducer { @Override public void logError(Throwable cause) { - publishErrorEvent(TAG_ERROR, cause); + publishErrorEvent(cause); } @Override public void logError(String message, Throwable cause) { - publishErrorEvent(TAG_ERROR, cause); + publishErrorEvent(cause); } @Override @@ -104,10 +105,10 @@ private void handleTaggedEvent(String type, String name) { } - private void publishErrorEvent(String tag, Throwable cause) { + private void publishErrorEvent(Throwable cause) { ApolloClientMonitorEventPublisher.publish( - ApolloClientMonitorEventFactory.getInstance().createEvent(tag) - .withTag(tag) + ApolloClientMonitorEventFactory.getInstance().createEvent(TAG_ERROR) + .withTag(TAG_ERROR) .putAttachment(THROWABLE, cause)); } @@ -123,7 +124,7 @@ private void publishMetaServiceEvent() { ApolloClientMonitorEventPublisher.publish( ApolloClientMonitorEventFactory.getInstance().createEvent(META_FRESH) .withTag(TAG_BOOTSTRAP) - .putAttachment(META_FRESH, DATE_FORMATTER.format(Instant.now()))); + .putAttachment(META_FRESH, LocalDate.now().toString())); } private void publishConfigServiceEvent(String name) { 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 ec2bb85f..48b6c440 100644 --- a/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java +++ b/apollo-client/src/main/java/com/ctrip/framework/apollo/util/ConfigUtil.java @@ -38,21 +38,18 @@ public class ConfigUtil { private static final Logger logger = LoggerFactory.getLogger(ConfigUtil.class); - private final RateLimiter warnLogRateLimiter; + /** * qps limit: discovery config service from meta *

* 1 times per second */ private int discoveryQPS = 1; - /** - * 1 second - */ + /** 1 second */ private int discoveryConnectTimeout = 1000; - /** - * 1 second - */ + /** 1 second */ private int discoveryReadTimeout = 1000; + private int refreshInterval = 5; private TimeUnit refreshIntervalTimeUnit = TimeUnit.MINUTES; private int connectTimeout = 1000; //1 second @@ -69,13 +66,14 @@ public class ConfigUtil { private TimeUnit configCacheExpireTimeUnit = TimeUnit.MINUTES;//1 minute private long longPollingInitialDelayInMills = 2000;//2 seconds private boolean autoUpdateInjectedSpringProperties = true; + private final RateLimiter warnLogRateLimiter; private boolean propertiesOrdered = false; private boolean propertyNamesCacheEnabled = false; private boolean propertyFileCacheEnabled = true; private boolean overrideSystemProperties = true; private boolean clientMonitorEnabled = false; private boolean clientMonitorJmxEnabled = false; - private String monitorExternalType = null; + private String monitorExternalType = "NONE"; private long monitorExternalExportPeriod = 10; private int monitorExceptionQueueSize = 25; @@ -100,19 +98,6 @@ public ConfigUtil() { initClientMonitorExceptionQueueSize(); } - - static Integer getCustomizedIntegerValue(String systemKey) { - String customizedValue = System.getProperty(systemKey); - if (!Strings.isNullOrEmpty(customizedValue)) { - try { - return Integer.parseInt(customizedValue); - } catch (Throwable ex) { - logger.error("Config for {} is invalid: {}", systemKey, customizedValue); - } - } - return null; - } - /** * Get the app id for the current application. * @@ -247,6 +232,18 @@ public TimeUnit getRefreshIntervalTimeUnit() { return refreshIntervalTimeUnit; } + static Integer getCustomizedIntegerValue(String systemKey) { + String customizedValue = System.getProperty(systemKey); + if (!Strings.isNullOrEmpty(customizedValue)) { + try { + return Integer.parseInt(customizedValue); + } catch (Throwable ex) { + logger.error("Config for {} is invalid: {}", systemKey, customizedValue); + } + } + return null; + } + private void initQPS() { { Integer value = getCustomizedIntegerValue("apollo.discoveryConnectTimeout"); @@ -353,8 +350,7 @@ private String getDeprecatedCustomizedCacheRoot() { } if (Strings.isNullOrEmpty(cacheRoot)) { // 2. Get from OS environment variable - cacheRoot = System.getenv( - ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR_ENVIRONMENT_VARIABLES); + cacheRoot = System.getenv(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR_ENVIRONMENT_VARIABLES); if (!Strings.isNullOrEmpty(cacheRoot)) { DeprecatedPropertyNotifyUtil .warn(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR_ENVIRONMENT_VARIABLES, @@ -363,8 +359,7 @@ private String getDeprecatedCustomizedCacheRoot() { } if (Strings.isNullOrEmpty(cacheRoot)) { // 3. Get from server.properties - cacheRoot = Foundation.server() - .getProperty(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR, null); + cacheRoot = Foundation.server().getProperty(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR, null); if (!Strings.isNullOrEmpty(cacheRoot)) { DeprecatedPropertyNotifyUtil.warn(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR, ApolloClientSystemConsts.APOLLO_CACHE_DIR); @@ -372,8 +367,7 @@ private String getDeprecatedCustomizedCacheRoot() { } if (Strings.isNullOrEmpty(cacheRoot)) { // 4. Get from app.properties - cacheRoot = Foundation.app() - .getProperty(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR, null); + cacheRoot = Foundation.app().getProperty(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR, null); if (!Strings.isNullOrEmpty(cacheRoot)) { DeprecatedPropertyNotifyUtil.warn(ApolloClientSystemConsts.DEPRECATED_APOLLO_CACHE_DIR, ApolloClientSystemConsts.APOLLO_CACHE_DIR); @@ -490,30 +484,30 @@ public boolean isOverrideSystemProperties() { } private void initPropertyNamesCacheEnabled() { - propertyNamesCacheEnabled = getPropertyBoolean( - ApolloClientSystemConsts.APOLLO_PROPERTY_NAMES_CACHE_ENABLE, - ApolloClientSystemConsts.APOLLO_PROPERTY_NAMES_CACHE_ENABLE_ENVIRONMENT_VARIABLES, - propertyNamesCacheEnabled); + propertyNamesCacheEnabled = getPropertyBoolean(ApolloClientSystemConsts.APOLLO_PROPERTY_NAMES_CACHE_ENABLE, + ApolloClientSystemConsts.APOLLO_PROPERTY_NAMES_CACHE_ENABLE_ENVIRONMENT_VARIABLES, + propertyNamesCacheEnabled); } private void initPropertyFileCacheEnabled() { propertyFileCacheEnabled = getPropertyBoolean(ApolloClientSystemConsts.APOLLO_CACHE_FILE_ENABLE, - ApolloClientSystemConsts.APOLLO_CACHE_FILE_ENABLE_ENVIRONMENT_VARIABLES, - propertyFileCacheEnabled); + ApolloClientSystemConsts.APOLLO_CACHE_FILE_ENABLE_ENVIRONMENT_VARIABLES, + propertyFileCacheEnabled); } private void initOverrideSystemProperties() { - overrideSystemProperties = getPropertyBoolean( - ApolloClientSystemConsts.APOLLO_OVERRIDE_SYSTEM_PROPERTIES, - ApolloClientSystemConsts.APOLLO_OVERRIDE_SYSTEM_PROPERTIES, - overrideSystemProperties); + overrideSystemProperties = getPropertyBoolean(ApolloClientSystemConsts.APOLLO_OVERRIDE_SYSTEM_PROPERTIES, + ApolloClientSystemConsts.APOLLO_OVERRIDE_SYSTEM_PROPERTIES, + overrideSystemProperties); } - + + private void initClientMonitorExternalType() { monitorExternalType = System.getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_TYPE); + if (Strings.isNullOrEmpty(monitorExternalType)) { monitorExternalType = Foundation.app() - .getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_TYPE, null); + .getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_TYPE, "NONE"); } } @@ -522,10 +516,15 @@ public String getMonitorExternalType() { } private void initClientMonitorExternalCollectPeriod() { - Integer value = getCustomizedIntegerValue( - ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_EXPORT_PERIOD); - if (null != value){ - monitorExternalExportPeriod = value; + Integer value = getCustomizedIntegerValue(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_EXPORT_PERIOD); + + if (value != null) { + if (value <= 0) { + logger.warn("Config for {} is invalid: {}, remain default value: 10", + ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_EXPORT_PERIOD, value); + } else { + monitorExternalExportPeriod = value; + } } } @@ -533,13 +532,14 @@ public long getMonitorExternalExportPeriod() { return monitorExternalExportPeriod; } - private void initClientMonitorEnabled() { String enabled = System.getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_ENABLED); + if (enabled == null) { enabled = Foundation.app() - .getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_ENABLED, "false"); + .getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_ENABLED, "false"); } + clientMonitorEnabled = Boolean.parseBoolean(enabled); } @@ -549,29 +549,36 @@ public boolean isClientMonitorEnabled() { private void initClientMonitorJmxEnabled() { String enabled = System.getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_JMX_ENABLED); + if (enabled == null) { enabled = Foundation.app() - .getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_JMX_ENABLED, "false"); + .getProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_JMX_ENABLED, "false"); } + clientMonitorJmxEnabled = Boolean.parseBoolean(enabled); } + public boolean isClientMonitorJmxEnabled() { return clientMonitorJmxEnabled; } + private void initClientMonitorExceptionQueueSize() { - Integer value = getCustomizedIntegerValue( - ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE); - if (null != value){ - monitorExceptionQueueSize = value; + Integer value = getCustomizedIntegerValue(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE); + + if (value != null) { + if (value <= 0) { + logger.warn("Config for {} is invalid: {}, remain default value: 25", + ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE, value); + } else { + monitorExceptionQueueSize = value; + } } } + public int getMonitorExceptionQueueSize() { - if(monitorExceptionQueueSize <= 0){ - monitorExceptionQueueSize = 25; - } return monitorExceptionQueueSize; } - + private boolean getPropertyBoolean(String propertyName, String envName, boolean defaultVal) { String enablePropertyNamesCache = System.getProperty(propertyName); if (Strings.isNullOrEmpty(enablePropertyNamesCache)) { @@ -585,9 +592,9 @@ private boolean getPropertyBoolean(String propertyName, String envName, boolean return Boolean.parseBoolean(enablePropertyNamesCache); } catch (Throwable ex) { logger.warn("Config for {} is invalid: {}, set default value: {}", - propertyName, enablePropertyNamesCache, defaultVal); + propertyName, enablePropertyNamesCache, defaultVal); } } return defaultVal; } -} +} \ No newline at end of file diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/internals/ConfigMonitorInitializerTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/internals/ConfigMonitorInitializerTest.java new file mode 100644 index 00000000..25be1005 --- /dev/null +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/internals/ConfigMonitorInitializerTest.java @@ -0,0 +1,86 @@ +/* + * 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 com.ctrip.framework.apollo.build.MockInjector; +import com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorContext; +import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporterFactory; +import com.ctrip.framework.apollo.util.ConfigUtil; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class ConfigMonitorInitializerTest { + + @Mock + private ConfigUtil mockConfigUtil; + @Mock + private ApolloClientMonitorContext mockMonitorContext; + @Mock + private ApolloClientMetricsExporterFactory mockExporterFactory; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + MockInjector.setInstance(ConfigUtil.class, mockConfigUtil); + MockInjector.setInstance(ApolloClientMonitorContext.class, mockMonitorContext); + MockInjector.setInstance(ApolloClientMetricsExporterFactory.class, mockExporterFactory); + resetConfigMonitorInitializer(); + } + + @Test + public void testInitializeWhenMonitorEnabledAndNotInitialized() { + when(mockConfigUtil.isClientMonitorEnabled()).thenReturn(true); + ConfigMonitorInitializer.initialize(); + assertTrue(ConfigMonitorInitializer.hasInitialized); + //ConfigMonitorInitializer.53line + DefaultApolloClientBootstrapArgsApi.64line + verify(mockConfigUtil, times(2)).isClientMonitorEnabled(); + } + + @Test + public void testInitializeWhenMonitorDisabled() { + when(mockConfigUtil.isClientMonitorEnabled()).thenReturn(false); + ConfigMonitorInitializer.initialize(); + assertFalse(ConfigMonitorInitializer.hasInitialized); + } + + @Test + public void testInitializeWhenAlreadyInitialized() { + when(mockConfigUtil.isClientMonitorEnabled()).thenReturn(true); + ConfigMonitorInitializer.hasInitialized = true; + ConfigMonitorInitializer.initialize(); + verify(mockConfigUtil, times(1)).isClientMonitorEnabled(); + } + + @Test + public void testReset() { + ConfigMonitorInitializer.reset(); + assertFalse(ConfigMonitorInitializer.hasInitialized); + } + + private void resetConfigMonitorInitializer() { + ConfigMonitorInitializer.reset(); + } + +} diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorContextTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorContextTest.java new file mode 100644 index 00000000..00d9145a --- /dev/null +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/ApolloClientMonitorContextTest.java @@ -0,0 +1,95 @@ +/* + * Copyright 2022 Apollo Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package com.ctrip.framework.apollo.monitor.internal; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import com.ctrip.framework.apollo.monitor.internal.exporter.ApolloClientMetricsExporter; +import com.ctrip.framework.apollo.monitor.internal.exporter.impl.NullApolloClientMetricsExporter; +import com.ctrip.framework.apollo.monitor.internal.listener.ApolloClientMonitorEventListener; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientBootstrapArgsApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientExceptionApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientNamespaceApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.DefaultApolloClientThreadPoolApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientBootstrapArgsMonitorApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientExceptionMonitorApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientNamespaceMonitorApi; +import com.ctrip.framework.apollo.monitor.internal.listener.impl.NullClientThreadPoolMonitorApi; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import java.util.List; + +public class ApolloClientMonitorContextTest { + + @Mock + private DefaultApolloClientExceptionApi exceptionMonitorApi; + @Mock + private DefaultApolloClientNamespaceApi namespaceMonitorApi; + @Mock + private DefaultApolloClientBootstrapArgsApi bootstrapArgsMonitorApi; + @Mock + private DefaultApolloClientThreadPoolApi threadPoolMonitorApi; + @Mock + private ApolloClientMetricsExporter metricsExporter; + + private ApolloClientMonitorContext monitorContext; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + monitorContext = new ApolloClientMonitorContext(); + } + + @Test + public void testInitContext(){ + assertTrue(monitorContext.getBootstrapArgsApi() instanceof NullClientBootstrapArgsMonitorApi); + assertTrue(monitorContext.getNamespaceApi() instanceof NullClientNamespaceMonitorApi); + assertTrue(monitorContext.getThreadPoolApi() instanceof NullClientThreadPoolMonitorApi); + assertTrue(monitorContext.getExceptionApi() instanceof NullClientExceptionMonitorApi); + assertTrue(monitorContext.getMetricsExporter() instanceof NullApolloClientMetricsExporter); + } + + @Test + public void testSettingAndGettingApis() { + monitorContext.setApolloClientExceptionMonitorApi(exceptionMonitorApi); + monitorContext.setApolloClientNamespaceMonitorApi(namespaceMonitorApi); + monitorContext.setApolloClientBootstrapArgsMonitorApi(bootstrapArgsMonitorApi); + monitorContext.setApolloClientThreadPoolMonitorApi(threadPoolMonitorApi); + monitorContext.setApolloClientMetricsExporter(metricsExporter); + + assertSame(exceptionMonitorApi, monitorContext.getExceptionApi()); + assertSame(namespaceMonitorApi, monitorContext.getNamespaceApi()); + assertSame(bootstrapArgsMonitorApi, monitorContext.getBootstrapArgsApi()); + assertSame(threadPoolMonitorApi, monitorContext.getThreadPoolApi()); + assertSame(metricsExporter, monitorContext.getMetricsExporter()); + } + + @Test + public void testGetCollectors() { + ApolloClientMonitorEventListener listener = Mockito.mock(ApolloClientMonitorEventListener.class); + ApolloClientMonitorEventListener listener2 = Mockito.mock(ApolloClientMonitorEventListener.class); + monitorContext.addApolloClientMonitorEventListener(listener); + monitorContext.addApolloClientMonitorEventListener(listener2); + + List listeners = monitorContext.getApolloClientMonitorEventListeners(); + assertEquals(2, listeners.size()); + } +} 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 new file mode 100644 index 00000000..2f1ffc6c --- /dev/null +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/DefaultConfigMonitorTest.java @@ -0,0 +1,79 @@ +/* + * 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.build.ApolloInjector; +import com.ctrip.framework.apollo.build.MockInjector; +import com.ctrip.framework.apollo.monitor.api.ApolloClientBootstrapArgsMonitorApi; +import com.ctrip.framework.apollo.monitor.api.ApolloClientExceptionMonitorApi; +import com.ctrip.framework.apollo.monitor.api.ApolloClientNamespaceMonitorApi; +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 { + + @Mock + private ApolloClientExceptionMonitorApi exceptionMonitorApi; + @Mock + private ApolloClientNamespaceMonitorApi namespaceMonitorApi; + @Mock + private ApolloClientBootstrapArgsMonitorApi bootstrapArgsMonitorApi; + @Mock + private ApolloClientThreadPoolMonitorApi threadPoolMonitorApi; + @Mock + private ApolloClientMetricsExporter metricsExporter; + @Mock + private ApolloClientMonitorContext monitorContext; + + private DefaultConfigMonitor configMonitor; + + @Before + public void setUp(){ + MockitoAnnotations.initMocks(this); + when(monitorContext.getExceptionApi()).thenReturn(exceptionMonitorApi); + when(monitorContext.getNamespaceApi()).thenReturn(namespaceMonitorApi); + when(monitorContext.getBootstrapArgsApi()).thenReturn(bootstrapArgsMonitorApi); + when(monitorContext.getThreadPoolApi()).thenReturn(threadPoolMonitorApi); + when(monitorContext.getMetricsExporter()).thenReturn(metricsExporter); + MockInjector.setInstance(ApolloClientMonitorContext.class, monitorContext); + + configMonitor = new DefaultConfigMonitor(); + + } + + @Test + public void testApis(){ + assertSame(exceptionMonitorApi, configMonitor.getExceptionMonitorApi()); + assertSame(namespaceMonitorApi, configMonitor.getNamespaceMonitorApi()); + assertSame(bootstrapArgsMonitorApi, configMonitor.getRunningParamsMonitorApi()); + assertSame(threadPoolMonitorApi, configMonitor.getThreadPoolMonitorApi()); + } + + @Test + public void testExporterData(){ + String data = "data"; + when(metricsExporter.response()).thenReturn(data); + + assertEquals(data, configMonitor.getExporterData()); + } +} 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 aed0cdd9..04241217 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 @@ -31,14 +31,14 @@ public class ApolloClientMonitorEventPublisherTest { private ApolloClientMonitorContext mockCollectorManager; private ConfigUtil mockConfigUtil; - private ApolloClientMonitorEventListener mockCollector; + private ApolloClientMonitorEventListener mockListener; private ApolloClientMonitorEvent mockEvent; @Before public void setUp() { mockCollectorManager = mock(ApolloClientMonitorContext.class); mockConfigUtil = mock(ConfigUtil.class); - mockCollector = mock(ApolloClientMonitorEventListener.class); + mockListener = mock(ApolloClientMonitorEventListener.class); mockEvent = mock(ApolloClientMonitorEvent.class); // 使用 Mockito 来模拟静态方法 @@ -50,23 +50,24 @@ public void setUp() { @Test public void testPublish_WhenClientMonitorEnabled_CollectorSupportsEvent() { when(mockConfigUtil.isClientMonitorEnabled()).thenReturn(true); - when(mockCollectorManager.getCollectors()).thenReturn(Collections.singletonList(mockCollector)); - when(mockCollector.isSupported(mockEvent)).thenReturn(true); + when(mockCollectorManager.getApolloClientMonitorEventListeners()).thenReturn(Collections.singletonList( + mockListener)); + when(mockListener.isSupported(mockEvent)).thenReturn(true); ApolloClientMonitorEventPublisher.publish(mockEvent); - verify(mockCollector).collect(mockEvent); + verify(mockListener).collect(mockEvent); } @Test public void testPublish_WhenClientMonitorEnabled_CollectorDoesNotSupportEvent() { when(mockConfigUtil.isClientMonitorEnabled()).thenReturn(true); - when(mockCollectorManager.getCollectors()).thenReturn(Collections.singletonList(mockCollector)); - when(mockCollector.isSupported(mockEvent)).thenReturn(false); + when(mockCollectorManager.getApolloClientMonitorEventListeners()).thenReturn(Collections.singletonList(mockListener)); + when(mockListener.isSupported(mockEvent)).thenReturn(false); ApolloClientMonitorEventPublisher.publish(mockEvent); - verify(mockCollector, never()).collect(mockEvent); + verify(mockListener, never()).collect(mockEvent); } @Test @@ -75,6 +76,6 @@ public void testPublish_WhenClientMonitorDisabled() { ApolloClientMonitorEventPublisher.publish(mockEvent); - verify(mockCollectorManager, never()).getCollectors(); + verify(mockCollectorManager, never()).getApolloClientMonitorEventListeners(); } } 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 15df2204..8c1454f8 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 @@ -94,7 +94,7 @@ protected void doInit() { } public List getCollectors() { - return collectors; + return listeners; } @Override 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 57908315..bce2079d 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 @@ -39,7 +39,7 @@ public class DefaultApolloClientMetricsExporterFactoryTest { private ConfigUtil configUtil; @Mock - private ApolloClientMonitorEventListener metricsCollector; + private ApolloClientMonitorEventListener monitorEventListener; @Before public void setUp() { @@ -63,8 +63,8 @@ public void testGetMetricsReporter_ExporterFound() { when(configUtil.getMonitorExternalType()).thenReturn("mocktheus"); when(configUtil.isClientMonitorJmxEnabled()).thenReturn(true); when(configUtil.getMonitorExternalExportPeriod()).thenReturn(1000L); - when(metricsCollector.getName()).thenReturn("testMBean"); - List collectors = Collections.singletonList(metricsCollector); + when(monitorEventListener.getName()).thenReturn("testMBean"); + List collectors = Collections.singletonList(monitorEventListener); ApolloClientMetricsExporter result = factory.getMetricsReporter(collectors); diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientExceptionApiTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientExceptionApiTest.java index 2391e2bd..f683993a 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientExceptionApiTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientExceptionApiTest.java @@ -20,6 +20,7 @@ import static org.mockito.Mockito.*; import static org.junit.Assert.*; +import com.ctrip.framework.apollo.core.ApolloClientSystemConsts; import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEvent; import com.ctrip.framework.apollo.exceptions.ApolloConfigException; import org.junit.Before; @@ -33,6 +34,8 @@ public class DefaultApolloClientExceptionApiTest { @Before public void setUp() { + int someQueueSize = 10; + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE, String.valueOf(someQueueSize)); exceptionApi = new DefaultApolloClientExceptionApi(); } @@ -83,14 +86,14 @@ public void testGetApolloConfigExceptionDetails() { @Test public void testCollect0_HandlesMaxQueueSize() { - for (int i = 0; i < 25; i++) { + for (int i = 0; i < 10; i++) { ApolloClientMonitorEvent event = mock(ApolloClientMonitorEvent.class); when(event.getAttachmentValue(THROWABLE)).thenReturn( new ApolloConfigException("Exception " + i)); exceptionApi.collect0(event); } - assertEquals(25, exceptionApi.getApolloConfigExceptionList().size()); + assertEquals(10, exceptionApi.getApolloConfigExceptionList().size()); // Add one more to exceed the size. ApolloClientMonitorEvent overflowEvent = mock(ApolloClientMonitorEvent.class); @@ -98,6 +101,6 @@ public void testCollect0_HandlesMaxQueueSize() { new ApolloConfigException("Overflow Exception")); exceptionApi.collect0(overflowEvent); - assertEquals(25, exceptionApi.getApolloConfigExceptionList().size()); + assertEquals(10, exceptionApi.getApolloConfigExceptionList().size()); } } \ No newline at end of file diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientNamespaceApiTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/monitor/internal/listener/impl/DefaultApolloClientNamespaceApiTest.java index 73621a13..e94b097f 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 @@ -16,87 +16,95 @@ */ package com.ctrip.framework.apollo.monitor.internal.listener.impl; -import static com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorConstant.APOLLO_CLIENT_NAMESPACE_NOT_FOUND; -import static com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorConstant.APOLLO_CLIENT_NAMESPACE_TIMEOUT; -import static com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorConstant.APOLLO_CLIENT_NAMESPACE_USAGE; -import static com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorConstant.NAMESPACE; -import static org.mockito.Mockito.*; -import static org.junit.Assert.*; - import com.ctrip.framework.apollo.Config; -import com.ctrip.framework.apollo.ConfigFile; +import com.ctrip.framework.apollo.internals.ConfigManager; import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEvent; -import java.util.List; -import java.util.Set; +import com.ctrip.framework.apollo.monitor.internal.event.ApolloClientMonitorEventFactory; import org.junit.Before; import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; -import java.util.HashMap; -import java.util.Map; -import org.mockito.internal.util.collections.Sets; +import java.util.Collections; + +import static com.ctrip.framework.apollo.monitor.internal.ApolloClientMonitorConstant.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; public class DefaultApolloClientNamespaceApiTest { - private DefaultApolloClientNamespaceApi api; - private Map configs; - private Map configFiles; + @Mock + private ConfigManager configManager; + + @Mock + private Config config; + + @InjectMocks + private DefaultApolloClientNamespaceApi namespaceApi; @Before public void setUp() { - configs = new HashMap<>(); - configFiles = new HashMap<>(); - api = new DefaultApolloClientNamespaceApi(configs, configFiles); + MockitoAnnotations.initMocks(this); + when(configManager.getConfig(anyString())).thenReturn(config); } @Test public void testCollectNamespaceNotFound() { - ApolloClientMonitorEvent event = mock(ApolloClientMonitorEvent.class); - when(event.getAttachmentValue(NAMESPACE)).thenReturn("testNamespace"); - when(event.getName()).thenReturn(APOLLO_CLIENT_NAMESPACE_NOT_FOUND); + ApolloClientMonitorEvent event = ApolloClientMonitorEventFactory + .getInstance().createEvent(APOLLO_CLIENT_NAMESPACE_NOT_FOUND) + .putAttachment(NAMESPACE, "testNamespace"); - api.collect0(event); + namespaceApi.collect0(event); - assertEquals(1, api.getNotFoundNamespaces().size()); - assertTrue(api.getNotFoundNamespaces().contains("testNamespace")); + assertTrue(namespaceApi.getNotFoundNamespaces().contains("testNamespace")); } @Test public void testCollectNamespaceTimeout() { - ApolloClientMonitorEvent event = mock(ApolloClientMonitorEvent.class); - when(event.getAttachmentValue(NAMESPACE)).thenReturn("testNamespace"); - when(event.getName()).thenReturn(APOLLO_CLIENT_NAMESPACE_TIMEOUT); + ApolloClientMonitorEvent event = ApolloClientMonitorEventFactory + .getInstance().createEvent(APOLLO_CLIENT_NAMESPACE_TIMEOUT) + .putAttachment(NAMESPACE, "testNamespace"); - api.collect0(event); + namespaceApi.collect0(event); - assertEquals(1, api.getTimeoutNamespaces().size()); - assertTrue(api.getTimeoutNamespaces().contains("testNamespace")); + assertTrue(namespaceApi.getTimeoutNamespaces().contains("testNamespace")); } @Test - public void testCollectNamespaceUsage() { - ApolloClientMonitorEvent event = mock(ApolloClientMonitorEvent.class); - when(event.getAttachmentValue(NAMESPACE)).thenReturn("testNamespace"); - when(event.getName()).thenReturn(APOLLO_CLIENT_NAMESPACE_USAGE); + public void testCollectNormalNamespace() { + ApolloClientMonitorEvent event = ApolloClientMonitorEventFactory + .getInstance().createEvent(APOLLO_CLIENT_NAMESPACE_USAGE) + .putAttachment(NAMESPACE, "testNamespace"); - api.collect0(event); + namespaceApi.collect0(event); - assertEquals(1, api.getNamespaceMetrics().get("testNamespace").getUsageCount()); + // Verify that the usage count has been incremented + assertEquals(1, namespaceApi.getNamespaceMetrics().get("testNamespace").getUsageCount()); } @Test public void testGetNamespacePropertySize() { - Config mockConfig = mock(Config.class); - when(mockConfig.getPropertyNames()).thenReturn(Sets.newSet("key1", "key2")); - configs.put("testNamespace", mockConfig); - Integer testNamespace = api.getNamespacePropertySize("testNamespace"); - assertEquals(2, testNamespace.intValue()); + when(config.getPropertyNames()).thenReturn(Collections.singleton("property1")); + + Integer propertySize = namespaceApi.getNamespacePropertySize("testNamespace"); + + assertEquals(Integer.valueOf(1), propertySize); } @Test - public void testGetConfigFileNamespaces() { - ConfigFile mockConfigFile = mock(ConfigFile.class); - configFiles.put("testNamespace", mockConfigFile); - List configFileNum = api.getConfigFileNamespaces(); - assertEquals(1, configFileNum.size()); + public void testExportMetrics() { + // Set up some initial state + ApolloClientMonitorEvent event = ApolloClientMonitorEventFactory + .getInstance().createEvent(APOLLO_CLIENT_NAMESPACE_USAGE) + .putAttachment(NAMESPACE, "testNamespace"); + namespaceApi.collect0(event); + + // Call the export method + namespaceApi.export0(); + + // Verify interactions with the configManager + verify(configManager).getConfig("testNamespace"); } } \ No newline at end of file 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 8bfea39e..d44645f4 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 @@ -50,12 +50,6 @@ public void testGetNamespaceItemNames() { } - @Test - public void testGetConfigFileNamespaces() { - List configFileNamespaces = namespaceMonitorApi.getConfigFileNamespaces(); - assertEquals(0, configFileNamespaces.size()); - } - @Test public void testGetNotFoundNamespaces() { List notFoundNamespaces = namespaceMonitorApi.getNotFoundNamespaces(); diff --git a/apollo-client/src/test/java/com/ctrip/framework/apollo/util/ConfigUtilTest.java b/apollo-client/src/test/java/com/ctrip/framework/apollo/util/ConfigUtilTest.java index 23a37362..18cda2dd 100644 --- a/apollo-client/src/test/java/com/ctrip/framework/apollo/util/ConfigUtilTest.java +++ b/apollo-client/src/test/java/com/ctrip/framework/apollo/util/ConfigUtilTest.java @@ -255,6 +255,92 @@ public void testCustomizePropertiesOrdered() { configUtil.isPropertiesOrderEnabled()); } + @Test + public void testMonitorExternalType() { + String someMonitorExternalType = "someType"; + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_TYPE, someMonitorExternalType); + + ConfigUtil configUtil = new ConfigUtil(); + + assertEquals(someMonitorExternalType, configUtil.getMonitorExternalType()); + } + + @Test + public void testCustomizeMonitorExternalCollectPeriod() { + int somePeriod = 5; + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_EXPORT_PERIOD, String.valueOf(somePeriod)); + + ConfigUtil configUtil = new ConfigUtil(); + + assertEquals(somePeriod, configUtil.getMonitorExternalExportPeriod()); + } + + @Test + public void testCustomizeInvalidMonitorExternalCollectPeriod() { + String someInvalidPeriod = "a"; + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXTERNAL_EXPORT_PERIOD, someInvalidPeriod); + + ConfigUtil configUtil = new ConfigUtil(); + + assertEquals(10, configUtil.getMonitorExternalExportPeriod()); // Default value + } + + @Test + public void testClientMonitorEnabled() { + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_ENABLED, "true"); + + ConfigUtil configUtil = new ConfigUtil(); + + assertTrue(configUtil.isClientMonitorEnabled()); + } + + @Test + public void testClientMonitorEnabledDefault() { + System.clearProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_ENABLED); + + ConfigUtil configUtil = new ConfigUtil(); + + assertFalse(configUtil.isClientMonitorEnabled()); // Default value + } + + @Test + public void testClientMonitorJmxEnabled() { + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_JMX_ENABLED, "true"); + + ConfigUtil configUtil = new ConfigUtil(); + + assertTrue(configUtil.isClientMonitorJmxEnabled()); + } + + @Test + public void testClientMonitorJmxEnabledDefault() { + System.clearProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_JMX_ENABLED); + + ConfigUtil configUtil = new ConfigUtil(); + + assertFalse(configUtil.isClientMonitorJmxEnabled()); // Default value + } + + @Test + public void testCustomizeMonitorExceptionQueueSize() { + int someQueueSize = 10; + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE, String.valueOf(someQueueSize)); + + ConfigUtil configUtil = new ConfigUtil(); + + assertEquals(someQueueSize, configUtil.getMonitorExceptionQueueSize()); + } + + @Test + public void testCustomizeInvalidMonitorExceptionQueueSize() { + String someInvalidQueueSize = "a"; + System.setProperty(ApolloClientSystemConsts.APOLLO_CLIENT_MONITOR_EXCEPTION_QUEUE_SIZE, someInvalidQueueSize); + + ConfigUtil configUtil = new ConfigUtil(); + + assertEquals(25, configUtil.getMonitorExceptionQueueSize()); // Default value + } + @Test public void test() { ConfigUtil configUtil = new ConfigUtil();