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 a16d5bd409c6c3246ed327b9fe0bc4b94820f6f4
Author: liubao <[email protected]>
AuthorDate: Sat Nov 25 11:44:14 2023 +0800

    [SCB-2838]using micrometer to replace spectator part2: InvocationMeter
---
 .../metrics/meter/LatencyDistributionMeter.java    | 60 --------------
 .../meter/TestLatencyDistributionMeter.java        | 47 -----------
 .../meter/invocation/AbstractInvocationMeter.java  | 92 +++++++++-------------
 .../meter/invocation/AbstractInvocationMeters.java | 14 +---
 .../meter/invocation/ConsumerInvocationMeter.java  | 66 ++++++++--------
 .../meter/invocation/ConsumerInvocationMeters.java |  6 +-
 .../core/meter/invocation/EdgeInvocationMeter.java | 54 ++++++-------
 .../meter/invocation/EdgeInvocationMeters.java     |  6 +-
 .../meter/invocation/ProducerInvocationMeter.java  | 69 ++++++++--------
 .../meter/invocation/ProducerInvocationMeters.java |  6 +-
 10 files changed, 147 insertions(+), 273 deletions(-)

diff --git 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/LatencyDistributionMeter.java
 
b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/LatencyDistributionMeter.java
deleted file mode 100644
index 175c06b8e..000000000
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/LatencyDistributionMeter.java
+++ /dev/null
@@ -1,60 +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.ArrayList;
-import java.util.List;
-
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Measurement;
-
-public class LatencyDistributionMeter extends AbstractPeriodMeter {
-  private final List<LatencyScopeMeter> latencyScopeMeters = new ArrayList<>();
-
-  public LatencyDistributionMeter(Id id, String config) {
-    this.id = id;
-
-    LatencyDistributionConfig latencyDistributionConfig = new 
LatencyDistributionConfig(config);
-    for (LatencyScopeConfig scopeConfig : 
latencyDistributionConfig.getScopeConfigs()) {
-      latencyScopeMeters.add(new LatencyScopeMeter(id, scopeConfig));
-    }
-  }
-
-  public void record(long nanoLatency) {
-    if (nanoLatency < 0) {
-      return;
-    }
-
-    for (LatencyScopeMeter latencyScopeMeter : latencyScopeMeters) {
-      if (latencyScopeMeter.update(nanoLatency)) {
-        return;
-      }
-    }
-  }
-
-  @Override
-  public void calcMeasurements(long msNow, long secondInterval) {
-    List<Measurement> measurements = new ArrayList<>();
-    calcMeasurements(measurements, msNow, secondInterval);
-    allMeasurements = measurements;
-  }
-
-  @Override
-  public void calcMeasurements(List<Measurement> measurements, long msNow, 
long secondInterval) {
-    latencyScopeMeters.forEach(latencyScopeMeter -> 
measurements.add(latencyScopeMeter.createMeasurement(msNow)));
-  }
-}
diff --git 
a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/meter/TestLatencyDistributionMeter.java
 
b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/meter/TestLatencyDistributionMeter.java
deleted file mode 100644
index d5cd26074..000000000
--- 
a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/meter/TestLatencyDistributionMeter.java
+++ /dev/null
@@ -1,47 +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.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Measurement;
-
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.Test;
-import org.mockito.Mockito;
-
-public class TestLatencyDistributionMeter {
-
-  @Test
-  public void testMeasure() {
-    Id id = Mockito.mock(Id.class);
-    LatencyDistributionMeter latencyDistributionMeter = new 
LatencyDistributionMeter(id, "0,1,3,10");
-    latencyDistributionMeter.record(TimeUnit.MILLISECONDS.toNanos(1L));
-    latencyDistributionMeter.record(TimeUnit.MILLISECONDS.toNanos(5L));
-    latencyDistributionMeter.record(TimeUnit.MILLISECONDS.toNanos(2L));
-    List<Measurement> measurements = new ArrayList<>();
-    latencyDistributionMeter.calcMeasurements(measurements, 0L, 0L);
-    Assertions.assertEquals(4, measurements.size());
-    Assertions.assertEquals(0, ((int) (measurements.get(0).value())));
-    Assertions.assertEquals(2, ((int) (measurements.get(1).value())));
-    Assertions.assertEquals(1, ((int) (measurements.get(2).value())));
-    Assertions.assertEquals(0, ((int) (measurements.get(3).value())));
-  }
-}
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 1ffbe068a..34ef22121 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
@@ -16,81 +16,65 @@
  */
 package org.apache.servicecomb.metrics.core.meter.invocation;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.time.Duration;
+import java.util.concurrent.TimeUnit;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.invocation.InvocationStageTrace;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
-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 io.micrometer.core.instrument.Measurement;
-
-
-public abstract class AbstractInvocationMeter extends AbstractPeriodMeter {
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
+import io.micrometer.core.instrument.Timer;
 
+public abstract class AbstractInvocationMeter {
   //total time
-  private final SimpleTimer totalTimer;
+  private final Timer totalTimer;
 
   // prepare time
-  private final SimpleTimer prepareTimer;
-
-  // latency distribution
-  private final LatencyDistributionMeter latencyDistributionMeter;
+  private final Timer prepareTimer;
 
   protected final MetricsBootstrapConfig metricsBootstrapConfig;
 
-  public AbstractInvocationMeter(Id id, MetricsBootstrapConfig 
metricsBootstrapConfig) {
-    this.id = id;
+  public AbstractInvocationMeter(MeterRegistry meterRegistry, String name, 
Tags tags,
+      MetricsBootstrapConfig metricsBootstrapConfig) {
     this.metricsBootstrapConfig = metricsBootstrapConfig;
-    latencyDistributionMeter = 
createLatencyDistribution(MeterInvocationConst.TAG_LATENCY_DISTRIBUTION);
-    totalTimer = createStageTimer(InvocationStageTrace.STAGE_TOTAL);
-    prepareTimer = createStageTimer(InvocationStageTrace.STAGE_PREPARE);
-  }
 
-  protected LatencyDistributionMeter createLatencyDistribution(String 
tagValue) {
-    return new 
LatencyDistributionMeter(id.withTag(MeterInvocationConst.TAG_TYPE, tagValue),
-        metricsBootstrapConfig.getLatencyDistribution());
+    Timer.Builder totalBuilder = Timer.builder(name)
+        .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_TOTAL));
+    if (!StringUtils.isEmpty(metricsBootstrapConfig.getLatencyDistribution())) 
{
+      
totalBuilder.sla(toDuration(metricsBootstrapConfig.getLatencyDistribution()));
+    }
+    this.totalTimer = totalBuilder.register(meterRegistry);
+    this.prepareTimer = 
Timer.builder(name).tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE
+        , MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_PREPARE)).register(meterRegistry);
   }
 
-  protected SimpleTimer createStageTimer(String stageValue) {
-    return createTimer(id.withTag(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE)
-        .withTag(MeterInvocationConst.TAG_STAGE, stageValue));
-  }
+  protected static Duration[] toDuration(String config) {
+    config = config.trim() + "," + Long.MAX_VALUE;
+    String[] array = config.split("\\s*,+\\s*");
+    Duration[] result = new Duration[array.length];
 
-  protected SimpleTimer createTimer(String tagKey, String tagValue) {
-    return createTimer(id.withTag(tagKey, tagValue));
-  }
+    for (int idx = 0; idx < array.length - 1; idx++) {
+      long msMin = Long.parseLong(array[idx]);
+      long msMax = Long.parseLong(array[idx + 1]);
+      if (msMin >= msMax) {
+        String msg = String.format("invalid latency scope, min=%s, max=%s.", 
array[idx], array[idx + 1]);
+        throw new IllegalStateException(msg);
+      }
+
+      result[idx] = Duration.ofMillis(msMin);
+    }
+    result[array.length - 1] = Duration.ofMillis(Long.MAX_VALUE);
 
-  protected SimpleTimer createTimer(Id timerId) {
-    return new SimpleTimer(timerId);
+    return result;
   }
 
   public void onInvocationFinish(InvocationFinishEvent event) {
     InvocationStageTrace stageTrace = 
event.getInvocation().getInvocationStageTrace();
-    latencyDistributionMeter.record(stageTrace.calcTotal());
-    totalTimer.record(stageTrace.calcTotal());
-    prepareTimer.record(stageTrace.calcPrepare());
-  }
-
-  @Override
-  public void calcMeasurements(long msNow, long secondInterval) {
-    List<Measurement> measurements = new ArrayList<>(3);
-    calcMeasurements(measurements, msNow, secondInterval);
-    allMeasurements = measurements;
-  }
-
-  @Override
-  public void calcMeasurements(List<Measurement> measurements, long msNow, 
long secondInterval) {
-    latencyDistributionMeter.calcMeasurements(measurements, msNow, 
secondInterval);
-    totalTimer.calcMeasurements(measurements, msNow, secondInterval);
-    prepareTimer.calcMeasurements(measurements, msNow, secondInterval);
-  }
-
-  @Override
-  public boolean hasExpired() {
-    return super.hasExpired();
+    totalTimer.record(stageTrace.calcTotal(), TimeUnit.NANOSECONDS);
+    prepareTimer.record(stageTrace.calcPrepare(), TimeUnit.NANOSECONDS);
   }
 }
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 ce9283e3d..6c696a570 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,10 +25,6 @@ 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.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;
 
@@ -68,20 +64,16 @@ public abstract class AbstractInvocationMeters {
     }
 
     return metersMap.computeIfAbsent(keyBuilder.toString(), k -> {
-      Id id = new Id(MeterInvocationConst.INVOCATION_NAME, Tags.empty()
+      AbstractInvocationMeter meter = 
createMeter(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);
+          .and(MeterInvocationConst.TAG_STATUS, 
String.valueOf(response.getStatusCode())));
       return meter;
     });
   }
 
-  protected abstract AbstractInvocationMeter createMeter(Id id);
+  protected abstract AbstractInvocationMeter createMeter(String name, Tags 
tags);
 
   public void onInvocationStart(InvocationStartEvent event) {
   }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeter.java
index cc575ad3c..d0b4c08f7 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeter.java
@@ -16,34 +16,47 @@
  */
 package org.apache.servicecomb.metrics.core.meter.invocation;
 
-import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.invocation.InvocationStageTrace;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
-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.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
+import io.micrometer.core.instrument.Timer;
 
 public class ConsumerInvocationMeter extends AbstractInvocationMeter {
-  private final SimpleTimer consumerEncodeRequestTimer;
+  private final Timer consumerEncodeRequestTimer;
 
-  private final SimpleTimer consumerDecodeResponseTimer;
+  private final Timer consumerDecodeResponseTimer;
 
-  private final SimpleTimer consumerGetConnectionTimer;
+  private final Timer consumerGetConnectionTimer;
 
-  private final SimpleTimer consumerSendRequestTimer;
+  private final Timer consumerSendRequestTimer;
 
-  private final SimpleTimer consumerWaitResponseTimer;
+  private final Timer consumerWaitResponseTimer;
 
-  public ConsumerInvocationMeter(Id id, MetricsBootstrapConfig 
metricsBootstrapConfig) {
-    super(id, metricsBootstrapConfig);
-    consumerSendRequestTimer = 
createStageTimer(InvocationStageTrace.STAGE_CONSUMER_SEND);
-    consumerGetConnectionTimer = 
createStageTimer(InvocationStageTrace.STAGE_CONSUMER_CONNECTION);
-    consumerEncodeRequestTimer = 
createStageTimer(InvocationStageTrace.STAGE_CONSUMER_ENCODE_REQUEST);
-    consumerDecodeResponseTimer = 
createStageTimer(InvocationStageTrace.STAGE_CONSUMER_DECODE_RESPONSE);
-    consumerWaitResponseTimer = 
createStageTimer(InvocationStageTrace.STAGE_CONSUMER_WAIT);
+  public ConsumerInvocationMeter(MeterRegistry meterRegistry, String name, 
Tags tags,
+      MetricsBootstrapConfig metricsBootstrapConfig) {
+    super(meterRegistry, name, tags, metricsBootstrapConfig);
+    consumerSendRequestTimer = Timer.builder(name)
+        .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_CONSUMER_SEND)).register(meterRegistry);
+    consumerGetConnectionTimer = Timer.builder(name)
+        .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_CONSUMER_CONNECTION)).register(meterRegistry);
+    consumerEncodeRequestTimer = Timer.builder(name)
+        .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_CONSUMER_ENCODE_REQUEST))
+        .register(meterRegistry);
+    consumerDecodeResponseTimer = Timer.builder(name)
+        .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_CONSUMER_DECODE_RESPONSE))
+        .register(meterRegistry);
+    consumerWaitResponseTimer = Timer.builder(name)
+        .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_CONSUMER_WAIT)).register(meterRegistry);
   }
 
   @Override
@@ -51,21 +64,10 @@ public class ConsumerInvocationMeter extends 
AbstractInvocationMeter {
     super.onInvocationFinish(event);
 
     InvocationStageTrace invocationStageTrace = 
event.getInvocation().getInvocationStageTrace();
-    
consumerEncodeRequestTimer.record(invocationStageTrace.calcConsumerEncodeRequest());
-    
consumerSendRequestTimer.record(invocationStageTrace.calcConsumerSendRequest());
-    consumerGetConnectionTimer.record(invocationStageTrace.calcConnection());
-    consumerWaitResponseTimer.record(invocationStageTrace.calcWait());
-    
consumerDecodeResponseTimer.record(invocationStageTrace.calcConsumerDecodeResponse());
-  }
-
-  @Override
-  public void calcMeasurements(List<Measurement> measurements, long msNow, 
long secondInterval) {
-    super.calcMeasurements(measurements, msNow, secondInterval);
-
-    consumerSendRequestTimer.calcMeasurements(measurements, msNow, 
secondInterval);
-    consumerGetConnectionTimer.calcMeasurements(measurements, msNow, 
secondInterval);
-    consumerEncodeRequestTimer.calcMeasurements(measurements, msNow, 
secondInterval);
-    consumerWaitResponseTimer.calcMeasurements(measurements, msNow, 
secondInterval);
-    consumerDecodeResponseTimer.calcMeasurements(measurements, msNow, 
secondInterval);
+    
consumerEncodeRequestTimer.record(invocationStageTrace.calcConsumerEncodeRequest(),
 TimeUnit.NANOSECONDS);
+    
consumerSendRequestTimer.record(invocationStageTrace.calcConsumerSendRequest(), 
TimeUnit.NANOSECONDS);
+    consumerGetConnectionTimer.record(invocationStageTrace.calcConnection(), 
TimeUnit.NANOSECONDS);
+    consumerWaitResponseTimer.record(invocationStageTrace.calcWait(), 
TimeUnit.NANOSECONDS);
+    
consumerDecodeResponseTimer.record(invocationStageTrace.calcConsumerDecodeResponse(),
 TimeUnit.NANOSECONDS);
   }
 }
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 d46faa803..842122e08 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,8 +18,8 @@ package org.apache.servicecomb.metrics.core.meter.invocation;
 
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 
-import io.micrometer.core.instrument.Meter.Id;
 import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
 
 public class ConsumerInvocationMeters extends AbstractInvocationMeters {
   public ConsumerInvocationMeters(MeterRegistry meterRegistry, 
MetricsBootstrapConfig metricsBootstrapConfig) {
@@ -27,7 +27,7 @@ public class ConsumerInvocationMeters extends 
AbstractInvocationMeters {
   }
 
   @Override
-  protected AbstractInvocationMeter createMeter(Id id) {
-    return new ConsumerInvocationMeter(id, this.metricsBootstrapConfig);
+  protected AbstractInvocationMeter createMeter(String name, Tags tags) {
+    return new ConsumerInvocationMeter(registry, name, tags, 
this.metricsBootstrapConfig);
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeter.java
index 89284ecd8..32fe7aa92 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeter.java
@@ -17,28 +17,37 @@
 
 package org.apache.servicecomb.metrics.core.meter.invocation;
 
-import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.invocation.InvocationStageTrace;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
-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.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
+import io.micrometer.core.instrument.Timer;
 
 public class EdgeInvocationMeter extends ConsumerInvocationMeter {
-  private final SimpleTimer providerDecodeRequestTimer;
-
-  private final SimpleTimer providerEncodeResponseTimer;
-
-  private final SimpleTimer sendResponseTimer;
-
-  public EdgeInvocationMeter(Id id, MetricsBootstrapConfig 
metricsBootstrapConfig) {
-    super(id, metricsBootstrapConfig);
-    providerDecodeRequestTimer = 
createStageTimer(InvocationStageTrace.STAGE_PROVIDER_DECODE_REQUEST);
-    providerEncodeResponseTimer = 
createStageTimer(InvocationStageTrace.STAGE_PROVIDER_ENCODE_RESPONSE);
-    sendResponseTimer = 
createStageTimer(InvocationStageTrace.STAGE_PROVIDER_SEND);
+  private final Timer providerDecodeRequestTimer;
+
+  private final Timer providerEncodeResponseTimer;
+
+  private final Timer sendResponseTimer;
+
+  public EdgeInvocationMeter(MeterRegistry meterRegistry, String name, Tags 
tags,
+      MetricsBootstrapConfig metricsBootstrapConfig) {
+    super(meterRegistry, name, tags, metricsBootstrapConfig);
+    providerDecodeRequestTimer = Timer.builder(name)
+        .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_PROVIDER_DECODE_REQUEST))
+        .register(meterRegistry);
+    providerEncodeResponseTimer = Timer.builder(name)
+        .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_PROVIDER_ENCODE_RESPONSE))
+        .register(meterRegistry);
+    sendResponseTimer = 
Timer.builder(name).tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_PROVIDER_SEND))
+        .register(meterRegistry);
   }
 
   @Override
@@ -46,17 +55,8 @@ public class EdgeInvocationMeter extends 
ConsumerInvocationMeter {
     super.onInvocationFinish(event);
     InvocationStageTrace invocationStageTrace = 
event.getInvocation().getInvocationStageTrace();
 
-    
providerDecodeRequestTimer.record(invocationStageTrace.calcProviderDecodeRequest());
-    
providerEncodeResponseTimer.record(invocationStageTrace.calcProviderEncodeResponse());
-    sendResponseTimer.record(invocationStageTrace.calcProviderSendResponse());
-  }
-
-  @Override
-  public void calcMeasurements(List<Measurement> measurements, long msNow, 
long secondInterval) {
-    super.calcMeasurements(measurements, msNow, secondInterval);
-
-    providerDecodeRequestTimer.calcMeasurements(measurements, msNow, 
secondInterval);
-    providerEncodeResponseTimer.calcMeasurements(measurements, msNow, 
secondInterval);
-    sendResponseTimer.calcMeasurements(measurements, msNow, secondInterval);
+    
providerDecodeRequestTimer.record(invocationStageTrace.calcProviderDecodeRequest(),
 TimeUnit.NANOSECONDS);
+    
providerEncodeResponseTimer.record(invocationStageTrace.calcProviderEncodeResponse(),
 TimeUnit.NANOSECONDS);
+    sendResponseTimer.record(invocationStageTrace.calcProviderSendResponse(), 
TimeUnit.NANOSECONDS);
   }
 }
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 872a811b7..ecdbd3670 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,8 +19,8 @@ package org.apache.servicecomb.metrics.core.meter.invocation;
 
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 
-import io.micrometer.core.instrument.Meter.Id;
 import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
 
 public class EdgeInvocationMeters extends ConsumerInvocationMeters {
   public EdgeInvocationMeters(MeterRegistry meterRegistry, 
MetricsBootstrapConfig metricsBootstrapConfig) {
@@ -28,7 +28,7 @@ public class EdgeInvocationMeters extends 
ConsumerInvocationMeters {
   }
 
   @Override
-  protected AbstractInvocationMeter createMeter(Id id) {
-    return new EdgeInvocationMeter(id, metricsBootstrapConfig);
+  protected AbstractInvocationMeter createMeter(String name, Tags tags) {
+    return new EdgeInvocationMeter(registry, name, tags, 
metricsBootstrapConfig);
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeter.java
index f5727613d..2ed55e5e0 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeter.java
@@ -16,35 +16,49 @@
  */
 package org.apache.servicecomb.metrics.core.meter.invocation;
 
-import java.util.List;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.servicecomb.core.event.InvocationFinishEvent;
 import org.apache.servicecomb.core.invocation.InvocationStageTrace;
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
-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.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
+import io.micrometer.core.instrument.Timer;
 
 public class ProducerInvocationMeter extends AbstractInvocationMeter {
-  private final SimpleTimer executorQueueTimer;
+  private final Timer executorQueueTimer;
 
-  private final SimpleTimer executionTimer;
+  private final Timer executionTimer;
 
-  private final SimpleTimer providerDecodeRequestTimer;
+  private final Timer providerDecodeRequestTimer;
 
-  private final SimpleTimer providerEncodeResponseTimer;
+  private final Timer providerEncodeResponseTimer;
 
-  private final SimpleTimer sendResponseTimer;
+  private final Timer sendResponseTimer;
 
-  public ProducerInvocationMeter(Id id, MetricsBootstrapConfig 
metricsBootstrapConfig) {
-    super(id, metricsBootstrapConfig);
-
-    executorQueueTimer = 
createStageTimer(InvocationStageTrace.STAGE_PROVIDER_QUEUE);
-    executionTimer = 
createStageTimer(InvocationStageTrace.STAGE_PROVIDER_BUSINESS);
-    providerDecodeRequestTimer = 
createStageTimer(InvocationStageTrace.STAGE_PROVIDER_DECODE_REQUEST);
-    providerEncodeResponseTimer = 
createStageTimer(InvocationStageTrace.STAGE_PROVIDER_ENCODE_RESPONSE);
-    sendResponseTimer = 
createStageTimer(InvocationStageTrace.STAGE_PROVIDER_SEND);
+  public ProducerInvocationMeter(MeterRegistry meterRegistry, String name, 
Tags tags,
+      MetricsBootstrapConfig metricsBootstrapConfig) {
+    super(meterRegistry, name, tags, metricsBootstrapConfig);
+    executorQueueTimer = Timer.builder(name)
+        .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_PROVIDER_QUEUE))
+        .register(meterRegistry);
+    executionTimer = 
Timer.builder(name).tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_PROVIDER_BUSINESS))
+        .register(meterRegistry);
+    providerDecodeRequestTimer = Timer.builder(name)
+        .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_PROVIDER_DECODE_REQUEST))
+        .register(meterRegistry);
+    providerEncodeResponseTimer = Timer.builder(name)
+        .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_PROVIDER_ENCODE_RESPONSE))
+        .register(meterRegistry);
+    sendResponseTimer = Timer.builder(name)
+        .tags(tags.and(MeterInvocationConst.TAG_TYPE, 
MeterInvocationConst.TAG_STAGE,
+            MeterInvocationConst.TAG_STAGE, 
InvocationStageTrace.STAGE_PROVIDER_SEND))
+        .register(meterRegistry);
   }
 
   @Override
@@ -52,21 +66,10 @@ public class ProducerInvocationMeter extends 
AbstractInvocationMeter {
     super.onInvocationFinish(event);
 
     InvocationStageTrace invocationStageTrace = 
event.getInvocation().getInvocationStageTrace();
-    executorQueueTimer.record(invocationStageTrace.calcQueue());
-    executionTimer.record(invocationStageTrace.calcBusinessExecute());
-    
providerDecodeRequestTimer.record(invocationStageTrace.calcProviderDecodeRequest());
-    
providerEncodeResponseTimer.record(invocationStageTrace.calcProviderEncodeResponse());
-    sendResponseTimer.record(invocationStageTrace.calcProviderSendResponse());
-  }
-
-  @Override
-  public void calcMeasurements(List<Measurement> measurements, long msNow, 
long secondInterval) {
-    super.calcMeasurements(measurements, msNow, secondInterval);
-
-    executorQueueTimer.calcMeasurements(measurements, msNow, secondInterval);
-    executionTimer.calcMeasurements(measurements, msNow, secondInterval);
-    providerDecodeRequestTimer.calcMeasurements(measurements, msNow, 
secondInterval);
-    providerEncodeResponseTimer.calcMeasurements(measurements, msNow, 
secondInterval);
-    sendResponseTimer.calcMeasurements(measurements, msNow, secondInterval);
+    executorQueueTimer.record(invocationStageTrace.calcQueue(), 
TimeUnit.NANOSECONDS);
+    executionTimer.record(invocationStageTrace.calcBusinessExecute(), 
TimeUnit.NANOSECONDS);
+    
providerDecodeRequestTimer.record(invocationStageTrace.calcProviderDecodeRequest(),
 TimeUnit.NANOSECONDS);
+    
providerEncodeResponseTimer.record(invocationStageTrace.calcProviderEncodeResponse(),
 TimeUnit.NANOSECONDS);
+    sendResponseTimer.record(invocationStageTrace.calcProviderSendResponse(), 
TimeUnit.NANOSECONDS);
   }
 }
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 60e86493c..bf4f84104 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,8 +18,8 @@ package org.apache.servicecomb.metrics.core.meter.invocation;
 
 import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig;
 
-import io.micrometer.core.instrument.Meter.Id;
 import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
 
 public class ProducerInvocationMeters extends AbstractInvocationMeters {
   public ProducerInvocationMeters(MeterRegistry meterRegistry, 
MetricsBootstrapConfig metricsBootstrapConfig) {
@@ -27,7 +27,7 @@ public class ProducerInvocationMeters extends 
AbstractInvocationMeters {
   }
 
   @Override
-  protected AbstractInvocationMeter createMeter(Id id) {
-    return new ProducerInvocationMeter(id, metricsBootstrapConfig);
+  protected AbstractInvocationMeter createMeter(String name, Tags tags) {
+    return new ProducerInvocationMeter(registry, name, tags, 
metricsBootstrapConfig);
   }
 }

Reply via email to