You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2018/11/24 02:09:00 UTC
[servicecomb-java-chassis] 04/10: [SCB-1034][WIP] os meters switch
to new mechanism
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 <wu...@huawei.com>
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);