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 611517baf6388bd5c54c96d41b92d76be6e87329
Author: liubao <[email protected]>
AuthorDate: Mon Nov 27 09:50:50 2023 +0800

    [SCB-2838]using micrometer to replace spectator part3: EndpointMeter
---
 .../com/netflix/spectator/api/SpectatorUtils.java  |  33 ------
 .../foundation/metrics/meter/PeriodMeter.java      |  10 +-
 .../foundation/metrics/meter/SimpleTimer.java      |  91 ---------------
 .../foundation/metrics/meter/TestSimpleTimer.java  |  43 -------
 .../metric/DefaultClientEndpointMetricManager.java |  27 ++++-
 .../metrics/core/VertxMetersInitializer.java       |  18 ++-
 .../metrics/core/meter/vertx/EndpointMeter.java    | 126 ++++++++++++---------
 .../core/meter/vertx/HttpClientEndpointMeter.java  |  26 ++---
 .../core/meter/vertx/HttpClientEndpointsMeter.java |  15 +--
 .../core/meter/vertx/ServerEndpointMeter.java      |  33 +++---
 .../core/meter/vertx/ServerEndpointsMeter.java     |  12 +-
 .../core/meter/vertx/VertxEndpointsMeter.java      |  52 +++------
 .../metrics/core/publish/DefaultLogPublisher.java  |   2 +-
 13 files changed, 165 insertions(+), 323 deletions(-)

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
deleted file mode 100644
index 400b8cb4b..000000000
--- 
a/foundations/foundation-metrics/src/main/java/com/netflix/spectator/api/SpectatorUtils.java
+++ /dev/null
@@ -1,33 +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 com.netflix.spectator.api;
-
-import io.micrometer.core.instrument.Meter;
-import io.micrometer.core.instrument.MeterRegistry;
-
-public final class SpectatorUtils {
-  private SpectatorUtils() {
-  }
-
-  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());
-    }
-    ((AbstractRegistry) registry).getOrCreate(meter.id(), Meter.class, null, 
_id -> meter);
-  }
-}
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 4fa57f13e..3fcbf41bd 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
@@ -16,14 +16,6 @@
  */
 package org.apache.servicecomb.foundation.metrics.meter;
 
-import java.util.List;
-
-import io.micrometer.core.instrument.Measurement;
-import io.micrometer.core.instrument.Meter;
-
-
-public interface PeriodMeter extends Meter {
+public interface PeriodMeter {
   void calcMeasurements(long msNow, long secondInterval);
-
-  void calcMeasurements(List<Measurement> measurements, 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
deleted file mode 100644
index f1860a783..000000000
--- 
a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/SimpleTimer.java
+++ /dev/null
@@ -1,91 +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 java.util.concurrent.atomic.LongAdder;
-
-
-import io.micrometer.core.instrument.Measurement;
-
-/**
- * ServoTimer is too slow
- * this is a faster timer
- */
-public class SimpleTimer extends AbstractPeriodMeter {
-  private static final double CNV_SECONDS = 1.0 / TimeUnit.SECONDS.toNanos(1L);
-
-  private final Id idCount;
-
-  private final Id idTotalTime;
-
-  private final Id idMax;
-
-  private final LongAdder count = new LongAdder();
-
-  private final LongAdder totalTime = new LongAdder();
-
-  private final AtomicDouble max = new AtomicDouble();
-
-  private long lastCount = 0;
-
-  private long lastTotalTime = 0;
-
-  public SimpleTimer(Id id) {
-    this.id = id;
-    this.idCount = id.withTag(Statistic.count);
-    this.idTotalTime = id.withTag(Statistic.totalTime);
-    this.idMax = id.withTag(Statistic.max);
-  }
-
-  public void record(long nanoAmount) {
-    if (nanoAmount >= 0) {
-      totalTime.add(nanoAmount);
-      count.increment();
-      max.max(nanoAmount);
-    }
-  }
-
-  private Measurement newMeasurement(Id id, long msNow, Number n) {
-    return new Measurement(id, msNow, n.doubleValue());
-  }
-
-  @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) {
-    long currentCount = count.longValue();
-    long currentTotalTime = totalTime.longValue();
-
-    measurements.add(newMeasurement(idCount, msNow, (double) (currentCount - 
lastCount) / secondInterval));
-    measurements
-        .add(newMeasurement(idTotalTime, msNow, (currentTotalTime - 
lastTotalTime) / secondInterval * CNV_SECONDS));
-    measurements.add(newMeasurement(idMax, msNow, max.get() * CNV_SECONDS));
-
-    lastCount = currentCount;
-    lastTotalTime = currentTotalTime;
-    // maybe lost some max value, but not so important?
-    max.set(0);
-  }
-}
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
deleted file mode 100644
index adc08f1bb..000000000
--- 
a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/meter/TestSimpleTimer.java
+++ /dev/null
@@ -1,43 +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 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(new Id("test", Tags.empty(), null, null, 
Type.TIMER));
-
-  @Test
-  public void measure() {
-    timer.record(2);
-    timer.record(4);
-
-    Assertions.assertFalse(timer.measure().iterator().hasNext());
-
-    timer.calcMeasurements(1, 2);
-    Assertions.assertEquals(
-        "[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().getName());
-  }
-}
diff --git 
a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/metric/DefaultClientEndpointMetricManager.java
 
b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/metric/DefaultClientEndpointMetricManager.java
index bdd5a1e52..a6ece5cac 100644
--- 
a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/metric/DefaultClientEndpointMetricManager.java
+++ 
b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/metrics/metric/DefaultClientEndpointMetricManager.java
@@ -16,6 +16,8 @@
  */
 package org.apache.servicecomb.foundation.vertx.metrics.metric;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -28,6 +30,10 @@ import com.google.common.annotations.VisibleForTesting;
 import io.vertx.core.Vertx;
 
 public class DefaultClientEndpointMetricManager {
+  public interface ChangeListener {
+    void endpointsChanged();
+  }
+
   private final MetricsOptionsEx metricsOptionsEx;
 
   // to avoid save too many endpoint that not exist any more
@@ -43,14 +49,24 @@ public class DefaultClientEndpointMetricManager {
   // so must lock the logic
   private final ReadWriteLock rwlock = new ReentrantReadWriteLock();
 
+  private final List<ChangeListener> changeListeners = new ArrayList<>();
+
   public DefaultClientEndpointMetricManager(MetricsOptionsEx metricsOptionsEx) 
{
     this.metricsOptionsEx = metricsOptionsEx;
   }
 
+  public void addChangeListener(ChangeListener listener) {
+    this.changeListeners.add(listener);
+  }
+
   public DefaultClientEndpointMetric getOrCreateEndpointMetric(String address) 
{
     rwlock.readLock().lock();
     try {
-      return clientEndpointMetricMap.computeIfAbsent(address, 
DefaultClientEndpointMetric::new);
+      if (clientEndpointMetricMap.get(address) == null) {
+        clientEndpointMetricMap.put(address, new 
DefaultClientEndpointMetric(address));
+        onChanged();
+      }
+      return clientEndpointMetricMap.get(address);
     } finally {
       rwlock.readLock().unlock();
     }
@@ -67,22 +83,31 @@ public class DefaultClientEndpointMetricManager {
 
   @VisibleForTesting
   public void onCheckClientEndpointMetricExpired(long periodic) {
+    boolean changed = false;
     for (DefaultClientEndpointMetric metric : 
clientEndpointMetricMap.values()) {
       if 
(metric.isExpired(metricsOptionsEx.getCheckClientEndpointMetricExpiredInNano()))
 {
         rwlock.writeLock().lock();
         try {
           if 
(metric.isExpired(metricsOptionsEx.getCheckClientEndpointMetricExpiredInNano()))
 {
             clientEndpointMetricMap.remove(metric.getAddress());
+            changed = true;
           }
         } finally {
           rwlock.writeLock().unlock();
         }
       }
     }
+    if (changed) {
+      onChanged();
+    }
   }
 
   public void setVertx(Vertx vertx) {
     
vertx.setPeriodic(metricsOptionsEx.getCheckClientEndpointMetricIntervalInMilliseconds(),
         this::onCheckClientEndpointMetricExpired);
   }
+
+  private void onChanged() {
+    this.changeListeners.forEach(ChangeListener::endpointsChanged);
+  }
 }
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 51cee1400..dbc093ab1 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
@@ -21,35 +21,31 @@ import 
org.apache.servicecomb.foundation.metrics.MetricsInitializer;
 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 io.micrometer.core.instrument.Meter.Id;
 import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.Tags;
 
 public class VertxMetersInitializer implements MetricsInitializer {
   public static final String VERTX_ENDPOINTS = "servicecomb.vertx.endpoints";
 
   public static final String ENDPOINTS_TYPE = "type";
 
-  public static final String ENDPOINTS_CLINET = "client";
+  public static final String ENDPOINTS_CLIENT = "client";
 
   public static final String ENDPOINTS_SERVER = "server";
 
   @Override
   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(Tag.of(ENDPOINTS_TYPE, ENDPOINTS_CLINET)),
+    new HttpClientEndpointsMeter(meterRegistry, VERTX_ENDPOINTS,
+        Tags.of(ENDPOINTS_TYPE, ENDPOINTS_CLIENT),
         SharedVertxFactory.getMetricsFactory(config.getEnvironment())
             .getVertxMetrics()
-            .getClientEndpointMetricManager()
-            .getClientEndpointMetricMap());
+            .getClientEndpointMetricManager());
 
-    VertxEndpointsMeter serverMeter = new ServerEndpointsMeter(
-        endpointsId.withTag(Tag.of(ENDPOINTS_TYPE, ENDPOINTS_SERVER)),
+    new ServerEndpointsMeter(meterRegistry, VERTX_ENDPOINTS,
+        Tags.of(ENDPOINTS_TYPE, ENDPOINTS_SERVER),
         SharedVertxFactory.getMetricsFactory(config.getEnvironment())
             .getVertxMetrics()
             .getServerEndpointMetricMap());
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 2217c8204..3624ef441 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
@@ -16,15 +16,14 @@
  */
 package org.apache.servicecomb.metrics.core.meter.vertx;
 
-import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 import 
org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultEndpointMetric;
 
-import io.micrometer.core.instrument.Measurement;
-import io.micrometer.core.instrument.Meter.Id;
+import io.micrometer.core.instrument.Gauge;
+import io.micrometer.core.instrument.MeterRegistry;
 import io.micrometer.core.instrument.Tag;
-
+import io.micrometer.core.instrument.Tags;
 
 public class EndpointMeter {
   private static final double SNV_MILLI_SECONDS = 1.0 / 
TimeUnit.MILLISECONDS.toNanos(1L);
@@ -47,23 +46,23 @@ public class EndpointMeter {
 
   public static final String LATENCY = "latency";
 
-  protected Id id;
+  protected DefaultEndpointMetric metric;
 
-  private final Id idConnect;
+  private final MeterRegistry meterRegistry;
 
-  private final Id idDisconnect;
+  private final Gauge connectCount;
 
-  private final Id idConnections;
+  private final Gauge disconnectCount;
 
-  private final Id idBytesRead;
+  private final Gauge connections;
 
-  private final Id idBytesWritten;
+  private final Gauge bytesRead;
 
-  private final Id idRequests;
+  private final Gauge bytesWritten;
 
-  private final Id idLatency;
+  private final Gauge requests;
 
-  protected DefaultEndpointMetric metric;
+  private final Gauge latency;
 
   private long lastConnectCount;
 
@@ -75,51 +74,76 @@ public class EndpointMeter {
 
   private long lastRequests;
 
+  private long lastRequestsForLatency;
+
   private long lastLatency;
 
-  public EndpointMeter(Id id, DefaultEndpointMetric metric) {
-    id = id.withTag(Tag.of(ADDRESS, metric.getAddress()));
-    this.id = id;
-    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;
+  public EndpointMeter(MeterRegistry meterRegistry, String name, Tags tags, 
DefaultEndpointMetric metric) {
+    this.meterRegistry = meterRegistry;
+
+    tags = tags.and(Tag.of(ADDRESS, metric.getAddress()));
+    connectCount = Gauge.builder(name, () -> {
+          long current = metric.getConnectCount();
+          long result = current - lastConnectCount;
+          lastConnectCount = current;
+          return result;
+        })
+        .tags(tags.and(Tag.of(STATISTIC, CONNECT_COUNT)))
+        .register(meterRegistry);
+    disconnectCount = Gauge.builder(name, () -> {
+          long current = metric.getDisconnectCount();
+          long result = current - lastDisconnectCount;
+          lastDisconnectCount = current;
+          return result;
+        }).tags(tags.and(Tag.of(STATISTIC, DISCONNECT_COUNT)))
+        .register(meterRegistry);
+    connections = Gauge.builder(name, () -> metric.getConnectCount() - 
metric.getDisconnectCount())
+        .tags(tags.and(Tag.of(STATISTIC, CONNECTIONS)))
+        .register(meterRegistry);
+    bytesRead = Gauge.builder(name, () -> {
+          long current = metric.getBytesRead();
+          long result = current - lastBytesRead;
+          lastBytesRead = current;
+          return result;
+        }).tags(tags.and(Tag.of(STATISTIC, BYTES_READ)))
+        .register(meterRegistry);
+    bytesWritten = Gauge.builder(name, () -> {
+          long current = metric.getBytesWritten();
+          long result = current - lastBytesWritten;
+          lastBytesWritten = current;
+          return result;
+        }).tags(tags.and(Tag.of(STATISTIC, BYTES_WRITTEN)))
+        .register(meterRegistry);
+    requests = Gauge.builder(name, () -> {
+          long current = metric.getRequests();
+          long result = current - lastRequests;
+          lastRequests = current;
+          return result;
+        }).tags(tags.and(Tag.of(STATISTIC, REQUESTS)))
+        .register(meterRegistry);
+    latency = Gauge.builder(name, () -> {
+          long currentLatency = metric.getLatency();
+          long currentRequests = metric.getRequests();
+          double result = currentRequests - lastRequestsForLatency == 0 ? 0 :
+              (currentLatency - lastLatency) / ((double) (currentRequests - 
lastRequestsForLatency)) * SNV_MILLI_SECONDS;
+          lastRequestsForLatency = currentRequests;
+          lastLatency = currentLatency;
+          return result;
+        }).tags(tags.and(Tag.of(STATISTIC, LATENCY)))
+        .register(meterRegistry);
   }
 
   public DefaultEndpointMetric getMetric() {
     return metric;
   }
 
-  protected Measurement newMeasurement(Id id, long timestamp, Number n) {
-    return new Measurement(id, timestamp, n.doubleValue());
-  }
-
-  public void calcMeasurements(List<Measurement> measurements, long msNow, 
double secondInterval) {
-    long connectCount = metric.getConnectCount();
-    long disconnectCount = metric.getDisconnectCount();
-    long bytesRead = metric.getBytesRead();
-    long bytesWritten = metric.getBytesWritten();
-    long requests = metric.getRequests();
-    long latency = metric.getLatency();
-
-    measurements.add(newMeasurement(idConnect, msNow, connectCount - 
lastConnectCount));
-    measurements.add(newMeasurement(idDisconnect, msNow, disconnectCount - 
lastDisconnectCount));
-    measurements.add(newMeasurement(idConnections, msNow, connectCount - 
disconnectCount));
-    measurements.add(newMeasurement(idBytesRead, msNow, (bytesRead - 
lastBytesRead) / secondInterval));
-    measurements.add(newMeasurement(idBytesWritten, msNow, (bytesWritten - 
lastBytesWritten) / secondInterval));
-    measurements.add(newMeasurement(idRequests, msNow, requests - 
lastRequests));
-    measurements.add(newMeasurement(idLatency, msNow,
-        requests - lastRequests == 0 ? 0 : (latency - lastLatency) / (requests 
- lastRequests) * SNV_MILLI_SECONDS));
-
-    this.lastConnectCount = connectCount;
-    this.lastDisconnectCount = disconnectCount;
-    this.lastBytesRead = bytesRead;
-    this.lastBytesWritten = bytesWritten;
-    this.lastRequests = requests;
-    this.lastLatency = latency;
+  public void destroy() {
+    this.meterRegistry.remove(connectCount);
+    this.meterRegistry.remove(disconnectCount);
+    this.meterRegistry.remove(connections);
+    this.meterRegistry.remove(bytesRead);
+    this.meterRegistry.remove(bytesWritten);
+    this.meterRegistry.remove(requests);
+    this.meterRegistry.remove(latency);
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/HttpClientEndpointMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/HttpClientEndpointMeter.java
index a960bf680..a80f4643e 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/HttpClientEndpointMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/HttpClientEndpointMeter.java
@@ -16,29 +16,21 @@
  */
 package org.apache.servicecomb.metrics.core.meter.vertx;
 
-import java.util.List;
-
 import 
org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultClientEndpointMetric;
 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.Gauge;
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.Tags;
 
 public class HttpClientEndpointMeter extends EndpointMeter {
   public static final String QUEUE_COUNT = "queueCount";
 
-  private final Id idQueueCount;
-
-  public HttpClientEndpointMeter(Id id, DefaultEndpointMetric metric) {
-    super(id, metric);
-    idQueueCount = this.id.withTag(STATISTIC, QUEUE_COUNT);
-  }
-
-  @Override
-  public void calcMeasurements(List<Measurement> measurements, long msNow, 
double secondInterval) {
-    super.calcMeasurements(measurements, msNow, secondInterval);
-
-    long queueCount = ((DefaultClientEndpointMetric) metric).getQueueCount();
-    measurements.add(newMeasurement(idQueueCount, msNow, queueCount));
+  public HttpClientEndpointMeter(MeterRegistry meterRegistry, String name, 
Tags tags, DefaultEndpointMetric metric) {
+    super(meterRegistry, name, tags, metric);
+    Gauge.builder(name, () -> ((DefaultClientEndpointMetric) 
metric).getQueueCount())
+        .tags(tags.and(Tag.of(STATISTIC, QUEUE_COUNT)))
+        .register(meterRegistry);
   }
 }
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 a8c3c4db9..78169f6af 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
@@ -16,20 +16,21 @@
  */
 package org.apache.servicecomb.metrics.core.meter.vertx;
 
-import java.util.Map;
-
+import 
org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultClientEndpointMetricManager;
 import 
org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultEndpointMetric;
 
 import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
 
 public class HttpClientEndpointsMeter extends VertxEndpointsMeter {
-  public <T extends DefaultEndpointMetric> 
HttpClientEndpointsMeter(MeterRegistry meterRegistry, Id id,
-      Map<String, T> endpointMetricMap) {
-    super(meterRegistry, id, endpointMetricMap);
+  public <T extends DefaultEndpointMetric> 
HttpClientEndpointsMeter(MeterRegistry meterRegistry, String name, Tags tags,
+      DefaultClientEndpointMetricManager clientEndpointMetricManager) {
+    super(meterRegistry, name, tags, 
clientEndpointMetricManager.getClientEndpointMetricMap());
+    clientEndpointMetricManager.addChangeListener(this::onChanged);
   }
 
   @Override
-  protected EndpointMeter createEndpointMeter(Id id, DefaultEndpointMetric 
metric) {
-    return new HttpClientEndpointMeter(id, metric);
+  protected EndpointMeter createEndpointMeter(DefaultEndpointMetric metric) {
+    return new HttpClientEndpointMeter(meterRegistry, name, tags, metric);
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/ServerEndpointMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/ServerEndpointMeter.java
index b2e8b6f40..2e8c6d2fb 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/ServerEndpointMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/ServerEndpointMeter.java
@@ -16,33 +16,28 @@
  */
 package org.apache.servicecomb.metrics.core.meter.vertx;
 
-import java.util.List;
-
 import 
org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultEndpointMetric;
 import 
org.apache.servicecomb.foundation.vertx.metrics.metric.DefaultServerEndpointMetric;
 
-import com.netflix.spectator.api.Id;
-import com.netflix.spectator.api.Measurement;
+import io.micrometer.core.instrument.Gauge;
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.Tags;
 
 public class ServerEndpointMeter extends EndpointMeter {
   public static final String REJECT_BY_CONNECTION_LIMIT = 
"rejectByConnectionLimit";
 
-  private final Id idRejectByConnectionLimit;
-
   private long lastRejectByConnectionLimit;
 
-  public ServerEndpointMeter(Id id, DefaultEndpointMetric metric) {
-    super(id, metric);
-    idRejectByConnectionLimit = this.id.withTag(STATISTIC, 
REJECT_BY_CONNECTION_LIMIT);
-  }
-
-  @Override
-  public void calcMeasurements(List<Measurement> measurements, long msNow, 
double secondInterval) {
-    super.calcMeasurements(measurements, msNow, secondInterval);
-
-    long rejectByConnectionLimit = ((DefaultServerEndpointMetric) 
metric).getRejectByConnectionLimitCount();
-    measurements
-        .add(newMeasurement(idRejectByConnectionLimit, msNow, 
rejectByConnectionLimit - lastRejectByConnectionLimit));
-    this.lastRejectByConnectionLimit = rejectByConnectionLimit;
+  public ServerEndpointMeter(MeterRegistry meterRegistry, String name, Tags 
tags, DefaultEndpointMetric metric) {
+    super(meterRegistry, name, tags, metric);
+    Gauge.builder(name, () -> {
+          long current = ((DefaultServerEndpointMetric) 
metric).getRejectByConnectionLimitCount();
+          long result = current - lastRejectByConnectionLimit;
+          lastRejectByConnectionLimit = current;
+          return result;
+        })
+        .tags(tags.and(Tag.of(STATISTIC, REJECT_BY_CONNECTION_LIMIT)))
+        .register(meterRegistry);
   }
 }
diff --git 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/ServerEndpointsMeter.java
 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/ServerEndpointsMeter.java
index 14c3f2cdc..11f5a7065 100644
--- 
a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/ServerEndpointsMeter.java
+++ 
b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/vertx/ServerEndpointsMeter.java
@@ -20,15 +20,17 @@ 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;
+import io.micrometer.core.instrument.Tags;
 
 public class ServerEndpointsMeter extends VertxEndpointsMeter {
-  public <T extends DefaultEndpointMetric> ServerEndpointsMeter(Id id, 
Map<String, T> endpointMetricMap) {
-    super(id, endpointMetricMap);
+  public <T extends DefaultEndpointMetric> ServerEndpointsMeter(MeterRegistry 
meterRegistry, String name, Tags tags,
+      Map<String, T> endpointMetricMap) {
+    super(meterRegistry, name, tags, endpointMetricMap);
   }
 
   @Override
-  protected EndpointMeter createEndpointMeter(Id id, DefaultEndpointMetric 
metric) {
-    return new ServerEndpointMeter(id, metric);
+  protected EndpointMeter createEndpointMeter(DefaultEndpointMetric metric) {
+    return new ServerEndpointMeter(meterRegistry, name, tags, metric);
   }
 }
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 7bed21427..829f17746 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
@@ -16,70 +16,52 @@
  */
 package org.apache.servicecomb.metrics.core.meter.vertx;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
 
 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 io.micrometer.core.instrument.Measurement;
 import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tags;
 
-public class VertxEndpointsMeter extends AbstractPeriodMeter {
+public class VertxEndpointsMeter {
   private final Map<String, DefaultEndpointMetric> endpointMetricMap;
 
-  private final MeterRegistry meterRegistry;
+  protected final MeterRegistry meterRegistry;
+
+  protected final String name;
+
+  protected final Tags tags;
 
   private final Map<String, EndpointMeter> endpointMeterMap = new 
ConcurrentHashMapEx<>();
 
   @SuppressWarnings("unchecked")
-  public <T extends DefaultEndpointMetric> VertxEndpointsMeter(MeterRegistry 
meterRegistry, Id id,
+  public <T extends DefaultEndpointMetric> VertxEndpointsMeter(MeterRegistry 
meterRegistry, String name, Tags tags,
       Map<String, T> endpointMetricMap) {
-    this.id = id;
     this.meterRegistry = meterRegistry;
+    this.name = name;
+    this.tags = tags;
     this.endpointMetricMap = (Map<String, DefaultEndpointMetric>) 
endpointMetricMap;
-  }
-
-  @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) {
     syncMeters();
-
-    for (EndpointMeter meter : endpointMeterMap.values()) {
-      meter.calcMeasurements(measurements, msNow, secondInterval);
-    }
   }
 
   private void syncMeters() {
     for (EndpointMeter meter : endpointMeterMap.values()) {
       if (!endpointMetricMap.containsKey(meter.getMetric().getAddress())) {
-        endpointMeterMap.remove(meter.getMetric().getAddress());
+        EndpointMeter removed = 
endpointMeterMap.remove(meter.getMetric().getAddress());
+        removed.destroy();
       }
     }
     for (DefaultEndpointMetric metric : endpointMetricMap.values()) {
-      endpointMeterMap.computeIfAbsent(metric.getAddress(), addr -> 
createEndpointMeter(id, metric));
+      endpointMeterMap.computeIfAbsent(metric.getAddress(), address -> 
createEndpointMeter(metric));
     }
   }
 
-  protected EndpointMeter createEndpointMeter(Id id, DefaultEndpointMetric 
metric) {
-    return new EndpointMeter(id, metric);
+  protected EndpointMeter createEndpointMeter(DefaultEndpointMetric metric) {
+    return new EndpointMeter(meterRegistry, name, tags, metric);
   }
 
-  @Override
-  public Iterable<Measurement> measure() {
-    return allMeasurements;
-  }
-
-  @Override
-  public boolean hasExpired() {
-    return false;
+  protected void onChanged() {
+    syncMeters();
   }
 }
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 2f45238d9..48e0d047d 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
@@ -482,7 +482,7 @@ public class DefaultLogPublisher implements 
MetricsInitializer {
     }
 
     ClientEndpointsLogPublisher client = new ClientEndpointsLogPublisher(tree, 
sb,
-        VertxMetersInitializer.ENDPOINTS_CLINET);
+        VertxMetersInitializer.ENDPOINTS_CLIENT);
     ServerEndpointsLogPublisher server = new ServerEndpointsLogPublisher(tree, 
sb,
         VertxMetersInitializer.ENDPOINTS_SERVER);
     if (client.isExists() || server.isExists()) {


Reply via email to