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 2023/12/01 08:22:22 UTC

(servicecomb-java-chassis) 04/11: [SCB-2838]using micrometer to replace spectator part3: OsMeter

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 07e85f0acc2cd7620253103c55d7b5814d0601b9
Author: liubao <bi...@qq.com>
AuthorDate: Mon Nov 27 11:57:27 2023 +0800

    [SCB-2838]using micrometer to replace spectator part3: OsMeter
---
 .../foundation/metrics/MetricsBootstrap.java       |  6 +++
 .../metrics/meter/AbstractPeriodMeter.java         | 42 ----------------
 .../foundation/metrics/meter/PeriodMeter.java      |  2 +-
 .../metrics/core/OsMetersInitializer.java          | 10 +++-
 .../metrics/core/meter/os/CpuMeter.java            | 41 ++++++++--------
 .../metrics/core/meter/os/NetMeter.java            | 47 ++++++++----------
 .../servicecomb/metrics/core/meter/os/OsMeter.java | 28 ++++-------
 .../core/meter/os/cpu/AbstractCpuUsage.java        | 13 -----
 .../metrics/core/meter/os/cpu/OsCpuUsage.java      |  5 +-
 .../metrics/core/meter/os/cpu/ProcessCpuUsage.java |  5 +-
 .../metrics/core/meter/os/net/InterfaceUsage.java  | 56 +++++++++++-----------
 .../metrics/core/meter/os/net/NetStat.java         | 11 +----
 12 files changed, 93 insertions(+), 173 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 2521650f6..72be58c9d 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
@@ -22,6 +22,7 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -91,6 +92,11 @@ public class MetricsBootstrap {
   }
 
   public synchronized void pollMeters() {
+    metricsInitializers.forEach(initializer -> {
+      if (initializer instanceof PeriodMeter) {
+        ((PeriodMeter) initializer).poll(System.currentTimeMillis(), config.getMsPollInterval());
+      }
+    });
     try {
       PolledEvent polledEvent = new PolledEvent(meterRegistry.getMeters());
       eventBus.post(polledEvent);
diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/AbstractPeriodMeter.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/AbstractPeriodMeter.java
deleted file mode 100644
index bd8672e5a..000000000
--- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/AbstractPeriodMeter.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.servicecomb.foundation.metrics.meter;
-
-import java.util.Collections;
-import java.util.List;
-
-import io.micrometer.core.instrument.Measurement;
-
-
-public abstract class AbstractPeriodMeter implements PeriodMeter {
-  protected Id id;
-
-  protected List<Measurement> allMeasurements = Collections.emptyList();
-
-  public Id id() {
-    return id;
-  }
-
-  @Override
-  public Iterable<Measurement> measure() {
-    return allMeasurements;
-  }
-
-  public boolean hasExpired() {
-    return false;
-  }
-}
diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/PeriodMeter.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/PeriodMeter.java
index 3fcbf41bd..a846d0817 100644
--- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/PeriodMeter.java
+++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/PeriodMeter.java
@@ -17,5 +17,5 @@
 package org.apache.servicecomb.foundation.metrics.meter;
 
 public interface PeriodMeter {
-  void calcMeasurements(long msNow, long secondInterval);
+  void poll(long msNow, long secondInterval);
 }
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 03b6660ff..2c5b0e28a 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
@@ -19,6 +19,7 @@ package org.apache.servicecomb.metrics.core;
 import org.apache.commons.lang3.SystemUtils;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
+import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter;
 import org.apache.servicecomb.metrics.core.meter.os.OsMeter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -28,7 +29,7 @@ import com.google.common.eventbus.EventBus;
 
 import io.micrometer.core.instrument.MeterRegistry;
 
-public class OsMetersInitializer implements MetricsInitializer {
+public class OsMetersInitializer implements MetricsInitializer, PeriodMeter {
   private static final Logger LOGGER = LoggerFactory.getLogger(OsMetersInitializer.class);
 
   private OsMeter osMeter;
@@ -54,4 +55,11 @@ public class OsMetersInitializer implements MetricsInitializer {
   public OsMeter getOsMeter() {
     return osMeter;
   }
+
+  @Override
+  public void poll(long msNow, long secondInterval) {
+    if (osMeter != null) {
+      osMeter.poll(msNow, secondInterval);
+    }
+  }
 }
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 fdc7e8022..f7d7f83b2 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
@@ -16,20 +16,21 @@
  */
 package org.apache.servicecomb.metrics.core.meter.os;
 
-import java.util.List;
+import java.io.IOException;
 
+import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter;
 import org.apache.servicecomb.metrics.core.meter.os.cpu.OsCpuUsage;
 import org.apache.servicecomb.metrics.core.meter.os.cpu.ProcessCpuUsage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import io.micrometer.core.instrument.Measurement;
-import io.micrometer.core.instrument.Meter.Id;
-import io.micrometer.core.instrument.Statistic;
-import io.micrometer.core.instrument.Tag;
+import com.google.common.annotations.VisibleForTesting;
 
+import io.micrometer.core.instrument.Gauge;
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
 
-public class CpuMeter {
+public class CpuMeter implements PeriodMeter {
   private static final Logger LOGGER = LoggerFactory.getLogger(CpuMeter.class);
 
   // read from /proc/stat
@@ -38,35 +39,33 @@ public class CpuMeter {
   // read from /proc/self/stat /proc/uptime
   private final ProcessCpuUsage processCpuUsage;
 
-  public CpuMeter(Id id) {
-    allCpuUsage = new OsCpuUsage(id.withTag(Tag.of(OsMeter.OS_TYPE, OsMeter.OS_TYPE_ALL_CPU)));
-    processCpuUsage = new ProcessCpuUsage(id.withTag(Tag.of(OsMeter.OS_TYPE, OsMeter.OS_TYPE_PROCESS_CPU)));
+  public CpuMeter(MeterRegistry meterRegistry, String name) {
+    allCpuUsage = new OsCpuUsage();
+    processCpuUsage = new ProcessCpuUsage();
 
-    //must refresh all first
-    update();
-    allCpuUsage.setUsage(0);
-    processCpuUsage.setUsage(0);
-  }
+    Gauge.builder(name, allCpuUsage::getUsage).tags(Tags.of(OsMeter.OS_TYPE, OsMeter.OS_TYPE_ALL_CPU))
+        .register(meterRegistry);
 
-  public void calcMeasurements(List<Measurement> measurements, long msNow) {
-    update();
-    measurements.add(new Measurement(() -> allCpuUsage.getUsage(), Statistic.VALUE));
-    measurements.add(new Measurement(() -> processCpuUsage.getUsage(), Statistic.VALUE));
+    Gauge.builder(name, processCpuUsage::getUsage).tags(Tags.of(OsMeter.OS_TYPE, OsMeter.OS_TYPE_PROCESS_CPU))
+        .register(meterRegistry);
   }
 
-  public void update() {
+  @Override
+  public void poll(long msNow, long secondInterval) {
     try {
       allCpuUsage.update();
       processCpuUsage.update();
-    } catch (Throwable e) {
-      LOGGER.error("Failed to update usage", e);
+    } catch (IOException e) {
+      LOGGER.error("Failed to update cpu usage", e);
     }
   }
 
+  @VisibleForTesting
   public OsCpuUsage getAllCpuUsage() {
     return allCpuUsage;
   }
 
+  @VisibleForTesting
   public ProcessCpuUsage getProcessCpuUsage() {
     return processCpuUsage;
   }
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 d7893095b..28427801b 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
@@ -19,24 +19,22 @@ package org.apache.servicecomb.metrics.core.meter.os;
 import java.io.File;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter;
 import org.apache.servicecomb.metrics.core.meter.os.net.InterfaceUsage;
-import org.apache.servicecomb.metrics.core.meter.os.net.NetStat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import io.micrometer.core.instrument.Measurement;
-import io.micrometer.core.instrument.Meter.Id;
+import io.micrometer.core.instrument.MeterRegistry;
 import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.Tags;
 
 
-public class NetMeter {
+public class NetMeter implements PeriodMeter {
   private static final Logger LOGGER = LoggerFactory.getLogger(NetMeter.class);
 
   public static final String STATISTIC = "statistic";
@@ -51,23 +49,24 @@ public class NetMeter {
 
   public static final Tag TAG_PACKETS_SEND = Tag.of(STATISTIC, "sendPackets");
 
-  private final Id id;
-
   private final Map<String, InterfaceUsage> interfaceUsageMap = new ConcurrentHashMap<>();
 
-  public NetMeter(Id id) {
-    this.id = id;
-    // init lastRxBytes, lastRxPackets, lastTxBytes, lastTxPackets
-    refreshNet(1);
-    interfaceUsageMap.values().forEach(interfaceUsage -> interfaceUsage.getNetStats().forEach(NetStat::clearRate));
-  }
+  protected final MeterRegistry meterRegistry;
 
-  public void calcMeasurements(List<Measurement> measurements, long msNow, long secondInterval) {
-    refreshNet(secondInterval);
+  protected final String name;
 
-    interfaceUsageMap.values().forEach(interfaceUsage -> interfaceUsage.calcMeasurements(measurements, msNow));
+  protected final Tags tags;
+
+  public NetMeter(MeterRegistry meterRegistry, String name, Tags tags) {
+    this.meterRegistry = meterRegistry;
+    this.name = name;
+    this.tags = tags;
   }
 
+  @Override
+  public void poll(long msNow, long secondInterval) {
+    refreshNet(secondInterval);
+  }
 
   /*
    * Inter-|   Receive                                                            |  Transmit
@@ -79,7 +78,6 @@ public class NetMeter {
     try {
       File file = new File("/proc/net/dev");
       List<String> netInfo = FileUtils.readLines(file, StandardCharsets.UTF_8);
-      Set<String> nameSet = new HashSet<>();
 
       //the first two lines is useless
       for (int i = 2; i < netInfo.size(); i++) {
@@ -90,19 +88,12 @@ public class NetMeter {
           continue;
         }
 
-        String name = strings[0].trim();
-        nameSet.add(name);
+        String interfaceName = strings[0].trim();
 
-        InterfaceUsage interfaceUsage = interfaceUsageMap.computeIfAbsent(name, key -> new InterfaceUsage(id, key));
+        InterfaceUsage interfaceUsage = interfaceUsageMap.computeIfAbsent(interfaceName,
+            key -> new InterfaceUsage(meterRegistry, name, tags, key));
         interfaceUsage.update(strings[1], secondInterval);
       }
-
-      // clear deleted interfaces
-      for (String interfaceName : interfaceUsageMap.keySet()) {
-        if (!nameSet.contains(interfaceName)) {
-          this.interfaceUsageMap.remove(interfaceName);
-        }
-      }
     } catch (IOException e) {
       LOGGER.error("Failed to read net info/", e);
     }
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 7425e28fc..832773012 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
@@ -16,16 +16,12 @@
  */
 package org.apache.servicecomb.metrics.core.meter.os;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.servicecomb.foundation.metrics.meter.AbstractPeriodMeter;
+import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter;
 
 import com.google.common.annotations.VisibleForTesting;
 
-import io.micrometer.core.instrument.Measurement;
 import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.Tags;
 
 /**
  * name=os type=cpu value = 0
@@ -35,7 +31,7 @@ import io.micrometer.core.instrument.Tag;
  * name=os type=net interface=eth0 statistic=sendPackets value=100
  * name=os type=net interface=eth0 statistic=receivePackets value=100
  */
-public class OsMeter extends AbstractPeriodMeter {
+public class OsMeter implements PeriodMeter {
   public static final String OS_NAME = "os";
 
   public static final String OS_TYPE = "type";
@@ -51,22 +47,14 @@ public class OsMeter extends AbstractPeriodMeter {
   private final NetMeter netMeter;
 
   public OsMeter(MeterRegistry meterRegistry) {
-    this.id = Id.
-    cpuMeter = new CpuMeter(id);
-    netMeter = new NetMeter(id.withTag(Tag.of(OS_TYPE, OS_TYPE_NET)));
-  }
-
-  @Override
-  public void calcMeasurements(long msNow, long secondInterval) {
-    List<Measurement> measurements = new ArrayList<>();
-    calcMeasurements(measurements, msNow, secondInterval);
-    allMeasurements = measurements;
+    cpuMeter = new CpuMeter(meterRegistry, OS_NAME);
+    netMeter = new NetMeter(meterRegistry, OS_NAME, Tags.of(OS_TYPE, OS_TYPE_NET));
   }
 
   @Override
-  public void calcMeasurements(List<Measurement> measurements, long msNow, long secondInterval) {
-    cpuMeter.calcMeasurements(measurements, msNow);
-    netMeter.calcMeasurements(measurements, msNow, secondInterval);
+  public void poll(long msNow, long secondInterval) {
+    cpuMeter.poll(msNow, secondInterval);
+    netMeter.poll(msNow, secondInterval);
   }
 
   @VisibleForTesting
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/AbstractCpuUsage.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/AbstractCpuUsage.java
index 8605edeb5..fb2eaa45b 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/AbstractCpuUsage.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/AbstractCpuUsage.java
@@ -17,12 +17,7 @@
 package org.apache.servicecomb.metrics.core.meter.os.cpu;
 
 
-import io.micrometer.core.instrument.Meter.Id;
-
 public abstract class AbstractCpuUsage {
-
-  protected Id id;
-
   protected double usage;
 
   protected int cpuCount = Runtime.getRuntime().availableProcessors();
@@ -38,14 +33,6 @@ public abstract class AbstractCpuUsage {
     }
   }
 
-  public AbstractCpuUsage(Id id) {
-    this.id = id;
-  }
-
-  public Id getId() {
-    return id;
-  }
-
   public double getUsage() {
     return usage;
   }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/OsCpuUsage.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/OsCpuUsage.java
index 8b40f212c..09ac5bc7b 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/OsCpuUsage.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/OsCpuUsage.java
@@ -18,8 +18,6 @@ package org.apache.servicecomb.metrics.core.meter.os.cpu;
 
 import java.io.IOException;
 
-import io.micrometer.core.instrument.Meter.Id;
-
 /*
  * unit : 1 jiffies
  * more details :
@@ -37,8 +35,7 @@ public class OsCpuUsage extends AbstractCpuUsage {
 
   private final Period idle = new Period();
 
-  public OsCpuUsage(Id id) {
-    super(id);
+  public OsCpuUsage() {
   }
 
   public void update() throws IOException {
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/ProcessCpuUsage.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/ProcessCpuUsage.java
index 6ab7ad828..1e0f55e68 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/ProcessCpuUsage.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/ProcessCpuUsage.java
@@ -18,8 +18,6 @@ package org.apache.servicecomb.metrics.core.meter.os.cpu;
 
 import java.io.IOException;
 
-import io.micrometer.core.instrument.Meter.Id;
-
 /*
  * unit : 1 jiffies
  * more details :
@@ -41,8 +39,7 @@ public class ProcessCpuUsage extends AbstractCpuUsage {
 
   private final int userHZ = CpuUtils.calcHertz();
 
-  public ProcessCpuUsage(Id id) {
-    super(id);
+  public ProcessCpuUsage() {
   }
 
   public void update() throws IOException {
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/InterfaceUsage.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/InterfaceUsage.java
index a72217894..432975bfa 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/InterfaceUsage.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/InterfaceUsage.java
@@ -22,51 +22,49 @@ import static org.apache.servicecomb.metrics.core.meter.os.NetMeter.TAG_PACKETS_
 import static org.apache.servicecomb.metrics.core.meter.os.NetMeter.TAG_RECEIVE;
 import static org.apache.servicecomb.metrics.core.meter.os.NetMeter.TAG_SEND;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import io.micrometer.core.instrument.Measurement;
-import io.micrometer.core.instrument.Meter.Id;
-import io.micrometer.core.instrument.Statistic;
+import io.micrometer.core.instrument.Gauge;
+import io.micrometer.core.instrument.MeterRegistry;
 import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.Tags;
 
 public class InterfaceUsage {
-  private final String name;
+  private final String interfaceName;
 
-  private final List<NetStat> netStats = new ArrayList<>();
+  private final NetStat receive;
 
-  public InterfaceUsage(Id id, String name) {
-    this.name = name;
-    id = id.withTag(Tag.of(INTERFACE, name));
-    init(id);
-  }
+  private final NetStat send;
+
+  private final NetStat packetsReceive;
+
+  private final NetStat packetsSend;
+
+  public InterfaceUsage(MeterRegistry meterRegistry, String name, Tags tags, String interfaceName) {
+    this.interfaceName = interfaceName;
+    tags.and(Tag.of(INTERFACE, name));
 
-  private void init(Id id) {
     // recv/Bps
-    netStats.add(new NetStat(id.withTag(TAG_RECEIVE), 0));
+    receive = new NetStat(0);
+    Gauge.builder(name, receive::getRate).tags(tags.and(TAG_RECEIVE, null)).register(meterRegistry);
     // send/Bps
-    netStats.add(new NetStat(id.withTag(TAG_SEND), 8));
-
+    send = new NetStat(8);
+    Gauge.builder(name, send::getRate).tags(tags.and(TAG_SEND, null)).register(meterRegistry);
     // recv/pps
-    netStats.add(new NetStat(id.withTag(TAG_PACKETS_RECEIVE), 1));
+    packetsReceive = new NetStat(1);
+    Gauge.builder(name, packetsReceive::getRate).tags(tags.and(TAG_PACKETS_RECEIVE, null)).register(meterRegistry);
     // send/pps
-    netStats.add(new NetStat(id.withTag(TAG_PACKETS_SEND), 9));
-  }
-
-  public void calcMeasurements(List<Measurement> measurements, long msNow) {
-    netStats.forEach(netStat -> measurements.add(new Measurement(() -> netStat.getRate(), Statistic.VALUE)));
+    packetsSend = new NetStat(9);
+    Gauge.builder(name, packetsSend::getRate).tags(tags.and(TAG_PACKETS_SEND, null)).register(meterRegistry);
   }
 
   public void update(String interfaceData, long secondInterval) {
     String[] netInfo = interfaceData.trim().split("\\s+");
-    netStats.forEach(netStat -> netStat.update(netInfo, secondInterval));
+    receive.update(netInfo, secondInterval);
+    send.update(netInfo, secondInterval);
+    packetsReceive.update(netInfo, secondInterval);
+    packetsSend.update(netInfo, secondInterval);
   }
 
   public String getName() {
-    return name;
-  }
-
-  public List<NetStat> getNetStats() {
-    return netStats;
+    return interfaceName;
   }
 }
diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/NetStat.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/NetStat.java
index 48b3d9d7d..fac707dce 100644
--- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/NetStat.java
+++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/NetStat.java
@@ -17,21 +17,16 @@
 package org.apache.servicecomb.metrics.core.meter.os.net;
 
 
-import io.micrometer.core.instrument.Meter.Id;
-
 public class NetStat {
   private final int index;
 
-  private final Id id;
-
   // send/recv bytes/packets
   private long lastValue;
 
   // Bps/pps
   private double rate;
 
-  public NetStat(Id id, int index) {
-    this.id = id;
+  public NetStat(int index) {
     this.index = index;
   }
 
@@ -56,8 +51,4 @@ public class NetStat {
   public int getIndex() {
     return index;
   }
-
-  public Id getId() {
-    return id;
-  }
 }