This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
commit a16d5bd409c6c3246ed327b9fe0bc4b94820f6f4 Author: liubao <[email protected]> AuthorDate: Sat Nov 25 11:44:14 2023 +0800 [SCB-2838]using micrometer to replace spectator part2: InvocationMeter --- .../metrics/meter/LatencyDistributionMeter.java | 60 -------------- .../meter/TestLatencyDistributionMeter.java | 47 ----------- .../meter/invocation/AbstractInvocationMeter.java | 92 +++++++++------------- .../meter/invocation/AbstractInvocationMeters.java | 14 +--- .../meter/invocation/ConsumerInvocationMeter.java | 66 ++++++++-------- .../meter/invocation/ConsumerInvocationMeters.java | 6 +- .../core/meter/invocation/EdgeInvocationMeter.java | 54 ++++++------- .../meter/invocation/EdgeInvocationMeters.java | 6 +- .../meter/invocation/ProducerInvocationMeter.java | 69 ++++++++-------- .../meter/invocation/ProducerInvocationMeters.java | 6 +- 10 files changed, 147 insertions(+), 273 deletions(-) diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/LatencyDistributionMeter.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/LatencyDistributionMeter.java deleted file mode 100644 index 175c06b8e..000000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/LatencyDistributionMeter.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.servicecomb.foundation.metrics.meter; - -import java.util.ArrayList; -import java.util.List; - -import com.netflix.spectator.api.Id; -import com.netflix.spectator.api.Measurement; - -public class LatencyDistributionMeter extends AbstractPeriodMeter { - private final List<LatencyScopeMeter> latencyScopeMeters = new ArrayList<>(); - - public LatencyDistributionMeter(Id id, String config) { - this.id = id; - - LatencyDistributionConfig latencyDistributionConfig = new LatencyDistributionConfig(config); - for (LatencyScopeConfig scopeConfig : latencyDistributionConfig.getScopeConfigs()) { - latencyScopeMeters.add(new LatencyScopeMeter(id, scopeConfig)); - } - } - - public void record(long nanoLatency) { - if (nanoLatency < 0) { - return; - } - - for (LatencyScopeMeter latencyScopeMeter : latencyScopeMeters) { - if (latencyScopeMeter.update(nanoLatency)) { - return; - } - } - } - - @Override - public void calcMeasurements(long msNow, long secondInterval) { - List<Measurement> measurements = new ArrayList<>(); - calcMeasurements(measurements, msNow, secondInterval); - allMeasurements = measurements; - } - - @Override - public void calcMeasurements(List<Measurement> measurements, long msNow, long secondInterval) { - latencyScopeMeters.forEach(latencyScopeMeter -> measurements.add(latencyScopeMeter.createMeasurement(msNow))); - } -} diff --git a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/meter/TestLatencyDistributionMeter.java b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/meter/TestLatencyDistributionMeter.java deleted file mode 100644 index d5cd26074..000000000 --- a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/meter/TestLatencyDistributionMeter.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.servicecomb.foundation.metrics.meter; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import com.netflix.spectator.api.Id; -import com.netflix.spectator.api.Measurement; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.mockito.Mockito; - -public class TestLatencyDistributionMeter { - - @Test - public void testMeasure() { - Id id = Mockito.mock(Id.class); - LatencyDistributionMeter latencyDistributionMeter = new LatencyDistributionMeter(id, "0,1,3,10"); - latencyDistributionMeter.record(TimeUnit.MILLISECONDS.toNanos(1L)); - latencyDistributionMeter.record(TimeUnit.MILLISECONDS.toNanos(5L)); - latencyDistributionMeter.record(TimeUnit.MILLISECONDS.toNanos(2L)); - List<Measurement> measurements = new ArrayList<>(); - latencyDistributionMeter.calcMeasurements(measurements, 0L, 0L); - Assertions.assertEquals(4, measurements.size()); - Assertions.assertEquals(0, ((int) (measurements.get(0).value()))); - Assertions.assertEquals(2, ((int) (measurements.get(1).value()))); - Assertions.assertEquals(1, ((int) (measurements.get(2).value()))); - Assertions.assertEquals(0, ((int) (measurements.get(3).value()))); - } -} diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeter.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeter.java index 1ffbe068a..34ef22121 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeter.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeter.java @@ -16,81 +16,65 @@ */ package org.apache.servicecomb.metrics.core.meter.invocation; -import java.util.ArrayList; -import java.util.List; +import java.time.Duration; +import java.util.concurrent.TimeUnit; +import org.apache.commons.lang3.StringUtils; import org.apache.servicecomb.core.event.InvocationFinishEvent; import org.apache.servicecomb.core.invocation.InvocationStageTrace; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; -import org.apache.servicecomb.foundation.metrics.meter.AbstractPeriodMeter; -import org.apache.servicecomb.foundation.metrics.meter.LatencyDistributionMeter; -import org.apache.servicecomb.foundation.metrics.meter.SimpleTimer; -import io.micrometer.core.instrument.Measurement; - - -public abstract class AbstractInvocationMeter extends AbstractPeriodMeter { +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Tags; +import io.micrometer.core.instrument.Timer; +public abstract class AbstractInvocationMeter { //total time - private final SimpleTimer totalTimer; + private final Timer totalTimer; // prepare time - private final SimpleTimer prepareTimer; - - // latency distribution - private final LatencyDistributionMeter latencyDistributionMeter; + private final Timer prepareTimer; protected final MetricsBootstrapConfig metricsBootstrapConfig; - public AbstractInvocationMeter(Id id, MetricsBootstrapConfig metricsBootstrapConfig) { - this.id = id; + public AbstractInvocationMeter(MeterRegistry meterRegistry, String name, Tags tags, + MetricsBootstrapConfig metricsBootstrapConfig) { this.metricsBootstrapConfig = metricsBootstrapConfig; - latencyDistributionMeter = createLatencyDistribution(MeterInvocationConst.TAG_LATENCY_DISTRIBUTION); - totalTimer = createStageTimer(InvocationStageTrace.STAGE_TOTAL); - prepareTimer = createStageTimer(InvocationStageTrace.STAGE_PREPARE); - } - protected LatencyDistributionMeter createLatencyDistribution(String tagValue) { - return new LatencyDistributionMeter(id.withTag(MeterInvocationConst.TAG_TYPE, tagValue), - metricsBootstrapConfig.getLatencyDistribution()); + Timer.Builder totalBuilder = Timer.builder(name) + .tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_TOTAL)); + if (!StringUtils.isEmpty(metricsBootstrapConfig.getLatencyDistribution())) { + totalBuilder.sla(toDuration(metricsBootstrapConfig.getLatencyDistribution())); + } + this.totalTimer = totalBuilder.register(meterRegistry); + this.prepareTimer = Timer.builder(name).tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE + , MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_PREPARE)).register(meterRegistry); } - protected SimpleTimer createStageTimer(String stageValue) { - return createTimer(id.withTag(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE) - .withTag(MeterInvocationConst.TAG_STAGE, stageValue)); - } + protected static Duration[] toDuration(String config) { + config = config.trim() + "," + Long.MAX_VALUE; + String[] array = config.split("\\s*,+\\s*"); + Duration[] result = new Duration[array.length]; - protected SimpleTimer createTimer(String tagKey, String tagValue) { - return createTimer(id.withTag(tagKey, tagValue)); - } + for (int idx = 0; idx < array.length - 1; idx++) { + long msMin = Long.parseLong(array[idx]); + long msMax = Long.parseLong(array[idx + 1]); + if (msMin >= msMax) { + String msg = String.format("invalid latency scope, min=%s, max=%s.", array[idx], array[idx + 1]); + throw new IllegalStateException(msg); + } + + result[idx] = Duration.ofMillis(msMin); + } + result[array.length - 1] = Duration.ofMillis(Long.MAX_VALUE); - protected SimpleTimer createTimer(Id timerId) { - return new SimpleTimer(timerId); + return result; } public void onInvocationFinish(InvocationFinishEvent event) { InvocationStageTrace stageTrace = event.getInvocation().getInvocationStageTrace(); - latencyDistributionMeter.record(stageTrace.calcTotal()); - totalTimer.record(stageTrace.calcTotal()); - prepareTimer.record(stageTrace.calcPrepare()); - } - - @Override - public void calcMeasurements(long msNow, long secondInterval) { - List<Measurement> measurements = new ArrayList<>(3); - calcMeasurements(measurements, msNow, secondInterval); - allMeasurements = measurements; - } - - @Override - public void calcMeasurements(List<Measurement> measurements, long msNow, long secondInterval) { - latencyDistributionMeter.calcMeasurements(measurements, msNow, secondInterval); - totalTimer.calcMeasurements(measurements, msNow, secondInterval); - prepareTimer.calcMeasurements(measurements, msNow, secondInterval); - } - - @Override - public boolean hasExpired() { - return super.hasExpired(); + totalTimer.record(stageTrace.calcTotal(), TimeUnit.NANOSECONDS); + prepareTimer.record(stageTrace.calcPrepare(), TimeUnit.NANOSECONDS); } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java index ce9283e3d..6c696a570 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/AbstractInvocationMeters.java @@ -25,10 +25,6 @@ import org.apache.servicecomb.foundation.common.concurrent.ConcurrentHashMapEx; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; import org.apache.servicecomb.swagger.invocation.Response; -import com.netflix.spectator.api.SpectatorUtils; - -import io.micrometer.core.instrument.Meter.Id; -import io.micrometer.core.instrument.Meter.Type; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Tags; @@ -68,20 +64,16 @@ public abstract class AbstractInvocationMeters { } return metersMap.computeIfAbsent(keyBuilder.toString(), k -> { - Id id = new Id(MeterInvocationConst.INVOCATION_NAME, Tags.empty() + AbstractInvocationMeter meter = createMeter(MeterInvocationConst.INVOCATION_NAME, Tags.empty() .and(MeterInvocationConst.TAG_ROLE, invocationName) .and(MeterInvocationConst.TAG_TRANSPORT, invocation.getRealTransportName()) .and(MeterInvocationConst.TAG_OPERATION, invocation.getMicroserviceQualifiedName()) - .and(MeterInvocationConst.TAG_STATUS, String.valueOf(response.getStatusCode())), - null, null, Type.OTHER); - - AbstractInvocationMeter meter = createMeter(id); - SpectatorUtils.registerMeter(registry, meter); + .and(MeterInvocationConst.TAG_STATUS, String.valueOf(response.getStatusCode()))); return meter; }); } - protected abstract AbstractInvocationMeter createMeter(Id id); + protected abstract AbstractInvocationMeter createMeter(String name, Tags tags); public void onInvocationStart(InvocationStartEvent event) { } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeter.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeter.java index cc575ad3c..d0b4c08f7 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeter.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeter.java @@ -16,34 +16,47 @@ */ package org.apache.servicecomb.metrics.core.meter.invocation; -import java.util.List; +import java.util.concurrent.TimeUnit; import org.apache.servicecomb.core.event.InvocationFinishEvent; import org.apache.servicecomb.core.invocation.InvocationStageTrace; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; -import org.apache.servicecomb.foundation.metrics.meter.SimpleTimer; -import com.netflix.spectator.api.Id; -import com.netflix.spectator.api.Measurement; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Tags; +import io.micrometer.core.instrument.Timer; public class ConsumerInvocationMeter extends AbstractInvocationMeter { - private final SimpleTimer consumerEncodeRequestTimer; + private final Timer consumerEncodeRequestTimer; - private final SimpleTimer consumerDecodeResponseTimer; + private final Timer consumerDecodeResponseTimer; - private final SimpleTimer consumerGetConnectionTimer; + private final Timer consumerGetConnectionTimer; - private final SimpleTimer consumerSendRequestTimer; + private final Timer consumerSendRequestTimer; - private final SimpleTimer consumerWaitResponseTimer; + private final Timer consumerWaitResponseTimer; - public ConsumerInvocationMeter(Id id, MetricsBootstrapConfig metricsBootstrapConfig) { - super(id, metricsBootstrapConfig); - consumerSendRequestTimer = createStageTimer(InvocationStageTrace.STAGE_CONSUMER_SEND); - consumerGetConnectionTimer = createStageTimer(InvocationStageTrace.STAGE_CONSUMER_CONNECTION); - consumerEncodeRequestTimer = createStageTimer(InvocationStageTrace.STAGE_CONSUMER_ENCODE_REQUEST); - consumerDecodeResponseTimer = createStageTimer(InvocationStageTrace.STAGE_CONSUMER_DECODE_RESPONSE); - consumerWaitResponseTimer = createStageTimer(InvocationStageTrace.STAGE_CONSUMER_WAIT); + public ConsumerInvocationMeter(MeterRegistry meterRegistry, String name, Tags tags, + MetricsBootstrapConfig metricsBootstrapConfig) { + super(meterRegistry, name, tags, metricsBootstrapConfig); + consumerSendRequestTimer = Timer.builder(name) + .tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_CONSUMER_SEND)).register(meterRegistry); + consumerGetConnectionTimer = Timer.builder(name) + .tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_CONSUMER_CONNECTION)).register(meterRegistry); + consumerEncodeRequestTimer = Timer.builder(name) + .tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_CONSUMER_ENCODE_REQUEST)) + .register(meterRegistry); + consumerDecodeResponseTimer = Timer.builder(name) + .tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_CONSUMER_DECODE_RESPONSE)) + .register(meterRegistry); + consumerWaitResponseTimer = Timer.builder(name) + .tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_CONSUMER_WAIT)).register(meterRegistry); } @Override @@ -51,21 +64,10 @@ public class ConsumerInvocationMeter extends AbstractInvocationMeter { super.onInvocationFinish(event); InvocationStageTrace invocationStageTrace = event.getInvocation().getInvocationStageTrace(); - consumerEncodeRequestTimer.record(invocationStageTrace.calcConsumerEncodeRequest()); - consumerSendRequestTimer.record(invocationStageTrace.calcConsumerSendRequest()); - consumerGetConnectionTimer.record(invocationStageTrace.calcConnection()); - consumerWaitResponseTimer.record(invocationStageTrace.calcWait()); - consumerDecodeResponseTimer.record(invocationStageTrace.calcConsumerDecodeResponse()); - } - - @Override - public void calcMeasurements(List<Measurement> measurements, long msNow, long secondInterval) { - super.calcMeasurements(measurements, msNow, secondInterval); - - consumerSendRequestTimer.calcMeasurements(measurements, msNow, secondInterval); - consumerGetConnectionTimer.calcMeasurements(measurements, msNow, secondInterval); - consumerEncodeRequestTimer.calcMeasurements(measurements, msNow, secondInterval); - consumerWaitResponseTimer.calcMeasurements(measurements, msNow, secondInterval); - consumerDecodeResponseTimer.calcMeasurements(measurements, msNow, secondInterval); + consumerEncodeRequestTimer.record(invocationStageTrace.calcConsumerEncodeRequest(), TimeUnit.NANOSECONDS); + consumerSendRequestTimer.record(invocationStageTrace.calcConsumerSendRequest(), TimeUnit.NANOSECONDS); + consumerGetConnectionTimer.record(invocationStageTrace.calcConnection(), TimeUnit.NANOSECONDS); + consumerWaitResponseTimer.record(invocationStageTrace.calcWait(), TimeUnit.NANOSECONDS); + consumerDecodeResponseTimer.record(invocationStageTrace.calcConsumerDecodeResponse(), TimeUnit.NANOSECONDS); } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeters.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeters.java index d46faa803..842122e08 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeters.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ConsumerInvocationMeters.java @@ -18,8 +18,8 @@ package org.apache.servicecomb.metrics.core.meter.invocation; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; -import io.micrometer.core.instrument.Meter.Id; import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Tags; public class ConsumerInvocationMeters extends AbstractInvocationMeters { public ConsumerInvocationMeters(MeterRegistry meterRegistry, MetricsBootstrapConfig metricsBootstrapConfig) { @@ -27,7 +27,7 @@ public class ConsumerInvocationMeters extends AbstractInvocationMeters { } @Override - protected AbstractInvocationMeter createMeter(Id id) { - return new ConsumerInvocationMeter(id, this.metricsBootstrapConfig); + protected AbstractInvocationMeter createMeter(String name, Tags tags) { + return new ConsumerInvocationMeter(registry, name, tags, this.metricsBootstrapConfig); } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeter.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeter.java index 89284ecd8..32fe7aa92 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeter.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeter.java @@ -17,28 +17,37 @@ package org.apache.servicecomb.metrics.core.meter.invocation; -import java.util.List; +import java.util.concurrent.TimeUnit; import org.apache.servicecomb.core.event.InvocationFinishEvent; import org.apache.servicecomb.core.invocation.InvocationStageTrace; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; -import org.apache.servicecomb.foundation.metrics.meter.SimpleTimer; -import com.netflix.spectator.api.Id; -import com.netflix.spectator.api.Measurement; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Tags; +import io.micrometer.core.instrument.Timer; public class EdgeInvocationMeter extends ConsumerInvocationMeter { - private final SimpleTimer providerDecodeRequestTimer; - - private final SimpleTimer providerEncodeResponseTimer; - - private final SimpleTimer sendResponseTimer; - - public EdgeInvocationMeter(Id id, MetricsBootstrapConfig metricsBootstrapConfig) { - super(id, metricsBootstrapConfig); - providerDecodeRequestTimer = createStageTimer(InvocationStageTrace.STAGE_PROVIDER_DECODE_REQUEST); - providerEncodeResponseTimer = createStageTimer(InvocationStageTrace.STAGE_PROVIDER_ENCODE_RESPONSE); - sendResponseTimer = createStageTimer(InvocationStageTrace.STAGE_PROVIDER_SEND); + private final Timer providerDecodeRequestTimer; + + private final Timer providerEncodeResponseTimer; + + private final Timer sendResponseTimer; + + public EdgeInvocationMeter(MeterRegistry meterRegistry, String name, Tags tags, + MetricsBootstrapConfig metricsBootstrapConfig) { + super(meterRegistry, name, tags, metricsBootstrapConfig); + providerDecodeRequestTimer = Timer.builder(name) + .tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_PROVIDER_DECODE_REQUEST)) + .register(meterRegistry); + providerEncodeResponseTimer = Timer.builder(name) + .tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_PROVIDER_ENCODE_RESPONSE)) + .register(meterRegistry); + sendResponseTimer = Timer.builder(name).tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_PROVIDER_SEND)) + .register(meterRegistry); } @Override @@ -46,17 +55,8 @@ public class EdgeInvocationMeter extends ConsumerInvocationMeter { super.onInvocationFinish(event); InvocationStageTrace invocationStageTrace = event.getInvocation().getInvocationStageTrace(); - providerDecodeRequestTimer.record(invocationStageTrace.calcProviderDecodeRequest()); - providerEncodeResponseTimer.record(invocationStageTrace.calcProviderEncodeResponse()); - sendResponseTimer.record(invocationStageTrace.calcProviderSendResponse()); - } - - @Override - public void calcMeasurements(List<Measurement> measurements, long msNow, long secondInterval) { - super.calcMeasurements(measurements, msNow, secondInterval); - - providerDecodeRequestTimer.calcMeasurements(measurements, msNow, secondInterval); - providerEncodeResponseTimer.calcMeasurements(measurements, msNow, secondInterval); - sendResponseTimer.calcMeasurements(measurements, msNow, secondInterval); + providerDecodeRequestTimer.record(invocationStageTrace.calcProviderDecodeRequest(), TimeUnit.NANOSECONDS); + providerEncodeResponseTimer.record(invocationStageTrace.calcProviderEncodeResponse(), TimeUnit.NANOSECONDS); + sendResponseTimer.record(invocationStageTrace.calcProviderSendResponse(), TimeUnit.NANOSECONDS); } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeters.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeters.java index 872a811b7..ecdbd3670 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeters.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/EdgeInvocationMeters.java @@ -19,8 +19,8 @@ package org.apache.servicecomb.metrics.core.meter.invocation; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; -import io.micrometer.core.instrument.Meter.Id; import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Tags; public class EdgeInvocationMeters extends ConsumerInvocationMeters { public EdgeInvocationMeters(MeterRegistry meterRegistry, MetricsBootstrapConfig metricsBootstrapConfig) { @@ -28,7 +28,7 @@ public class EdgeInvocationMeters extends ConsumerInvocationMeters { } @Override - protected AbstractInvocationMeter createMeter(Id id) { - return new EdgeInvocationMeter(id, metricsBootstrapConfig); + protected AbstractInvocationMeter createMeter(String name, Tags tags) { + return new EdgeInvocationMeter(registry, name, tags, metricsBootstrapConfig); } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeter.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeter.java index f5727613d..2ed55e5e0 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeter.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeter.java @@ -16,35 +16,49 @@ */ package org.apache.servicecomb.metrics.core.meter.invocation; -import java.util.List; +import java.util.concurrent.TimeUnit; import org.apache.servicecomb.core.event.InvocationFinishEvent; import org.apache.servicecomb.core.invocation.InvocationStageTrace; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; -import org.apache.servicecomb.foundation.metrics.meter.SimpleTimer; -import com.netflix.spectator.api.Id; -import com.netflix.spectator.api.Measurement; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Tags; +import io.micrometer.core.instrument.Timer; public class ProducerInvocationMeter extends AbstractInvocationMeter { - private final SimpleTimer executorQueueTimer; + private final Timer executorQueueTimer; - private final SimpleTimer executionTimer; + private final Timer executionTimer; - private final SimpleTimer providerDecodeRequestTimer; + private final Timer providerDecodeRequestTimer; - private final SimpleTimer providerEncodeResponseTimer; + private final Timer providerEncodeResponseTimer; - private final SimpleTimer sendResponseTimer; + private final Timer sendResponseTimer; - public ProducerInvocationMeter(Id id, MetricsBootstrapConfig metricsBootstrapConfig) { - super(id, metricsBootstrapConfig); - - executorQueueTimer = createStageTimer(InvocationStageTrace.STAGE_PROVIDER_QUEUE); - executionTimer = createStageTimer(InvocationStageTrace.STAGE_PROVIDER_BUSINESS); - providerDecodeRequestTimer = createStageTimer(InvocationStageTrace.STAGE_PROVIDER_DECODE_REQUEST); - providerEncodeResponseTimer = createStageTimer(InvocationStageTrace.STAGE_PROVIDER_ENCODE_RESPONSE); - sendResponseTimer = createStageTimer(InvocationStageTrace.STAGE_PROVIDER_SEND); + public ProducerInvocationMeter(MeterRegistry meterRegistry, String name, Tags tags, + MetricsBootstrapConfig metricsBootstrapConfig) { + super(meterRegistry, name, tags, metricsBootstrapConfig); + executorQueueTimer = Timer.builder(name) + .tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_PROVIDER_QUEUE)) + .register(meterRegistry); + executionTimer = Timer.builder(name).tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_PROVIDER_BUSINESS)) + .register(meterRegistry); + providerDecodeRequestTimer = Timer.builder(name) + .tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_PROVIDER_DECODE_REQUEST)) + .register(meterRegistry); + providerEncodeResponseTimer = Timer.builder(name) + .tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_PROVIDER_ENCODE_RESPONSE)) + .register(meterRegistry); + sendResponseTimer = Timer.builder(name) + .tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE, + MeterInvocationConst.TAG_STAGE, InvocationStageTrace.STAGE_PROVIDER_SEND)) + .register(meterRegistry); } @Override @@ -52,21 +66,10 @@ public class ProducerInvocationMeter extends AbstractInvocationMeter { super.onInvocationFinish(event); InvocationStageTrace invocationStageTrace = event.getInvocation().getInvocationStageTrace(); - executorQueueTimer.record(invocationStageTrace.calcQueue()); - executionTimer.record(invocationStageTrace.calcBusinessExecute()); - providerDecodeRequestTimer.record(invocationStageTrace.calcProviderDecodeRequest()); - providerEncodeResponseTimer.record(invocationStageTrace.calcProviderEncodeResponse()); - sendResponseTimer.record(invocationStageTrace.calcProviderSendResponse()); - } - - @Override - public void calcMeasurements(List<Measurement> measurements, long msNow, long secondInterval) { - super.calcMeasurements(measurements, msNow, secondInterval); - - executorQueueTimer.calcMeasurements(measurements, msNow, secondInterval); - executionTimer.calcMeasurements(measurements, msNow, secondInterval); - providerDecodeRequestTimer.calcMeasurements(measurements, msNow, secondInterval); - providerEncodeResponseTimer.calcMeasurements(measurements, msNow, secondInterval); - sendResponseTimer.calcMeasurements(measurements, msNow, secondInterval); + executorQueueTimer.record(invocationStageTrace.calcQueue(), TimeUnit.NANOSECONDS); + executionTimer.record(invocationStageTrace.calcBusinessExecute(), TimeUnit.NANOSECONDS); + providerDecodeRequestTimer.record(invocationStageTrace.calcProviderDecodeRequest(), TimeUnit.NANOSECONDS); + providerEncodeResponseTimer.record(invocationStageTrace.calcProviderEncodeResponse(), TimeUnit.NANOSECONDS); + sendResponseTimer.record(invocationStageTrace.calcProviderSendResponse(), TimeUnit.NANOSECONDS); } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeters.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeters.java index 60e86493c..bf4f84104 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeters.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/ProducerInvocationMeters.java @@ -18,8 +18,8 @@ package org.apache.servicecomb.metrics.core.meter.invocation; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; -import io.micrometer.core.instrument.Meter.Id; import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Tags; public class ProducerInvocationMeters extends AbstractInvocationMeters { public ProducerInvocationMeters(MeterRegistry meterRegistry, MetricsBootstrapConfig metricsBootstrapConfig) { @@ -27,7 +27,7 @@ public class ProducerInvocationMeters extends AbstractInvocationMeters { } @Override - protected AbstractInvocationMeter createMeter(Id id) { - return new ProducerInvocationMeter(id, metricsBootstrapConfig); + protected AbstractInvocationMeter createMeter(String name, Tags tags) { + return new ProducerInvocationMeter(registry, name, tags, metricsBootstrapConfig); } }
