This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
commit 4175bbcf5e52fb3356a3d357eed57d11ba58bbde Author: wujimin <wuji...@huawei.com> AuthorDate: Thu Nov 22 09:08:32 2018 +0800 [SCB-1034][WIP] globalRegistry switch from CompositeRegistry to GlobalRegistry --- .../foundation/metrics/MetricsBootstrap.java | 36 ++++++---------------- .../foundation/metrics/MetricsBootstrapConfig.java | 3 ++ .../foundation/metrics/MetricsInitializer.java | 5 +-- .../foundation/metrics/TestMetricsBootstrap.java | 24 ++++++--------- .../metrics/core/DefaultRegistryInitializer.java | 20 ++++++------ .../metrics/core/MetricsBootListener.java | 5 ++- .../core/TestDefaultRegistryInitializer.java | 8 ++--- 7 files changed, 40 insertions(+), 61 deletions(-) diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java index 3180973..a63a98d 100644 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java +++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java @@ -24,17 +24,13 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils; +import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry; -import com.google.common.collect.Lists; import com.google.common.eventbus.EventBus; import com.google.common.util.concurrent.ThreadFactoryBuilder; -import com.netflix.spectator.api.CompositeRegistry; -import com.netflix.spectator.api.Measurement; -import com.netflix.spectator.api.Meter; public class MetricsBootstrap { - - private CompositeRegistry globalRegistry; + private GlobalRegistry globalRegistry; private EventBus eventBus; @@ -42,7 +38,7 @@ public class MetricsBootstrap { private ScheduledExecutorService executorService; - public void start(CompositeRegistry globalRegistry, EventBus eventBus) { + public void start(GlobalRegistry globalRegistry, EventBus eventBus) { this.globalRegistry = globalRegistry; this.eventBus = eventBus; this.executorService = Executors.newScheduledThreadPool(1, @@ -61,36 +57,24 @@ public class MetricsBootstrap { List<MetricsInitializer> initializers = new ArrayList<>(SPIServiceUtils.getSortedService(MetricsInitializer.class)); Collections.reverse(initializers); - initializers.forEach(initializer -> { - initializer.destroy(); - }); + initializers.forEach(initializer -> initializer.destroy()); } protected void loadMetricsInitializers() { - SPIServiceUtils.getSortedService(MetricsInitializer.class).forEach(initializer -> { - initializer.init(globalRegistry, eventBus, config); - }); + SPIServiceUtils.getSortedService(MetricsInitializer.class) + .forEach(initializer -> initializer.init(globalRegistry, eventBus, config)); } protected void startPoll() { executorService.scheduleAtFixedRate(this::pollMeters, - config.getMsPollInterval(), + 0, config.getMsPollInterval(), TimeUnit.MILLISECONDS); } protected void pollMeters() { - eventBus.post(new PollEvent(config.getMsPollInterval())); - List<Meter> meters = Lists.newArrayList(globalRegistry.iterator()); - // must collect measurements - // otherwise if there is no any period publisher, normal publisher maybe get NaN values - List<Measurement> measurements = new ArrayList<>(); - for (Meter meter : meters) { - meter.measure().forEach(measurements::add); - } - - PolledEvent event = new PolledEvent(meters, measurements); - - eventBus.post(event); + long secondInterval = TimeUnit.MILLISECONDS.toSeconds(config.getMsPollInterval()); + PolledEvent polledEvent = globalRegistry.poll(secondInterval); + eventBus.post(polledEvent); } } diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrapConfig.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrapConfig.java index d1b6be7..09322ca 100644 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrapConfig.java +++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrapConfig.java @@ -28,6 +28,9 @@ public class MetricsBootstrapConfig { public MetricsBootstrapConfig() { msPollInterval = DynamicPropertyFactory.getInstance().getIntProperty(METRICS_WINDOW_TIME, DEFAULT_METRICS_WINDOW_TIME).get(); + if (msPollInterval < 1000) { + msPollInterval = 1000; + } } public long getMsPollInterval() { diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsInitializer.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsInitializer.java index b232f48..88201dc 100644 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsInitializer.java +++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsInitializer.java @@ -16,8 +16,9 @@ */ package org.apache.servicecomb.foundation.metrics; +import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry; + import com.google.common.eventbus.EventBus; -import com.netflix.spectator.api.CompositeRegistry; public interface MetricsInitializer { default int getOrder() { @@ -27,7 +28,7 @@ public interface MetricsInitializer { /** * if create new registry, must add to globalRegistry */ - void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config); + void init(GlobalRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config); default void destroy() { diff --git a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsBootstrap.java b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsBootstrap.java index c22315a..7487745 100644 --- a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsBootstrap.java +++ b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/TestMetricsBootstrap.java @@ -24,15 +24,16 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils; +import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry; import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Test; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; -import com.netflix.spectator.api.CompositeRegistry; import com.netflix.spectator.api.Measurement; import com.netflix.spectator.api.Meter; +import com.netflix.spectator.api.Registry; import mockit.Deencapsulation; import mockit.Expectations; @@ -41,8 +42,7 @@ import mockit.Mocked; public class TestMetricsBootstrap { MetricsBootstrap bootstrap = new MetricsBootstrap(); - @Mocked - CompositeRegistry globalRegistry; + GlobalRegistry globalRegistry = new GlobalRegistry(); EventBus eventBus = new EventBus(); @@ -51,7 +51,7 @@ public class TestMetricsBootstrap { List<MetricsInitializer> initList = new ArrayList<>(); MetricsInitializer metricsInitializer = new MetricsInitializer() { @Override - public void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { + public void init(GlobalRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { initList.add(this); } }; @@ -69,14 +69,15 @@ public class TestMetricsBootstrap { } @Test - public void pollMeters(@Mocked Meter meter, @Mocked Measurement measurement, + public void pollMeters(@Mocked Registry registry, @Mocked Meter meter, @Mocked Measurement measurement, @Mocked ScheduledExecutorService executor) { List<Meter> meters = Arrays.asList(meter); + globalRegistry.add(registry); new Expectations(Executors.class) { { Executors.newScheduledThreadPool(1, (ThreadFactory) any); result = executor; - globalRegistry.iterator(); + registry.iterator(); result = meters.iterator(); meter.measure(); result = Arrays.asList(measurement); @@ -85,14 +86,8 @@ public class TestMetricsBootstrap { bootstrap.start(globalRegistry, eventBus); PolledEvent result = new PolledEvent(null, null); - List<PollEvent> events = new ArrayList<>(); eventBus.register(new Object() { @Subscribe - public void onPollEvent(PollEvent pollEvent) { - events.add(pollEvent); - } - - @Subscribe public void onEvent(PolledEvent event) { result.setMeters(event.getMeters()); result.setMeasurements(event.getMeasurements()); @@ -101,7 +96,6 @@ public class TestMetricsBootstrap { bootstrap.pollMeters(); bootstrap.shutdown(); - Assert.assertEquals(1, events.size()); Assert.assertEquals(meters, result.getMeters()); Assert.assertThat(result.getMeasurements(), Matchers.contains(measurement)); } @@ -116,7 +110,7 @@ public class TestMetricsBootstrap { } @Override - public void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { + public void init(GlobalRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { } @Override @@ -132,7 +126,7 @@ public class TestMetricsBootstrap { } @Override - public void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { + public void init(GlobalRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { } @Override diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/DefaultRegistryInitializer.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/DefaultRegistryInitializer.java index 586da6b..a01675f 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/DefaultRegistryInitializer.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/DefaultRegistryInitializer.java @@ -16,19 +16,20 @@ */ package org.apache.servicecomb.metrics.core; +import java.time.Duration; + import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; import org.apache.servicecomb.foundation.metrics.MetricsInitializer; +import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry; import com.google.common.eventbus.EventBus; import com.netflix.servo.DefaultMonitorRegistry; -import com.netflix.spectator.api.CompositeRegistry; -import com.netflix.spectator.api.Registry; import com.netflix.spectator.servo.ServoRegistry; public class DefaultRegistryInitializer implements MetricsInitializer { public static final String SERVO_POLLERS = "servo.pollers"; - private CompositeRegistry globalRegistry; + private GlobalRegistry globalRegistry; private ServoRegistry registry; @@ -39,12 +40,15 @@ public class DefaultRegistryInitializer implements MetricsInitializer { } @Override - public void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { + public void init(GlobalRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) { this.globalRegistry = globalRegistry; - System.getProperties().setProperty(SERVO_POLLERS, String.valueOf(config.getMsPollInterval())); - registry = new ServoRegistry(); + // spectator move poll gauges from inline to background executor + // we need to set the interval to unify value + System.setProperty("spectator.api.gaugePollingFrequency", Duration.ofMillis(config.getMsPollInterval()).toString()); + System.setProperty(SERVO_POLLERS, String.valueOf(config.getMsPollInterval())); + registry = new ServoRegistry(); globalRegistry.add(registry); } @@ -55,8 +59,4 @@ public class DefaultRegistryInitializer implements MetricsInitializer { globalRegistry.remove(registry); } } - - public Registry getRegistry() { - return registry; - } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java index d572506..be8963d 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsBootListener.java @@ -24,12 +24,11 @@ import org.apache.servicecomb.foundation.common.event.EventManager; import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils; import org.apache.servicecomb.foundation.metrics.MetricsBootstrap; import org.apache.servicecomb.foundation.metrics.MetricsInitializer; +import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry; import org.apache.servicecomb.metrics.core.publish.HealthCheckerRestPublisher; import org.apache.servicecomb.metrics.core.publish.MetricsRestPublisher; import org.springframework.stereotype.Component; -import com.netflix.spectator.api.Spectator; - @Component public class MetricsBootListener implements BootListener { private MetricsBootstrap metricsBootstrap = new MetricsBootstrap(); @@ -44,7 +43,7 @@ public class MetricsBootListener implements BootListener { registerSchemas(); break; case AFTER_REGISTRY: - metricsBootstrap.start(Spectator.globalRegistry(), EventManager.getEventBus()); + metricsBootstrap.start(new GlobalRegistry(), EventManager.getEventBus()); break; case BEFORE_CLOSE: metricsBootstrap.shutdown(); diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestDefaultRegistryInitializer.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestDefaultRegistryInitializer.java index f5e77b0..c18aed9 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestDefaultRegistryInitializer.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestDefaultRegistryInitializer.java @@ -19,22 +19,20 @@ package org.apache.servicecomb.metrics.core; import java.util.List; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; +import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry; import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Test; import com.google.common.eventbus.EventBus; import com.netflix.servo.DefaultMonitorRegistry; -import com.netflix.spectator.api.CompositeRegistry; -import com.netflix.spectator.api.ManualClock; import com.netflix.spectator.api.Registry; -import com.netflix.spectator.api.SpectatorUtils; import com.netflix.spectator.servo.ServoRegistry; import mockit.Deencapsulation; public class TestDefaultRegistryInitializer { - CompositeRegistry globalRegistry = SpectatorUtils.createCompositeRegistry(new ManualClock()); + GlobalRegistry globalRegistry = new GlobalRegistry(); List<Registry> registries = Deencapsulation.getField(globalRegistry, "registries"); @@ -45,7 +43,7 @@ public class TestDefaultRegistryInitializer { registryInitializer.init(globalRegistry, new EventBus(), new MetricsBootstrapConfig()); Assert.assertEquals(-10, registryInitializer.getOrder()); - Assert.assertThat(registryInitializer.getRegistry(), Matchers.instanceOf(ServoRegistry.class)); + Assert.assertThat(globalRegistry.getDefaultRegistry(), Matchers.instanceOf(ServoRegistry.class)); Assert.assertEquals(1, registries.size()); Assert.assertEquals(1, DefaultMonitorRegistry.getInstance().getRegisteredMonitors().size());