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 7bc6d7f84eee1c56732b5498c20dd6f38bbc38fb
Author: liubao <[email protected]>
AuthorDate: Sat Nov 25 10:02:13 2023 +0800

    [SCB-2838]using micrometer to replace spectator part1: MetricsInitializer
---
 foundations/foundation-metrics/pom.xml             |  4 +-
 .../com/netflix/spectator/api/SpectatorUtils.java  | 16 ++--
 .../foundation/metrics/MetricsBootstrap.java       | 18 +++--
 .../foundation/metrics/MetricsInitializer.java     |  9 +--
 .../foundation/metrics/PolledEvent.java            | 17 +---
 .../metrics/meter/AbstractPeriodMeter.java         |  4 +-
 .../metrics/meter/LatencyScopeMeter.java           | 12 +--
 .../foundation/metrics/meter/PeriodMeter.java      |  5 +-
 .../foundation/metrics/meter/SimpleTimer.java      |  6 +-
 .../publish/spectator/DefaultTagFinder.java        |  5 +-
 .../metrics/publish/spectator/MeasurementNode.java |  4 +-
 .../metrics/publish/spectator/MeasurementTree.java | 21 +++--
 .../metrics/publish/spectator/TagFinder.java       |  2 +-
 .../metrics/registry/GlobalRegistry.java           | 92 ++--------------------
 .../foundation/metrics/TestMetricsBootstrap.java   | 12 ++-
 .../foundation/metrics/meter/TestSimpleTimer.java  |  9 ++-
 .../metrics/core/DefaultRegistryInitializer.java   | 63 ---------------
 .../metrics/core/InvocationMetersInitializer.java  | 14 ++--
 .../metrics/core/MetricsCoreConfiguration.java     |  5 --
 .../metrics/core/OsMetersInitializer.java          | 11 +--
 .../metrics/core/ThreadPoolMetersInitializer.java  | 36 ++++-----
 .../metrics/core/VertxMetersInitializer.java       | 20 ++---
 .../metrics/core/meter/ConsumerMeters.java         |  6 +-
 .../servicecomb/metrics/core/meter/EdgeMeters.java |  6 +-
 .../metrics/core/meter/ProducerMeters.java         |  6 +-
 .../meter/invocation/AbstractInvocationMeter.java  |  4 +-
 .../meter/invocation/AbstractInvocationMeters.java | 28 +++----
 .../meter/invocation/ConsumerInvocationMeters.java |  8 +-
 .../meter/invocation/EdgeInvocationMeters.java     |  8 +-
 .../meter/invocation/ProducerInvocationMeters.java |  8 +-
 .../metrics/core/meter/os/CpuMeter.java            | 15 ++--
 .../metrics/core/meter/os/NetMeter.java            | 16 ++--
 .../servicecomb/metrics/core/meter/os/OsMeter.java | 12 +--
 .../core/meter/os/cpu/AbstractCpuUsage.java        |  3 +-
 .../metrics/core/meter/os/cpu/OsCpuUsage.java      |  2 +-
 .../metrics/core/meter/os/cpu/ProcessCpuUsage.java |  2 +-
 .../metrics/core/meter/os/net/InterfaceUsage.java  | 10 ++-
 .../metrics/core/meter/os/net/NetStat.java         |  3 +-
 .../metrics/core/meter/vertx/EndpointMeter.java    | 22 +++---
 .../core/meter/vertx/HttpClientEndpointsMeter.java |  7 +-
 .../core/meter/vertx/VertxEndpointsMeter.java      | 10 ++-
 .../metrics/core/publish/DefaultLogPublisher.java  | 14 ++--
 .../metrics/core/publish/PublishModelFactory.java  |  3 +-
 .../core/TestDefaultRegistryInitializer.java       | 73 -----------------
 .../metrics/core/meter/os/TestOsMeter.java         | 25 +++---
 .../metrics/prometheus/PrometheusPublisher.java    | 43 +++++-----
 .../basic/integration/MetricsEndpointImpl.java     | 35 ++++----
 47 files changed, 256 insertions(+), 498 deletions(-)

diff --git a/foundations/foundation-metrics/pom.xml 
b/foundations/foundation-metrics/pom.xml
index ba0193e70..aca8ad61d 100644
--- a/foundations/foundation-metrics/pom.xml
+++ b/foundations/foundation-metrics/pom.xml
@@ -32,8 +32,8 @@
       <artifactId>foundation-common</artifactId>
     </dependency>
     <dependency>
-      <groupId>com.netflix.spectator</groupId>
-      <artifactId>spectator-reg-servo</artifactId>
+      <groupId>io.micrometer</groupId>
+      <artifactId>micrometer-core</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.logging.log4j</groupId>
diff --git 
a/foundations/foundation-metrics/src/main/java/com/netflix/spectator/api/SpectatorUtils.java
 
b/foundations/foundation-metrics/src/main/java/com/netflix/spectator/api/SpectatorUtils.java
index cccc7107f..400b8cb4b 100644
--- 
a/foundations/foundation-metrics/src/main/java/com/netflix/spectator/api/SpectatorUtils.java
+++ 
b/foundations/foundation-metrics/src/main/java/com/netflix/spectator/api/SpectatorUtils.java
@@ -16,21 +16,15 @@
  */
 package com.netflix.spectator.api;
 
+import io.micrometer.core.instrument.Meter;
+import io.micrometer.core.instrument.MeterRegistry;
+
 public final class SpectatorUtils {
   private SpectatorUtils() {
   }
 
-  public static Id createDefaultId(String name) {
-    return new DefaultId(name);
-  }
-
-  public static void removeExpiredMeters(Registry registry) {
-    if (registry instanceof AbstractRegistry) {
-      ((AbstractRegistry) registry).removeExpiredMeters();
-    }
-  }
-
-  public static void registerMeter(Registry registry, Meter meter) {
+  public static void registerMeter(MeterRegistry registry, Meter meter) {
+    registry.counter()
     if (!(registry instanceof AbstractRegistry)) {
       throw new IllegalStateException("registry must be a AbstractRegistry, 
class=" + registry.getClass().getName());
     }
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 5b014afe8..2521650f6 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,7 +22,6 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,10 +30,12 @@ import org.springframework.core.env.Environment;
 import com.google.common.eventbus.EventBus;
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 
+import io.micrometer.core.instrument.MeterRegistry;
+
 public class MetricsBootstrap {
   private static final Logger LOGGER = 
LoggerFactory.getLogger(MetricsBootstrap.class);
 
-  private GlobalRegistry globalRegistry;
+  private MeterRegistry meterRegistry;
 
   private EventBus eventBus;
 
@@ -57,15 +58,19 @@ public class MetricsBootstrap {
     this.metricsInitializers = metricsInitializers;
   }
 
-  public void start(GlobalRegistry globalRegistry, EventBus eventBus) {
-    this.globalRegistry = globalRegistry;
+  @Autowired
+  public void setMeterRegistry(MeterRegistry meterRegistry) {
+    this.meterRegistry = meterRegistry;
+  }
+
+  public void start(EventBus eventBus) {
     this.eventBus = eventBus;
     this.executorService = Executors.newScheduledThreadPool(1,
         new ThreadFactoryBuilder()
             .setNameFormat("spectator-poller-%d")
             .build());
 
-    metricsInitializers.forEach(initializer -> 
initializer.init(globalRegistry, eventBus, config));
+    metricsInitializers.forEach(initializer -> 
initializer.init(this.meterRegistry, eventBus, config));
     startPoll();
   }
 
@@ -87,8 +92,7 @@ public class MetricsBootstrap {
 
   public synchronized void pollMeters() {
     try {
-      long secondInterval = 
TimeUnit.MILLISECONDS.toSeconds(config.getMsPollInterval());
-      PolledEvent polledEvent = globalRegistry.poll(secondInterval);
+      PolledEvent polledEvent = new PolledEvent(meterRegistry.getMeters());
       eventBus.post(polledEvent);
     } catch (Throwable e) {
       LOGGER.error("poll meters error. ", e);
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 88201dcb2..3cb0b8f95 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
@@ -16,19 +16,16 @@
  */
 package org.apache.servicecomb.foundation.metrics;
 
-import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
-
 import com.google.common.eventbus.EventBus;
 
+import io.micrometer.core.instrument.MeterRegistry;
+
 public interface MetricsInitializer {
   default int getOrder() {
     return 0;
   }
 
-  /**
-   * if create new registry, must add to globalRegistry
-   */
-  void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config);
+  void init(MeterRegistry meterRegistry, EventBus eventBus, 
MetricsBootstrapConfig config);
 
   default void destroy() {
 
diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/PolledEvent.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/PolledEvent.java
index 6b7c3018c..0814f9614 100644
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/PolledEvent.java
+++ 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/PolledEvent.java
@@ -18,17 +18,14 @@ package org.apache.servicecomb.foundation.metrics;
 
 import java.util.List;
 
-import com.netflix.spectator.api.Measurement;
-import com.netflix.spectator.api.Meter;
+import io.micrometer.core.instrument.Meter;
+
 
 public class PolledEvent {
   private List<Meter> meters;
 
-  private List<Measurement> measurements;
-
-  public PolledEvent(List<Meter> meters, List<Measurement> measurements) {
+  public PolledEvent(List<Meter> meters) {
     this.meters = meters;
-    this.measurements = measurements;
   }
 
   public List<Meter> getMeters() {
@@ -38,12 +35,4 @@ public class PolledEvent {
   public void setMeters(List<Meter> meters) {
     this.meters = meters;
   }
-
-  public List<Measurement> getMeasurements() {
-    return measurements;
-  }
-
-  public void setMeasurements(List<Measurement> measurements) {
-    this.measurements = measurements;
-  }
 }
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
index d9e2f46d5..bd8672e5a 100644
--- 
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
@@ -19,8 +19,8 @@ package org.apache.servicecomb.foundation.metrics.meter;
 import java.util.Collections;
 import java.util.List;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Measurement;
+import io.micrometer.core.instrument.Measurement;
+
 
 public abstract class AbstractPeriodMeter implements PeriodMeter {
   protected Id id;
diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/LatencyScopeMeter.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/LatencyScopeMeter.java
index 114f930f0..506375d09 100644
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/LatencyScopeMeter.java
+++ 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/LatencyScopeMeter.java
@@ -19,8 +19,10 @@ package org.apache.servicecomb.foundation.metrics.meter;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.LongAdder;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Measurement;
+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;
 
 public class LatencyScopeMeter {
   private final Id scopeId;
@@ -36,8 +38,8 @@ public class LatencyScopeMeter {
   public LatencyScopeMeter(Id latencyDistributionId, LatencyScopeConfig 
config) {
     nanoMin = TimeUnit.MILLISECONDS.toNanos(config.getMsMin());
     nanoMax = TimeUnit.MILLISECONDS.toNanos(config.getMsMax());
-    scopeId = latencyDistributionId.withTag("scope",
-        String.format("[%d,%s)", config.getMsMin(), config.getMsMax() == 
Long.MAX_VALUE ? "" : config.getMsMax()));
+    scopeId = latencyDistributionId.withTag(Tag.of("scope",
+        String.format("[%d,%s)", config.getMsMin(), config.getMsMax() == 
Long.MAX_VALUE ? "" : config.getMsMax())));
   }
 
   public boolean update(long nanoLatency) {
@@ -54,6 +56,6 @@ public class LatencyScopeMeter {
     long deltaTimes = currentTimes - lastTimes;
     this.lastTimes = currentTimes;
 
-    return new Measurement(scopeId, msNow, deltaTimes);
+    return new Measurement(() -> deltaTimes, Statistic.VALUE);
   }
 }
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 f91d781e1..4fa57f13e 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
@@ -18,8 +18,9 @@ package org.apache.servicecomb.foundation.metrics.meter;
 
 import java.util.List;
 
-import com.netflix.spectator.api.Measurement;
-import com.netflix.spectator.api.Meter;
+import io.micrometer.core.instrument.Measurement;
+import io.micrometer.core.instrument.Meter;
+
 
 public interface PeriodMeter extends Meter {
   void calcMeasurements(long msNow, long secondInterval);
diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/SimpleTimer.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/SimpleTimer.java
index 09803a471..f1860a783 100644
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/SimpleTimer.java
+++ 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/SimpleTimer.java
@@ -21,10 +21,8 @@ import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.LongAdder;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Measurement;
-import com.netflix.spectator.api.Statistic;
-import com.netflix.spectator.impl.AtomicDouble;
+
+import io.micrometer.core.instrument.Measurement;
 
 /**
  * ServoTimer is too slow
diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/DefaultTagFinder.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/DefaultTagFinder.java
index 17d3d9a73..31af35c7a 100644
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/DefaultTagFinder.java
+++ 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/DefaultTagFinder.java
@@ -16,7 +16,8 @@
  */
 package org.apache.servicecomb.foundation.metrics.publish.spectator;
 
-import com.netflix.spectator.api.Tag;
+
+import io.micrometer.core.instrument.Tag;
 
 public class DefaultTagFinder implements TagFinder {
   private final String tagKey;
@@ -45,7 +46,7 @@ public class DefaultTagFinder implements TagFinder {
   @Override
   public Tag find(Iterable<Tag> tags) {
     for (Tag tag : tags) {
-      if (tag.key().equals(tagKey)) {
+      if (tag.getKey().equals(tagKey)) {
         return tag;
       }
     }
diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/MeasurementNode.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/MeasurementNode.java
index c138bea15..272f6b87e 100644
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/MeasurementNode.java
+++ 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/MeasurementNode.java
@@ -21,7 +21,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
-import com.netflix.spectator.api.Measurement;
+import io.micrometer.core.instrument.Measurement;
 
 public class MeasurementNode implements Comparable<MeasurementNode> {
   private final String name;
@@ -84,7 +84,7 @@ public class MeasurementNode implements 
Comparable<MeasurementNode> {
   public double summary() {
     double result = 0;
     for (Measurement measurement : measurements) {
-      result += measurement.value();
+      result += measurement.getValue();
     }
 
     return result;
diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/MeasurementTree.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/MeasurementTree.java
index 79101fa16..e2dbd268b 100644
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/MeasurementTree.java
+++ 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/MeasurementTree.java
@@ -19,10 +19,10 @@ package 
org.apache.servicecomb.foundation.metrics.publish.spectator;
 import java.util.Iterator;
 import java.util.List;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Measurement;
-import com.netflix.spectator.api.Meter;
-import com.netflix.spectator.api.Tag;
+import io.micrometer.core.instrument.Measurement;
+import io.micrometer.core.instrument.Meter;
+import io.micrometer.core.instrument.Meter.Id;
+import io.micrometer.core.instrument.Tag;
 
 // like select * from meters group by ......
 // but output a tree not a table
@@ -38,22 +38,21 @@ public class MeasurementTree extends MeasurementNode {
   public void from(Iterator<Meter> meters, MeasurementGroupConfig groupConfig) 
{
     meters.forEachRemaining(meter -> {
       Iterable<Measurement> measurements = meter.measure();
-      from(measurements, groupConfig);
+      from(meter.getId(), measurements, groupConfig);
     });
   }
 
-  public void from(Iterable<Measurement> measurements, MeasurementGroupConfig 
groupConfig) {
+  public void from(Id id, Iterable<Measurement> measurements, 
MeasurementGroupConfig groupConfig) {
     for (Measurement measurement : measurements) {
-      Id id = measurement.id();
-      MeasurementNode node = addChild(id.name(), measurement);
+      MeasurementNode node = addChild(id.getName(), measurement);
 
-      List<TagFinder> tagFinders = groupConfig.findTagFinders(id.name());
+      List<TagFinder> tagFinders = groupConfig.findTagFinders(id.getName());
       if (tagFinders == null) {
         continue;
       }
 
       for (TagFinder tagFinder : tagFinders) {
-        Tag tag = tagFinder.find(id.tags());
+        Tag tag = tagFinder.find(id.getTags());
         if (tag == null) {
           if (tagFinder.skipOnNull()) {
             break;
@@ -64,7 +63,7 @@ public class MeasurementTree extends MeasurementNode {
                   measurement));
         }
 
-        node = node.addChild(tag.value(), measurement);
+        node = node.addChild(tag.getValue(), measurement);
       }
     }
   }
diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/TagFinder.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/TagFinder.java
index 0762afb8d..a3c893b4b 100644
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/TagFinder.java
+++ 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/spectator/TagFinder.java
@@ -16,7 +16,7 @@
  */
 package org.apache.servicecomb.foundation.metrics.publish.spectator;
 
-import com.netflix.spectator.api.Tag;
+import io.micrometer.core.instrument.Tag;
 
 public interface TagFinder {
   static TagFinder build(Object obj) {
diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/registry/GlobalRegistry.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/registry/GlobalRegistry.java
index 25e85b134..453c86495 100644
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/registry/GlobalRegistry.java
+++ 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/registry/GlobalRegistry.java
@@ -16,99 +16,19 @@
  */
 package org.apache.servicecomb.foundation.metrics.registry;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-
 import org.apache.servicecomb.foundation.metrics.PolledEvent;
-import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter;
-
-import com.netflix.spectator.api.Clock;
-import com.netflix.spectator.api.Measurement;
-import com.netflix.spectator.api.Meter;
-import com.netflix.spectator.api.Registry;
-import com.netflix.spectator.api.SpectatorUtils;
-
-public class GlobalRegistry {
-  private final Clock clock;
 
-  private final List<Registry> registries = new CopyOnWriteArrayList<>();
+import io.micrometer.core.instrument.MeterRegistry;
 
-  private Registry defaultRegistry;
 
-  public GlobalRegistry() {
-    this(Clock.SYSTEM);
-  }
-
-  public GlobalRegistry(Clock clock) {
-    this.clock = clock;
-  }
-
-  public Clock getClock() {
-    return clock;
-  }
-
-  public List<Registry> getRegistries() {
-    return registries;
-  }
-
-  public Registry getDefaultRegistry() {
-    return defaultRegistry;
-  }
-
-  public synchronized void add(Registry registry) {
-    if (registries.isEmpty()) {
-      defaultRegistry = registry;
-    }
-    registries.add(registry);
-  }
-
-  public synchronized void remove(Registry registry) {
-    registries.remove(registry);
-    if (registry != defaultRegistry) {
-      return;
-    }
-
-    if (registries.isEmpty()) {
-      defaultRegistry = null;
-      return;
-    }
-
-    defaultRegistry = registries.get(0);
-  }
-
-  public synchronized void removeAll() {
-    registries.clear();
-    defaultRegistry = null;
-  }
+public class GlobalRegistry {
+  private final MeterRegistry meterRegistry;
 
-  @SuppressWarnings("unchecked")
-  public <T extends Registry> T find(Class<T> cls) {
-    for (Registry registry : registries) {
-      if (cls.isAssignableFrom(registry.getClass())) {
-        return (T) registry;
-      }
-    }
-    return null;
+  public GlobalRegistry(MeterRegistry meterRegistry) {
+    this.meterRegistry = meterRegistry;
   }
 
   public PolledEvent poll(long secondInterval) {
-    long msNow = clock.wallTime();
-    List<Meter> meters = new ArrayList<>();
-    List<Measurement> measurements = new ArrayList<>();
-    for (Registry registry : registries) {
-      SpectatorUtils.removeExpiredMeters(registry);
-
-      for (Meter meter : registry) {
-        if (meter instanceof PeriodMeter) {
-          ((PeriodMeter) meter).calcMeasurements(msNow, secondInterval);
-        }
-
-        meters.add(meter);
-        meter.measure().forEach(measurements::add);
-      }
-    }
-
-    return new PolledEvent(meters, measurements);
+    return new PolledEvent(this.meterRegistry.getMeters());
   }
 }
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 466a0c5f1..02deb078b 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
@@ -25,7 +25,6 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.ScheduledExecutorService;
 
-import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
 import org.hamcrest.MatcherAssert;
 import org.hamcrest.Matchers;
 import org.junit.jupiter.api.Assertions;
@@ -36,13 +35,12 @@ import org.springframework.core.env.Environment;
 
 import com.google.common.eventbus.EventBus;
 
+import io.micrometer.core.instrument.MeterRegistry;
 import mockit.Deencapsulation;
 
 public class TestMetricsBootstrap {
   MetricsBootstrap bootstrap = new MetricsBootstrap();
 
-  GlobalRegistry globalRegistry = new GlobalRegistry();
-
   EventBus eventBus = new EventBus();
 
   Environment environment = Mockito.mock(Environment.class);
@@ -63,14 +61,14 @@ public class TestMetricsBootstrap {
     List<MetricsInitializer> initList = new ArrayList<>();
     MetricsInitializer metricsInitializer = new MetricsInitializer() {
       @Override
-      public void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
+      public void init(MeterRegistry meterRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
         initList.add(this);
       }
     };
 
     bootstrap.setMetricsInitializers(Arrays.asList(metricsInitializer, 
metricsInitializer));
 
-    bootstrap.start(globalRegistry, eventBus);
+    bootstrap.start(eventBus);
     bootstrap.shutdown();
 
     MatcherAssert.assertThat(initList, Matchers.contains(metricsInitializer, 
metricsInitializer));
@@ -87,7 +85,7 @@ public class TestMetricsBootstrap {
       }
 
       @Override
-      public void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
+      public void init(MeterRegistry meterRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
       }
 
       @Override
@@ -103,7 +101,7 @@ public class TestMetricsBootstrap {
       }
 
       @Override
-      public void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
+      public void init(MeterRegistry meterRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
       }
 
       @Override
diff --git 
a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/meter/TestSimpleTimer.java
 
b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/meter/TestSimpleTimer.java
index 47b60ec47..adc08f1bb 100644
--- 
a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/meter/TestSimpleTimer.java
+++ 
b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/meter/TestSimpleTimer.java
@@ -16,12 +16,15 @@
  */
 package org.apache.servicecomb.foundation.metrics.meter;
 
-import com.netflix.spectator.api.SpectatorUtils;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import io.micrometer.core.instrument.Meter.Id;
+import io.micrometer.core.instrument.Meter.Type;
+import io.micrometer.core.instrument.Tags;
+
 public class TestSimpleTimer {
-  SimpleTimer timer = new SimpleTimer(SpectatorUtils.createDefaultId("name"));
+  SimpleTimer timer = new SimpleTimer(new Id("test", Tags.empty(), null, null, 
Type.TIMER));
 
   @Test
   public void measure() {
@@ -35,6 +38,6 @@ public class TestSimpleTimer {
         "[Measurement(name:statistic=count,1,1.0), 
Measurement(name:statistic=totalTime,1,3.0000000000000004E-9), 
Measurement(name:statistic=max,1,4.0E-9)]",
         timer.measure().toString());
     Assertions.assertFalse(timer.hasExpired());
-    Assertions.assertEquals("name", timer.id().name());
+    Assertions.assertEquals("name", timer.id().getName());
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/DefaultRegistryInitializer.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/DefaultRegistryInitializer.java
deleted file mode 100644
index d48898c6b..000000000
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/DefaultRegistryInitializer.java
+++ /dev/null
@@ -1,63 +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.metrics.core;
-
-import java.time.Duration;
-
-import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
-import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
-import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
-
-import com.google.common.eventbus.EventBus;
-import com.netflix.servo.DefaultMonitorRegistry;
-
-public class DefaultRegistryInitializer implements MetricsInitializer {
-  public static final String SERVO_POLLERS = "servo.pollers";
-
-  private GlobalRegistry globalRegistry;
-
-  @SuppressWarnings("deprecation")
-  private com.netflix.spectator.servo.ServoRegistry registry;
-
-  // create registry before init meters
-  @Override
-  public int getOrder() {
-    return -10;
-  }
-
-  @Override
-  @SuppressWarnings("deprecation")
-  public void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
-    this.globalRegistry = globalRegistry;
-
-    // spectator move poll gauges from inline to background executor
-    // we need to set the interval to unify value
-    System.setProperty("spectator.api.gaugePollingFrequency", 
Duration.ofMillis(config.getMsPollInterval()).toString());
-
-    System.setProperty(SERVO_POLLERS, 
String.valueOf(config.getMsPollInterval()));
-    registry = new com.netflix.spectator.servo.ServoRegistry();
-    globalRegistry.add(registry);
-  }
-
-  @Override
-  public void destroy() {
-    if (registry != null) {
-      DefaultMonitorRegistry.getInstance().unregister(registry);
-      globalRegistry.remove(registry);
-    }
-  }
-}
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/InvocationMetersInitializer.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/InvocationMetersInitializer.java
index 33912e987..4777fa347 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/InvocationMetersInitializer.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/InvocationMetersInitializer.java
@@ -21,7 +21,6 @@ import 
org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.event.InvocationStartEvent;
 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.ConsumerMeters;
 import org.apache.servicecomb.metrics.core.meter.EdgeMeters;
 import org.apache.servicecomb.metrics.core.meter.ProducerMeters;
@@ -30,7 +29,8 @@ import 
org.apache.servicecomb.metrics.core.meter.invocation.AbstractInvocationMe
 import com.google.common.eventbus.AllowConcurrentEvents;
 import com.google.common.eventbus.EventBus;
 import com.google.common.eventbus.Subscribe;
-import com.netflix.spectator.api.Registry;
+
+import io.micrometer.core.instrument.MeterRegistry;
 
 public class InvocationMetersInitializer implements MetricsInitializer {
   private ConsumerMeters consumerMeters;
@@ -40,12 +40,10 @@ public class InvocationMetersInitializer implements 
MetricsInitializer {
   private EdgeMeters edgeMeters;
 
   @Override
-  public void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
-    Registry registry = globalRegistry.getDefaultRegistry();
-
-    consumerMeters = new ConsumerMeters(registry, config);
-    producerMeters = new ProducerMeters(registry, config);
-    edgeMeters = new EdgeMeters(registry, config);
+  public void init(MeterRegistry meterRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
+    consumerMeters = new ConsumerMeters(meterRegistry, config);
+    producerMeters = new ProducerMeters(meterRegistry, config);
+    edgeMeters = new EdgeMeters(meterRegistry, config);
 
     eventBus.register(this);
   }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsCoreConfiguration.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsCoreConfiguration.java
index 91d6ea2a5..5d1dc7f60 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsCoreConfiguration.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsCoreConfiguration.java
@@ -42,11 +42,6 @@ public class MetricsCoreConfiguration {
     return new DefaultLogPublisher();
   }
 
-  @Bean
-  public DefaultRegistryInitializer defaultRegistryInitializer() {
-    return new DefaultRegistryInitializer();
-  }
-
   @Bean
   public InvocationMetersInitializer invocationMetersInitializer() {
     return new InvocationMetersInitializer();
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 88f01393f..03b6660ff 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,15 +19,14 @@ 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.registry.GlobalRegistry;
 import org.apache.servicecomb.metrics.core.meter.os.OsMeter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.eventbus.EventBus;
-import com.netflix.spectator.api.Registry;
-import com.netflix.spectator.api.SpectatorUtils;
+
+import io.micrometer.core.instrument.MeterRegistry;
 
 public class OsMetersInitializer implements MetricsInitializer {
   private static final Logger LOGGER = 
LoggerFactory.getLogger(OsMetersInitializer.class);
@@ -43,15 +42,13 @@ public class OsMetersInitializer implements 
MetricsInitializer {
   }
 
   @Override
-  public void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
+  public void init(MeterRegistry meterRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
     if (!isOsLinux) {
       LOGGER.info("only support linux os to collect cpu and net info");
       return;
     }
 
-    Registry registry = globalRegistry.getDefaultRegistry();
-    osMeter = new OsMeter(registry);
-    SpectatorUtils.registerMeter(registry, osMeter);
+    osMeter = new OsMeter(meterRegistry);
   }
 
   public OsMeter getOsMeter() {
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/ThreadPoolMetersInitializer.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/ThreadPoolMetersInitializer.java
index ad0123391..1c30f3951 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/ThreadPoolMetersInitializer.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/ThreadPoolMetersInitializer.java
@@ -26,27 +26,22 @@ import org.apache.servicecomb.core.SCBEngine;
 import org.apache.servicecomb.core.definition.MicroserviceMeta;
 import org.apache.servicecomb.core.definition.OperationMeta;
 import org.apache.servicecomb.core.executor.GroupExecutor;
-import org.apache.servicecomb.core.executor.ThreadPoolExecutorEx;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
-import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
 
 import com.google.common.eventbus.EventBus;
-import com.netflix.spectator.api.BasicTag;
-import com.netflix.spectator.api.Registry;
-import com.netflix.spectator.api.Tag;
-import com.netflix.spectator.api.patterns.PolledMeter;
-import com.netflix.spectator.api.patterns.ThreadPoolMonitor;
+
+import io.micrometer.core.instrument.MeterRegistry;
 
 public class ThreadPoolMetersInitializer implements MetricsInitializer {
   public static String REJECTED_COUNT = "threadpool.rejectedCount";
 
-  private Registry registry;
+  private MeterRegistry meterRegistry;
 
   @Override
-  public void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
-    registry = globalRegistry.getDefaultRegistry();
+  public void init(MeterRegistry meterRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
+    this.meterRegistry = meterRegistry;
 
     createThreadPoolMeters();
   }
@@ -93,15 +88,16 @@ public class ThreadPoolMetersInitializer implements 
MetricsInitializer {
       return;
     }
 
-    ThreadPoolMonitor.attach(registry, (ThreadPoolExecutor) executor, 
threadPoolName);
-
-    if (executor instanceof ThreadPoolExecutorEx) {
-      Tag idTag = new BasicTag("id", threadPoolName);
-
-      PolledMeter.using(registry)
-          .withName(REJECTED_COUNT)
-          .withTag(idTag)
-          .monitorMonotonicCounter((ThreadPoolExecutorEx) executor, 
ThreadPoolExecutorEx::getRejectedCount);
-    }
+    // TODO: add thread pool meter
+//    ThreadPoolMonitor.attach(registry, (ThreadPoolExecutor) executor, 
threadPoolName);
+//
+//    if (executor instanceof ThreadPoolExecutorEx) {
+//      Tag idTag = new BasicTag("id", threadPoolName);
+//
+//      PolledMeter.using(registry)
+//          .withName(REJECTED_COUNT)
+//          .withTag(idTag)
+//          .monitorMonotonicCounter((ThreadPoolExecutorEx) executor, 
ThreadPoolExecutorEx::getRejectedCount);
+//    }
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/VertxMetersInitializer.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/VertxMetersInitializer.java
index dd70b3873..51cee1400 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/VertxMetersInitializer.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/VertxMetersInitializer.java
@@ -18,16 +18,16 @@ package org.apache.servicecomb.metrics.core;
 
 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.foundation.vertx.SharedVertxFactory;
 import 
org.apache.servicecomb.metrics.core.meter.vertx.HttpClientEndpointsMeter;
 import org.apache.servicecomb.metrics.core.meter.vertx.ServerEndpointsMeter;
 import org.apache.servicecomb.metrics.core.meter.vertx.VertxEndpointsMeter;
 
 import com.google.common.eventbus.EventBus;
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Registry;
-import com.netflix.spectator.api.SpectatorUtils;
+
+import io.micrometer.core.instrument.Meter.Id;
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tag;
 
 public class VertxMetersInitializer implements MetricsInitializer {
   public static final String VERTX_ENDPOINTS = "servicecomb.vertx.endpoints";
@@ -39,23 +39,19 @@ public class VertxMetersInitializer implements 
MetricsInitializer {
   public static final String ENDPOINTS_SERVER = "server";
 
   @Override
-  public void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
-    Registry registry = globalRegistry.getDefaultRegistry();
-
-    Id endpointsId = registry.createId(VERTX_ENDPOINTS);
+  public void init(MeterRegistry meterRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
+    Id endpointsId = new Id(VERTX_ENDPOINTS, null, null, null, null);
     VertxEndpointsMeter clientMeter = new HttpClientEndpointsMeter(
-        endpointsId.withTag(ENDPOINTS_TYPE, ENDPOINTS_CLINET),
+        endpointsId.withTag(Tag.of(ENDPOINTS_TYPE, ENDPOINTS_CLINET)),
         SharedVertxFactory.getMetricsFactory(config.getEnvironment())
             .getVertxMetrics()
             .getClientEndpointMetricManager()
             .getClientEndpointMetricMap());
-    SpectatorUtils.registerMeter(registry, clientMeter);
 
     VertxEndpointsMeter serverMeter = new ServerEndpointsMeter(
-        endpointsId.withTag(ENDPOINTS_TYPE, ENDPOINTS_SERVER),
+        endpointsId.withTag(Tag.of(ENDPOINTS_TYPE, ENDPOINTS_SERVER)),
         SharedVertxFactory.getMetricsFactory(config.getEnvironment())
             .getVertxMetrics()
             .getServerEndpointMetricMap());
-    SpectatorUtils.registerMeter(registry, serverMeter);
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ConsumerMeters.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ConsumerMeters.java
index bea132203..ccd7f49f6 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ConsumerMeters.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ConsumerMeters.java
@@ -20,13 +20,13 @@ import 
org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import 
org.apache.servicecomb.metrics.core.meter.invocation.AbstractInvocationMeters;
 import 
org.apache.servicecomb.metrics.core.meter.invocation.ConsumerInvocationMeters;
 
-import com.netflix.spectator.api.Registry;
+import io.micrometer.core.instrument.MeterRegistry;
 
 public class ConsumerMeters {
   private final AbstractInvocationMeters invocationMeters;
 
-  public ConsumerMeters(Registry registry, MetricsBootstrapConfig 
metricsBootstrapConfig) {
-    invocationMeters = new ConsumerInvocationMeters(registry, 
metricsBootstrapConfig);
+  public ConsumerMeters(MeterRegistry meterRegistry, MetricsBootstrapConfig 
metricsBootstrapConfig) {
+    invocationMeters = new ConsumerInvocationMeters(meterRegistry, 
metricsBootstrapConfig);
   }
 
   public AbstractInvocationMeters getInvocationMeters() {
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/EdgeMeters.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/EdgeMeters.java
index 6da929165..b81403e89 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/EdgeMeters.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/EdgeMeters.java
@@ -21,14 +21,14 @@ import 
org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import 
org.apache.servicecomb.metrics.core.meter.invocation.AbstractInvocationMeters;
 import 
org.apache.servicecomb.metrics.core.meter.invocation.EdgeInvocationMeters;
 
-import com.netflix.spectator.api.Registry;
+import io.micrometer.core.instrument.MeterRegistry;
 
 public class EdgeMeters {
   private final AbstractInvocationMeters invocationMeters;
 
 
-  public EdgeMeters(Registry registry, MetricsBootstrapConfig 
metricsBootstrapConfig) {
-    this.invocationMeters = new EdgeInvocationMeters(registry, 
metricsBootstrapConfig);
+  public EdgeMeters(MeterRegistry meterRegistry, MetricsBootstrapConfig 
metricsBootstrapConfig) {
+    this.invocationMeters = new EdgeInvocationMeters(meterRegistry, 
metricsBootstrapConfig);
   }
 
   public AbstractInvocationMeters getInvocationMeters() {
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ProducerMeters.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ProducerMeters.java
index abe415864..1822b940f 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ProducerMeters.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ProducerMeters.java
@@ -20,13 +20,13 @@ import 
org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import 
org.apache.servicecomb.metrics.core.meter.invocation.AbstractInvocationMeters;
 import 
org.apache.servicecomb.metrics.core.meter.invocation.ProducerInvocationMeters;
 
-import com.netflix.spectator.api.Registry;
+import io.micrometer.core.instrument.MeterRegistry;
 
 public class ProducerMeters {
   private final AbstractInvocationMeters invocationMeters;
 
-  public ProducerMeters(Registry registry, MetricsBootstrapConfig 
metricsBootstrapConfig) {
-    invocationMeters = new ProducerInvocationMeters(registry, 
metricsBootstrapConfig);
+  public ProducerMeters(MeterRegistry meterRegistry, MetricsBootstrapConfig 
metricsBootstrapConfig) {
+    invocationMeters = new ProducerInvocationMeters(meterRegistry, 
metricsBootstrapConfig);
   }
 
   public AbstractInvocationMeters getInvocationMeters() {
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeter.java
index 362ae1dfb..1ffbe068a 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeter.java
@@ -26,8 +26,8 @@ import 
org.apache.servicecomb.foundation.metrics.meter.AbstractPeriodMeter;
 import 
org.apache.servicecomb.foundation.metrics.meter.LatencyDistributionMeter;
 import org.apache.servicecomb.foundation.metrics.meter.SimpleTimer;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Measurement;
+import io.micrometer.core.instrument.Measurement;
+
 
 public abstract class AbstractInvocationMeter extends AbstractPeriodMeter {
 
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java
index bca004e65..ce9283e3d 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java
@@ -25,12 +25,15 @@ import 
org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import org.apache.servicecomb.swagger.invocation.Response;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Registry;
 import com.netflix.spectator.api.SpectatorUtils;
 
+import io.micrometer.core.instrument.Meter.Id;
+import io.micrometer.core.instrument.Meter.Type;
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
+
 public abstract class AbstractInvocationMeters {
-  protected Registry registry;
+  protected MeterRegistry registry;
 
   private final Map<String, AbstractInvocationMeter> metersMap = new 
ConcurrentHashMapEx<>();
 
@@ -39,13 +42,13 @@ public abstract class AbstractInvocationMeters {
 
   protected MetricsBootstrapConfig metricsBootstrapConfig;
 
-  public AbstractInvocationMeters(Registry registry, MetricsBootstrapConfig 
metricsBootstrapConfig) {
+  public AbstractInvocationMeters(MeterRegistry registry, 
MetricsBootstrapConfig metricsBootstrapConfig) {
     this.registry = registry;
     this.metricsBootstrapConfig = metricsBootstrapConfig;
   }
 
   protected AbstractInvocationMeter getOrCreateMeters(Invocation invocation, 
Response response) {
-    // build string key is faster then use Id to locate timer directly
+    // build string key is faster than use Id to locate timer directly
     StringBuilder keyBuilder = new StringBuilder(maxKeyLen);
     String invocationName;
     //check edge
@@ -65,15 +68,12 @@ public abstract class AbstractInvocationMeters {
     }
 
     return metersMap.computeIfAbsent(keyBuilder.toString(), k -> {
-      Id id = registry.createId(MeterInvocationConst.INVOCATION_NAME,
-          MeterInvocationConst.TAG_ROLE,
-          invocationName,
-          MeterInvocationConst.TAG_TRANSPORT,
-          invocation.getRealTransportName(),
-          MeterInvocationConst.TAG_OPERATION,
-          invocation.getMicroserviceQualifiedName(),
-          MeterInvocationConst.TAG_STATUS,
-          String.valueOf(response.getStatusCode()));
+      Id id = new Id(MeterInvocationConst.INVOCATION_NAME, Tags.empty()
+          .and(MeterInvocationConst.TAG_ROLE, invocationName)
+          .and(MeterInvocationConst.TAG_TRANSPORT, 
invocation.getRealTransportName())
+          .and(MeterInvocationConst.TAG_OPERATION, 
invocation.getMicroserviceQualifiedName())
+          .and(MeterInvocationConst.TAG_STATUS, 
String.valueOf(response.getStatusCode())),
+          null, null, Type.OTHER);
 
       AbstractInvocationMeter meter = createMeter(id);
       SpectatorUtils.registerMeter(registry, meter);
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeters.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeters.java
index fd0729ca7..d46faa803 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeters.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeters.java
@@ -18,12 +18,12 @@ package 
org.apache.servicecomb.metrics.core.meter.invocation;
 
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Registry;
+import io.micrometer.core.instrument.Meter.Id;
+import io.micrometer.core.instrument.MeterRegistry;
 
 public class ConsumerInvocationMeters extends AbstractInvocationMeters {
-  public ConsumerInvocationMeters(Registry registry, MetricsBootstrapConfig 
metricsBootstrapConfig) {
-    super(registry, metricsBootstrapConfig);
+  public ConsumerInvocationMeters(MeterRegistry meterRegistry, 
MetricsBootstrapConfig metricsBootstrapConfig) {
+    super(meterRegistry, metricsBootstrapConfig);
   }
 
   @Override
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeters.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeters.java
index 2a5b0bddd..872a811b7 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeters.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeters.java
@@ -19,12 +19,12 @@ package 
org.apache.servicecomb.metrics.core.meter.invocation;
 
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Registry;
+import io.micrometer.core.instrument.Meter.Id;
+import io.micrometer.core.instrument.MeterRegistry;
 
 public class EdgeInvocationMeters extends ConsumerInvocationMeters {
-  public EdgeInvocationMeters(Registry registry, MetricsBootstrapConfig 
metricsBootstrapConfig) {
-    super(registry, metricsBootstrapConfig);
+  public EdgeInvocationMeters(MeterRegistry meterRegistry, 
MetricsBootstrapConfig metricsBootstrapConfig) {
+    super(meterRegistry, metricsBootstrapConfig);
   }
 
   @Override
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeters.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeters.java
index fefe50708..60e86493c 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeters.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeters.java
@@ -18,12 +18,12 @@ package 
org.apache.servicecomb.metrics.core.meter.invocation;
 
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Registry;
+import io.micrometer.core.instrument.Meter.Id;
+import io.micrometer.core.instrument.MeterRegistry;
 
 public class ProducerInvocationMeters extends AbstractInvocationMeters {
-  public ProducerInvocationMeters(Registry registry, MetricsBootstrapConfig 
metricsBootstrapConfig) {
-    super(registry, metricsBootstrapConfig);
+  public ProducerInvocationMeters(MeterRegistry meterRegistry, 
MetricsBootstrapConfig metricsBootstrapConfig) {
+    super(meterRegistry, metricsBootstrapConfig);
   }
 
   @Override
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 587c11419..fdc7e8022 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
@@ -23,8 +23,11 @@ import 
org.apache.servicecomb.metrics.core.meter.os.cpu.ProcessCpuUsage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Measurement;
+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;
+
 
 public class CpuMeter {
   private static final Logger LOGGER = LoggerFactory.getLogger(CpuMeter.class);
@@ -36,8 +39,8 @@ public class CpuMeter {
   private final ProcessCpuUsage processCpuUsage;
 
   public CpuMeter(Id id) {
-    allCpuUsage = new OsCpuUsage(id.withTag(OsMeter.OS_TYPE, 
OsMeter.OS_TYPE_ALL_CPU));
-    processCpuUsage = new ProcessCpuUsage(id.withTag(OsMeter.OS_TYPE, 
OsMeter.OS_TYPE_PROCESS_CPU));
+    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)));
 
     //must refresh all first
     update();
@@ -47,8 +50,8 @@ public class CpuMeter {
 
   public void calcMeasurements(List<Measurement> measurements, long msNow) {
     update();
-    measurements.add(new Measurement(allCpuUsage.getId(), msNow, 
allCpuUsage.getUsage()));
-    measurements.add(new Measurement(processCpuUsage.getId(), msNow, 
processCpuUsage.getUsage()));
+    measurements.add(new Measurement(() -> allCpuUsage.getUsage(), 
Statistic.VALUE));
+    measurements.add(new Measurement(() -> processCpuUsage.getUsage(), 
Statistic.VALUE));
   }
 
   public void update() {
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 5c9bc69cc..d7893095b 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
@@ -31,10 +31,10 @@ import 
org.apache.servicecomb.metrics.core.meter.os.net.NetStat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.netflix.spectator.api.BasicTag;
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Measurement;
-import com.netflix.spectator.api.Tag;
+import io.micrometer.core.instrument.Measurement;
+import io.micrometer.core.instrument.Meter.Id;
+import io.micrometer.core.instrument.Tag;
+
 
 public class NetMeter {
   private static final Logger LOGGER = LoggerFactory.getLogger(NetMeter.class);
@@ -43,13 +43,13 @@ public class NetMeter {
 
   public static final String INTERFACE = "interface";
 
-  public static final Tag TAG_RECEIVE = new BasicTag(STATISTIC, "receive");
+  public static final Tag TAG_RECEIVE = Tag.of(STATISTIC, "receive");
 
-  public static final Tag TAG_PACKETS_RECEIVE = new BasicTag(STATISTIC, 
"receivePackets");
+  public static final Tag TAG_PACKETS_RECEIVE = Tag.of(STATISTIC, 
"receivePackets");
 
-  public static final Tag TAG_SEND = new BasicTag(STATISTIC, "send");
+  public static final Tag TAG_SEND = Tag.of(STATISTIC, "send");
 
-  public static final Tag TAG_PACKETS_SEND = new BasicTag(STATISTIC, 
"sendPackets");
+  public static final Tag TAG_PACKETS_SEND = Tag.of(STATISTIC, "sendPackets");
 
   private final Id id;
 
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 8bc157c17..7425e28fc 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
@@ -22,8 +22,10 @@ import java.util.List;
 import org.apache.servicecomb.foundation.metrics.meter.AbstractPeriodMeter;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.netflix.spectator.api.Measurement;
-import com.netflix.spectator.api.Registry;
+
+import io.micrometer.core.instrument.Measurement;
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tag;
 
 /**
  * name=os type=cpu value = 0
@@ -48,10 +50,10 @@ public class OsMeter extends AbstractPeriodMeter {
 
   private final NetMeter netMeter;
 
-  public OsMeter(Registry registry) {
-    this.id = registry.createId(OS_NAME);
+  public OsMeter(MeterRegistry meterRegistry) {
+    this.id = Id.
     cpuMeter = new CpuMeter(id);
-    netMeter = new NetMeter(id.withTag(OS_TYPE, OS_TYPE_NET));
+    netMeter = new NetMeter(id.withTag(Tag.of(OS_TYPE, OS_TYPE_NET)));
   }
 
   @Override
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 375a64875..8605edeb5 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
@@ -16,7 +16,8 @@
  */
 package org.apache.servicecomb.metrics.core.meter.os.cpu;
 
-import com.netflix.spectator.api.Id;
+
+import io.micrometer.core.instrument.Meter.Id;
 
 public abstract class AbstractCpuUsage {
 
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 364ca10b4..8b40f212c 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,7 +18,7 @@ package org.apache.servicecomb.metrics.core.meter.os.cpu;
 
 import java.io.IOException;
 
-import com.netflix.spectator.api.Id;
+import io.micrometer.core.instrument.Meter.Id;
 
 /*
  * unit : 1 jiffies
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 00ec8cb5e..6ab7ad828 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,7 +18,7 @@ package org.apache.servicecomb.metrics.core.meter.os.cpu;
 
 import java.io.IOException;
 
-import com.netflix.spectator.api.Id;
+import io.micrometer.core.instrument.Meter.Id;
 
 /*
  * unit : 1 jiffies
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 c29d9598f..a72217894 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
@@ -25,8 +25,10 @@ import static 
org.apache.servicecomb.metrics.core.meter.os.NetMeter.TAG_SEND;
 import java.util.ArrayList;
 import java.util.List;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Measurement;
+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;
 
 public class InterfaceUsage {
   private final String name;
@@ -35,7 +37,7 @@ public class InterfaceUsage {
 
   public InterfaceUsage(Id id, String name) {
     this.name = name;
-    id = id.withTag(INTERFACE, name);
+    id = id.withTag(Tag.of(INTERFACE, name));
     init(id);
   }
 
@@ -52,7 +54,7 @@ public class InterfaceUsage {
   }
 
   public void calcMeasurements(List<Measurement> measurements, long msNow) {
-    netStats.forEach(netStat -> measurements.add(new 
Measurement(netStat.getId(), msNow, netStat.getRate())));
+    netStats.forEach(netStat -> measurements.add(new Measurement(() -> 
netStat.getRate(), Statistic.VALUE)));
   }
 
   public void update(String interfaceData, long secondInterval) {
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 3d3f08b70..48b3d9d7d 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
@@ -16,7 +16,8 @@
  */
 package org.apache.servicecomb.metrics.core.meter.os.net;
 
-import com.netflix.spectator.api.Id;
+
+import io.micrometer.core.instrument.Meter.Id;
 
 public class NetStat {
   private final int index;
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/EndpointMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/EndpointMeter.java
index d0ce37bc6..2217c8204 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/EndpointMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/EndpointMeter.java
@@ -21,8 +21,10 @@ import java.util.concurrent.TimeUnit;
 
 import 
org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultEndpointMetric;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Measurement;
+import io.micrometer.core.instrument.Measurement;
+import io.micrometer.core.instrument.Meter.Id;
+import io.micrometer.core.instrument.Tag;
+
 
 public class EndpointMeter {
   private static final double SNV_MILLI_SECONDS = 1.0 / 
TimeUnit.MILLISECONDS.toNanos(1L);
@@ -76,15 +78,15 @@ public class EndpointMeter {
   private long lastLatency;
 
   public EndpointMeter(Id id, DefaultEndpointMetric metric) {
-    id = id.withTag(ADDRESS, metric.getAddress());
+    id = id.withTag(Tag.of(ADDRESS, metric.getAddress()));
     this.id = id;
-    idConnect = id.withTag(STATISTIC, CONNECT_COUNT);
-    idDisconnect = id.withTag(STATISTIC, DISCONNECT_COUNT);
-    idConnections = id.withTag(STATISTIC, CONNECTIONS);
-    idBytesRead = id.withTag(STATISTIC, BYTES_READ);
-    idBytesWritten = id.withTag(STATISTIC, BYTES_WRITTEN);
-    idRequests = id.withTag(STATISTIC, REQUESTS);
-    idLatency = id.withTag(STATISTIC, LATENCY);
+    idConnect = id.withTag(Tag.of(STATISTIC, CONNECT_COUNT);
+    idDisconnect = id.withTag(Tag.of(STATISTIC, DISCONNECT_COUNT));
+    idConnections = id.withTag(Tag.of(STATISTIC, CONNECTIONS));
+    idBytesRead = id.withTag(Tag.of(STATISTIC, BYTES_READ));
+    idBytesWritten = id.withTag(Tag.of(STATISTIC, BYTES_WRITTEN));
+    idRequests = id.withTag(Tag.of(STATISTIC, REQUESTS));
+    idLatency = id.withTag(Tag.of(STATISTIC, LATENCY));
     this.metric = metric;
   }
 
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/HttpClientEndpointsMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/HttpClientEndpointsMeter.java
index 57430bae4..a8c3c4db9 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/HttpClientEndpointsMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/HttpClientEndpointsMeter.java
@@ -20,11 +20,12 @@ import java.util.Map;
 
 import 
org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultEndpointMetric;
 
-import com.netflix.spectator.api.Id;
+import io.micrometer.core.instrument.MeterRegistry;
 
 public class HttpClientEndpointsMeter extends VertxEndpointsMeter {
-  public <T extends DefaultEndpointMetric> HttpClientEndpointsMeter(Id id, 
Map<String, T> endpointMetricMap) {
-    super(id, endpointMetricMap);
+  public <T extends DefaultEndpointMetric> 
HttpClientEndpointsMeter(MeterRegistry meterRegistry, Id id,
+      Map<String, T> endpointMetricMap) {
+    super(meterRegistry, id, endpointMetricMap);
   }
 
   @Override
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/VertxEndpointsMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/VertxEndpointsMeter.java
index ab7f4d95d..7bed21427 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/VertxEndpointsMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/VertxEndpointsMeter.java
@@ -24,17 +24,21 @@ import 
org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx;
 import org.apache.servicecomb.foundation.metrics.meter.AbstractPeriodMeter;
 import 
org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultEndpointMetric;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Measurement;
+import io.micrometer.core.instrument.Measurement;
+import io.micrometer.core.instrument.MeterRegistry;
 
 public class VertxEndpointsMeter extends AbstractPeriodMeter {
   private final Map<String, DefaultEndpointMetric> endpointMetricMap;
 
+  private final MeterRegistry meterRegistry;
+
   private final Map<String, EndpointMeter> endpointMeterMap = new 
ConcurrentHashMapEx<>();
 
   @SuppressWarnings("unchecked")
-  public <T extends DefaultEndpointMetric> VertxEndpointsMeter(Id id, 
Map<String, T> endpointMetricMap) {
+  public <T extends DefaultEndpointMetric> VertxEndpointsMeter(MeterRegistry 
meterRegistry, Id id,
+      Map<String, T> endpointMetricMap) {
     this.id = id;
+    this.meterRegistry = meterRegistry;
     this.endpointMetricMap = (Map<String, DefaultEndpointMetric>) 
endpointMetricMap;
   }
 
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
index b9d20995b..2f45238d9 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/DefaultLogPublisher.java
@@ -31,7 +31,6 @@ import 
org.apache.servicecomb.foundation.metrics.meter.LatencyDistributionConfig
 import org.apache.servicecomb.foundation.metrics.meter.LatencyScopeConfig;
 import 
org.apache.servicecomb.foundation.metrics.publish.spectator.MeasurementNode;
 import 
org.apache.servicecomb.foundation.metrics.publish.spectator.MeasurementTree;
-import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
 import org.apache.servicecomb.foundation.vertx.VertxUtils;
 import org.apache.servicecomb.metrics.core.VertxMetersInitializer;
 import org.apache.servicecomb.metrics.core.meter.os.NetMeter;
@@ -50,8 +49,9 @@ import org.springframework.core.env.Environment;
 import com.google.common.base.Strings;
 import com.google.common.eventbus.EventBus;
 import com.google.common.eventbus.Subscribe;
-import com.netflix.spectator.api.Meter;
 
+import io.micrometer.core.instrument.Meter;
+import io.micrometer.core.instrument.MeterRegistry;
 import io.vertx.core.Vertx;
 
 public class DefaultLogPublisher implements MetricsInitializer {
@@ -102,7 +102,7 @@ public class DefaultLogPublisher implements 
MetricsInitializer {
   }
 
   @Override
-  public void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
+  public void init(MeterRegistry meterRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
     if (!environment.getProperty(ENABLED, boolean.class, false)) {
       return;
     }
@@ -181,10 +181,10 @@ public class DefaultLogPublisher implements 
MetricsInitializer {
 
     StringBuilder tmpSb = new StringBuilder();
     for (MeasurementNode interfaceNode : netNode.getChildren().values()) {
-      double sendRate = 
interfaceNode.findChild(NetMeter.TAG_SEND.value()).summary();
-      double sendPacketsRate = 
interfaceNode.findChild(NetMeter.TAG_PACKETS_SEND.value()).summary();
-      double receiveRate = 
interfaceNode.findChild(NetMeter.TAG_RECEIVE.value()).summary();
-      double receivePacketsRate = 
interfaceNode.findChild(NetMeter.TAG_PACKETS_RECEIVE.value()).summary();
+      double sendRate = 
interfaceNode.findChild(NetMeter.TAG_SEND.getValue()).summary();
+      double sendPacketsRate = 
interfaceNode.findChild(NetMeter.TAG_PACKETS_SEND.getValue()).summary();
+      double receiveRate = 
interfaceNode.findChild(NetMeter.TAG_RECEIVE.getValue()).summary();
+      double receivePacketsRate = 
interfaceNode.findChild(NetMeter.TAG_PACKETS_RECEIVE.getValue()).summary();
       if (sendRate == 0 && receiveRate == 0 && receivePacketsRate == 0 && 
sendPacketsRate == 0) {
         continue;
       }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishModelFactory.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishModelFactory.java
index 69e1d7b3f..68aaad35c 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishModelFactory.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishModelFactory.java
@@ -31,9 +31,10 @@ import 
org.apache.servicecomb.metrics.core.publish.model.DefaultPublishModel;
 import 
org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerfGroups;
 import org.apache.servicecomb.swagger.invocation.InvocationType;
 
-import com.netflix.spectator.api.Meter;
 import com.netflix.spectator.api.patterns.ThreadPoolMonitorPublishModelFactory;
 
+import io.micrometer.core.instrument.Meter;
+
 public class PublishModelFactory {
   private final MeasurementTree tree;
 
diff --git 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestDefaultRegistryInitializer.java
 
b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestDefaultRegistryInitializer.java
deleted file mode 100644
index 35fcd4ede..000000000
--- 
a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestDefaultRegistryInitializer.java
+++ /dev/null
@@ -1,73 +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.metrics.core;
-
-import static 
org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig.CONFIG_LATENCY_DISTRIBUTION_MIN_SCOPE_LEN;
-import static 
org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig.DEFAULT_METRICS_WINDOW_TIME;
-import static 
org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig.METRICS_WINDOW_TIME;
-
-import java.util.List;
-
-import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
-import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
-import org.junit.Test;
-import org.junit.jupiter.api.Assertions;
-import org.mockito.Mockito;
-import org.springframework.core.env.Environment;
-
-import com.google.common.eventbus.EventBus;
-import com.netflix.servo.DefaultMonitorRegistry;
-import com.netflix.spectator.api.Registry;
-
-import mockit.Deencapsulation;
-
-public class TestDefaultRegistryInitializer {
-  GlobalRegistry globalRegistry = new GlobalRegistry();
-
-  List<Registry> registries = Deencapsulation.getField(globalRegistry, 
"registries");
-
-  DefaultRegistryInitializer registryInitializer = new 
DefaultRegistryInitializer();
-
-  Environment environment = Mockito.mock(Environment.class);
-
-  @Test
-  @SuppressWarnings("deprecation")
-  public void init() {
-    Mockito.when(environment.getProperty(METRICS_WINDOW_TIME, int.class, 
DEFAULT_METRICS_WINDOW_TIME))
-        .thenReturn(DEFAULT_METRICS_WINDOW_TIME);
-    Mockito.when(environment.getProperty(
-            CONFIG_LATENCY_DISTRIBUTION_MIN_SCOPE_LEN, int.class, 7))
-        .thenReturn(7);
-    registryInitializer.init(globalRegistry, new EventBus(), new 
MetricsBootstrapConfig(environment));
-
-    Assertions.assertEquals(-10, registryInitializer.getOrder());
-    Assertions.assertTrue(globalRegistry.getDefaultRegistry() instanceof 
com.netflix.spectator.servo.ServoRegistry);
-    Assertions.assertEquals(1, registries.size());
-    Assertions.assertEquals(0, 
DefaultMonitorRegistry.getInstance().getRegisteredMonitors().size());
-
-    registryInitializer.destroy();
-
-    Assertions.assertEquals(0, registries.size());
-    Assertions.assertEquals(0, 
DefaultMonitorRegistry.getInstance().getRegisteredMonitors().size());
-  }
-
-  @Test
-  public void destroy_notInit() {
-    // should not throw exception
-    registryInitializer.destroy();
-  }
-}
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 375627d9b..6f71a126d 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
@@ -28,23 +28,22 @@ import java.util.List;
 import org.apache.commons.io.FileUtils;
 import org.apache.servicecomb.metrics.core.meter.os.cpu.CpuUtils;
 import org.junit.Test;
+import org.junit.jupiter.api.Assertions;
+import org.mockito.Mockito;
 
 import com.google.common.collect.Lists;
 import com.google.common.io.CharSource;
 import com.google.common.io.Files;
-import com.netflix.spectator.api.DefaultRegistry;
-import com.netflix.spectator.api.ManualClock;
-import com.netflix.spectator.api.Measurement;
-import com.netflix.spectator.api.Registry;
 
+import io.micrometer.core.instrument.Measurement;
+import io.micrometer.core.instrument.MeterRegistry;
 import mockit.Expectations;
 import mockit.Mock;
 import mockit.MockUp;
 import mockit.Mocked;
-import org.junit.jupiter.api.Assertions;
 
 public class TestOsMeter {
-  Registry registry = new DefaultRegistry(new ManualClock());
+  MeterRegistry meterRegistry = Mockito.mock(MeterRegistry.class);
 
   @Test
   public void testCalcMeasurement(@Mocked Runtime runtime, @Mocked 
RuntimeMXBean mxBean,
@@ -91,7 +90,7 @@ public class TestOsMeter {
         result = "1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1";
       }
     };
-    OsMeter osMeter = new OsMeter(registry);
+    OsMeter osMeter = new OsMeter(meterRegistry);
     list.clear();
     list.add("useless");
     list.add("useless");
@@ -105,11 +104,11 @@ public class TestOsMeter {
     osMeter.calcMeasurements(1, 1);
     ArrayList<Measurement> measurements = 
Lists.newArrayList(osMeter.measure());
     Assertions.assertEquals(6, measurements.size());
-    Assertions.assertEquals(0.875, measurements.get(0).value(), 0.0);
-    Assertions.assertEquals(0.5, measurements.get(1).value(), 0.0);
-    Assertions.assertEquals(1.0, measurements.get(2).value(), 0.0);
-    Assertions.assertEquals(1.0, measurements.get(3).value(), 0.0);
-    Assertions.assertEquals(1.0, measurements.get(4).value(), 0.0);
-    Assertions.assertEquals(1.0, measurements.get(5).value(), 0.0);
+    Assertions.assertEquals(0.875, measurements.get(0).getValue(), 0.0);
+    Assertions.assertEquals(0.5, measurements.get(1).getValue(), 0.0);
+    Assertions.assertEquals(1.0, measurements.get(2).getValue(), 0.0);
+    Assertions.assertEquals(1.0, measurements.get(3).getValue(), 0.0);
+    Assertions.assertEquals(1.0, measurements.get(4).getValue(), 0.0);
+    Assertions.assertEquals(1.0, measurements.get(5).getValue(), 0.0);
   }
 }
diff --git 
a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java
 
b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java
index 12ae5041d..19cd28d51 100644
--- 
a/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java
+++ 
b/metrics/metrics-integration/metrics-prometheus/src/main/java/org/apache/servicecomb/metrics/prometheus/PrometheusPublisher.java
@@ -25,18 +25,17 @@ import org.apache.servicecomb.config.BootStrapProperties;
 import 
org.apache.servicecomb.foundation.common.exceptions.ServiceCombException;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 import org.apache.servicecomb.foundation.metrics.MetricsInitializer;
-import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.env.Environment;
 
 import com.google.common.eventbus.EventBus;
-import com.netflix.spectator.api.Measurement;
-import com.netflix.spectator.api.Meter;
-import com.netflix.spectator.api.Registry;
-import com.netflix.spectator.api.Tag;
 
+import io.micrometer.core.instrument.Measurement;
+import io.micrometer.core.instrument.Meter;
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tag;
 import io.prometheus.client.Collector;
 import io.prometheus.client.Collector.MetricFamilySamples.Sample;
 import io.prometheus.client.CollectorRegistry;
@@ -49,7 +48,7 @@ public class PrometheusPublisher extends Collector implements 
Collector.Describa
 
   private HTTPServer httpServer;
 
-  private GlobalRegistry globalRegistry;
+  private MeterRegistry meterRegistry;
 
   private Environment environment;
 
@@ -59,8 +58,8 @@ public class PrometheusPublisher extends Collector implements 
Collector.Describa
   }
 
   @Override
-  public void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
-    this.globalRegistry = globalRegistry;
+  public void init(MeterRegistry meterRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
+    this.meterRegistry = meterRegistry;
 
     //prometheus default port allocation is here : 
https://github.com/prometheus/prometheus/wiki/Default-port-allocations
     String address = environment.getProperty(METRICS_PROMETHEUS_ADDRESS, 
String.class, "0.0.0.0:9696");
@@ -87,18 +86,14 @@ public class PrometheusPublisher extends Collector 
implements Collector.Describa
   @Override
   public List<MetricFamilySamples> describe() {
     List<MetricFamilySamples> familySamples = new ArrayList<>();
-    if (globalRegistry == null) {
-      return familySamples;
-    }
 
     List<Sample> samples = new ArrayList<>();
-    for (Registry registry : globalRegistry.getRegistries()) {
-      for (Meter meter : registry) {
-        meter.measure().forEach(measurement -> {
-          Sample sample = convertMeasurementToSample(measurement);
-          samples.add(sample);
-        });
-      }
+
+    for (Meter meter : this.meterRegistry.getMeters()) {
+      meter.measure().forEach(measurement -> {
+        Sample sample = convertMeasurementToSample(meter, measurement);
+        samples.add(sample);
+      });
     }
 
     familySamples.add(new MetricFamilySamples("ServiceComb_Metrics", 
Type.UNKNOWN, "ServiceComb Metrics", samples));
@@ -106,20 +101,20 @@ public class PrometheusPublisher extends Collector 
implements Collector.Describa
     return familySamples;
   }
 
-  protected Sample convertMeasurementToSample(Measurement measurement) {
-    String prometheusName = measurement.id().name().replace(".", "_");
+  protected Sample convertMeasurementToSample(Meter meter, Measurement 
measurement) {
+    String prometheusName = meter.getId().getName().replace(".", "_");
     List<String> labelNames = new ArrayList<>();
     List<String> labelValues = new ArrayList<>();
 
     labelNames.add("appId");
     labelValues.add(BootStrapProperties.readApplication(environment));
 
-    for (Tag tag : measurement.id().tags()) {
-      labelNames.add(tag.key());
-      labelValues.add(tag.value());
+    for (Tag tag : meter.getId().getTags()) {
+      labelNames.add(tag.getKey());
+      labelValues.add(tag.getValue());
     }
 
-    return new Sample(prometheusName, labelNames, labelValues, 
measurement.value());
+    return new Sample(prometheusName, labelNames, labelValues, 
measurement.getValue());
   }
 
   @Override
diff --git 
a/solutions/solution-basic/src/main/java/org/apache/servicecomb/solution/basic/integration/MetricsEndpointImpl.java
 
b/solutions/solution-basic/src/main/java/org/apache/servicecomb/solution/basic/integration/MetricsEndpointImpl.java
index 6cb73136d..65103dbb2 100644
--- 
a/solutions/solution-basic/src/main/java/org/apache/servicecomb/solution/basic/integration/MetricsEndpointImpl.java
+++ 
b/solutions/solution-basic/src/main/java/org/apache/servicecomb/solution/basic/integration/MetricsEndpointImpl.java
@@ -24,38 +24,33 @@ import java.util.stream.StreamSupport;
 
 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.provider.rest.common.RestSchema;
 
 import com.google.common.eventbus.EventBus;
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Meter;
-import com.netflix.spectator.api.Registry;
+
+import io.micrometer.core.instrument.Meter;
+import io.micrometer.core.instrument.Meter.Id;
+import io.micrometer.core.instrument.MeterRegistry;
 
 @RestSchema(schemaId = MetricsEndpoint.NAME, schemaInterface = 
MetricsEndpoint.class)
 public class MetricsEndpointImpl implements MetricsInitializer, 
MetricsEndpoint {
-  private GlobalRegistry globalRegistry;
+  private MeterRegistry meterRegistry;
 
   @Override
-  public void init(GlobalRegistry globalRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
-    this.globalRegistry = globalRegistry;
+  public void init(MeterRegistry meterRegistry, EventBus eventBus, 
MetricsBootstrapConfig config) {
+    this.meterRegistry = meterRegistry;
   }
 
   @Override
   public Map<String, Double> measure() {
     Map<String, Double> measurements = new LinkedHashMap<>();
-    if (globalRegistry == null) {
-      return measurements;
-    }
-
     StringBuilder sb = new StringBuilder();
-    for (Registry registry : globalRegistry.getRegistries()) {
-      for (Meter meter : registry) {
-        meter.measure().forEach(measurement -> {
-          String key = idToString(measurement.id(), sb);
-          measurements.put(key, measurement.value());
-        });
-      }
+
+    for (Meter meter : this.meterRegistry.getMeters()) {
+      meter.measure().forEach(measurement -> {
+        String key = idToString(meter.getId(), sb);
+        measurements.put(key, measurement.getValue());
+      });
     }
 
     return measurements;
@@ -65,10 +60,10 @@ public class MetricsEndpointImpl implements 
MetricsInitializer, MetricsEndpoint
   // idName(tag1=value1,tag2=value2)
   protected String idToString(Id id, StringBuilder sb) {
     sb.setLength(0);
-    sb.append(id.name()).append('(');
+    sb.append(id.getName()).append('(');
     sb.append(StreamSupport
         .stream(id
-            .tags()
+            .getTags()
             .spliterator(), false)
         .map(Object::toString)
         .collect(

Reply via email to