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 e9381c9fbb920a20bd6c20cec9c0f4c20f4c720a
Author: wujimin <[email protected]>
AuthorDate: Thu Nov 22 09:16:01 2018 +0800

    [SCB-1034][WIP] os meters switch to new mechanism
---
 .../metrics/core/OsMetersInitializer.java          | 15 ++++---
 .../metrics/core/meter/os/CpuMeter.java            |  4 +-
 .../metrics/core/meter/os/NetMeter.java            | 22 +++++-----
 .../servicecomb/metrics/core/meter/os/OsMeter.java | 49 ++++++----------------
 .../metrics/core/TestOsMeterInitializer.java       | 25 ++++-------
 .../metrics/core/meter/os/TestNetMeter.java        | 19 +++------
 .../metrics/core/meter/os/TestOsMeter.java         | 13 ++----
 7 files changed, 50 insertions(+), 97 deletions(-)

diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/OsMetersInitializer.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/OsMetersInitializer.java
index f94cf18..783d0cc 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/OsMetersInitializer.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/OsMetersInitializer.java
@@ -17,16 +17,16 @@
 package org.apache.servicecomb.metrics.core;
 
 import org.apache.commons.lang3.SystemUtils;
-import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
+import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
 import org.apache.servicecomb.metrics.core.meter.os.OsMeter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.eventbus.EventBus;
-import com.netflix.spectator.api.CompositeRegistry;
 import com.netflix.spectator.api.Registry;
+import com.netflix.spectator.api.SpectatorUtils;
 
 public class OsMetersInitializer implements MetricsInitializer {
   private static final Logger LOGGER = 
LoggerFactory.getLogger(OsMetersInitializer.class);
@@ -34,16 +34,15 @@ public class OsMetersInitializer implements 
MetricsInitializer {
   private OsMeter osMeter;
 
   @Override
-  public void init(CompositeRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
+  public void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
     if (!SystemUtils.IS_OS_LINUX) {
       LOGGER.info("only support linux os to collect cpu and net info");
       return;
     }
-    DefaultRegistryInitializer defaultRegistryInitializer = SPIServiceUtils
-        .getTargetService(MetricsInitializer.class, 
DefaultRegistryInitializer.class);
-    Registry registry = defaultRegistryInitializer.getRegistry();
-    osMeter = new OsMeter(registry, eventBus);
-    registry.register(osMeter);
+
+    Registry registry = globalRegistry.getDefaultRegistry();
+    osMeter = new OsMeter(registry);
+    SpectatorUtils.registerMeter(registry, osMeter);
   }
 
   public OsMeter getOsMeter() {
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/CpuMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/CpuMeter.java
index d6e916e..60f6cd2 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/CpuMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/CpuMeter.java
@@ -48,9 +48,9 @@ public class CpuMeter {
     rate = 0.0;
   }
 
-  public void calcMeasurements(List<Measurement> measurements, long timestap) {
+  public void calcMeasurements(List<Measurement> measurements, long msNow) {
     refreshCpu();
-    measurements.add(new Measurement(id, timestap, rate));
+    measurements.add(new Measurement(id, msNow, rate));
   }
 
   /*
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/NetMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/NetMeter.java
index 1c1d59d..8396619 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/NetMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/NetMeter.java
@@ -26,7 +26,6 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.servicecomb.foundation.metrics.PollEvent;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -51,7 +50,6 @@ public class NetMeter {
   private Map<String, InterfaceInfo> interfaceInfoMap = new 
ConcurrentHashMap<>();
 
   public static class InterfaceInfo {
-
     private final String name;
 
     private Id sendId;
@@ -76,12 +74,12 @@ public class NetMeter {
       this.receiveId = id.withTag(TAG_RECEIVE);
     }
 
-    public void update(String interfaceData, long interval) {
+    public void update(String interfaceData, long secondInterval) {
       String[] netInfo = interfaceData.trim().split("\\s+");
       long rxBytes = Long.parseLong(netInfo[0]);
       long txBytes = Long.parseLong(netInfo[8]);
-      sendRate = (double) (txBytes - lastTxBytes) * 1000 / interval;
-      receiveRate = (double) (rxBytes - lastRxBytes) * 1000 / interval;
+      sendRate = (double) (txBytes - lastTxBytes) / secondInterval;
+      receiveRate = (double) (rxBytes - lastRxBytes) / secondInterval;
       lastRxBytes = rxBytes;
       lastTxBytes = txBytes;
     }
@@ -109,6 +107,8 @@ public class NetMeter {
 
   public NetMeter(Id id) {
     this.id = id;
+
+    // init lastRxBytes and lastTxBytes
     refreshNet(1);
     for (InterfaceInfo interfaceInfo : interfaceInfoMap.values()) {
       interfaceInfo.sendRate = 0;
@@ -116,12 +116,12 @@ public class NetMeter {
     }
   }
 
-  public void calcMeasurements(List<Measurement> measurements, long timestap, 
PollEvent pollEvent) {
-    refreshNet(pollEvent.getMsPollInterval());
+  public void calcMeasurements(List<Measurement> measurements, long msNow, 
long secondInterval) {
+    refreshNet(secondInterval);
 
     for (InterfaceInfo interfaceInfo : interfaceInfoMap.values()) {
-      measurements.add(new Measurement(interfaceInfo.sendId, timestap, 
interfaceInfo.sendRate));
-      measurements.add(new Measurement(interfaceInfo.receiveId, timestap, 
interfaceInfo.receiveRate));
+      measurements.add(new Measurement(interfaceInfo.sendId, msNow, 
interfaceInfo.sendRate));
+      measurements.add(new Measurement(interfaceInfo.receiveId, msNow, 
interfaceInfo.receiveRate));
     }
   }
 
@@ -131,7 +131,7 @@ public class NetMeter {
    *  eth0: 2615248100 32148518    0    0    0     0          0          0     
    87333034794 21420267    0      0     0     0    0    0
    *        0          1           2    3    4     5          6          7     
     8
    */
-  protected void refreshNet(long interval) {
+  protected void refreshNet(long secondInterval) {
     try {
       File file = new File("/proc/net/dev");
       List<String> netInfo = FileUtils.readLines(file, StandardCharsets.UTF_8);
@@ -150,7 +150,7 @@ public class NetMeter {
         nameSet.add(name);
 
         InterfaceInfo interfaceInfo = interfaceInfoMap.computeIfAbsent(name, 
key -> new InterfaceInfo(id, key));
-        interfaceInfo.update(strings[1], interval);
+        interfaceInfo.update(strings[1], secondInterval);
       }
 
       // clear deleted interfaces
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/OsMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/OsMeter.java
index 961dbe0..257f8d9 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/OsMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/OsMeter.java
@@ -19,13 +19,10 @@ package org.apache.servicecomb.metrics.core.meter.os;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.servicecomb.foundation.metrics.PollEvent;
+import org.apache.servicecomb.foundation.metrics.meter.AbstractPeriodMeter;
 
-import com.google.common.eventbus.EventBus;
-import com.google.common.eventbus.Subscribe;
-import com.netflix.spectator.api.Id;
+import com.google.common.annotations.VisibleForTesting;
 import com.netflix.spectator.api.Measurement;
-import com.netflix.spectator.api.Meter;
 import com.netflix.spectator.api.Registry;
 
 /**
@@ -33,7 +30,7 @@ import com.netflix.spectator.api.Registry;
  * name=os type=net interface=eth0 statistic=send value=100
  * name=os type=net interface=eth0 statistic=receive value=100
  */
-public class OsMeter implements Meter {
+public class OsMeter extends AbstractPeriodMeter {
   public static final String OS_NAME = "os";
 
   public static final String OS_TYPE = "type";
@@ -42,56 +39,36 @@ public class OsMeter implements Meter {
 
   public static final String OS_TYPE_NET = "net";
 
-  private List<Measurement> measurements = new ArrayList<>();
-
-  private Id id;
-
-  private Registry registry;
-
   private CpuMeter cpuMeter;
 
   private NetMeter netMeter;
 
-  public OsMeter(Registry registry, EventBus eventBus) {
-    this.registry = registry;
+  public OsMeter(Registry registry) {
     this.id = registry.createId(OS_NAME);
 
     cpuMeter = new CpuMeter(id.withTag(OS_TYPE, OS_TYPE_CPU));
     netMeter = new NetMeter(id.withTag(OS_TYPE, OS_TYPE_NET));
-
-    eventBus.register(this);
-  }
-
-  @Subscribe
-  public void calcMeasurements(PollEvent pollEvent) {
-    final long now = registry.clock().wallTime();
-
-    final List<Measurement> tmpCpuMeasurements = new ArrayList<>();
-    cpuMeter.calcMeasurements(tmpCpuMeasurements, now);
-    netMeter.calcMeasurements(tmpCpuMeasurements, now, pollEvent);
-
-    measurements = tmpCpuMeasurements;
-  }
-
-  @Override
-  public Id id() {
-    return id;
   }
 
   @Override
-  public Iterable<Measurement> measure() {
-    return measurements;
+  public void calcMeasurements(long msNow, long secondInterval) {
+    List<Measurement> measurements = new ArrayList<>();
+    calcMeasurements(measurements, msNow, secondInterval);
+    allMeasurements = measurements;
   }
 
   @Override
-  public boolean hasExpired() {
-    return false;
+  public void calcMeasurements(List<Measurement> measurements, long msNow, 
long secondInterval) {
+    cpuMeter.calcMeasurements(measurements, msNow);
+    netMeter.calcMeasurements(measurements, msNow, secondInterval);
   }
 
+  @VisibleForTesting
   public CpuMeter getCpuMeter() {
     return cpuMeter;
   }
 
+  @VisibleForTesting
   public NetMeter getNetMeter() {
     return netMeter;
   }
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestOsMeterInitializer.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestOsMeterInitializer.java
index db266af..bb73bd1 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestOsMeterInitializer.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestOsMeterInitializer.java
@@ -25,8 +25,7 @@ import java.util.Map;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang3.SystemUtils;
 import org.apache.servicecomb.foundation.common.utils.ReflectUtils;
-import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
-import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
+import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
 import org.apache.servicecomb.metrics.core.meter.os.CpuMeter;
 import org.apache.servicecomb.metrics.core.meter.os.NetMeter;
 import org.apache.servicecomb.metrics.core.meter.os.NetMeter.InterfaceInfo;
@@ -47,16 +46,15 @@ import mockit.MockUp;
 import mockit.Mocked;
 
 public class TestOsMeterInitializer {
-  private Registry registry = new DefaultRegistry(new ManualClock());
+  GlobalRegistry globalRegistry = new GlobalRegistry(new ManualClock());
 
-  @Mocked
-  private DefaultRegistryInitializer defaultRegistryInitializer;
-
-  @Mocked
-  private EventBus eventBus;
+  Registry registry = new DefaultRegistry(globalRegistry.getClock());
 
   private boolean isLinux;
 
+  @Mocked
+  EventBus eventBus;
+
   @Before
   public void beforeTest() {
     isLinux = SystemUtils.IS_OS_LINUX;
@@ -65,14 +63,6 @@ public class TestOsMeterInitializer {
   @Test
   public void init(@Mocked Runtime runtime) {
     ReflectUtils.setField(SystemUtils.class, null, "IS_OS_LINUX", true);
-    new Expectations(SPIServiceUtils.class) {
-      {
-        SPIServiceUtils.getTargetService(MetricsInitializer.class, 
DefaultRegistryInitializer.class);
-        result = defaultRegistryInitializer;
-        defaultRegistryInitializer.getRegistry();
-        result = registry;
-      }
-    };
     List<String> list = new ArrayList<>();
     list.add("cpu  1 1 1 1 1 1 1 1 0 0");
     list.add("useless");
@@ -95,8 +85,9 @@ public class TestOsMeterInitializer {
         result = 2;
       }
     };
+    globalRegistry.add(registry);
     OsMetersInitializer osMetersInitializer = new OsMetersInitializer();
-    osMetersInitializer.init(null, eventBus, null);
+    osMetersInitializer.init(globalRegistry, eventBus, null);
     OsMeter osMeter = osMetersInitializer.getOsMeter();
     Assert.assertNotNull(osMeter);
     Assert.assertNotNull(osMeter.getCpuMeter());
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestNetMeter.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestNetMeter.java
index 3995083..8caa14d 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestNetMeter.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestNetMeter.java
@@ -23,7 +23,6 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.servicecomb.foundation.metrics.PollEvent;
 import org.apache.servicecomb.metrics.core.meter.os.NetMeter.InterfaceInfo;
 import org.junit.Assert;
 import org.junit.Test;
@@ -31,7 +30,6 @@ import org.junit.Test;
 import com.netflix.spectator.api.Id;
 import com.netflix.spectator.api.Measurement;
 
-import mockit.Expectations;
 import mockit.Mock;
 import mockit.MockUp;
 import mockit.Mocked;
@@ -52,7 +50,7 @@ public class TestNetMeter {
     NetMeter netMeter = new NetMeter(id);
     list.remove(2);
     list.add("eth0: 1 1    0    0    0     0          0          1         1 1 
   1      0     0     0    0    0");
-    netMeter.refreshNet(1000);
+    netMeter.refreshNet(1);
     Map<String, InterfaceInfo> meterInterfaceInfoMap = 
netMeter.getInterfaceInfoMap();
     Assert.assertTrue(meterInterfaceInfoMap.containsKey("eth0"));
     InterfaceInfo eth0 = meterInterfaceInfoMap.get("eth0");
@@ -82,7 +80,7 @@ public class TestNetMeter {
     list.remove(2);
     list.add("eth0: 1 1    0    0    0     0          0          1         1 1 
   1      0     0     0    0    0");
     list.add("lo: 0 0    0    0    0     0          0          0         0 0   
 0      0     0     0    0    0");
-    netMeter.refreshNet(1000);
+    netMeter.refreshNet(1);
     Assert.assertEquals(2, netMap.size());
     InterfaceInfo eth0 = netMap.get("eth0");
     Assert.assertEquals("eth0", eth0.getName());
@@ -130,7 +128,7 @@ public class TestNetMeter {
     list.remove(2);
     list.remove(2);
     list.add("eth0: 1 1    0    0    0     0          0          1         1 1 
   1      0     0     0    0    0");
-    netMeter.refreshNet(1000);
+    netMeter.refreshNet(1);
     Assert.assertNull(netMap.get("lo"));
     Assert.assertEquals(1, netMap.size());
     Assert.assertEquals("eth0", eth0.getName());
@@ -142,18 +140,11 @@ public class TestNetMeter {
 
 
   @Test
-  public void testCalcMeasurements(@Mocked Id id, @Mocked PollEvent pollEvent) 
{
-
+  public void testCalcMeasurements(@Mocked Id id) {
     List<String> list = new ArrayList<>();
     list.add("useless");
     list.add("useless");
     list.add("eth0: 0 0    0    0    0     0          0          0         0 0 
   0      0     0     0    0    0");
-    new Expectations() {
-      {
-        pollEvent.getMsPollInterval();
-        result = 1000;
-      }
-    };
     new MockUp<FileUtils>() {
       @Mock
       public List<String> readLines(File file, Charset encoding) {
@@ -164,7 +155,7 @@ public class TestNetMeter {
     list.remove(2);
     list.add("eth0: 1 1    0    0    0     0          0          1         1 1 
   1      0     0     0    0    0");
     List<Measurement> measurements = new ArrayList<>();
-    netMeter.calcMeasurements(measurements, 0L, pollEvent);
+    netMeter.calcMeasurements(measurements, 0L, 1);
     Assert.assertEquals(2, measurements.size());
     Measurement send = measurements.get(0);
     Measurement recv = measurements.get(1);
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestOsMeter.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestOsMeter.java
index aa3c3ba..a07f229 100644
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestOsMeter.java
+++ 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/meter/os/TestOsMeter.java
@@ -23,12 +23,10 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.servicecomb.foundation.metrics.PollEvent;
 import org.junit.Assert;
 import org.junit.Test;
 
 import com.google.common.collect.Lists;
-import com.google.common.eventbus.EventBus;
 import com.netflix.spectator.api.DefaultRegistry;
 import com.netflix.spectator.api.ManualClock;
 import com.netflix.spectator.api.Measurement;
@@ -40,12 +38,10 @@ import mockit.MockUp;
 import mockit.Mocked;
 
 public class TestOsMeter {
-  EventBus eventBus = new EventBus();
-
   Registry registry = new DefaultRegistry(new ManualClock());
 
   @Test
-  public void testCalcMeasurement(@Mocked PollEvent pollEvent, @Mocked Runtime 
runtime) {
+  public void testCalcMeasurement(@Mocked Runtime runtime) {
     List<String> list = new ArrayList<>();
     list.add("cpu  1 1 1 1 1 1 1 1 0 0");
     list.add("useless");
@@ -66,16 +62,15 @@ public class TestOsMeter {
       {
         runtime.availableProcessors();
         result = 2;
-        pollEvent.getMsPollInterval();
-        result = 1000;
       }
     };
-    OsMeter osMeter = new OsMeter(registry, eventBus);
+    OsMeter osMeter = new OsMeter(registry);
     list.clear();
     list.add("cpu  2 2 2 2 2 2 2 2 0 0");
     list.add("useless");
     list.add("eth0: 1 1    0    0    0     0          0          1         1 1 
   1      0     0     0    0    0");
-    eventBus.post(pollEvent);
+
+    osMeter.calcMeasurements(1, 1);
     ArrayList<Measurement> measurements = 
Lists.newArrayList(osMeter.measure());
     Assert.assertEquals(3, measurements.size());
     Assert.assertEquals(1.75, measurements.get(0).value(), 0.0);

Reply via email to