You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by wu...@apache.org on 2018/04/08 15:14:47 UTC

[incubator-servicecomb-java-chassis] 02/09: SCB-422 metrics shutdown when chassis close

This is an automated email from the ASF dual-hosted git repository.

wujimin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit f1a110eec3e5b26b5a07cd21a26380090794a39f
Author: wujimin <wu...@huawei.com>
AuthorDate: Wed Apr 4 09:05:08 2018 +0800

    SCB-422 metrics shutdown when chassis close
---
 .../foundation/metrics/MetricsBootstrap.java       |  8 +++
 .../foundation/metrics/MetricsInitializer.java     |  8 +++
 .../foundation/metrics/TestMetricsBootstrap.java   | 58 +++++++++++++++++++---
 .../metrics/core/MetricsBootListener.java          |  2 +
 4 files changed, 70 insertions(+), 6 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 0c6a523..335d7c5 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
@@ -16,6 +16,8 @@
  */
 package org.apache.servicecomb.foundation.metrics;
 
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -52,6 +54,12 @@ public class MetricsBootstrap {
 
   public void shutdown() {
     executorService.shutdown();
+
+    List<MetricsInitializer> initializers = new ArrayList<>(SPIServiceUtils.getSortedService(MetricsInitializer.class));
+    Collections.reverse(initializers);
+    initializers.forEach(initializer -> {
+      initializer.uninit();
+    });
   }
 
   protected void loadMetricsInitializers() {
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 5e1aaef..3556576 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
@@ -20,8 +20,16 @@ import com.google.common.eventbus.EventBus;
 import com.netflix.spectator.api.CompositeRegistry;
 
 public interface MetricsInitializer {
+  default int getOrder() {
+    return 0;
+  }
+
   /** 
    * if create new registry, must add to globalRegistry
    */
   void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config);
+
+  default void uninit() {
+
+  }
 }
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 b8280f4..a8fd7ec 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
@@ -19,10 +19,10 @@ package org.apache.servicecomb.foundation.metrics;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.ScheduledExecutorService;
 
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.hamcrest.Matchers;
-import org.junit.After;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -31,6 +31,7 @@ import com.google.common.eventbus.Subscribe;
 import com.netflix.spectator.api.CompositeRegistry;
 import com.netflix.spectator.api.Meter;
 
+import mockit.Deencapsulation;
 import mockit.Expectations;
 import mockit.Mocked;
 
@@ -42,11 +43,6 @@ public class TestMetricsBootstrap {
 
   EventBus eventBus = new EventBus();
 
-  @After
-  public void teardown() {
-    bootstrap.shutdown();
-  }
-
   @Test
   public void loadMetricsInitializers() {
     List<MetricsInitializer> initList = new ArrayList<>();
@@ -64,6 +60,7 @@ public class TestMetricsBootstrap {
     };
 
     bootstrap.start(globalRegistry, eventBus);
+    bootstrap.shutdown();
 
     Assert.assertThat(initList, Matchers.contains(metricsInitializer, metricsInitializer));
   }
@@ -89,7 +86,56 @@ public class TestMetricsBootstrap {
     });
 
     bootstrap.pollMeters();
+    bootstrap.shutdown();
 
     Assert.assertEquals(meters, result.getMeters());
   }
+
+  @Test
+  public void shutdown(@Mocked ScheduledExecutorService scheduledExecutorService) {
+    List<MetricsInitializer> uninitList = new ArrayList<>();
+    MetricsInitializer initializer1 = new MetricsInitializer() {
+      @Override
+      public int getOrder() {
+        return 1;
+      }
+
+      @Override
+      public void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) {
+      }
+
+      @Override
+      public void uninit() {
+        uninitList.add(this);
+      }
+    };
+
+    MetricsInitializer initializer2 = new MetricsInitializer() {
+      @Override
+      public int getOrder() {
+        return 2;
+      }
+
+      @Override
+      public void init(CompositeRegistry globalRegistry, EventBus eventBus, MetricsBootstrapConfig config) {
+      }
+
+      @Override
+      public void uninit() {
+        uninitList.add(this);
+      }
+    };
+
+    new Expectations(SPIServiceUtils.class) {
+      {
+        SPIServiceUtils.getSortedService(MetricsInitializer.class);
+        result = Arrays.asList(initializer1, initializer2);
+      }
+    };
+    Deencapsulation.setField(bootstrap, "executorService", scheduledExecutorService);
+
+    bootstrap.shutdown();
+
+    Assert.assertThat(uninitList, Matchers.contains(initializer2, initializer1));
+  }
 }
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 289c879..51b7bfc 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
@@ -48,6 +48,8 @@ public class MetricsBootListener implements BootListener {
       case AFTER_REGISTRY:
         metricsBootstrap.start(Spectator.globalRegistry(), EventManager.getEventBus());
         break;
+      case BEFORE_CLOSE:
+        metricsBootstrap.shutdown();
       default:
         break;
     }

-- 
To stop receiving notification emails like this one, please contact
wujimin@apache.org.