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