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());
 

Reply via email to