You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2023/12/01 08:22:20 UTC
(servicecomb-java-chassis) 02/11: [SCB-2838]using micrometer to replace spectator part2: InvocationMeter
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 <bi...@qq.com>
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);
}
}