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 26b990fd5ce9b0a91e65379e892739bdbf7cb87d Author: liubao <[email protected]> AuthorDate: Fri Dec 1 09:13:04 2023 +0800 [SCB-2838]using micrometer to replace spectator part6: thread pool and endpoint improvement --- .../metrics/publish/MeasurementTree.java | 31 +- .../publish/spectator/TestMeasurementTree.java | 4 +- .../monitor/MetricsMonitorDataProvider.java | 26 +- .../metrics/core/MetricsCoreConfiguration.java | 2 + .../metrics/core/ThreadPoolMetersInitializer.java | 54 +-- .../ThreadPoolMonitorPublishModelFactory.java | 52 ++- .../meter/invocation/AbstractInvocationMeter.java | 3 +- .../meter/invocation/MeterInvocationConst.java | 6 - .../metrics/core/meter/pool/ThreadPoolMeter.java | 102 ++++++ .../metrics/core/meter/vertx/EndpointMeter.java | 2 +- .../metrics/core/publish/DefaultLogPublisher.java | 55 ++- .../metrics/core/publish/PublishModelFactory.java | 12 +- .../metrics/core/publish/PublishUtils.java | 13 +- .../core/publish/model/invocation/PerfInfo.java | 16 +- .../core/TestInvocationMetersInitializer.java | 100 +++--- .../core/TestThreadPoolMetersInitializer.java | 30 +- .../core/publish/TestDefaultLogPublisher.java | 17 +- .../publish/TestInvocationPublishModelFactory.java | 372 ++++++++++----------- .../metrics/core/publish/TestPublishUtils.java | 27 +- .../publish/TestThreadPoolPublishModelFactory.java | 7 +- .../model/invocation/TestOperationPerf.java | 12 +- .../model/invocation/TestOperationPerfGroup.java | 12 +- .../publish/model/invocation/TestPerfInfo.java | 16 +- .../core/publish/model/invocation/Utils.java | 3 +- 24 files changed, 521 insertions(+), 453 deletions(-) diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/MeasurementTree.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/MeasurementTree.java index 440900e4f..88e6eda69 100644 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/MeasurementTree.java +++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/publish/MeasurementTree.java @@ -17,8 +17,10 @@ package org.apache.servicecomb.foundation.metrics.publish; import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; +import java.util.concurrent.TimeUnit; import io.micrometer.core.instrument.Measurement; import io.micrometer.core.instrument.Meter; @@ -46,28 +48,35 @@ public class MeasurementTree extends MeasurementNode { // only id name exists in groupConfig will accept, others will be ignored public void from(Iterator<Meter> meters, MeasurementGroupConfig groupConfig) { meters.forEachRemaining(meter -> { - Iterable<Measurement> measurements = meter.measure(); - from(meter.getId(), measurements, groupConfig); - // This code snip is not very good design. But timer is quite special. - if (meter instanceof Timer) { - HistogramSnapshot snapshot = ((Timer) meter).takeSnapshot(); + if (meter instanceof Timer timer) { + HistogramSnapshot snapshot = timer.takeSnapshot(); + List<Measurement> summary = Arrays.asList(new Measurement(snapshot::count, Statistic.COUNT), + new Measurement(() -> snapshot.total(TimeUnit.MILLISECONDS), Statistic.TOTAL_TIME), + new Measurement(() -> snapshot.max(TimeUnit.MILLISECONDS), Statistic.MAX)); + from(meter.getId(), summary, groupConfig); + CountAtBucket[] countAtBuckets = snapshot.histogramCounts(); if (countAtBuckets.length > 2) { - List<Measurement> latency = new ArrayList<>(countAtBuckets.length); + List<Measurement> distributions = new ArrayList<>(countAtBuckets.length); for (int i = 0; i < countAtBuckets.length; i++) { final int index = i; if (index == 0) { - latency.add(new Measurement(() -> countAtBuckets[index].count(), - Statistic.VALUE)); + distributions.add(new Measurement(() -> countAtBuckets[index].count(), + Statistic.COUNT)); continue; } - latency.add(new Measurement(() -> countAtBuckets[index].count() - countAtBuckets[index - 1].count(), - Statistic.VALUE)); + distributions.add(new Measurement(() -> countAtBuckets[index].count() - countAtBuckets[index - 1].count(), + Statistic.COUNT)); } - from(meter.getId().withTag(Tag.of(TAG_TYPE, TAG_LATENCY_DISTRIBUTION)), latency, groupConfig); + + from(meter.getId().withTag(Tag.of(TAG_TYPE, TAG_LATENCY_DISTRIBUTION)), distributions, groupConfig); } + return; } + + Iterable<Measurement> measurements = meter.measure(); + from(meter.getId(), measurements, groupConfig); }); } diff --git a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/publish/spectator/TestMeasurementTree.java b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/publish/spectator/TestMeasurementTree.java index d21354be5..234147a1f 100644 --- a/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/publish/spectator/TestMeasurementTree.java +++ b/foundations/foundation-metrics/src/test/java/org/apache/servicecomb/foundation/metrics/publish/spectator/TestMeasurementTree.java @@ -54,8 +54,8 @@ public class TestMeasurementTree { @Test public void from() { - timer.record(10, TimeUnit.SECONDS); - timer.record(2, TimeUnit.SECONDS); + timer.record(10, TimeUnit.MILLISECONDS); + timer.record(2, TimeUnit.MILLISECONDS); MeasurementGroupConfig config = new MeasurementGroupConfig("id", "g1", "g2"); tree.from(registry.getMeters().iterator(), config); diff --git a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProvider.java b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProvider.java index 4829fb22a..ed54eef34 100644 --- a/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProvider.java +++ b/huawei-cloud/dashboard/src/main/java/org/apache/servicecomb/huaweicloud/dashboard/monitor/MetricsMonitorDataProvider.java @@ -140,16 +140,16 @@ public class MetricsMonitorDataProvider implements MonitorDataProvider { }); // dashboard calculates the latest 10 seconds, different with metrics cycle. interfaceInfo.setTotal( - doubleToInt(interfaceInfo.getTotal() + 10 * stageTotal.getTps())); + doubleToInt(interfaceInfo.getTotal() + stageTotal.getTotalRequests())); if (perfGroup.getStatus().matches(CODE_SUCCESS)) { - interfaceInfo.setQps(stageTotal.getTps()); + interfaceInfo.setQps(stageTotal.getTotalRequests() / 10); interfaceInfo.setLatency(doubleToInt(stageTotal.calcMsLatency())); } else { interfaceInfo.setFailure( - doubleToInt(interfaceInfo.getTotal() + stageTotal.getMsTotalTime() * stageTotal.getTps())); + doubleToInt(interfaceInfo.getTotal() + stageTotal.getTotalRequests())); if (perfGroup.getStatus().equals(CODE_TIMEOUT)) { interfaceInfo.setCountTimeout( - doubleToInt(interfaceInfo.getCountTimeout() + stageTotal.getMsTotalTime() * stageTotal.getTps())); + doubleToInt(interfaceInfo.getCountTimeout() + stageTotal.getTotalRequests())); } } } @@ -176,16 +176,17 @@ public class MetricsMonitorDataProvider implements MonitorDataProvider { }); // dashboard calculates the latest 10 seconds, different with metrics cycle. interfaceInfo.setTotal( - doubleToInt(interfaceInfo.getTotal() + 10 * stageTotal.getTps())); + doubleToInt(interfaceInfo.getTotal() + stageTotal.getTotalRequests())); if (perfGroup.getStatus().matches(CODE_SUCCESS)) { - interfaceInfo.setQps(stageTotal.getTps()); + interfaceInfo.setQps(stageTotal.getTotalRequests() / 10); interfaceInfo.setLatency(doubleToInt(stageTotal.calcMsLatency())); } else { interfaceInfo.setFailure( - doubleToInt(interfaceInfo.getTotal() + stageTotal.getMsTotalTime() * stageTotal.getTps())); + doubleToInt(interfaceInfo.getTotal() + stageTotal.getTotalRequests())); if (perfGroup.getStatus().equals(CODE_TIMEOUT)) { interfaceInfo.setCountTimeout( - doubleToInt(interfaceInfo.getCountTimeout() + stageTotal.getMsTotalTime() * stageTotal.getTps())); + doubleToInt( + interfaceInfo.getCountTimeout() + stageTotal.getTotalRequests())); } } } @@ -212,16 +213,17 @@ public class MetricsMonitorDataProvider implements MonitorDataProvider { }); // dashboard calculates the latest 10 seconds, different with metrics cycle. interfaceInfo.setTotal( - doubleToInt(interfaceInfo.getTotal() + 10 * stageTotal.getTps())); + doubleToInt(interfaceInfo.getTotal() + stageTotal.getTotalRequests())); if (perfGroup.getStatus().matches(CODE_SUCCESS)) { - interfaceInfo.setQps(stageTotal.getTps()); + interfaceInfo.setQps(stageTotal.getTotalRequests() / 10); interfaceInfo.setLatency(doubleToInt(stageTotal.calcMsLatency())); } else { interfaceInfo.setFailure( - doubleToInt(interfaceInfo.getTotal() + stageTotal.getMsTotalTime() * stageTotal.getTps())); + doubleToInt(interfaceInfo.getTotal() + stageTotal.getTotalRequests())); if (perfGroup.getStatus().equals(CODE_TIMEOUT)) { interfaceInfo.setCountTimeout( - doubleToInt(interfaceInfo.getCountTimeout() + stageTotal.getMsTotalTime() * stageTotal.getTps())); + doubleToInt( + interfaceInfo.getCountTimeout() + stageTotal.getTotalRequests())); } } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsCoreConfiguration.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsCoreConfiguration.java index f0e05ae00..661fc7a1d 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsCoreConfiguration.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/MetricsCoreConfiguration.java @@ -23,6 +23,7 @@ import org.apache.servicecomb.foundation.metrics.MetricsBootstrap; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; import org.apache.servicecomb.metrics.core.publish.DefaultLogPublisher; import org.apache.servicecomb.metrics.core.publish.SlowInvocationLogger; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; @@ -40,6 +41,7 @@ public class MetricsCoreConfiguration { } @Bean + @ConditionalOnMissingBean public MeterRegistry meterRegistry(MetricsBootstrapConfig config) { return new SimpleMeterRegistry(s -> { if ("simple.step".equals(s)) { diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/ThreadPoolMetersInitializer.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/ThreadPoolMetersInitializer.java index a2a307b4a..9ada12258 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/ThreadPoolMetersInitializer.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/ThreadPoolMetersInitializer.java @@ -16,6 +16,7 @@ */ package org.apache.servicecomb.metrics.core; +import java.util.HashMap; import java.util.IdentityHashMap; import java.util.Map; import java.util.Map.Entry; @@ -26,37 +27,21 @@ import org.apache.servicecomb.core.SCBEngine; import org.apache.servicecomb.core.definition.MicroserviceMeta; import org.apache.servicecomb.core.definition.OperationMeta; import org.apache.servicecomb.core.executor.GroupExecutor; -import org.apache.servicecomb.core.executor.ThreadPoolExecutorEx; import org.apache.servicecomb.foundation.common.utils.BeanUtils; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; import org.apache.servicecomb.foundation.metrics.MetricsInitializer; +import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter; +import org.apache.servicecomb.metrics.core.meter.pool.ThreadPoolMeter; import com.google.common.eventbus.EventBus; -import io.micrometer.core.instrument.Gauge; import io.micrometer.core.instrument.MeterRegistry; -public class ThreadPoolMetersInitializer implements MetricsInitializer { - public static final String ID = "id"; - - public static final String REJECTED_COUNT = "threadpool.rejectedCount"; - - public static final String TASK_COUNT = "threadpool.taskCount"; - - public static final String COMPLETED_TASK_COUNT = "threadpool.completedTaskCount"; - - public static final String CURRENT_THREADS_BUSY = "threadpool.currentThreadsBusy"; - - public static final String MAX_THREADS = "threadpool.maxThreads"; - - public static final String POOL_SIZE = "threadpool.poolSize"; - - public static final String CORE_POOL_SIZE = "threadpool.corePoolSize"; - - public static final String QUEUE_SIZE = "threadpool.queueSize"; - +public class ThreadPoolMetersInitializer implements MetricsInitializer, PeriodMeter { private MeterRegistry meterRegistry; + private Map<String, ThreadPoolMeter> threadPoolMeters = new HashMap<>(); + @Override public void init(MeterRegistry meterRegistry, EventBus eventBus, MetricsBootstrapConfig config) { this.meterRegistry = meterRegistry; @@ -106,25 +91,12 @@ public class ThreadPoolMetersInitializer implements MetricsInitializer { return; } - Gauge.builder(TASK_COUNT, threadPoolExecutor::getTaskCount).tags(ID, threadPoolName) - .register(meterRegistry); - Gauge.builder(COMPLETED_TASK_COUNT, threadPoolExecutor::getCompletedTaskCount).tags(ID, threadPoolName) - .register(meterRegistry); - Gauge.builder(CURRENT_THREADS_BUSY, threadPoolExecutor::getActiveCount).tags(ID, threadPoolName) - .register(meterRegistry); - Gauge.builder(MAX_THREADS, threadPoolExecutor::getMaximumPoolSize).tags(ID, threadPoolName) - .register(meterRegistry); - Gauge.builder(POOL_SIZE, threadPoolExecutor::getPoolSize).tags(ID, threadPoolName) - .register(meterRegistry); - Gauge.builder(CORE_POOL_SIZE, threadPoolExecutor::getCorePoolSize).tags(ID, threadPoolName) - .register(meterRegistry); - Gauge.builder(QUEUE_SIZE, () -> threadPoolExecutor.getQueue().size()).tags(ID, threadPoolName) - .register(meterRegistry); - - if (executor instanceof ThreadPoolExecutorEx) { - Gauge.builder(REJECTED_COUNT, () -> ((ThreadPoolExecutorEx) (executor)).getRejectedCount()) - .tags(ID, threadPoolName) - .register(meterRegistry); - } + threadPoolMeters.computeIfAbsent(threadPoolName, + (key) -> new ThreadPoolMeter(meterRegistry, threadPoolName, threadPoolExecutor)); + } + + @Override + public void poll(long msNow, long secondInterval) { + threadPoolMeters.forEach((key, value) -> value.poll(msNow, secondInterval)); } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ThreadPoolMonitorPublishModelFactory.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ThreadPoolMonitorPublishModelFactory.java index 003989087..d0474142c 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ThreadPoolMonitorPublishModelFactory.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/ThreadPoolMonitorPublishModelFactory.java @@ -16,11 +16,12 @@ */ package org.apache.servicecomb.metrics.core.meter; +import java.util.HashMap; import java.util.Map; import org.apache.servicecomb.foundation.metrics.publish.MeasurementNode; import org.apache.servicecomb.foundation.metrics.publish.MeasurementTree; -import org.apache.servicecomb.metrics.core.ThreadPoolMetersInitializer; +import org.apache.servicecomb.metrics.core.meter.pool.ThreadPoolMeter; import org.apache.servicecomb.metrics.core.publish.model.ThreadPoolPublishModel; import io.micrometer.core.instrument.Measurement; @@ -30,54 +31,41 @@ public class ThreadPoolMonitorPublishModelFactory { void set(ThreadPoolPublishModel model, Measurement measurement); } - private final MeasurementTree tree; - - private final Map<String, ThreadPoolPublishModel> threadPools; - - public ThreadPoolMonitorPublishModelFactory(MeasurementTree tree, - Map<String, ThreadPoolPublishModel> threadPools) { - this.tree = tree; - this.threadPools = threadPools; - } - - public static void create(MeasurementTree tree, - Map<String, ThreadPoolPublishModel> threadPools) { - new ThreadPoolMonitorPublishModelFactory(tree, threadPools).create(); - } - - public void create() { - readMeasurement(ThreadPoolMetersInitializer.TASK_COUNT, + public static Map<String, ThreadPoolPublishModel> create(MeasurementTree tree) { + Map<String, ThreadPoolPublishModel> result = new HashMap<>(8); + readMeasurement(result, tree, ThreadPoolMeter.TASK_COUNT, (model, measurement) -> model.setAvgTaskCount(measurement.getValue())); - readMeasurement(ThreadPoolMetersInitializer.COMPLETED_TASK_COUNT, + readMeasurement(result, tree, ThreadPoolMeter.COMPLETED_TASK_COUNT, (model, measurement) -> model.setAvgCompletedTaskCount(measurement.getValue())); - readMeasurement(ThreadPoolMetersInitializer.CURRENT_THREADS_BUSY, + readMeasurement(result, tree, ThreadPoolMeter.CURRENT_THREADS_BUSY, (model, measurement) -> model.setCurrentThreadsBusy((int) measurement.getValue())); - readMeasurement(ThreadPoolMetersInitializer.MAX_THREADS, + readMeasurement(result, tree, ThreadPoolMeter.MAX_THREADS, (model, measurement) -> model.setMaxThreads((int) measurement.getValue())); - readMeasurement(ThreadPoolMetersInitializer.POOL_SIZE, + readMeasurement(result, tree, ThreadPoolMeter.POOL_SIZE, (model, measurement) -> model.setPoolSize((int) measurement.getValue())); - readMeasurement(ThreadPoolMetersInitializer.CORE_POOL_SIZE, + readMeasurement(result, tree, ThreadPoolMeter.CORE_POOL_SIZE, (model, measurement) -> model.setCorePoolSize((int) measurement.getValue())); - readMeasurement(ThreadPoolMetersInitializer.QUEUE_SIZE, + readMeasurement(result, tree, ThreadPoolMeter.QUEUE_SIZE, (model, measurement) -> model.setQueueSize((int) measurement.getValue())); - readMeasurement(ThreadPoolMetersInitializer.REJECTED_COUNT, + readMeasurement(result, tree, ThreadPoolMeter.REJECTED_COUNT, (model, measurement) -> model.setRejected(measurement.getValue())); + return result; } - protected void readMeasurement(String name, Setter setter) { - MeasurementNode node = tree.findChild(name); + protected static void readMeasurement(Map<String, ThreadPoolPublishModel> threadPools, MeasurementTree tree, + String name, Setter setter) { + MeasurementNode node = tree.findChild(ThreadPoolMeter.THREAD_POOL_METER); if (node == null) { return; } - for (Measurement measurement : node.getMeasurements()) { - String threadPoolName = node.getId().getTag(ThreadPoolMetersInitializer.ID); - if (threadPoolName == null) { + for (String threadPoolName : node.getChildren().keySet()) { + MeasurementNode measure = node.findChild(threadPoolName, name); + if (measure == null) { continue; } - ThreadPoolPublishModel model = threadPools.computeIfAbsent(threadPoolName, tpn -> new ThreadPoolPublishModel()); - setter.set(model, measurement); + setter.set(model, measure.getMeasurements().get(0)); } } } 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 bf7bb0429..1ced47feb 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 @@ -46,7 +46,8 @@ public abstract class AbstractInvocationMeter { .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())); + totalBuilder.sla(toDuration(metricsBootstrapConfig.getLatencyDistribution())) + .distributionStatisticExpiry(Duration.ofMillis(metricsBootstrapConfig.getMsPollInterval())); } this.totalTimer = totalBuilder.register(meterRegistry); this.prepareTimer = Timer.builder(name).tags(tags.and(MeterInvocationConst.TAG_TYPE, MeterInvocationConst.TAG_STAGE diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/MeterInvocationConst.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/MeterInvocationConst.java index fd5d53f9e..fac87d55e 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/MeterInvocationConst.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/invocation/MeterInvocationConst.java @@ -16,8 +16,6 @@ */ package org.apache.servicecomb.metrics.core.meter.invocation; -import io.micrometer.core.instrument.Statistic; - public interface MeterInvocationConst { String INVOCATION_NAME = "servicecomb.invocation"; @@ -32,11 +30,7 @@ public interface MeterInvocationConst { String TAG_STAGE = "stage"; - String TAG_LATENCY_DISTRIBUTION = "latencyDistribution"; - String TAG_STATUS = "status"; - String TAG_STATISTIC = Statistic.COUNT.name(); - String EDGE_INVOCATION_NAME = "EDGE"; } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/pool/ThreadPoolMeter.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/pool/ThreadPoolMeter.java new file mode 100644 index 000000000..1267bc53e --- /dev/null +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/pool/ThreadPoolMeter.java @@ -0,0 +1,102 @@ +/* + * 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.metrics.core.meter.pool; + +import java.util.concurrent.ThreadPoolExecutor; + +import org.apache.servicecomb.core.executor.ThreadPoolExecutorEx; +import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter; + +import io.micrometer.core.instrument.Gauge; +import io.micrometer.core.instrument.MeterRegistry; + +public class ThreadPoolMeter implements PeriodMeter { + public static final String THREAD_POOL_METER = "servicecomb.threadpool"; + + public static final String ID = "id"; + + public static final String STAGE = "stage"; + + public static final String REJECTED_COUNT = "rejectedCount"; + + public static final String TASK_COUNT = "taskCount"; + + public static final String COMPLETED_TASK_COUNT = "completedTaskCount"; + + public static final String CURRENT_THREADS_BUSY = "currentThreadsBusy"; + + public static final String MAX_THREADS = "maxThreads"; + + public static final String POOL_SIZE = "poolSize"; + + public static final String CORE_POOL_SIZE = "corePoolSize"; + + public static final String QUEUE_SIZE = "queueSize"; + + private final ThreadPoolExecutor threadPoolExecutor; + + private long currentTask; + + private long lastTask; + + private long currentCompletedTask; + + private long lastCompletedTask; + + public ThreadPoolMeter(MeterRegistry meterRegistry, String threadPoolName, ThreadPoolExecutor threadPoolExecutor) { + this.threadPoolExecutor = threadPoolExecutor; + + Gauge.builder(THREAD_POOL_METER, () -> currentTask) + .tags(ID, threadPoolName, STAGE, TASK_COUNT) + .register(meterRegistry); + Gauge.builder(THREAD_POOL_METER, () -> currentCompletedTask) + .tags(ID, threadPoolName, STAGE, COMPLETED_TASK_COUNT) + .register(meterRegistry); + Gauge.builder(THREAD_POOL_METER, threadPoolExecutor::getActiveCount) + .tags(ID, threadPoolName, STAGE, CURRENT_THREADS_BUSY) + .register(meterRegistry); + Gauge.builder(THREAD_POOL_METER, threadPoolExecutor::getMaximumPoolSize) + .tags(ID, threadPoolName, STAGE, MAX_THREADS) + .register(meterRegistry); + Gauge.builder(THREAD_POOL_METER, threadPoolExecutor::getPoolSize) + .tags(ID, threadPoolName, STAGE, POOL_SIZE) + .register(meterRegistry); + Gauge.builder(THREAD_POOL_METER, threadPoolExecutor::getCorePoolSize) + .tags(ID, threadPoolName, STAGE, CORE_POOL_SIZE) + .register(meterRegistry); + Gauge.builder(THREAD_POOL_METER, () -> threadPoolExecutor.getQueue().size()) + .tags(ID, threadPoolName, STAGE, QUEUE_SIZE) + .register(meterRegistry); + + if (threadPoolExecutor instanceof ThreadPoolExecutorEx) { + Gauge.builder(THREAD_POOL_METER, () -> ((ThreadPoolExecutorEx) (threadPoolExecutor)).getRejectedCount()) + .tags(ID, threadPoolName, STAGE, REJECTED_COUNT) + .register(meterRegistry); + } + } + + @Override + public void poll(long msNow, long secondInterval) { + long temp = threadPoolExecutor.getTaskCount(); + currentTask = temp - lastTask; + lastTask = temp; + + temp = threadPoolExecutor.getCompletedTaskCount(); + currentCompletedTask = temp - lastCompletedTask; + lastCompletedTask = temp; + } +} 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 f00cf22e0..b758dbebf 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 @@ -104,7 +104,7 @@ public class EndpointMeter implements PeriodMeter { disconnectCount = Gauge.builder(name, () -> currentDisconnectCount) .tags(tags.and(Tag.of(STATISTIC, DISCONNECT_COUNT))) .register(meterRegistry); - connections = Gauge.builder(name, () -> currentConnectCount - currentDisconnectCount) + connections = Gauge.builder(name, () -> this.metric.getConnectCount() - this.metric.getDisconnectCount()) .tags(tags.and(Tag.of(STATISTIC, CONNECTIONS))) .register(meterRegistry); bytesRead = Gauge.builder(name, () -> currentBytesRead) 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 ba0679e8d..feaee2e22 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 @@ -62,7 +62,7 @@ public class DefaultLogPublisher implements MetricsInitializer { // for a client, maybe will connect to too many endpoints, so default not print detail, just print summary public static final String ENDPOINTS_CLIENT_DETAIL_ENABLED = "servicecomb.metrics.publisher.defaultLog.endpoints.client.detail.enabled"; - private static final String FIRST_LINE_SIMPLE_FORMAT = " %-11s %-8.1f %-18s %s%s\n"; + private static final String FIRST_LINE_SIMPLE_FORMAT = " %-11s\n"; private static final String SIMPLE_FORMAT = " %-8.1f %-18s %s%s\n"; @@ -243,7 +243,7 @@ public class DefaultLogPublisher implements MetricsInitializer { sb.append("" + "edge:\n" + " simple:\n" - + " status tps latency ") + + " status requests latency ") .append(latencyDistributionHeader) .append("operation\n"); StringBuilder detailsBuilder = new StringBuilder(); @@ -267,7 +267,7 @@ public class DefaultLogPublisher implements MetricsInitializer { sb.append("" + "consumer:\n" + " simple:\n" - + " status tps latency ") + + " status requests latency ") .append(latencyDistributionHeader) .append("operation\n"); StringBuilder detailsBuilder = new StringBuilder(); @@ -291,7 +291,7 @@ public class DefaultLogPublisher implements MetricsInitializer { sb.append("" + "producer:\n" + " simple:\n" - + " status tps latency ") + + " status requests latency ") .append(latencyDistributionHeader) .append("operation\n"); // use detailsBuilder, we can traverse the map only once @@ -311,32 +311,24 @@ public class DefaultLogPublisher implements MetricsInitializer { private StringBuilder printSamplePerf(OperationPerfGroup perfGroup) { StringBuilder sb = new StringBuilder(); - boolean firstLine = true; + String status = perfGroup.getTransport() + "." + perfGroup.getStatus() + ":"; + sb.append(String.format(FIRST_LINE_SIMPLE_FORMAT, status)); + for (int i = 0; i < perfGroup.getOperationPerfs().size(); i++) { OperationPerf operationPerf = perfGroup.getOperationPerfs().get(i); - PerfInfo stageTotal = operationPerf.findStage(InvocationStageTrace.STAGE_TOTAL); - if (Double.compare(0D, stageTotal.getTps()) == 0) { + if (isIngoreEmptyPerf(operationPerf)) { continue; } - if (firstLine) { - firstLine = false; - String status = perfGroup.getTransport() + "." + perfGroup.getStatus(); - sb.append(String.format(FIRST_LINE_SIMPLE_FORMAT, status, - stageTotal.getTps(), - getDetailsFromPerf(stageTotal), - formatLatencyDistribution(operationPerf), - operationPerf.getOperation())); - } else { - sb.append(String.format(SIMPLE_FORMAT, stageTotal.getTps(), - getDetailsFromPerf(stageTotal), - formatLatencyDistribution(operationPerf), - operationPerf.getOperation())); - } + PerfInfo stageTotal = operationPerf.findStage(InvocationStageTrace.STAGE_TOTAL); + sb.append(String.format(SIMPLE_FORMAT, stageTotal.getTotalRequests(), + getDetailsFromPerf(stageTotal), + formatLatencyDistribution(operationPerf), + operationPerf.getOperation())); } OperationPerf summaryOperation = perfGroup.getSummary(); PerfInfo stageSummaryTotal = summaryOperation.findStage(InvocationStageTrace.STAGE_TOTAL); //print summary - sb.append(String.format(SIMPLE_FORMAT, stageSummaryTotal.getTps(), + sb.append(String.format(SIMPLE_FORMAT, stageSummaryTotal.getTotalRequests(), getDetailsFromPerf(stageSummaryTotal), formatLatencyDistribution(summaryOperation), "(summary)")); @@ -357,8 +349,7 @@ public class DefaultLogPublisher implements MetricsInitializer { .append(":\n"); PerfInfo prepare, queue, providerDecode, providerEncode, execute, sendResp; for (OperationPerf operationPerf : perfGroup.getOperationPerfs()) { - PerfInfo stageTotal = operationPerf.findStage(InvocationStageTrace.STAGE_TOTAL); - if (Double.compare(0D, stageTotal.getTps()) == 0) { + if (isIngoreEmptyPerf(operationPerf)) { continue; } prepare = operationPerf.findStage(InvocationStageTrace.STAGE_PREPARE); @@ -396,8 +387,7 @@ public class DefaultLogPublisher implements MetricsInitializer { PerfInfo prepare, encodeRequest, decodeResponse, sendReq, getConnect, waitResp; for (OperationPerf operationPerf : perfGroup.getOperationPerfs()) { - PerfInfo stageTotal = operationPerf.findStage(InvocationStageTrace.STAGE_TOTAL); - if (Double.compare(0D, stageTotal.getTps()) == 0) { + if (isIngoreEmptyPerf(operationPerf)) { continue; } prepare = operationPerf.findStage(InvocationStageTrace.STAGE_PREPARE); @@ -436,8 +426,7 @@ public class DefaultLogPublisher implements MetricsInitializer { encodeConsumerRequest, decodeConsumerResponse, sendReq, getConnect, waitResp, sendResp; for (OperationPerf operationPerf : perfGroup.getOperationPerfs()) { - PerfInfo stageTotal = operationPerf.findStage(InvocationStageTrace.STAGE_TOTAL); - if (Double.compare(0D, stageTotal.getTps()) == 0) { + if (isIngoreEmptyPerf(operationPerf)) { continue; } prepare = operationPerf.findStage(InvocationStageTrace.STAGE_PREPARE); @@ -469,6 +458,16 @@ public class DefaultLogPublisher implements MetricsInitializer { return sb; } + private boolean isIngoreEmptyPerf(OperationPerf operationPerf) { + PerfInfo stageTotal = operationPerf.findStage(InvocationStageTrace.STAGE_TOTAL); + // max latency is calculated in ring algorithm, maybe not 0 + if (Double.compare(0D, stageTotal.getTotalRequests()) == 0 + && Double.compare(0D, stageTotal.getMsMaxLatency()) == 0) { + return true; + } + return false; + } + protected void printVertxMetrics(MeasurementTree tree, StringBuilder sb) { appendLine(sb, "vertx:"); diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishModelFactory.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishModelFactory.java index db5e43404..5baa2917e 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishModelFactory.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishModelFactory.java @@ -23,16 +23,16 @@ import org.apache.servicecomb.foundation.metrics.publish.MeasurementGroupConfig; import org.apache.servicecomb.foundation.metrics.publish.MeasurementNode; import org.apache.servicecomb.foundation.metrics.publish.MeasurementTree; import org.apache.servicecomb.metrics.core.VertxMetersInitializer; +import org.apache.servicecomb.metrics.core.meter.ThreadPoolMonitorPublishModelFactory; import org.apache.servicecomb.metrics.core.meter.invocation.MeterInvocationConst; import org.apache.servicecomb.metrics.core.meter.os.NetMeter; import org.apache.servicecomb.metrics.core.meter.os.OsMeter; +import org.apache.servicecomb.metrics.core.meter.pool.ThreadPoolMeter; import org.apache.servicecomb.metrics.core.meter.vertx.EndpointMeter; import org.apache.servicecomb.metrics.core.publish.model.DefaultPublishModel; import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerfGroups; import org.apache.servicecomb.swagger.invocation.InvocationType; -import org.apache.servicecomb.metrics.core.meter.ThreadPoolMonitorPublishModelFactory; - import io.micrometer.core.instrument.Meter; public class PublishModelFactory { @@ -64,7 +64,6 @@ public class PublishModelFactory { MeterInvocationConst.TAG_TYPE, new DefaultTagFinder(MeterInvocationConst.TAG_STAGE, true)); - //os config groupConfig.addGroup(OsMeter.OS_NAME, OsMeter.OS_TYPE, new DefaultTagFinder(NetMeter.INTERFACE, true)); @@ -73,6 +72,9 @@ public class PublishModelFactory { VertxMetersInitializer.ENDPOINTS_TYPE, EndpointMeter.ADDRESS, EndpointMeter.STATISTIC); + groupConfig.addGroup(ThreadPoolMeter.THREAD_POOL_METER, + ThreadPoolMeter.ID, ThreadPoolMeter.STAGE); + return groupConfig; } @@ -106,11 +108,11 @@ public class PublishModelFactory { model.getProducer() .setOperationPerfGroups(generateOperationPerfGroups(tree, InvocationType.PROVIDER.name())); - //edge + model.getEdge() .setOperationPerfGroups(generateOperationPerfGroups(tree, MeterInvocationConst.EDGE_INVOCATION_NAME)); - ThreadPoolMonitorPublishModelFactory.create(tree, model.getThreadPools()); + model.setThreadPools(ThreadPoolMonitorPublishModelFactory.create(tree)); return model; } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishUtils.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishUtils.java index 8f883b5a8..9bf2cb6f9 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishUtils.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/PublishUtils.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.Map; import org.apache.servicecomb.foundation.metrics.publish.MeasurementNode; +import org.apache.servicecomb.foundation.metrics.publish.MeasurementTree; import org.apache.servicecomb.metrics.core.meter.invocation.MeterInvocationConst; import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerf; import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerfGroup; @@ -34,13 +35,9 @@ public final class PublishUtils { public static PerfInfo createPerfInfo(MeasurementNode stageNode) { PerfInfo perfInfo = new PerfInfo(); - perfInfo.setTps(stageNode.findChild(Statistic.COUNT.name()).summary()); - perfInfo.setMsTotalTime(stageNode.findChild(Statistic.TOTAL_TIME.name()).summary() * 1000); - // when UT with DefaultRegistry, there is no max value - MeasurementNode maxNode = stageNode.findChild(Statistic.MAX.name()); - if (maxNode != null) { - perfInfo.setMsMaxLatency(maxNode.summary() * 1000); - } + perfInfo.setTotalRequests(stageNode.findChild(Statistic.COUNT.name()).summary()); + perfInfo.setMsTotalTime(stageNode.findChild(Statistic.TOTAL_TIME.name()).summary()); + perfInfo.setMsMaxLatency(stageNode.findChild(Statistic.MAX.name()).summary()); return perfInfo; } @@ -54,7 +51,7 @@ public final class PublishUtils { operationPerf.getStages().put(mNode.getName(), perfInfo); }); - MeasurementNode latencyNode = statusNode.findChild(MeterInvocationConst.TAG_LATENCY_DISTRIBUTION); + MeasurementNode latencyNode = statusNode.findChild(MeasurementTree.TAG_LATENCY_DISTRIBUTION); if (latencyNode != null && latencyNode.getMeasurements() != null) { operationPerf.setLatencyDistribution(latencyNode.getMeasurements().stream() .map(m -> (int) m.getValue()) diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/model/invocation/PerfInfo.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/model/invocation/PerfInfo.java index fef78700c..e9e3afbee 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/model/invocation/PerfInfo.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/publish/model/invocation/PerfInfo.java @@ -17,18 +17,18 @@ package org.apache.servicecomb.metrics.core.publish.model.invocation; public class PerfInfo { - private double tps; + private double totalRequests; private double msTotalTime; private double msMaxLatency; - public double getTps() { - return tps; + public double getTotalRequests() { + return totalRequests; } - public void setTps(double tps) { - this.tps = tps; + public void setTotalRequests(double totalRequests) { + this.totalRequests = totalRequests; } public double getMsTotalTime() { @@ -48,7 +48,7 @@ public class PerfInfo { } public void add(PerfInfo other) { - tps += other.tps; + totalRequests += other.totalRequests; msTotalTime += other.msTotalTime; if (msMaxLatency < other.msMaxLatency) { msMaxLatency = other.msMaxLatency; @@ -56,12 +56,12 @@ public class PerfInfo { } public double calcMsLatency() { - return (tps != 0) ? msTotalTime / tps : 0; + return (totalRequests != 0) ? msTotalTime / totalRequests : 0; } @Override public String toString() { - return "PerfInfo [tps=" + tps + ", msTotalTime=" + msTotalTime + ", msLatency=" + calcMsLatency() + return "PerfInfo [tps=" + totalRequests + ", msTotalTime=" + msTotalTime + ", msLatency=" + calcMsLatency() + ", msMaxLatency=" + msMaxLatency + "]"; } diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestInvocationMetersInitializer.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestInvocationMetersInitializer.java index 8705f89d1..09963b4e4 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestInvocationMetersInitializer.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestInvocationMetersInitializer.java @@ -110,9 +110,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "prepare") .getMeasurements(); @@ -120,9 +120,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "consumer-send") .getMeasurements(); @@ -130,9 +130,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.0E-8"); + "statistic='TOTAL_TIME', value=1.0E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=5.0E-9"); + "statistic='MAX', value=5.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "connection") .getMeasurements(); @@ -140,9 +140,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "consumer-encode") .getMeasurements(); @@ -151,9 +151,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=8.0E-9"); + "statistic='TOTAL_TIME', value=8.0E-6"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=4.0E-9"); + "statistic='MAX', value=4.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "connection") .getMeasurements(); @@ -161,9 +161,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "wait") .getMeasurements(); @@ -171,9 +171,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "consumer-decode") .getMeasurements(); @@ -181,9 +181,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); } @Test @@ -236,9 +236,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "prepare") .getMeasurements(); @@ -246,9 +246,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "consumer-send") .getMeasurements(); @@ -256,9 +256,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.0E-8"); + "statistic='TOTAL_TIME', value=1.0E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=5.0E-9"); + "statistic='MAX', value=5.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "connection") .getMeasurements(); @@ -266,9 +266,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "consumer-encode") .getMeasurements(); @@ -276,9 +276,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=8.0E-9"); + "statistic='TOTAL_TIME', value=8.0E-6"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=4.0E-9"); + "statistic='MAX', value=4.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "wait") .getMeasurements(); @@ -286,9 +286,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "consumer-decode") .getMeasurements(); @@ -296,9 +296,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.6E-8"); + "statistic='TOTAL_TIME', value=1.6E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=8.0E-9"); + "statistic='MAX', value=8.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "provider-decode") .getMeasurements(); @@ -306,9 +306,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "provider-encode") .getMeasurements(); @@ -316,9 +316,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "provider-send") .getMeasurements(); @@ -326,9 +326,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); } @Test @@ -375,9 +375,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "prepare") .getMeasurements(); @@ -385,9 +385,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "queue") .getMeasurements(); @@ -395,9 +395,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "execute") .getMeasurements(); @@ -405,9 +405,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "provider-decode") .getMeasurements(); @@ -415,9 +415,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "provider-encode") .getMeasurements(); @@ -425,9 +425,9 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); measurements = tree.findChild(MeterInvocationConst.INVOCATION_NAME, "provider-send") .getMeasurements(); @@ -435,8 +435,8 @@ public class TestInvocationMetersInitializer { AssertUtil.assertMeasure(measurements, 0, "statistic='COUNT', value=2.0"); AssertUtil.assertMeasure(measurements, 1, - "statistic='TOTAL_TIME', value=1.8E-8"); + "statistic='TOTAL_TIME', value=1.8E-5"); AssertUtil.assertMeasure(measurements, 2, - "statistic='MAX', value=9.0E-9"); + "statistic='MAX', value=9.0E-6"); } } diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestThreadPoolMetersInitializer.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestThreadPoolMetersInitializer.java index 73afa85b9..9c9698aed 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestThreadPoolMetersInitializer.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestThreadPoolMetersInitializer.java @@ -32,7 +32,9 @@ import org.apache.servicecomb.core.executor.GroupExecutor; import org.apache.servicecomb.core.executor.ThreadPoolExecutorEx; import org.apache.servicecomb.foundation.common.utils.BeanUtils; import org.apache.servicecomb.foundation.metrics.publish.MeasurementGroupConfig; +import org.apache.servicecomb.foundation.metrics.publish.MeasurementNode; import org.apache.servicecomb.foundation.metrics.publish.MeasurementTree; +import org.apache.servicecomb.metrics.core.meter.pool.ThreadPoolMeter; import org.junit.Test; import org.junit.jupiter.api.Assertions; import org.mockito.Mockito; @@ -127,22 +129,18 @@ public class TestThreadPoolMetersInitializer { MeasurementTree tree = new MeasurementTree(); MeasurementGroupConfig group = new MeasurementGroupConfig(); - group.addGroup("threadpool.maxThreads", "id"); - group.addGroup("threadpool.rejectedCount", "id"); - group.addGroup("threadpool.completedTaskCount", "id"); - group.addGroup("threadpool.currentThreadsBusy", "id"); - group.addGroup("threadpool.corePoolSize", "id"); - group.addGroup("threadpool.poolSize", "id"); - group.addGroup("threadpool.queueSize", "id"); - group.addGroup("threadpool.taskCount", "id"); + group.addGroup(ThreadPoolMeter.THREAD_POOL_METER, ThreadPoolMeter.ID, + ThreadPoolMeter.STAGE); tree.from(registry.getMeters().iterator(), group); - Assertions.assertEquals(tree.findChild("threadpool.maxThreads", "groupExecutor-group0").summary(), 0, 0); - Assertions.assertEquals(tree.findChild("threadpool.rejectedCount", "groupExecutor-group0").summary(), 0, 0); - Assertions.assertEquals(tree.findChild("threadpool.completedTaskCount", "groupExecutor-group0").summary(), 0, 0); - Assertions.assertEquals(tree.findChild("threadpool.currentThreadsBusy", "groupExecutor-group0").summary(), 0, 0); - Assertions.assertEquals(tree.findChild("threadpool.corePoolSize", "groupExecutor-group0").summary(), 0, 0); - Assertions.assertEquals(tree.findChild("threadpool.poolSize", "groupExecutor-group0").summary(), 0, 0); - Assertions.assertEquals(tree.findChild("threadpool.queueSize", "groupExecutor-group0").summary(), 10, 0); - Assertions.assertEquals(tree.findChild("threadpool.taskCount", "groupExecutor-group0").summary(), 0, 0); + + MeasurementNode node = tree.findChild(ThreadPoolMeter.THREAD_POOL_METER); + Assertions.assertEquals(node.findChild("groupExecutor-group0", "maxThreads").summary(), 0, 0); + Assertions.assertEquals(node.findChild("groupExecutor-group0", "rejectedCount").summary(), 0, 0); + Assertions.assertEquals(node.findChild("groupExecutor-group0", "completedTaskCount").summary(), 0, 0); + Assertions.assertEquals(node.findChild("groupExecutor-group0", "currentThreadsBusy").summary(), 0, 0); + Assertions.assertEquals(node.findChild("groupExecutor-group0", "corePoolSize").summary(), 0, 0); + Assertions.assertEquals(node.findChild("groupExecutor-group0", "poolSize").summary(), 0, 0); + Assertions.assertEquals(node.findChild("groupExecutor-group0", "queueSize").summary(), 10, 0); + Assertions.assertEquals(node.findChild("groupExecutor-group0", "taskCount").summary(), 0, 0); } } diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java index a18d2207d..bc1fd4df6 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestDefaultLogPublisher.java @@ -163,7 +163,7 @@ public class TestDefaultLogPublisher { }; DefaultPublishModel model = new DefaultPublishModel(); PerfInfo perfTotal = new PerfInfo(); - perfTotal.setTps(10_0000); + perfTotal.setTotalRequests(10_0000); perfTotal.setMsTotalTime(30000L * 1_0000); perfTotal.setMsMaxLatency(30000); OperationPerf operationPerf = new OperationPerf(); @@ -264,8 +264,9 @@ public class TestDefaultLogPublisher { 0 0 0 0 NaN 0 0.0 0.0 test consumer: simple: - status tps latency [0,1) [1,100) [100,) operation - rest.OK 100000.0 3000.000/30000.000 12 120 1200 op + status requests latency [0,1) [1,100) [100,) operation + rest.OK: \s + 100000.0 3000.000/30000.000 12 120 1200 op 100000.0 3000.000/30000.000 12 120 1200 (summary) details: rest.OK: @@ -274,8 +275,9 @@ public class TestDefaultLogPublisher { wait : 3000.000/30000.000 decode-response : 3000.000/30000.000 producer: simple: - status tps latency [0,1) [1,100) [100,) operation - rest.OK 100000.0 3000.000/30000.000 12 120 1200 op + status requests latency [0,1) [1,100) [100,) operation + rest.OK: \s + 100000.0 3000.000/30000.000 12 120 1200 op 100000.0 3000.000/30000.000 12 120 1200 (summary) details: rest.OK: @@ -284,8 +286,9 @@ public class TestDefaultLogPublisher { encode-response: 3000.000/30000.000 send: 3000.000/30000.000 edge: simple: - status tps latency [0,1) [1,100) [100,) operation - rest.OK 100000.0 3000.000/30000.000 12 120 1200 op + status requests latency [0,1) [1,100) [100,) operation + rest.OK: \s + 100000.0 3000.000/30000.000 12 120 1200 op 100000.0 3000.000/30000.000 12 120 1200 (summary) details: rest.OK: diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestInvocationPublishModelFactory.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestInvocationPublishModelFactory.java index e96bed878..d0310e48c 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestInvocationPublishModelFactory.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestInvocationPublishModelFactory.java @@ -75,198 +75,198 @@ public class TestInvocationPublishModelFactory { String expect = """ { - "operationPerfGroups" : { - "groups" : { - "rest" : { - "200" : { - "transport" : "rest", - "status" : "200", - "operationPerfs" : [ { - "operation" : "m.s.o", - "stages" : { - "consumer-encode" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "prepare" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "wait" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "total" : { - "tps" : 1.0, - "msTotalTime" : 1.4E-5, - "msMaxLatency" : 1.4E-5 - }, - "consumer-send" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "connection" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "consumer-decode" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - } - }, - "latencyDistribution" : [ 1, 0, 0 ] - } ], - "summary" : { - "operation" : "", - "stages" : { - "consumer-encode" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "prepare" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "total" : { - "tps" : 1.0, - "msTotalTime" : 1.4E-5, - "msMaxLatency" : 1.4E-5 - }, - "wait" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "consumer-send" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "connection" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "consumer-decode" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - } - }, - "latencyDistribution" : [ 1, 0, 0 ] - } - } - } - } - } - } + "operationPerfGroups" : { + "groups" : { + "rest" : { + "200" : { + "transport" : "rest", + "status" : "200", + "operationPerfs" : [ { + "operation" : "m.s.o", + "stages" : { + "consumer-encode" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "prepare" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "wait" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "total" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.4E-5, + "msMaxLatency" : 1.4E-5 + }, + "consumer-send" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "connection" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "consumer-decode" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + } + }, + "latencyDistribution" : [ 1, 0, 0 ] + } ], + "summary" : { + "operation" : "", + "stages" : { + "consumer-encode" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "prepare" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "total" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.4E-5, + "msMaxLatency" : 1.4E-5 + }, + "wait" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "consumer-send" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "connection" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "consumer-decode" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + } + }, + "latencyDistribution" : [ 1, 0, 0 ] + } + } + } + } + } + } """; Assertions.assertEquals(Json.encodePrettily(Json.decodeValue(expect, Object.class)), Json.encodePrettily(model.getConsumer())); expect = """ { - "operationPerfGroups" : { - "groups" : { - "rest" : { - "200" : { - "transport" : "rest", - "status" : "200", - "operationPerfs" : [ { - "operation" : "m.s.o", - "stages" : { - "consumer-encode" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "prepare" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "wait" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "total" : { - "tps" : 1.0, - "msTotalTime" : 1.4E-5, - "msMaxLatency" : 1.4E-5 - }, - "consumer-send" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "connection" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "consumer-decode" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - } - }, - "latencyDistribution" : [ 1, 0, 0 ] - } ], - "summary" : { - "operation" : "", - "stages" : { - "consumer-encode" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "prepare" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "total" : { - "tps" : 1.0, - "msTotalTime" : 1.4E-5, - "msMaxLatency" : 1.4E-5 - }, - "wait" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "consumer-send" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "connection" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - }, - "consumer-decode" : { - "tps" : 1.0, - "msTotalTime" : 1.0000000000000002E-6, - "msMaxLatency" : 1.0000000000000002E-6 - } - }, - "latencyDistribution" : [ 1, 0, 0 ] - } - } - } - } - } - } + "operationPerfGroups" : { + "groups" : { + "rest" : { + "200" : { + "transport" : "rest", + "status" : "200", + "operationPerfs" : [ { + "operation" : "m.s.o", + "stages" : { + "consumer-encode" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "prepare" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "wait" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "total" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.4E-5, + "msMaxLatency" : 1.4E-5 + }, + "consumer-send" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "connection" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "consumer-decode" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + } + }, + "latencyDistribution" : [ 1, 0, 0 ] + } ], + "summary" : { + "operation" : "", + "stages" : { + "consumer-encode" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "prepare" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "total" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.4E-5, + "msMaxLatency" : 1.4E-5 + }, + "wait" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "consumer-send" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "connection" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + }, + "consumer-decode" : { + "totalRequests" : 1.0, + "msTotalTime" : 1.0E-6, + "msMaxLatency" : 1.0E-6 + } + }, + "latencyDistribution" : [ 1, 0, 0 ] + } + } + } + } + } + } """; Assertions.assertEquals(Json.encodePrettily(Json.decodeValue(expect, Object.class)), Json.encodePrettily(model.getProducer())); diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestPublishUtils.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestPublishUtils.java index 7d98f7bff..66fb62f2f 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestPublishUtils.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestPublishUtils.java @@ -16,13 +16,13 @@ */ package org.apache.servicecomb.metrics.core.publish; -import java.util.HashMap; import java.util.Map; import org.apache.servicecomb.core.CoreConst; import org.apache.servicecomb.core.invocation.InvocationStageTrace; import org.apache.servicecomb.foundation.metrics.publish.MeasurementNode; import org.apache.servicecomb.foundation.metrics.publish.MeasurementTree; +import org.apache.servicecomb.metrics.core.meter.ThreadPoolMonitorPublishModelFactory; import org.apache.servicecomb.metrics.core.publish.model.ThreadPoolPublishModel; import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerf; import org.apache.servicecomb.metrics.core.publish.model.invocation.OperationPerfGroup; @@ -32,8 +32,6 @@ import org.apache.servicecomb.metrics.core.publish.model.invocation.Utils; import org.junit.Test; import org.junit.jupiter.api.Assertions; -import org.apache.servicecomb.metrics.core.meter.ThreadPoolMonitorPublishModelFactory; - import jakarta.ws.rs.core.Response.Status; public class TestPublishUtils { @@ -45,9 +43,9 @@ public class TestPublishUtils { PerfInfo perf = PublishUtils.createPerfInfo(stageNode); - Assertions.assertEquals(10, perf.getTps(), 0); - Assertions.assertEquals(1000, perf.calcMsLatency(), 0); - Assertions.assertEquals(100000, perf.getMsMaxLatency(), 0); + Assertions.assertEquals(10, perf.getTotalRequests(), 0); + Assertions.assertEquals(1, perf.calcMsLatency(), 0); + Assertions.assertEquals(100, perf.getMsMaxLatency(), 0); } @Test @@ -56,9 +54,9 @@ public class TestPublishUtils { PerfInfo perfInfo = opPerf.findStage(InvocationStageTrace.STAGE_TOTAL); Integer[] latencyDistribution = opPerf.getLatencyDistribution(); - Assertions.assertEquals(10, perfInfo.getTps(), 0); - Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0); - Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0); + Assertions.assertEquals(10, perfInfo.getTotalRequests(), 0); + Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0); + Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0); Assertions.assertEquals(2, latencyDistribution.length); Assertions.assertEquals(1, latencyDistribution[0].intValue()); Assertions.assertEquals(2, latencyDistribution[1].intValue()); @@ -77,9 +75,9 @@ public class TestPublishUtils { PerfInfo perfInfo = group.getSummary().findStage(InvocationStageTrace.STAGE_TOTAL); Integer[] latencyDistribution = group.getSummary().getLatencyDistribution(); - Assertions.assertEquals(10, perfInfo.getTps(), 0); - Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0); - Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0); + Assertions.assertEquals(10, perfInfo.getTotalRequests(), 0); + Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0); + Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0); Assertions.assertEquals(2, latencyDistribution.length); Assertions.assertEquals(1, latencyDistribution[0].intValue()); Assertions.assertEquals(2, latencyDistribution[1].intValue()); @@ -87,9 +85,8 @@ public class TestPublishUtils { @Test public void createThreadPoolPublishModels_empty() { - Map<String, ThreadPoolPublishModel> threadPools = new HashMap<>(); - - ThreadPoolMonitorPublishModelFactory.create(new MeasurementTree(), threadPools); + Map<String, ThreadPoolPublishModel> threadPools = + ThreadPoolMonitorPublishModelFactory.create(new MeasurementTree()); Assertions.assertTrue(threadPools.isEmpty()); } diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestThreadPoolPublishModelFactory.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestThreadPoolPublishModelFactory.java index 64778d3ee..7a20f852c 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestThreadPoolPublishModelFactory.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/TestThreadPoolPublishModelFactory.java @@ -17,8 +17,8 @@ package org.apache.servicecomb.metrics.core.publish; import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; +import org.apache.servicecomb.core.executor.ThreadPoolExecutorEx; import org.apache.servicecomb.foundation.common.event.EventManager; import org.apache.servicecomb.foundation.common.utils.JsonUtils; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; @@ -44,7 +44,7 @@ public class TestThreadPoolPublishModelFactory { BlockingQueue<Runnable> queue; @Test - public void createDefaultPublishModel(@Injectable ThreadPoolExecutor threadPoolExecutor) throws Exception { + public void createDefaultPublishModel(@Injectable ThreadPoolExecutorEx threadPoolExecutor) throws Exception { new Expectations() { { threadPoolExecutor.getQueue(); @@ -66,7 +66,8 @@ public class TestThreadPoolPublishModelFactory { DefaultPublishModel model = factory.createDefaultPublishModel(); Assertions.assertEquals( - "{\"test\":{\"avgTaskCount\":0.0,\"avgCompletedTaskCount\":0.0,\"currentThreadsBusy\":0,\"maxThreads\":0,\"poolSize\":0,\"corePoolSize\":0,\"queueSize\":10,\"rejected\":\"NaN\"}}", + """ + {"test":{"avgTaskCount":0.0,"avgCompletedTaskCount":0.0,"currentThreadsBusy":0,"maxThreads":0,"poolSize":0,"corePoolSize":0,"queueSize":10,"rejected":0.0}}""", JsonUtils.writeValueAsString(model.getThreadPools())); } } diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerf.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerf.java index bc4016165..2090f21a8 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerf.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerf.java @@ -35,13 +35,13 @@ public class TestOperationPerf { Assertions.assertEquals(op, otherOpPerf.getOperation()); PerfInfo perfInfo = opPerf.findStage(InvocationStageTrace.STAGE_TOTAL); - Assertions.assertEquals(10, perfInfo.getTps(), 0); - Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0); - Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0); + Assertions.assertEquals(10, perfInfo.getTotalRequests(), 0); + Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0); + Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0); perfInfo = opPerf.findStage(InvocationStageTrace.STAGE_PROVIDER_BUSINESS); - Assertions.assertEquals(10, perfInfo.getTps(), 0); - Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0); - Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0); + Assertions.assertEquals(10, perfInfo.getTotalRequests(), 0); + Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0); + Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0); } } diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerfGroup.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerfGroup.java index ae3ed7a29..9f4fa492f 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerfGroup.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestOperationPerfGroup.java @@ -47,13 +47,13 @@ public class TestOperationPerfGroup { OperationPerf summary = group.getSummary(); PerfInfo perfInfo = summary.findStage(InvocationStageTrace.STAGE_TOTAL); - Assertions.assertEquals(20, perfInfo.getTps(), 0); - Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0); - Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0); + Assertions.assertEquals(20, perfInfo.getTotalRequests(), 0); + Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0); + Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0); perfInfo = summary.findStage(InvocationStageTrace.STAGE_PROVIDER_BUSINESS); - Assertions.assertEquals(20, perfInfo.getTps(), 0); - Assertions.assertEquals(1000, perfInfo.calcMsLatency(), 0); - Assertions.assertEquals(100000, perfInfo.getMsMaxLatency(), 0); + Assertions.assertEquals(20, perfInfo.getTotalRequests(), 0); + Assertions.assertEquals(1, perfInfo.calcMsLatency(), 0); + Assertions.assertEquals(100, perfInfo.getMsMaxLatency(), 0); } } diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestPerfInfo.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestPerfInfo.java index 3fec1908b..35c6d83e7 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestPerfInfo.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/TestPerfInfo.java @@ -24,7 +24,7 @@ public class TestPerfInfo { public void construct() { PerfInfo perf = new PerfInfo(); - Assertions.assertEquals(0, perf.getTps(), 0); + Assertions.assertEquals(0, perf.getTotalRequests(), 0); Assertions.assertEquals(0, perf.getMsTotalTime(), 0); Assertions.assertEquals(0, perf.getMsMaxLatency(), 0); Assertions.assertEquals(0, perf.calcMsLatency(), 0); @@ -35,18 +35,18 @@ public class TestPerfInfo { PerfInfo sum = new PerfInfo(); PerfInfo other = new PerfInfo(); - other.setTps(10); + other.setTotalRequests(10); other.setMsTotalTime(10); other.setMsMaxLatency(100); sum.add(other); other = new PerfInfo(); - other.setTps(20); + other.setTotalRequests(20); other.setMsTotalTime(20); other.setMsMaxLatency(200); sum.add(other); - Assertions.assertEquals(30, sum.getTps(), 0); + Assertions.assertEquals(30, sum.getTotalRequests(), 0); Assertions.assertEquals(30, sum.getMsTotalTime(), 0); Assertions.assertEquals(200, sum.getMsMaxLatency(), 0); Assertions.assertEquals(1.0, sum.calcMsLatency(), 0); @@ -57,18 +57,18 @@ public class TestPerfInfo { PerfInfo sum = new PerfInfo(); PerfInfo other = new PerfInfo(); - other.setTps(10); + other.setTotalRequests(10); other.setMsTotalTime(10); other.setMsMaxLatency(100); sum.add(other); other = new PerfInfo(); - other.setTps(20); + other.setTotalRequests(20); other.setMsTotalTime(20); other.setMsMaxLatency(50); sum.add(other); - Assertions.assertEquals(30, sum.getTps(), 0); + Assertions.assertEquals(30, sum.getTotalRequests(), 0); Assertions.assertEquals(1.0, sum.calcMsLatency(), 0); Assertions.assertEquals(100, sum.getMsMaxLatency(), 0); } @@ -76,7 +76,7 @@ public class TestPerfInfo { @Test public void testToString() { PerfInfo perf = new PerfInfo(); - perf.setTps(10); + perf.setTotalRequests(10); perf.setMsTotalTime(10); perf.setMsMaxLatency(100); diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/Utils.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/Utils.java index a9f87601d..c48a1b5b6 100644 --- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/Utils.java +++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/publish/model/invocation/Utils.java @@ -21,6 +21,7 @@ import java.util.List; import org.apache.servicecomb.core.invocation.InvocationStageTrace; import org.apache.servicecomb.foundation.metrics.publish.MeasurementNode; +import org.apache.servicecomb.foundation.metrics.publish.MeasurementTree; import org.apache.servicecomb.metrics.core.meter.invocation.MeterInvocationConst; import org.apache.servicecomb.metrics.core.publish.PublishUtils; @@ -60,7 +61,7 @@ public class Utils { Id id = initId; MeasurementNode statusNode = new MeasurementNode(status, id, new HashMap<>()); MeasurementNode typeNode = new MeasurementNode(MeterInvocationConst.TAG_STAGE, id, new HashMap<>()); - MeasurementNode latencyNode = new MeasurementNode(MeterInvocationConst.TAG_LATENCY_DISTRIBUTION, id, + MeasurementNode latencyNode = new MeasurementNode(MeasurementTree.TAG_LATENCY_DISTRIBUTION, id, new HashMap<>()); List<Measurement> measurements = latencyNode.getMeasurements(); measurements.add(new Measurement(() -> 1, Statistic.VALUE));
