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()) {
