This is an automated email from the ASF dual-hosted git repository. kezhenxu94 pushed a commit to branch object-pool in repository https://gitbox.apache.org/repos/asf/skywalking.git
commit 76b76611baee63668604ff631f0b0d25c26ff93d Author: kezhenxu94 <[email protected]> AuthorDate: Mon Aug 9 22:08:21 2021 +0800 Pool metrics objects --- .../datacarrier/consumer/BulkConsumePool.java | 16 +++---- .../skywalking/oap/meter/analyzer/Analyzer.java | 5 +- .../exporter/provider/grpc/GRPCExporter.java | 11 +++-- .../exporter/provider/grpc/GRPCExporterTest.java | 13 ++--- .../server/exporter/provider/grpc/MockMetrics.java | 5 ++ .../code-templates/dispatcher/doMetrics.ftl | 2 +- .../metrics-builder/storage2Entity.ftl | 4 +- .../resources/code-templates/metrics/toDay.ftl | 4 +- .../resources/code-templates/metrics/toHour.ftl | 4 +- .../core/alarm/provider/NotifyHandlerTest.java | 4 +- .../core/alarm/provider/RunningRuleTest.java | 41 +++++++++++++--- .../oap/server/core/MetricsObjectPool.java | 47 ++++++++++++++++++ .../skywalking/oap/server/core/Recyclable.java | 26 ++++++++++ .../core/analysis/data/MergableBufferedData.java | 4 +- .../analysis/manual/endpoint/EndpointTraffic.java | 11 +++++ .../analysis/manual/instance/InstanceTraffic.java | 13 ++++- .../manual/networkalias/NetworkAddressAlias.java | 13 ++++- .../endpoint/EndpointCallRelationDispatcher.java | 3 +- .../EndpointRelationServerSideMetrics.java | 18 +++++-- .../ServiceInstanceCallRelationDispatcher.java | 7 ++- .../ServiceInstanceRelationClientSideMetrics.java | 46 +++++++++++++++--- .../ServiceInstanceRelationServerSideMetrics.java | 46 +++++++++++++++--- .../service/ServiceCallRelationDispatcher.java | 5 +- .../service/ServiceRelationClientSideMetrics.java | 18 +++++-- .../service/ServiceRelationServerSideMetrics.java | 18 +++++-- .../analysis/manual/service/ServiceTraffic.java | 10 ++++ .../server/core/analysis/meter/MeterSystem.java | 8 ++-- .../analysis/meter/function/HistogramFunction.java | 9 ++++ .../meter/function/PercentileFunction.java | 56 +++++++++++++++++----- .../analysis/meter/function/avg/AvgFunction.java | 12 +++++ .../meter/function/avg/AvgHistogramFunction.java | 11 +++++ .../avg/AvgHistogramPercentileFunction.java | 14 ++++++ .../meter/function/avg/AvgLabeledFunction.java | 12 +++++ .../meter/function/latest/LatestFunction.java | 25 ++++++++-- .../analysis/meter/function/sum/SumFunction.java | 13 ++++- .../server/core/analysis/metrics/ApdexMetrics.java | 10 +++- .../server/core/analysis/metrics/CPMMetrics.java | 9 ++++ .../server/core/analysis/metrics/CountMetrics.java | 8 ++++ .../server/core/analysis/metrics/DataTable.java | 16 ++++++- .../core/analysis/metrics/DoubleAvgMetrics.java | 11 +++++ .../core/analysis/metrics/HistogramMetrics.java | 8 ++++ .../oap/server/core/analysis/metrics/IntList.java | 16 ++++++- .../core/analysis/metrics/LongAvgMetrics.java | 10 ++++ .../core/analysis/metrics/MaxDoubleMetrics.java | 8 ++++ .../core/analysis/metrics/MaxLongMetrics.java | 8 ++++ .../oap/server/core/analysis/metrics/Metrics.java | 11 ++++- .../core/analysis/metrics/MinDoubleMetrics.java | 8 ++++ .../core/analysis/metrics/MinLongMetrics.java | 8 ++++ .../core/analysis/metrics/PercentMetrics.java | 10 ++++ .../core/analysis/metrics/PercentileMetrics.java | 11 +++++ .../server/core/analysis/metrics/PxxMetrics.java | 11 +++++ .../server/core/analysis/metrics/RateMetrics.java | 10 ++++ .../server/core/analysis/metrics/SumMetrics.java | 8 ++++ .../server/core/analysis/worker/ExportWorker.java | 4 +- .../analysis/worker/MetricsAggregateWorker.java | 8 ++-- .../analysis/worker/MetricsPersistentWorker.java | 29 +++++++---- .../analysis/worker/MetricsStreamProcessor.java | 3 +- .../oap/server/core/exporter/ExportEvent.java | 11 ++--- .../core/remote/client/GRPCRemoteClient.java | 5 ++ .../skywalking/oap/server/core/source/Event.java | 18 +++++++ .../endpoint/EndpointCallRelationTest.java | 13 +++-- .../instance/ServiceInstanceRelationTest.java | 25 ++++++---- .../relation/service/ServiceRelationTest.java | 25 ++++++---- .../meter/function/HistogramFunctionTest.java | 21 ++++---- .../function/avg/AvgHistogramFunctionTest.java | 21 ++++---- .../core/analysis/metrics/LongAvgMetricsTest.java | 9 ++-- .../core/analysis/metrics/MaxLongMetricsTest.java | 9 ++-- .../server/core/analysis/metrics/MetricsTest.java | 16 +++++-- 68 files changed, 774 insertions(+), 178 deletions(-) diff --git a/apm-commons/apm-datacarrier/src/main/java/org/apache/skywalking/apm/commons/datacarrier/consumer/BulkConsumePool.java b/apm-commons/apm-datacarrier/src/main/java/org/apache/skywalking/apm/commons/datacarrier/consumer/BulkConsumePool.java index 2d2195d..0f182a9 100644 --- a/apm-commons/apm-datacarrier/src/main/java/org/apache/skywalking/apm/commons/datacarrier/consumer/BulkConsumePool.java +++ b/apm-commons/apm-datacarrier/src/main/java/org/apache/skywalking/apm/commons/datacarrier/consumer/BulkConsumePool.java @@ -21,6 +21,7 @@ package org.apache.skywalking.apm.commons.datacarrier.consumer; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; +import lombok.RequiredArgsConstructor; import org.apache.skywalking.apm.commons.datacarrier.EnvUtil; import org.apache.skywalking.apm.commons.datacarrier.buffer.Channels; @@ -36,7 +37,7 @@ public class BulkConsumePool implements ConsumerPool { public BulkConsumePool(String name, int size, long consumeCycle) { size = EnvUtil.getInt(name + "_THREAD", size); - allConsumers = new ArrayList<MultipleChannelsConsumer>(size); + allConsumers = new ArrayList<>(size); for (int i = 0; i < size; i++) { MultipleChannelsConsumer multipleChannelsConsumer = new MultipleChannelsConsumer("DataCarrier." + name + ".BulkConsumePool." + i + ".Thread", consumeCycle); multipleChannelsConsumer.setDaemon(true); @@ -95,16 +96,11 @@ public class BulkConsumePool implements ConsumerPool { /** * The creator for {@link BulkConsumePool}. */ + @RequiredArgsConstructor public static class Creator implements Callable<ConsumerPool> { - private String name; - private int size; - private long consumeCycle; - - public Creator(String name, int poolSize, long consumeCycle) { - this.name = name; - this.size = poolSize; - this.consumeCycle = consumeCycle; - } + private final String name; + private final int size; + private final long consumeCycle; @Override public ConsumerPool call() { diff --git a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java index 5364b0c..37b0ef8 100644 --- a/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java +++ b/oap-server/analyzer/meter-analyzer/src/main/java/org/apache/skywalking/oap/meter/analyzer/Analyzer.java @@ -35,6 +35,7 @@ import org.apache.skywalking.oap.meter.analyzer.dsl.Result; import org.apache.skywalking.oap.meter.analyzer.dsl.Sample; import org.apache.skywalking.oap.meter.analyzer.dsl.SampleFamily; import org.apache.skywalking.oap.meter.analyzer.k8s.K8sInfoRegistry; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.analysis.NodeType; import org.apache.skywalking.oap.server.core.analysis.TimeBucket; import org.apache.skywalking.oap.server.core.analysis.manual.endpoint.EndpointTraffic; @@ -285,7 +286,7 @@ public class Analyzer { } private void serverSide(MeterEntity entity) { - ServiceRelationServerSideMetrics metrics = new ServiceRelationServerSideMetrics(); + ServiceRelationServerSideMetrics metrics = MetricsObjectPool.get(ServiceRelationServerSideMetrics.class); metrics.setTimeBucket(TimeBucket.getMinuteTimeBucket(System.currentTimeMillis())); metrics.setSourceServiceId(entity.sourceServiceId()); metrics.setDestServiceId(entity.destServiceId()); @@ -295,7 +296,7 @@ public class Analyzer { } private void clientSide(MeterEntity entity) { - ServiceRelationClientSideMetrics metrics = new ServiceRelationClientSideMetrics(); + ServiceRelationClientSideMetrics metrics = MetricsObjectPool.get(ServiceRelationClientSideMetrics.class); metrics.setTimeBucket(TimeBucket.getMinuteTimeBucket(System.currentTimeMillis())); metrics.setSourceServiceId(entity.sourceServiceId()); metrics.setDestServiceId(entity.destServiceId()); diff --git a/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporter.java b/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporter.java index 8758584..c209496 100644 --- a/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporter.java +++ b/oap-server/exporter/src/main/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporter.java @@ -59,7 +59,7 @@ public class GRPCExporter extends MetricFormatter implements MetricValuesExportS private final GRPCExporterSetting setting; private final MetricExportServiceGrpc.MetricExportServiceStub exportServiceFutureStub; private final MetricExportServiceGrpc.MetricExportServiceBlockingStub blockingStub; - private final DataCarrier exportBuffer; + private final DataCarrier<ExportData> exportBuffer; private final ReentrantLock fetchListLock; private volatile List<SubscriptionMetric> subscriptionList; private volatile long lastFetchTimestamp = 0; @@ -71,7 +71,7 @@ public class GRPCExporter extends MetricFormatter implements MetricValuesExportS ManagedChannel channel = client.getChannel(); exportServiceFutureStub = MetricExportServiceGrpc.newStub(channel); blockingStub = MetricExportServiceGrpc.newBlockingStub(channel); - exportBuffer = new DataCarrier<ExportData>(setting.getBufferChannelNum(), setting.getBufferChannelSize()); + exportBuffer = new DataCarrier<>(setting.getBufferChannelNum(), setting.getBufferChannelSize()); exportBuffer.consume(this, 1, 200); subscriptionList = new ArrayList<>(); fetchListLock = new ReentrantLock(); @@ -178,8 +178,9 @@ public class GRPCExporter extends MetricFormatter implements MetricValuesExportS MetricsMetaInfo meta = row.getMeta(); builder.setMetricName(meta.getMetricsName()); - builder.setEventType( - EventType.INCREMENT.equals(row.getEventType()) ? EventType.INCREMENT : EventType.TOTAL); + builder.setEventType(ExportEvent.EventType.INCREMENT == row.getEventType() + ? EventType.INCREMENT + : EventType.TOTAL); String entityName = getEntityName(meta); if (entityName == null) { return; @@ -191,6 +192,8 @@ public class GRPCExporter extends MetricFormatter implements MetricValuesExportS streamObserver.onNext(builder.build()); exportNum.getAndIncrement(); + + metrics.recycle(); }); streamObserver.onCompleted(); diff --git a/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporterTest.java b/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporterTest.java index de42ce7..b980f56 100644 --- a/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporterTest.java +++ b/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/GRPCExporterTest.java @@ -22,6 +22,7 @@ import io.grpc.testing.GrpcServerRule; import java.util.Collections; import java.util.LinkedList; import java.util.List; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.analysis.metrics.MetricsMetaInfo; import org.apache.skywalking.oap.server.core.analysis.metrics.WithMetadata; import org.apache.skywalking.oap.server.core.exporter.ExportData; @@ -60,7 +61,7 @@ public class GRPCExporterTest { @Test public void export() { - ExportEvent event = new ExportEvent(new MockExporterMetrics(), ExportEvent.EventType.TOTAL); + ExportEvent event = new ExportEvent(MetricsObjectPool.get(MockExporterMetrics.class), ExportEvent.EventType.TOTAL); exporter.export(event); } @@ -102,10 +103,10 @@ public class GRPCExporterTest { private List<ExportData> dataList() { List<ExportData> dataList = new LinkedList<>(); - dataList.add(new ExportData(metaInfo, new MockMetrics(), INCREMENT)); - dataList.add(new ExportData(metaInfo, new MockIntValueMetrics(), INCREMENT)); - dataList.add(new ExportData(metaInfo, new MockLongValueMetrics(), INCREMENT)); - dataList.add(new ExportData(metaInfo, new MockDoubleValueMetrics(), INCREMENT)); + dataList.add(new ExportData(metaInfo, MetricsObjectPool.get(MockMetrics.class), INCREMENT)); + dataList.add(new ExportData(metaInfo, MetricsObjectPool.get(MockIntValueMetrics.class), INCREMENT)); + dataList.add(new ExportData(metaInfo, MetricsObjectPool.get(MockLongValueMetrics.class), INCREMENT)); + dataList.add(new ExportData(metaInfo, MetricsObjectPool.get(MockDoubleValueMetrics.class), INCREMENT)); return dataList; } -} \ No newline at end of file +} diff --git a/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/MockMetrics.java b/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/MockMetrics.java index 6a55802..8da3c2d 100644 --- a/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/MockMetrics.java +++ b/oap-server/exporter/src/test/java/org/apache/skywalking/oap/server/exporter/provider/grpc/MockMetrics.java @@ -62,4 +62,9 @@ public class MockMetrics extends Metrics { public RemoteData.Builder serialize() { return null; } + + @Override + public void recycle() { + handle.recycle(this); + } } diff --git a/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/doMetrics.ftl b/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/doMetrics.ftl index 6312960..4521f1a 100644 --- a/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/doMetrics.ftl +++ b/oap-server/oal-rt/src/main/resources/code-templates/dispatcher/doMetrics.ftl @@ -8,7 +8,7 @@ private void do${metricsName}(${sourcePackage}${sourceName} source) { </#list> </#if> -${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage}${metricsName}Metrics(); +${metricsClassPackage}${metricsName}Metrics metrics = org.apache.skywalking.oap.server.core.MetricsObjectPool.get(${metricsClassPackage}${metricsName}Metrics.class); metrics.setTimeBucket(source.getTimeBucket()); <#list fieldsFromSource as field> metrics.${field.fieldSetter}(source.${field.fieldGetter}()); diff --git a/oap-server/oal-rt/src/main/resources/code-templates/metrics-builder/storage2Entity.ftl b/oap-server/oal-rt/src/main/resources/code-templates/metrics-builder/storage2Entity.ftl index e8f71c9..577b53f 100644 --- a/oap-server/oal-rt/src/main/resources/code-templates/metrics-builder/storage2Entity.ftl +++ b/oap-server/oal-rt/src/main/resources/code-templates/metrics-builder/storage2Entity.ftl @@ -1,5 +1,5 @@ public org.apache.skywalking.oap.server.core.storage.StorageData storage2Entity(java.util.Map dbMap) { -${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage}${metricsName}Metrics(); +${metricsClassPackage}${metricsName}Metrics metrics = org.apache.skywalking.oap.server.core.MetricsObjectPool.get(${metricsClassPackage}${metricsName}Metrics.class); <#list fieldsFromSource as field> <#if field.typeName == "long" || field.typeName == "int" || field.typeName == "double" || field.typeName == "float"> metrics.${field.fieldSetter}(((Number)dbMap.get("${field.columnName}")).${field.typeName}Value()); @@ -19,4 +19,4 @@ ${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage} </#if> </#list> return metrics; -} \ No newline at end of file +} diff --git a/oap-server/oal-rt/src/main/resources/code-templates/metrics/toDay.ftl b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toDay.ftl index e3c5bf9..ea516f7 100644 --- a/oap-server/oal-rt/src/main/resources/code-templates/metrics/toDay.ftl +++ b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toDay.ftl @@ -1,5 +1,5 @@ public org.apache.skywalking.oap.server.core.analysis.metrics.Metrics toDay() { -${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage}${metricsName}Metrics(); +${metricsClassPackage}${metricsName}Metrics metrics = org.apache.skywalking.oap.server.core.MetricsObjectPool.get(${metricsClassPackage}${metricsName}Metrics.class); <#list fieldsFromSource as field> <#if field.columnName == "time_bucket"> metrics.setTimeBucket(toTimeBucketInDay()); @@ -23,4 +23,4 @@ ${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage} </#if> </#list> return metrics; -} \ No newline at end of file +} diff --git a/oap-server/oal-rt/src/main/resources/code-templates/metrics/toHour.ftl b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toHour.ftl index b0bddbd..e1d2b3b 100644 --- a/oap-server/oal-rt/src/main/resources/code-templates/metrics/toHour.ftl +++ b/oap-server/oal-rt/src/main/resources/code-templates/metrics/toHour.ftl @@ -1,5 +1,5 @@ public org.apache.skywalking.oap.server.core.analysis.metrics.Metrics toHour() { -${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage}${metricsName}Metrics(); +${metricsClassPackage}${metricsName}Metrics metrics = org.apache.skywalking.oap.server.core.MetricsObjectPool.get(${metricsClassPackage}${metricsName}Metrics.class); <#list fieldsFromSource as field> <#if field.columnName == "time_bucket"> metrics.setTimeBucket(toTimeBucketInHour()); @@ -23,4 +23,4 @@ ${metricsClassPackage}${metricsName}Metrics metrics = new ${metricsClassPackage} </#if> </#list> return metrics; -} \ No newline at end of file +} diff --git a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandlerTest.java b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandlerTest.java index 4d252e0..28ac029 100644 --- a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandlerTest.java +++ b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/NotifyHandlerTest.java @@ -309,7 +309,7 @@ public class NotifyHandlerTest { Whitebox.setInternalState(notifyHandler, "core", core); } - private abstract class MockMetrics extends Metrics implements WithMetadata { + private abstract static class MockMetrics extends Metrics implements WithMetadata { } -} \ No newline at end of file +} diff --git a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRuleTest.java b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRuleTest.java index 2802722..8c9ed1e 100644 --- a/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRuleTest.java +++ b/oap-server/server-alarm-plugin/src/test/java/org/apache/skywalking/oap/server/core/alarm/provider/RunningRuleTest.java @@ -27,6 +27,7 @@ import java.util.Objects; import lombok.Getter; import lombok.Setter; import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.alarm.AlarmCallback; import org.apache.skywalking.oap.server.core.alarm.AlarmMessage; import org.apache.skywalking.oap.server.core.alarm.MetaInAlarm; @@ -50,7 +51,7 @@ import org.powermock.reflect.Whitebox; * So in this test, we need to simulate a lot of scenario to see the reactions. */ public class RunningRuleTest { - private static DateTimeFormatter TIME_BUCKET_FORMATTER = DateTimeFormat.forPattern("yyyyMMddHHmm"); + private static final DateTimeFormatter TIME_BUCKET_FORMATTER = DateTimeFormat.forPattern("yyyyMMddHHmm"); @Test public void testInitAndStart() { @@ -404,14 +405,15 @@ public class RunningRuleTest { } private Metrics getMetrics(long timeBucket, int value) { - MockMetrics mockMetrics = new MockMetrics(); + MockMetrics mockMetrics = MetricsObjectPool.get(MockMetrics.class); mockMetrics.setValue(value); mockMetrics.setTimeBucket(timeBucket); return mockMetrics; } private Metrics getMultipleValueMetrics(long timeBucket, int... values) { - MockMultipleValueMetrics mockMultipleValueMetrics = new MockMultipleValueMetrics(); + MockMultipleValueMetrics mockMultipleValueMetrics = + MetricsObjectPool.get(MockMultipleValueMetrics.class); mockMultipleValueMetrics.setValues(values); mockMultipleValueMetrics.setTimeBucket(timeBucket); return mockMultipleValueMetrics; @@ -419,13 +421,14 @@ public class RunningRuleTest { } private Metrics getLabeledValueMetrics(long timeBucket, String values) { - MockLabeledValueMetrics mockLabeledValueMetrics = new MockLabeledValueMetrics(); + MockLabeledValueMetrics mockLabeledValueMetrics = + MetricsObjectPool.get(MockLabeledValueMetrics.class); mockLabeledValueMetrics.setValue(new DataTable(values)); mockLabeledValueMetrics.setTimeBucket(timeBucket); return mockLabeledValueMetrics; } - private class MockMetrics extends Metrics implements IntValueHolder { + public static class MockMetrics extends Metrics implements IntValueHolder { private int value; @Override @@ -476,9 +479,17 @@ public class RunningRuleTest { public int remoteHashCode() { return 0; } + + @Override + public void recycle() { + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } - private class MockMultipleValueMetrics extends Metrics implements MultiIntValuesHolder { + public static class MockMultipleValueMetrics extends Metrics implements MultiIntValuesHolder { private int[] values; public void setValues(int[] values) { @@ -529,9 +540,17 @@ public class RunningRuleTest { public RemoteData.Builder serialize() { return null; } + + @Override + public void recycle() { + this.values = null; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } - private class MockLabeledValueMetrics extends Metrics implements LabeledValueHolder { + public static class MockLabeledValueMetrics extends Metrics implements LabeledValueHolder { @Getter @Setter @@ -576,6 +595,14 @@ public class RunningRuleTest { public RemoteData.Builder serialize() { return null; } + + @Override + public void recycle() { + this.value.recycle(); + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } private void assertLabeled(AlarmRule alarmRule) { diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/MetricsObjectPool.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/MetricsObjectPool.java new file mode 100644 index 0000000..d6a3966 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/MetricsObjectPool.java @@ -0,0 +1,47 @@ +/* + * 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.skywalking.oap.server.core; + +import io.netty.util.internal.ObjectPool; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import lombok.extern.slf4j.Slf4j; +import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics; + +@Slf4j +public final class MetricsObjectPool { + private static final Map<Class<? extends Metrics>, ObjectPool<Metrics>> POOLS = + new ConcurrentHashMap<>(); + + @SuppressWarnings("unchecked") + public static <T extends Metrics> T get(Class<T> type) { + final ObjectPool<Metrics> pool = POOLS.computeIfAbsent(type, __ -> ObjectPool.newPool( + handle -> { + try { + final Metrics m = type.getDeclaredConstructor().newInstance(); + m.handle(handle); + return m; + } catch (Exception e) { + log.error("Failed to create object for {}", type, e); + throw new RuntimeException(e); + } + }) + ); + return (T) pool.get(); + } +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Recyclable.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Recyclable.java new file mode 100644 index 0000000..6b50c48 --- /dev/null +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/Recyclable.java @@ -0,0 +1,26 @@ +/* + * 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.skywalking.oap.server.core; + +import io.netty.util.internal.ObjectPool; + +public interface Recyclable<T> { + void handle(ObjectPool.Handle<T> handle); + + void recycle(); +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/data/MergableBufferedData.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/data/MergableBufferedData.java index 501135d..687d891 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/data/MergableBufferedData.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/data/MergableBufferedData.java @@ -18,10 +18,10 @@ package org.apache.skywalking.oap.server.core.analysis.data; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics; /** @@ -61,7 +61,7 @@ public class MergableBufferedData<METRICS extends Metrics> implements BufferedDa @Override public List<METRICS> read() { try { - return buffer.values().stream().collect(Collectors.toList()); + return new ArrayList<>(buffer.values()); } finally { buffer.clear(); } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTraffic.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTraffic.java index e302904..05355f9 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTraffic.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/endpoint/EndpointTraffic.java @@ -44,12 +44,14 @@ public class EndpointTraffic extends Metrics { public static final String INDEX_NAME = "endpoint_traffic"; public static final String SERVICE_ID = "service_id"; + public static final String NAME = "name"; @Setter @Getter @Column(columnName = SERVICE_ID) private String serviceId; + @Setter @Getter @Column(columnName = NAME, matchQuery = true) @@ -86,6 +88,15 @@ public class EndpointTraffic extends Metrics { return hashCode(); } + @Override + public void recycle() { + this.serviceId = null; + this.name = Const.EMPTY_STRING; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } + public static class Builder implements StorageHashMapBuilder<EndpointTraffic> { @Override diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceTraffic.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceTraffic.java index e66595b..0f972a2 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceTraffic.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/instance/InstanceTraffic.java @@ -79,7 +79,7 @@ public class InstanceTraffic extends Metrics { if (instanceTraffic.getProperties() != null && instanceTraffic.getProperties().size() > 0) { this.properties = instanceTraffic.getProperties(); } - /** + /* * Keep the time bucket as the same time inserted. */ if (this.getTimeBucket() > metrics.getTimeBucket()) { @@ -125,6 +125,17 @@ public class InstanceTraffic extends Metrics { return IDManager.ServiceInstanceID.buildId(serviceId, name); } + @Override + public void recycle() { + this.serviceId = null; + this.name = null; + this.lastPingTimestamp = 0; + this.properties = null; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } + public static class Builder implements StorageHashMapBuilder<InstanceTraffic> { @Override public InstanceTraffic storage2Entity(final Map<String, Object> dbMap) { diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/networkalias/NetworkAddressAlias.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/networkalias/NetworkAddressAlias.java index 75b3ff7..964f7f6 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/networkalias/NetworkAddressAlias.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/networkalias/NetworkAddressAlias.java @@ -72,7 +72,7 @@ public class NetworkAddressAlias extends Metrics { this.representServiceId = alias.getRepresentServiceId(); this.representServiceInstanceId = alias.getRepresentServiceInstanceId(); this.lastUpdateTimeBucket = alias.getLastUpdateTimeBucket(); - /** + /* * Keep the time bucket as the same time inserted. */ if (this.getTimeBucket() > metrics.getTimeBucket()) { @@ -113,6 +113,17 @@ public class NetworkAddressAlias extends Metrics { return builder; } + @Override + public void recycle() { + this.address = null; + this.representServiceId = null; + this.representServiceInstanceId = null; + this.lastUpdateTimeBucket = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } + public static class Builder implements StorageHashMapBuilder<NetworkAddressAlias> { @Override public NetworkAddressAlias storage2Entity(final Map<String, Object> dbMap) { diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationDispatcher.java index 562b27e..5f162f1 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationDispatcher.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationDispatcher.java @@ -18,6 +18,7 @@ package org.apache.skywalking.oap.server.core.analysis.manual.relation.endpoint; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.analysis.IDManager; import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher; import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor; @@ -35,7 +36,7 @@ public class EndpointCallRelationDispatcher implements SourceDispatcher<Endpoint } private void serverSide(EndpointRelation source) { - EndpointRelationServerSideMetrics metrics = new EndpointRelationServerSideMetrics(); + EndpointRelationServerSideMetrics metrics = MetricsObjectPool.get(EndpointRelationServerSideMetrics.class); metrics.setTimeBucket(source.getTimeBucket()); metrics.setSourceEndpoint( IDManager.EndpointID.buildId(source.getServiceId(), source.getEndpoint())); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointRelationServerSideMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointRelationServerSideMetrics.java index 1feb1af..4be9f8f 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointRelationServerSideMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointRelationServerSideMetrics.java @@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.analysis.Stream; import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics; import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor; @@ -80,7 +81,7 @@ public class EndpointRelationServerSideMetrics extends Metrics { @Override public Metrics toHour() { - EndpointRelationServerSideMetrics metrics = new EndpointRelationServerSideMetrics(); + EndpointRelationServerSideMetrics metrics = MetricsObjectPool.get(EndpointRelationServerSideMetrics.class); metrics.setTimeBucket(toTimeBucketInHour()); metrics.setSourceEndpoint(getSourceEndpoint()); metrics.setDestEndpoint(getDestEndpoint()); @@ -91,7 +92,7 @@ public class EndpointRelationServerSideMetrics extends Metrics { @Override public Metrics toDay() { - EndpointRelationServerSideMetrics metrics = new EndpointRelationServerSideMetrics(); + EndpointRelationServerSideMetrics metrics = MetricsObjectPool.get(EndpointRelationServerSideMetrics.class); metrics.setTimeBucket(toTimeBucketInDay()); metrics.setSourceEndpoint(getSourceEndpoint()); metrics.setDestEndpoint(getDestEndpoint()); @@ -132,11 +133,22 @@ public class EndpointRelationServerSideMetrics extends Metrics { return remoteBuilder; } + @Override + public void recycle() { + this.sourceEndpoint = null; + this.destEndpoint = null; + this.componentId = 0; + this.entityId = null; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } + public static class Builder implements StorageHashMapBuilder<EndpointRelationServerSideMetrics> { @Override public EndpointRelationServerSideMetrics storage2Entity(Map<String, Object> dbMap) { - EndpointRelationServerSideMetrics metrics = new EndpointRelationServerSideMetrics(); + EndpointRelationServerSideMetrics metrics = MetricsObjectPool.get(EndpointRelationServerSideMetrics.class); metrics.setSourceEndpoint((String) dbMap.get(SOURCE_ENDPOINT)); metrics.setDestEndpoint((String) dbMap.get(DEST_ENDPOINT)); metrics.setComponentId(((Number) dbMap.get(COMPONENT_ID)).intValue()); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceCallRelationDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceCallRelationDispatcher.java index 19fd61a..c086fb9 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceCallRelationDispatcher.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceCallRelationDispatcher.java @@ -18,6 +18,7 @@ package org.apache.skywalking.oap.server.core.analysis.manual.relation.instance; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher; import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor; import org.apache.skywalking.oap.server.core.source.ServiceInstanceRelation; @@ -37,7 +38,8 @@ public class ServiceInstanceCallRelationDispatcher implements SourceDispatcher<S } private void serverSide(ServiceInstanceRelation source) { - ServiceInstanceRelationServerSideMetrics metrics = new ServiceInstanceRelationServerSideMetrics(); + ServiceInstanceRelationServerSideMetrics metrics = + MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class); metrics.setTimeBucket(source.getTimeBucket()); metrics.setSourceServiceId(source.getSourceServiceId()); metrics.setSourceServiceInstanceId(source.getSourceServiceInstanceId()); @@ -49,7 +51,8 @@ public class ServiceInstanceCallRelationDispatcher implements SourceDispatcher<S } private void clientSide(ServiceInstanceRelation source) { - ServiceInstanceRelationClientSideMetrics metrics = new ServiceInstanceRelationClientSideMetrics(); + ServiceInstanceRelationClientSideMetrics metrics = + MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class); metrics.setTimeBucket(source.getTimeBucket()); metrics.setSourceServiceId(source.getSourceServiceId()); metrics.setSourceServiceInstanceId(source.getSourceServiceInstanceId()); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationClientSideMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationClientSideMetrics.java index 1a49b98..d2ff768 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationClientSideMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationClientSideMetrics.java @@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.analysis.Stream; import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics; import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor; @@ -32,40 +33,53 @@ import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine; import org.apache.skywalking.oap.server.core.storage.StorageHashMapBuilder; import org.apache.skywalking.oap.server.core.storage.annotation.Column; -@Stream(name = ServiceInstanceRelationClientSideMetrics.INDEX_NAME, scopeId = DefaultScopeDefine.SERVICE_INSTANCE_RELATION, - builder = ServiceInstanceRelationClientSideMetrics.Builder.class, processor = MetricsStreamProcessor.class) +@Stream( + name = ServiceInstanceRelationClientSideMetrics.INDEX_NAME, + scopeId = DefaultScopeDefine.SERVICE_INSTANCE_RELATION, + builder = ServiceInstanceRelationClientSideMetrics.Builder.class, + processor = MetricsStreamProcessor.class) @EqualsAndHashCode(of = { "entityId" }, callSuper = true) public class ServiceInstanceRelationClientSideMetrics extends Metrics { public static final String INDEX_NAME = "service_instance_relation_client_side"; + public static final String SOURCE_SERVICE_ID = "source_service_id"; + public static final String SOURCE_SERVICE_INSTANCE_ID = "source_service_instance_id"; + public static final String DEST_SERVICE_ID = "dest_service_id"; + public static final String DEST_SERVICE_INSTANCE_ID = "dest_service_instance_id"; + public static final String COMPONENT_ID = "component_id"; @Setter @Getter @Column(columnName = SOURCE_SERVICE_ID) private String sourceServiceId; + @Setter @Getter @Column(columnName = SOURCE_SERVICE_INSTANCE_ID) private String sourceServiceInstanceId; + @Setter @Getter @Column(columnName = DEST_SERVICE_ID) private String destServiceId; + @Setter @Getter @Column(columnName = DEST_SERVICE_INSTANCE_ID) private String destServiceInstanceId; + @Setter @Getter @Column(columnName = COMPONENT_ID, storageOnly = true) private int componentId; + @Setter @Getter @Column(columnName = ENTITY_ID, length = 512) @@ -88,7 +102,8 @@ public class ServiceInstanceRelationClientSideMetrics extends Metrics { @Override public Metrics toHour() { - ServiceInstanceRelationClientSideMetrics metrics = new ServiceInstanceRelationClientSideMetrics(); + ServiceInstanceRelationClientSideMetrics metrics = + MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class); metrics.setTimeBucket(toTimeBucketInHour()); metrics.setSourceServiceId(getSourceServiceId()); metrics.setSourceServiceInstanceId(getSourceServiceInstanceId()); @@ -101,7 +116,8 @@ public class ServiceInstanceRelationClientSideMetrics extends Metrics { @Override public Metrics toDay() { - ServiceInstanceRelationClientSideMetrics metrics = new ServiceInstanceRelationClientSideMetrics(); + ServiceInstanceRelationClientSideMetrics metrics = + MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class); metrics.setTimeBucket(toTimeBucketInDay()); metrics.setSourceServiceId(getSourceServiceId()); metrics.setSourceServiceInstanceId(getSourceServiceInstanceId()); @@ -148,11 +164,26 @@ public class ServiceInstanceRelationClientSideMetrics extends Metrics { return remoteBuilder; } - public static class Builder implements StorageHashMapBuilder<ServiceInstanceRelationClientSideMetrics> { + @Override + public void recycle() { + this.sourceServiceId = null; + this.sourceServiceInstanceId = null; + this.destServiceId = null; + this.destServiceInstanceId = null; + this.componentId = 0; + this.entityId = null; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } + + public static class Builder + implements StorageHashMapBuilder<ServiceInstanceRelationClientSideMetrics> { @Override public ServiceInstanceRelationClientSideMetrics storage2Entity(Map<String, Object> dbMap) { - ServiceInstanceRelationClientSideMetrics metrics = new ServiceInstanceRelationClientSideMetrics(); + ServiceInstanceRelationClientSideMetrics metrics = + MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class); metrics.setEntityId((String) dbMap.get(ENTITY_ID)); metrics.setSourceServiceId((String) dbMap.get(SOURCE_SERVICE_ID)); metrics.setSourceServiceInstanceId((String) dbMap.get(SOURCE_SERVICE_INSTANCE_ID)); @@ -164,7 +195,8 @@ public class ServiceInstanceRelationClientSideMetrics extends Metrics { } @Override - public Map<String, Object> entity2Storage(ServiceInstanceRelationClientSideMetrics storageData) { + public Map<String, Object> entity2Storage( + ServiceInstanceRelationClientSideMetrics storageData) { Map<String, Object> map = new HashMap<>(); map.put(ENTITY_ID, storageData.getEntityId()); map.put(SOURCE_SERVICE_ID, storageData.getSourceServiceId()); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationServerSideMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationServerSideMetrics.java index 97fc99d..a21723b 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationServerSideMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationServerSideMetrics.java @@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.analysis.Stream; import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics; import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor; @@ -32,40 +33,53 @@ import org.apache.skywalking.oap.server.core.source.DefaultScopeDefine; import org.apache.skywalking.oap.server.core.storage.StorageHashMapBuilder; import org.apache.skywalking.oap.server.core.storage.annotation.Column; -@Stream(name = ServiceInstanceRelationServerSideMetrics.INDEX_NAME, scopeId = DefaultScopeDefine.SERVICE_INSTANCE_RELATION, - builder = ServiceInstanceRelationServerSideMetrics.Builder.class, processor = MetricsStreamProcessor.class) +@Stream( + name = ServiceInstanceRelationServerSideMetrics.INDEX_NAME, + scopeId = DefaultScopeDefine.SERVICE_INSTANCE_RELATION, + builder = ServiceInstanceRelationServerSideMetrics.Builder.class, + processor = MetricsStreamProcessor.class) @EqualsAndHashCode(of = { "entityId" }, callSuper = true) public class ServiceInstanceRelationServerSideMetrics extends Metrics { public static final String INDEX_NAME = "service_instance_relation_server_side"; + public static final String SOURCE_SERVICE_ID = "source_service_id"; + public static final String SOURCE_SERVICE_INSTANCE_ID = "source_service_instance_id"; + public static final String DEST_SERVICE_ID = "dest_service_id"; + public static final String DEST_SERVICE_INSTANCE_ID = "dest_service_instance_id"; + public static final String COMPONENT_ID = "component_id"; @Setter @Getter @Column(columnName = SOURCE_SERVICE_ID) private String sourceServiceId; + @Setter @Getter @Column(columnName = SOURCE_SERVICE_INSTANCE_ID) private String sourceServiceInstanceId; + @Setter @Getter @Column(columnName = DEST_SERVICE_ID) private String destServiceId; + @Setter @Getter @Column(columnName = DEST_SERVICE_INSTANCE_ID) private String destServiceInstanceId; + @Setter @Getter @Column(columnName = COMPONENT_ID, storageOnly = true) private int componentId; + @Setter @Getter @Column(columnName = ENTITY_ID, length = 512) @@ -88,7 +102,8 @@ public class ServiceInstanceRelationServerSideMetrics extends Metrics { @Override public Metrics toHour() { - ServiceInstanceRelationServerSideMetrics metrics = new ServiceInstanceRelationServerSideMetrics(); + ServiceInstanceRelationServerSideMetrics metrics = + MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class); metrics.setTimeBucket(toTimeBucketInHour()); metrics.setSourceServiceId(getSourceServiceId()); metrics.setSourceServiceInstanceId(getSourceServiceInstanceId()); @@ -101,7 +116,8 @@ public class ServiceInstanceRelationServerSideMetrics extends Metrics { @Override public Metrics toDay() { - ServiceInstanceRelationServerSideMetrics metrics = new ServiceInstanceRelationServerSideMetrics(); + ServiceInstanceRelationServerSideMetrics metrics = + MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class); metrics.setTimeBucket(toTimeBucketInDay()); metrics.setSourceServiceId(getSourceServiceId()); metrics.setSourceServiceInstanceId(getSourceServiceInstanceId()); @@ -148,11 +164,26 @@ public class ServiceInstanceRelationServerSideMetrics extends Metrics { return remoteBuilder; } - public static class Builder implements StorageHashMapBuilder<ServiceInstanceRelationServerSideMetrics> { + @Override + public void recycle() { + this.sourceServiceId = null; + this.sourceServiceInstanceId = null; + this.destServiceId = null; + this.destServiceInstanceId = null; + this.componentId = 0; + this.entityId = null; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } + + public static class Builder + implements StorageHashMapBuilder<ServiceInstanceRelationServerSideMetrics> { @Override public ServiceInstanceRelationServerSideMetrics storage2Entity(Map<String, Object> dbMap) { - ServiceInstanceRelationServerSideMetrics metrics = new ServiceInstanceRelationServerSideMetrics(); + ServiceInstanceRelationServerSideMetrics metrics = + MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class); metrics.setEntityId((String) dbMap.get(ENTITY_ID)); metrics.setSourceServiceId((String) dbMap.get(SOURCE_SERVICE_ID)); metrics.setSourceServiceInstanceId((String) dbMap.get(SOURCE_SERVICE_INSTANCE_ID)); @@ -164,7 +195,8 @@ public class ServiceInstanceRelationServerSideMetrics extends Metrics { } @Override - public Map<String, Object> entity2Storage(ServiceInstanceRelationServerSideMetrics storageData) { + public Map<String, Object> entity2Storage( + ServiceInstanceRelationServerSideMetrics storageData) { Map<String, Object> map = new HashMap<>(); map.put(ENTITY_ID, storageData.getEntityId()); map.put(SOURCE_SERVICE_ID, storageData.getSourceServiceId()); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceCallRelationDispatcher.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceCallRelationDispatcher.java index 867f546..d609bb3 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceCallRelationDispatcher.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceCallRelationDispatcher.java @@ -18,6 +18,7 @@ package org.apache.skywalking.oap.server.core.analysis.manual.relation.service; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.analysis.SourceDispatcher; import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor; import org.apache.skywalking.oap.server.core.source.ServiceRelation; @@ -37,7 +38,7 @@ public class ServiceCallRelationDispatcher implements SourceDispatcher<ServiceRe } private void serverSide(ServiceRelation source) { - ServiceRelationServerSideMetrics metrics = new ServiceRelationServerSideMetrics(); + ServiceRelationServerSideMetrics metrics = MetricsObjectPool.get(ServiceRelationServerSideMetrics.class); metrics.setTimeBucket(source.getTimeBucket()); metrics.setSourceServiceId(source.getSourceServiceId()); metrics.setDestServiceId(source.getDestServiceId()); @@ -47,7 +48,7 @@ public class ServiceCallRelationDispatcher implements SourceDispatcher<ServiceRe } private void clientSide(ServiceRelation source) { - ServiceRelationClientSideMetrics metrics = new ServiceRelationClientSideMetrics(); + ServiceRelationClientSideMetrics metrics = MetricsObjectPool.get(ServiceRelationClientSideMetrics.class); metrics.setTimeBucket(source.getTimeBucket()); metrics.setSourceServiceId(source.getSourceServiceId()); metrics.setDestServiceId(source.getDestServiceId()); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationClientSideMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationClientSideMetrics.java index 4bacf15..e8d02c8 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationClientSideMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationClientSideMetrics.java @@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.analysis.Stream; import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics; import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor; @@ -85,7 +86,7 @@ public class ServiceRelationClientSideMetrics extends Metrics { @Override public Metrics toHour() { - ServiceRelationClientSideMetrics metrics = new ServiceRelationClientSideMetrics(); + ServiceRelationClientSideMetrics metrics = MetricsObjectPool.get(ServiceRelationClientSideMetrics.class); metrics.setEntityId(getEntityId()); metrics.setTimeBucket(toTimeBucketInHour()); metrics.setSourceServiceId(getSourceServiceId()); @@ -96,7 +97,7 @@ public class ServiceRelationClientSideMetrics extends Metrics { @Override public Metrics toDay() { - ServiceRelationClientSideMetrics metrics = new ServiceRelationClientSideMetrics(); + ServiceRelationClientSideMetrics metrics = MetricsObjectPool.get(ServiceRelationClientSideMetrics.class); metrics.setEntityId(getEntityId()); metrics.setTimeBucket(toTimeBucketInDay()); metrics.setSourceServiceId(getSourceServiceId()); @@ -136,11 +137,22 @@ public class ServiceRelationClientSideMetrics extends Metrics { return remoteBuilder; } + @Override + public void recycle() { + this.sourceServiceId = null; + this.destServiceId = null; + this.componentId = 0; + this.entityId = null; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } + public static class Builder implements StorageHashMapBuilder<ServiceRelationClientSideMetrics> { @Override public ServiceRelationClientSideMetrics storage2Entity(Map<String, Object> dbMap) { - ServiceRelationClientSideMetrics metrics = new ServiceRelationClientSideMetrics(); + ServiceRelationClientSideMetrics metrics = MetricsObjectPool.get(ServiceRelationClientSideMetrics.class); metrics.setSourceServiceId((String) dbMap.get(SOURCE_SERVICE_ID)); metrics.setDestServiceId((String) dbMap.get(DEST_SERVICE_ID)); metrics.setComponentId(((Number) dbMap.get(COMPONENT_ID)).intValue()); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationServerSideMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationServerSideMetrics.java index 5e66b00..748d63c 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationServerSideMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationServerSideMetrics.java @@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.analysis.Stream; import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics; import org.apache.skywalking.oap.server.core.analysis.worker.MetricsStreamProcessor; @@ -78,7 +79,7 @@ public class ServiceRelationServerSideMetrics extends Metrics { @Override public Metrics toHour() { - ServiceRelationServerSideMetrics metrics = new ServiceRelationServerSideMetrics(); + ServiceRelationServerSideMetrics metrics = MetricsObjectPool.get(ServiceRelationServerSideMetrics.class); metrics.setTimeBucket(toTimeBucketInHour()); metrics.setSourceServiceId(getSourceServiceId()); metrics.setDestServiceId(getDestServiceId()); @@ -89,7 +90,7 @@ public class ServiceRelationServerSideMetrics extends Metrics { @Override public Metrics toDay() { - ServiceRelationServerSideMetrics metrics = new ServiceRelationServerSideMetrics(); + ServiceRelationServerSideMetrics metrics = MetricsObjectPool.get(ServiceRelationServerSideMetrics.class); metrics.setTimeBucket(toTimeBucketInDay()); metrics.setSourceServiceId(getSourceServiceId()); metrics.setDestServiceId(getDestServiceId()); @@ -129,11 +130,22 @@ public class ServiceRelationServerSideMetrics extends Metrics { return remoteBuilder; } + @Override + public void recycle() { + this.sourceServiceId = null; + this.destServiceId = null; + this.componentId = 0; + this.entityId = null; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } + public static class Builder implements StorageHashMapBuilder<ServiceRelationServerSideMetrics> { @Override public ServiceRelationServerSideMetrics storage2Entity(Map<String, Object> dbMap) { - ServiceRelationServerSideMetrics metrics = new ServiceRelationServerSideMetrics(); + ServiceRelationServerSideMetrics metrics = MetricsObjectPool.get(ServiceRelationServerSideMetrics.class); metrics.setEntityId((String) dbMap.get(ENTITY_ID)); metrics.setSourceServiceId((String) dbMap.get(SOURCE_SERVICE_ID)); metrics.setDestServiceId((String) dbMap.get(DEST_SERVICE_ID)); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java index d5ab808..32fdfc9 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/manual/service/ServiceTraffic.java @@ -94,6 +94,16 @@ public class ServiceTraffic extends Metrics { return builder; } + @Override + public void recycle() { + this.name = null; + this.nodeType = null; + this.group = null; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } + public static class Builder implements StorageHashMapBuilder<ServiceTraffic> { @Override diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java index 9930155..aa2beca 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/MeterSystem.java @@ -201,7 +201,7 @@ public class MeterSystem implements Service { CtClass metricsClass = classPool.makeClass(METER_CLASS_PACKAGE + className, parentClass); - /** + /* * Create empty construct */ try { @@ -213,15 +213,15 @@ public class MeterSystem implements Service { throw new UnexpectedException(e.getMessage(), e); } - /** + /* * Generate `AcceptableValue<T> createNew()` method. */ try { metricsClass.addMethod(CtNewMethod.make( "" + "public org.apache.skywalking.oap.server.core.analysis.meter.function.AcceptableValue createNew() {" - + " return new " + METER_CLASS_PACKAGE + className + "();" - + " }" + + " return org.apache.skywalking.oap.server.core.MetricsObjectPool.get(" + METER_CLASS_PACKAGE + className + ".class);" + + "}" , metricsClass)); } catch (CannotCompileException e) { log.error("Can't generate createNew method for " + className + ".", e); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunction.java index e6ee54e..46b51b7 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunction.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunction.java @@ -147,6 +147,15 @@ public abstract class HistogramFunction extends Metrics implements AcceptableVal return HistogramFunctionBuilder.class; } + @Override + public void recycle() { + this.entityId = null; + this.dataset.recycle(); + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } + public static class HistogramFunctionBuilder implements StorageHashMapBuilder<HistogramFunction> { @Override diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/PercentileFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/PercentileFunction.java index 2b67047..c2fa640 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/PercentileFunction.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/PercentileFunction.java @@ -42,28 +42,35 @@ import org.apache.skywalking.oap.server.core.storage.StorageHashMapBuilder; import org.apache.skywalking.oap.server.core.storage.annotation.Column; /** - * PercentileFunction is the implementation of {@link PercentileMetrics} in the meter system. The major difference is - * the PercentileFunction accepts the {@link PercentileArgument} as input rather than every single request. + * PercentileFunction is the implementation of {@link PercentileMetrics} in the meter system. The + * major difference is the PercentileFunction accepts the {@link PercentileArgument} as input rather + * than every single request. */ @MeterFunction(functionName = "percentile") @Slf4j -public abstract class PercentileFunction extends Metrics implements AcceptableValue<PercentileFunction.PercentileArgument>, MultiIntValuesHolder { +public abstract class PercentileFunction extends Metrics + implements AcceptableValue<PercentileFunction.PercentileArgument>, MultiIntValuesHolder { public static final String DATASET = "dataset"; + public static final String RANKS = "ranks"; + public static final String VALUE = "value"; @Setter @Getter @Column(columnName = ENTITY_ID, length = 512) private String entityId; + @Getter @Setter @Column(columnName = VALUE, dataType = Column.ValueDataType.LABELED_VALUE, storageOnly = true) private DataTable percentileValues = new DataTable(10); + @Getter @Setter @Column(columnName = DATASET, storageOnly = true) private DataTable dataset = new DataTable(30); + /** * Rank */ @@ -79,20 +86,23 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa if (dataset.size() > 0) { if (!value.getBucketedValues().isCompatible(dataset)) { throw new IllegalArgumentException( - "Incompatible BucketedValues [" + value + "] for current PercentileFunction[" + dataset + "]"); + "Incompatible BucketedValues [" + value + "] for current PercentileFunction[" + + dataset + "]"); } } for (final int rank : value.getRanks()) { if (rank <= 0) { - throw new IllegalArgumentException("Illegal rank value " + rank + ", must be positive"); + throw new IllegalArgumentException( + "Illegal rank value " + rank + ", must be positive"); } } if (ranks.size() > 0) { if (ranks.size() != value.getRanks().length) { throw new IllegalArgumentException( - "Incompatible ranks size = [" + value.getRanks().length + "] for current PercentileFunction[" + ranks + "Incompatible ranks size = [" + value.getRanks().length + + "] for current PercentileFunction[" + ranks .size() + "]"); } else { for (final int rank : value.getRanks()) { @@ -113,7 +123,8 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa final long[] values = value.getBucketedValues().getValues(); for (int i = 0; i < values.length; i++) { final long bucket = value.getBucketedValues().getBuckets()[i]; - String bucketName = bucket == Long.MIN_VALUE ? Bucket.INFINITE_NEGATIVE : String.valueOf(bucket); + String bucketName = + bucket == Long.MIN_VALUE ? Bucket.INFINITE_NEGATIVE : String.valueOf(bucket); final long bucketValue = values[i]; dataset.valueAccumulation(bucketName, bucketValue); } @@ -140,7 +151,8 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa return true; } else { if (!this.ranks.equals(ranksOfThat)) { - log.warn("Rank {} doesn't exist in the previous ranks {}", ranksOfThat, this.ranks); + log.warn( + "Rank {} doesn't exist in the previous ranks {}", ranksOfThat, this.ranks); return true; } } @@ -163,7 +175,8 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa } int count = 0; - final List<String> sortedKeys = dataset.sortedKeys(Comparator.comparingInt(Integer::parseInt)); + final List<String> sortedKeys = + dataset.sortedKeys(Comparator.comparingInt(Integer::parseInt)); int loopIndex = 0; @@ -175,7 +188,8 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa int roof = roofs[rankIdx]; if (count >= roof) { - percentileValues.put(String.valueOf(ranks.get(rankIdx)), Long.parseLong(key)); + percentileValues.put( + String.valueOf(ranks.get(rankIdx)), Long.parseLong(key)); loopIndex++; } else { break; @@ -259,10 +273,12 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa @Getter public static class PercentileArgument { private final BucketedValues bucketedValues; + private final int[] ranks; } - public static class PercentileFunctionBuilder implements StorageHashMapBuilder<PercentileFunction> { + public static class PercentileFunctionBuilder + implements StorageHashMapBuilder<PercentileFunction> { @Override public PercentileFunction storage2Entity(final Map<String, Object> dbMap) { @@ -294,10 +310,12 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa @Override public boolean equals(Object o) { - if (this == o) + if (this == o) { return true; - if (!(o instanceof PercentileFunction)) + } + if (!(o instanceof PercentileFunction)) { return false; + } PercentileFunction function = (PercentileFunction) o; return Objects.equals(entityId, function.entityId) && getTimeBucket() == function.getTimeBucket(); @@ -307,4 +325,16 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa public int hashCode() { return Objects.hash(entityId, getTimeBucket()); } + + @Override + public void recycle() { + this.entityId = null; + this.percentileValues.recycle(); + this.dataset.recycle(); + this.ranks.recycle(); + this.isCalculated = false; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgFunction.java index dc2dec3..86687b3 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgFunction.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgFunction.java @@ -213,4 +213,16 @@ public abstract class AvgFunction extends Metrics implements AcceptableValue<Lon public int hashCode() { return Objects.hash(entityId, getTimeBucket()); } + + @Override + public void recycle() { + this.entityId = null; + this.serviceId = null; + this.summation = 0; + this.count = 0; + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunction.java index f2bfc39..1bf6580 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunction.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunction.java @@ -221,4 +221,15 @@ public abstract class AvgHistogramFunction extends Metrics implements Acceptable public int hashCode() { return Objects.hash(entityId, getTimeBucket()); } + + @Override + public void recycle() { + this.entityId = null; + this.summation.recycle(); + this.count.recycle(); + this.dataset.recycle(); + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramPercentileFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramPercentileFunction.java index 1dd353f..50b0282 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramPercentileFunction.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramPercentileFunction.java @@ -378,4 +378,18 @@ public abstract class AvgHistogramPercentileFunction extends Metrics implements public int hashCode() { return Objects.hash(entityId, getTimeBucket()); } + + @Override + public void recycle() { + this.entityId = null; + this.percentileValues.recycle(); + this.summation.recycle(); + this.count.recycle(); + this.dataset.recycle(); + this.ranks.recycle(); + this.isCalculated = false; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgLabeledFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgLabeledFunction.java index 5e11958..ae88c19 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgLabeledFunction.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgLabeledFunction.java @@ -217,4 +217,16 @@ public abstract class AvgLabeledFunction extends Metrics implements AcceptableVa public int hashCode() { return Objects.hash(entityId, getTimeBucket()); } + + @Override + public void recycle() { + this.entityId = null; + this.serviceId = null; + this.summation.recycle(); + this.count.recycle(); + this.value.recycle(); + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/latest/LatestFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/latest/LatestFunction.java index 9e49426..5c619c6 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/latest/LatestFunction.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/latest/LatestFunction.java @@ -41,7 +41,8 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column; @MeterFunction(functionName = "latest") @ToString -public abstract class LatestFunction extends Metrics implements AcceptableValue<Long>, LongValueHolder { +public abstract class LatestFunction extends Metrics + implements AcceptableValue<Long>, LongValueHolder { protected static final String VALUE = "value"; @Setter @@ -62,23 +63,27 @@ public abstract class LatestFunction extends Metrics implements AcceptableValue< @Column(columnName = VALUE, dataType = Column.ValueDataType.COMMON_VALUE, function = Function.Latest) private long value; - @Override public void accept(MeterEntity entity, Long value) { + @Override + public void accept(MeterEntity entity, Long value) { this.entityId = entity.id(); this.serviceId = entity.serviceId(); this.value = value; } - @Entrance public final void combine(@SourceFrom long value) { + @Entrance + public final void combine(@SourceFrom long value) { this.value = value; } - @Override public final boolean combine(Metrics metrics) { + @Override + public final boolean combine(Metrics metrics) { LatestFunction latestFunction = (LatestFunction) metrics; combine(latestFunction.value); return true; } - @Override public void calculate() { + @Override + public void calculate() { } @@ -138,6 +143,16 @@ public abstract class LatestFunction extends Metrics implements AcceptableValue< return LatestFunction.LastestStorageBuilder.class; } + @Override + public void recycle() { + this.entityId = null; + this.serviceId = null; + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } + public static class LastestStorageBuilder implements StorageHashMapBuilder<LatestFunction> { @Override public LatestFunction storage2Entity(final Map<String, Object> dbMap) { diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/sum/SumFunction.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/sum/SumFunction.java index d229f6b..bd712fc 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/sum/SumFunction.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/sum/SumFunction.java @@ -41,7 +41,8 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column; @ToString @MeterFunction(functionName = "sum") -public abstract class SumFunction extends Metrics implements AcceptableValue<Long>, LongValueHolder { +public abstract class SumFunction extends Metrics + implements AcceptableValue<Long>, LongValueHolder { protected static final String VALUE = "value"; @Setter @@ -183,4 +184,14 @@ public abstract class SumFunction extends Metrics implements AcceptableValue<Lon public int hashCode() { return Objects.hash(getEntityId(), getTimeBucket()); } + + @Override + public void recycle() { + this.entityId = null; + this.serviceId = null; + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/ApdexMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/ApdexMetrics.java index 14b4750..ba275b1 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/ApdexMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/ApdexMetrics.java @@ -92,7 +92,13 @@ public abstract class ApdexMetrics extends Metrics implements IntValueHolder { } @Override - public int getValue() { - return value; + public void recycle() { + this.totalNum = 0; + this.sNum = 0; + this.tNum = 0; + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CPMMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CPMMetrics.java index bc0f02f..ae2e90d 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CPMMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CPMMetrics.java @@ -57,5 +57,14 @@ public abstract class CPMMetrics extends Metrics implements LongValueHolder { public void calculate() { this.value = total / getDurationInMinute(); } + + @Override + public void recycle() { + this.value = 0; + this.total = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CountMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CountMetrics.java index 9a22314..383dbd0 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CountMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/CountMetrics.java @@ -51,4 +51,12 @@ public abstract class CountMetrics extends Metrics implements LongValueHolder { @Override public void calculate() { } + + @Override + public void recycle() { + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DataTable.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DataTable.java index 0640d68..3ec0a10 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DataTable.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DataTable.java @@ -17,6 +17,7 @@ package org.apache.skywalking.oap.server.core.analysis.metrics; +import io.netty.util.internal.ObjectPool; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; @@ -26,6 +27,7 @@ import java.util.stream.Collectors; import lombok.EqualsAndHashCode; import lombok.ToString; import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.Recyclable; import org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObject; /** @@ -33,8 +35,8 @@ import org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObje */ @ToString @EqualsAndHashCode -public class DataTable implements StorageDataComplexObject<DataTable> { - private HashMap<String, Long> data; +public class DataTable implements StorageDataComplexObject<DataTable>, Recyclable<DataTable> { + private final HashMap<String, Long> data; public DataTable() { data = new HashMap<>(); @@ -153,4 +155,14 @@ public class DataTable implements StorageDataComplexObject<DataTable> { }); return this; } + + @Override + public void handle(final ObjectPool.Handle<DataTable> handle) { + // This is not directly pooled, don't need to handle it + } + + @Override + public void recycle() { + this.data.clear(); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DoubleAvgMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DoubleAvgMetrics.java index 9356c21..15e72a6 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DoubleAvgMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/DoubleAvgMetrics.java @@ -64,4 +64,15 @@ public abstract class DoubleAvgMetrics extends Metrics implements DoubleValueHol public final void calculate() { this.value = this.summation / this.count; } + + @Override + public void recycle() { + this.summation = 0; + this.count = 0; + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/HistogramMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/HistogramMetrics.java index dbb4870..208ced2 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/HistogramMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/HistogramMetrics.java @@ -87,4 +87,12 @@ public abstract class HistogramMetrics extends Metrics { @Override public final void calculate() { } + + @Override + public void recycle() { + this.dataset.recycle(); + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/IntList.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/IntList.java index b5bd9ef..ce3ee10 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/IntList.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/IntList.java @@ -18,11 +18,13 @@ package org.apache.skywalking.oap.server.core.analysis.metrics; +import io.netty.util.internal.ObjectPool; import java.util.ArrayList; import java.util.List; import lombok.EqualsAndHashCode; import lombok.ToString; import org.apache.skywalking.oap.server.core.Const; +import org.apache.skywalking.oap.server.core.Recyclable; import org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObject; /** @@ -30,11 +32,11 @@ import org.apache.skywalking.oap.server.core.storage.type.StorageDataComplexObje */ @ToString @EqualsAndHashCode -public class IntList implements StorageDataComplexObject<IntList> { +public class IntList implements StorageDataComplexObject<IntList>, Recyclable<IntList> { private List<Integer> data; public IntList(int initialSize) { - this.data = new ArrayList(initialSize); + this.data = new ArrayList<>(initialSize); } public IntList(String valueString) { @@ -84,4 +86,14 @@ public class IntList implements StorageDataComplexObject<IntList> { public int get(final int idx) { return this.data.get(idx); } + + @Override + public void handle(final ObjectPool.Handle<IntList> handle) { + // This is not directly pooled, don't need to handle it + } + + @Override + public void recycle() { + this.data.clear(); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetrics.java index 661281c..45e6be9 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetrics.java @@ -64,4 +64,14 @@ public abstract class LongAvgMetrics extends Metrics implements LongValueHolder public final void calculate() { this.value = this.summation / this.count; } + + @Override + public void recycle() { + this.summation = 0; + this.count = 0; + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxDoubleMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxDoubleMetrics.java index 5dcef23..0c4d2bc 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxDoubleMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxDoubleMetrics.java @@ -52,4 +52,12 @@ public abstract class MaxDoubleMetrics extends Metrics implements DoubleValueHol @Override public void calculate() { } + + @Override + public void recycle() { + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetrics.java index 9b70a47..a7387dc 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetrics.java @@ -55,4 +55,12 @@ public abstract class MaxLongMetrics extends Metrics implements LongValueHolder @Override public void calculate() { } + + @Override + public void recycle() { + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/Metrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/Metrics.java index 1bbcd06..b80d5e1 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/Metrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/Metrics.java @@ -18,9 +18,11 @@ package org.apache.skywalking.oap.server.core.analysis.metrics; +import io.netty.util.internal.ObjectPool; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; +import org.apache.skywalking.oap.server.core.Recyclable; import org.apache.skywalking.oap.server.core.analysis.TimeBucket; import org.apache.skywalking.oap.server.core.remote.data.StreamData; import org.apache.skywalking.oap.server.core.storage.StorageData; @@ -33,7 +35,7 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column; @EqualsAndHashCode(of = { "timeBucket" }) -public abstract class Metrics extends StreamData implements StorageData { +public abstract class Metrics extends StreamData implements StorageData, Recyclable<Metrics> { public static final String TIME_BUCKET = "time_bucket"; public static final String ENTITY_ID = "entity_id"; @@ -52,6 +54,8 @@ public abstract class Metrics extends StreamData implements StorageData { @Getter private long lastUpdateTimestamp = 0L; + protected ObjectPool.Handle<Metrics> handle; + /** * Merge the given metrics instance, these two must be the same metrics type. * @@ -153,4 +157,9 @@ public abstract class Metrics extends StreamData implements StorageData { } protected abstract String id0(); + + @Override + public void handle(final ObjectPool.Handle<Metrics> handle) { + this.handle = handle; + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinDoubleMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinDoubleMetrics.java index bdc45e6..8cc4300 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinDoubleMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinDoubleMetrics.java @@ -52,4 +52,12 @@ public abstract class MinDoubleMetrics extends Metrics implements DoubleValueHol @Override public void calculate() { } + + @Override + public void recycle() { + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetrics.java index 88f7fab..9be2984 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/MinLongMetrics.java @@ -52,4 +52,12 @@ public abstract class MinLongMetrics extends Metrics implements LongValueHolder @Override public void calculate() { } + + @Override + public void recycle() { + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetrics.java index aa6d32f..85bf20d 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetrics.java @@ -69,4 +69,14 @@ public abstract class PercentMetrics extends Metrics implements IntValueHolder { public int getValue() { return percentage; } + + @Override + public void recycle() { + this.total = 0; + this.percentage = 0; + this.match = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentileMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentileMetrics.java index 0e1b2a6..e65bb19 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentileMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentileMetrics.java @@ -124,4 +124,15 @@ public abstract class PercentileMetrics extends Metrics implements MultiIntValue .flatMapToInt(l -> IntStream.of(l.intValue())) .toArray(); } + + @Override + public void recycle() { + this.percentileValues.recycle(); + this.precision = 0; + this.dataset.recycle(); + this.isCalculated = false; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PxxMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PxxMetrics.java index a65ebce..6c31844 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PxxMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/PxxMetrics.java @@ -106,4 +106,15 @@ public abstract class PxxMetrics extends Metrics implements IntValueHolder { } } } + + @Override + public void recycle() { + this.value = 0; + this.precision = 0; + this.isCalculated = false; + this.detailGroup.recycle(); + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/RateMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/RateMetrics.java index 830f1d7..839a8d7 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/RateMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/RateMetrics.java @@ -73,4 +73,14 @@ public abstract class RateMetrics extends Metrics implements IntValueHolder { public int getValue() { return percentage; } + + @Override + public void recycle() { + this.denominator = 0; + this.percentage = 0; + this.numerator = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/SumMetrics.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/SumMetrics.java index a2f3d61..7eae61c 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/SumMetrics.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/metrics/SumMetrics.java @@ -51,4 +51,12 @@ public abstract class SumMetrics extends Metrics implements LongValueHolder { @Override public void calculate() { } + + @Override + public void recycle() { + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/ExportWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/ExportWorker.java index 63090bc..b6f322d 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/ExportWorker.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/ExportWorker.java @@ -25,8 +25,8 @@ import org.apache.skywalking.oap.server.core.worker.AbstractWorker; import org.apache.skywalking.oap.server.library.module.ModuleDefineHolder; /** - * A bridge worker. If the {@link ExporterModule} provider declared and provides a implementation of {@link - * MetricValuesExportService}, forward the export data to it. + * A bridge worker. If the {@link ExporterModule} provider declared and provides an implementation + * of {@link MetricValuesExportService}, forward the export data to it. */ public class ExportWorker extends AbstractWorker<ExportEvent> { private MetricValuesExportService exportService; diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsAggregateWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsAggregateWorker.java index 4e7c59e..5e8a20b 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsAggregateWorker.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsAggregateWorker.java @@ -43,17 +43,17 @@ import org.apache.skywalking.oap.server.telemetry.api.MetricsTag; @Slf4j public class MetricsAggregateWorker extends AbstractWorker<Metrics> { public final long l1FlushPeriod; - private AbstractWorker<Metrics> nextWorker; + private final AbstractWorker<Metrics> nextWorker; private final DataCarrier<Metrics> dataCarrier; private final MergableBufferedData<Metrics> mergeDataCache; - private CounterMetrics aggregationCounter; + private final CounterMetrics aggregationCounter; private long lastSendTime = 0; MetricsAggregateWorker(ModuleDefineHolder moduleDefineHolder, AbstractWorker<Metrics> nextWorker, String modelName, long l1FlushPeriod) { super(moduleDefineHolder); this.nextWorker = nextWorker; - this.mergeDataCache = new MergableBufferedData(); + this.mergeDataCache = new MergableBufferedData<>(); String name = "METRICS_L1_AGGREGATION"; this.dataCarrier = new DataCarrier<>("MetricsAggregateWorker." + modelName, name, 2, 10000); @@ -139,4 +139,4 @@ public class MetricsAggregateWorker extends AbstractWorker<Metrics> { flush(); } } -} \ No newline at end of file +} diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsPersistentWorker.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsPersistentWorker.java index b216bd0..1f30473 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsPersistentWorker.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsPersistentWorker.java @@ -67,7 +67,7 @@ public class MetricsPersistentWorker extends PersistenceWorker<Metrics> { private final boolean enableDatabaseSession; private final boolean supportUpdate; private long sessionTimeout; - private CounterMetrics aggregationCounter; + private final CounterMetrics aggregationCounter; /** * The counter for the round of persistent. */ @@ -81,13 +81,13 @@ public class MetricsPersistentWorker extends PersistenceWorker<Metrics> { /** * @since 8.7.0 TTL settings from {@link org.apache.skywalking.oap.server.core.CoreModuleConfig#getMetricsDataTTL()} */ - private int metricsDataTTL; + private final int metricsDataTTL; MetricsPersistentWorker(ModuleDefineHolder moduleDefineHolder, Model model, IMetricsDAO metricsDAO, AbstractWorker<Metrics> nextAlarmWorker, AbstractWorker<ExportEvent> nextExportWorker, MetricsTransWorker transWorker, boolean enableDatabaseSession, boolean supportUpdate, long storageSessionTimeout, int metricsDataTTL) { - super(moduleDefineHolder, new ReadWriteSafeCache<>(new MergableBufferedData(), new MergableBufferedData())); + super(moduleDefineHolder, new ReadWriteSafeCache<>(new MergableBufferedData<>(), new MergableBufferedData<>())); this.model = model; this.context = new HashMap<>(100); this.enableDatabaseSession = enableDatabaseSession; @@ -161,12 +161,12 @@ public class MetricsPersistentWorker extends PersistenceWorker<Metrics> { @Override public List<PrepareRequest> prepareBatch(Collection<Metrics> lastCollection) { if (persistentCounter++ % persistentMod != 0) { - return Collections.EMPTY_LIST; + return Collections.emptyList(); } long start = System.currentTimeMillis(); if (lastCollection.size() == 0) { - return Collections.EMPTY_LIST; + return Collections.emptyList(); } /* @@ -233,11 +233,20 @@ public class MetricsPersistentWorker extends PersistenceWorker<Metrics> { metrics.setLastUpdateTimestamp(timestamp); } - /* - * The `metrics` should be not changed in all above process. Exporter is an async process. - */ - nextExportWorker.ifPresent(exportEvenWorker -> exportEvenWorker.in( - new ExportEvent(metrics, ExportEvent.EventType.INCREMENT))); + if (nextExportWorker.isPresent()) { + /* + * The `metrics` should be not changed in all above process as exporter is an + * async process. + * + * Exporter is also responsible to recycle the passed-in metrics. + */ + nextExportWorker.get().in(new ExportEvent(metrics, ExportEvent.EventType.INCREMENT)); + } else { + /* + * No exporter is configured, metrics can be recycled right now. + */ + metrics.recycle(); + } } } catch (Throwable t) { log.error(t.getMessage(), t); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsStreamProcessor.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsStreamProcessor.java index 1fb1d41..d4691d9 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsStreamProcessor.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/worker/MetricsStreamProcessor.java @@ -119,7 +119,6 @@ public class MetricsStreamProcessor implements StreamProcessor<Metrics> { this.create(moduleDefineHolder, StreamDefinition.from(stream), metricsClass); } - @SuppressWarnings("unchecked") public void create(ModuleDefineHolder moduleDefineHolder, StreamDefinition stream, Class<? extends Metrics> metricsClass) throws StorageException { @@ -148,7 +147,7 @@ public class MetricsStreamProcessor implements StreamProcessor<Metrics> { MetricsTransWorker transWorker = null; final MetricsExtension metricsExtension = metricsClass.getAnnotation(MetricsExtension.class); - /** + /* * All metrics default are `supportDownSampling` and `insertAndUpdate`, unless it has explicit definition. */ boolean supportDownSampling = true; diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/exporter/ExportEvent.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/exporter/ExportEvent.java index 8a38efc..524ed7a 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/exporter/ExportEvent.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/exporter/ExportEvent.java @@ -19,6 +19,7 @@ package org.apache.skywalking.oap.server.core.exporter; import lombok.Getter; +import lombok.RequiredArgsConstructor; import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics; /** @@ -26,17 +27,13 @@ import org.apache.skywalking.oap.server.core.analysis.metrics.Metrics; * changed in any case. */ @Getter +@RequiredArgsConstructor public class ExportEvent { /** * Fields of this should not be changed in any case. */ - private Metrics metrics; - private EventType type; - - public ExportEvent(Metrics metrics, EventType type) { - this.metrics = metrics; - this.type = type; - } + private final Metrics metrics; + private final EventType type; public enum EventType { /** diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/GRPCRemoteClient.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/GRPCRemoteClient.java index 51fda20..b2e90ae 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/GRPCRemoteClient.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/remote/client/GRPCRemoteClient.java @@ -28,6 +28,7 @@ import java.util.concurrent.atomic.AtomicInteger; import lombok.extern.slf4j.Slf4j; import org.apache.skywalking.apm.commons.datacarrier.DataCarrier; import org.apache.skywalking.apm.commons.datacarrier.consumer.IConsumer; +import org.apache.skywalking.oap.server.core.Recyclable; import org.apache.skywalking.oap.server.core.remote.data.StreamData; import org.apache.skywalking.oap.server.core.remote.grpc.proto.Empty; import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteMessage; @@ -149,6 +150,10 @@ public class GRPCRemoteClient implements RemoteClient { builder.setRemoteData(streamData.serialize()); this.getDataCarrier().produce(builder.build()); + + if (streamData instanceof Recyclable) { + ((Recyclable<?>) streamData).recycle(); + } } class RemoteMessageConsumer implements IConsumer<RemoteMessage> { diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Event.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Event.java index f985d08..7d8a14e 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Event.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/Event.java @@ -230,6 +230,24 @@ public class Event extends Metrics implements ISource, WithMetadata, LongValueHo return id; } + @Override + public void recycle() { + this.uuid = null; + this.service = null; + this.serviceInstance = null; + this.endpoint = null; + this.name = null; + this.type = null; + this.message = null; + this.parameters = null; + this.startTime = 0; + this.endTime = 0; + this.value = 0; + setTimeBucket(0); + setLastUpdateTimestamp(0); + handle.recycle(this); + } + public static class Builder implements StorageHashMapBuilder<Event> { @Override public Map<String, Object> entity2Storage(Event storageData) { diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationTest.java index c509604..f9846ef 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/endpoint/EndpointCallRelationTest.java @@ -18,18 +18,21 @@ package org.apache.skywalking.oap.server.core.analysis.manual.relation.endpoint; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.junit.Assert; import org.junit.Test; public class EndpointCallRelationTest { @Test public void testEndpointRelationServerSideMetricsEquals() { - EndpointRelationServerSideMetrics thisObject = new EndpointRelationServerSideMetrics(); + EndpointRelationServerSideMetrics thisObject = + MetricsObjectPool.get(EndpointRelationServerSideMetrics.class); thisObject.setEntityId( "VXNlcg==.0-VXNlcg==-em1iaXotcHJvbW90aW9uMi1hZG1pbkAxMjUyNw==.1-L0Bpbi9hcGkvaGVhbHRo"); thisObject.setTimeBucket(202101071505L); - EndpointRelationServerSideMetrics otherObject = new EndpointRelationServerSideMetrics(); + EndpointRelationServerSideMetrics otherObject = + MetricsObjectPool.get(EndpointRelationServerSideMetrics.class); otherObject.setEntityId( "VXNlcg==.0-VXNlcg==-em1iaXotcHJvbW90aW9uMi1hZG1pbkAxMjUyNw==.1-L0Bpbi9hcGkvaGVhbHRo"); otherObject.setTimeBucket(202101071505L); @@ -39,12 +42,14 @@ public class EndpointCallRelationTest { @Test public void testEndpointRelationServerSideMetricsNotEquals() { - EndpointRelationServerSideMetrics thisObject = new EndpointRelationServerSideMetrics(); + EndpointRelationServerSideMetrics thisObject = + MetricsObjectPool.get(EndpointRelationServerSideMetrics.class); thisObject.setEntityId( "VXNlcg==.0-VXNlcg==-em1iaXotcHJvbW90aW9uMi1hZG1pbkAxMjUyNw==.1-L0Bpbi9hcGkvaGVhbHRo"); thisObject.setTimeBucket(202101071505L); - EndpointRelationServerSideMetrics otherObject = new EndpointRelationServerSideMetrics(); + EndpointRelationServerSideMetrics otherObject = + MetricsObjectPool.get(EndpointRelationServerSideMetrics.class); otherObject.setEntityId( "VXNlcg==.0-VXNlcg==-em1iaXotcHJvbW90aW9uMi1hZG1pbkAxMjUyNw==.1-L0Bpbi9hcGkvaGVhbHRo"); otherObject.setTimeBucket(202101071506L); diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationTest.java index 18dc008..5d3b696 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/instance/ServiceInstanceRelationTest.java @@ -18,18 +18,21 @@ package org.apache.skywalking.oap.server.core.analysis.manual.relation.instance; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.junit.Assert; import org.junit.Test; public class ServiceInstanceRelationTest { @Test public void testServiceInstanceRelationClientSideMetricsEquals() { - ServiceInstanceRelationClientSideMetrics thisObject = new ServiceInstanceRelationClientSideMetrics(); + ServiceInstanceRelationClientSideMetrics thisObject = + MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class); thisObject.setEntityId( "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY="); thisObject.setTimeBucket(202101071505L); - ServiceInstanceRelationClientSideMetrics otherObject = new ServiceInstanceRelationClientSideMetrics(); + ServiceInstanceRelationClientSideMetrics otherObject = + MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class); otherObject.setEntityId( "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY="); otherObject.setTimeBucket(202101071505L); @@ -39,12 +42,14 @@ public class ServiceInstanceRelationTest { @Test public void testServiceInstanceRelationClientSideMetricsNotEquals() { - ServiceInstanceRelationClientSideMetrics thisObject = new ServiceInstanceRelationClientSideMetrics(); + ServiceInstanceRelationClientSideMetrics thisObject = + MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class); thisObject.setEntityId( "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY="); thisObject.setTimeBucket(202101071505L); - ServiceInstanceRelationClientSideMetrics otherObject = new ServiceInstanceRelationClientSideMetrics(); + ServiceInstanceRelationClientSideMetrics otherObject = + MetricsObjectPool.get(ServiceInstanceRelationClientSideMetrics.class); otherObject.setEntityId( "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY="); otherObject.setTimeBucket(202101071506L); @@ -54,12 +59,14 @@ public class ServiceInstanceRelationTest { @Test public void testServiceInstanceRelationServerSideMetricsEquals() { - ServiceInstanceRelationServerSideMetrics thisObject = new ServiceInstanceRelationServerSideMetrics(); + ServiceInstanceRelationServerSideMetrics thisObject = + MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class); thisObject.setEntityId( "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY="); thisObject.setTimeBucket(202101071505L); - ServiceInstanceRelationServerSideMetrics otherObject = new ServiceInstanceRelationServerSideMetrics(); + ServiceInstanceRelationServerSideMetrics otherObject = + MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class); otherObject.setEntityId( "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY="); otherObject.setTimeBucket(202101071505L); @@ -69,12 +76,14 @@ public class ServiceInstanceRelationTest { @Test public void testServiceInstanceRelationServerSideMetricsNotEquals() { - ServiceInstanceRelationServerSideMetrics thisObject = new ServiceInstanceRelationServerSideMetrics(); + ServiceInstanceRelationServerSideMetrics thisObject = + MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class); thisObject.setEntityId( "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY="); thisObject.setTimeBucket(202101071505L); - ServiceInstanceRelationServerSideMetrics otherObject = new ServiceInstanceRelationServerSideMetrics(); + ServiceInstanceRelationServerSideMetrics otherObject = + MetricsObjectPool.get(ServiceInstanceRelationServerSideMetrics.class); otherObject.setEntityId( "em1jLWJlYWNvbi1taWRkbGV3YXJlQDExMTIz.1_MTAuMTExLjIzMi4yMDc=-MTkyLjE2OC40Ni4xNDM6NDY2MDY=.0_MTkyLjE2OC40Ni4xNDM6NDY2MDY="); otherObject.setTimeBucket(202101071506L); diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationTest.java index 6bf8282..002250d 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/manual/relation/service/ServiceRelationTest.java @@ -18,17 +18,20 @@ package org.apache.skywalking.oap.server.core.analysis.manual.relation.service; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.junit.Assert; import org.junit.Test; public class ServiceRelationTest { @Test public void testServiceRelationClientSideMetricsEquals() { - ServiceRelationClientSideMetrics thisObject = new ServiceRelationClientSideMetrics(); + ServiceRelationClientSideMetrics thisObject = + MetricsObjectPool.get(ServiceRelationClientSideMetrics.class); thisObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1"); thisObject.setTimeBucket(202101071505L); - ServiceRelationClientSideMetrics otherObject = new ServiceRelationClientSideMetrics(); + ServiceRelationClientSideMetrics otherObject = + MetricsObjectPool.get(ServiceRelationClientSideMetrics.class); otherObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1"); otherObject.setTimeBucket(202101071505L); @@ -37,11 +40,13 @@ public class ServiceRelationTest { @Test public void testServiceRelationClientSideMetricsNotEquals() { - ServiceRelationClientSideMetrics thisObject = new ServiceRelationClientSideMetrics(); + ServiceRelationClientSideMetrics thisObject = + MetricsObjectPool.get(ServiceRelationClientSideMetrics.class); thisObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1"); thisObject.setTimeBucket(202101071505L); - ServiceRelationClientSideMetrics otherObject = new ServiceRelationClientSideMetrics(); + ServiceRelationClientSideMetrics otherObject = + MetricsObjectPool.get(ServiceRelationClientSideMetrics.class); otherObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1"); otherObject.setTimeBucket(202101071506L); @@ -50,11 +55,13 @@ public class ServiceRelationTest { @Test public void testServiceRelationServerSideMetricsEquals() { - ServiceRelationServerSideMetrics thisObject = new ServiceRelationServerSideMetrics(); + ServiceRelationServerSideMetrics thisObject = + MetricsObjectPool.get(ServiceRelationServerSideMetrics.class); thisObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1"); thisObject.setTimeBucket(202101071505L); - ServiceRelationServerSideMetrics otherObject = new ServiceRelationServerSideMetrics(); + ServiceRelationServerSideMetrics otherObject = + MetricsObjectPool.get(ServiceRelationServerSideMetrics.class); otherObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1"); otherObject.setTimeBucket(202101071505L); @@ -63,11 +70,13 @@ public class ServiceRelationTest { @Test public void testServiceRelationServerSideMetricsNotEquals() { - ServiceRelationServerSideMetrics thisObject = new ServiceRelationServerSideMetrics(); + ServiceRelationServerSideMetrics thisObject = + MetricsObjectPool.get(ServiceRelationServerSideMetrics.class); thisObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1"); thisObject.setTimeBucket(202101071505L); - ServiceRelationServerSideMetrics otherObject = new ServiceRelationServerSideMetrics(); + ServiceRelationServerSideMetrics otherObject = + MetricsObjectPool.get(ServiceRelationServerSideMetrics.class); otherObject.setEntityId("VXNlcg==.0-em0tY2xpZW50LXNldHRpbmctd2ViYXBpQDEwNjQ4.1"); otherObject.setTimeBucket(202101071506L); diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunctionTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunctionTest.java index 5ddbb0a..9804a4a 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunctionTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/HistogramFunctionTest.java @@ -20,6 +20,7 @@ package org.apache.skywalking.oap.server.core.analysis.meter.function; import java.util.Map; import java.util.stream.IntStream; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.analysis.meter.MeterEntity; import org.apache.skywalking.oap.server.core.analysis.metrics.DataTable; import org.apache.skywalking.oap.server.core.query.type.Bucket; @@ -54,7 +55,7 @@ public class HistogramFunctionTest { @Test public void testFunction() { - HistogramFunctionInst inst = new HistogramFunctionInst(); + HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class); inst.accept( MeterEntity.newService("service-test"), new BucketedValues( @@ -90,7 +91,7 @@ public class HistogramFunctionTest { @Test public void testFunctionWithInfinite() { - HistogramFunctionInst inst = new HistogramFunctionInst(); + HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class); inst.accept( MeterEntity.newService("service-test"), new BucketedValues( @@ -118,7 +119,7 @@ public class HistogramFunctionTest { @Test(expected = IllegalArgumentException.class) public void testIncompatible() { - HistogramFunctionInst inst = new HistogramFunctionInst(); + HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class); inst.accept( MeterEntity.newService("service-test"), new BucketedValues( @@ -144,7 +145,7 @@ public class HistogramFunctionTest { @Test public void testSerialization() { - HistogramFunctionInst inst = new HistogramFunctionInst(); + HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class); inst.accept( MeterEntity.newService("service-test"), new BucketedValues( @@ -156,7 +157,7 @@ public class HistogramFunctionTest { }) ); - final HistogramFunctionInst inst2 = new HistogramFunctionInst(); + final HistogramFunctionInst inst2 = MetricsObjectPool.get(HistogramFunctionInst.class); inst2.deserialize(inst.serialize().build()); Assert.assertEquals(inst, inst2); @@ -166,7 +167,7 @@ public class HistogramFunctionTest { @Test public void testSerializationInInfinite() { - HistogramFunctionInst inst = new HistogramFunctionInst(); + HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class); inst.accept( MeterEntity.newService("service-test"), new BucketedValues( @@ -178,7 +179,7 @@ public class HistogramFunctionTest { }) ); - final HistogramFunctionInst inst2 = new HistogramFunctionInst(); + final HistogramFunctionInst inst2 = MetricsObjectPool.get(HistogramFunctionInst.class); inst2.deserialize(inst.serialize().build()); Assert.assertEquals(inst, inst2); @@ -188,7 +189,7 @@ public class HistogramFunctionTest { @Test public void testBuilder() throws IllegalAccessException, InstantiationException { - HistogramFunctionInst inst = new HistogramFunctionInst(); + HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class); inst.accept( MeterEntity.newService("service-test"), new BucketedValues( @@ -212,11 +213,11 @@ public class HistogramFunctionTest { Assert.assertEquals(inst.getDataset(), inst2.getDataset()); } - private static class HistogramFunctionInst extends HistogramFunction { + public static class HistogramFunctionInst extends HistogramFunction { @Override public AcceptableValue<BucketedValues> createNew() { - return new HistogramFunctionInst(); + return MetricsObjectPool.get(HistogramFunctionInst.class); } } } diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunctionTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunctionTest.java index b5d0588..b9a2800 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunctionTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramFunctionTest.java @@ -20,6 +20,7 @@ package org.apache.skywalking.oap.server.core.analysis.meter.function.avg; import java.util.Map; import java.util.stream.IntStream; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.analysis.meter.MeterEntity; import org.apache.skywalking.oap.server.core.analysis.meter.function.AcceptableValue; import org.apache.skywalking.oap.server.core.analysis.meter.function.BucketedValues; @@ -51,7 +52,7 @@ public class AvgHistogramFunctionTest { @Test public void testFunction() { - HistogramFunctionInst inst = new HistogramFunctionInst(); + HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class); inst.accept( MeterEntity.newService("service-test"), new BucketedValues( @@ -88,7 +89,7 @@ public class AvgHistogramFunctionTest { @Test public void testFunctionWithInfinite() { - HistogramFunctionInst inst = new HistogramFunctionInst(); + HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class); inst.accept( MeterEntity.newService("service-test"), new BucketedValues( @@ -118,7 +119,7 @@ public class AvgHistogramFunctionTest { @Test public void testSerialization() { - HistogramFunctionInst inst = new HistogramFunctionInst(); + HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class); inst.accept( MeterEntity.newService("service-test"), new BucketedValues( @@ -131,7 +132,7 @@ public class AvgHistogramFunctionTest { ); inst.calculate(); - final HistogramFunctionInst inst2 = new HistogramFunctionInst(); + final HistogramFunctionInst inst2 = MetricsObjectPool.get(HistogramFunctionInst.class); inst2.deserialize(inst.serialize().build()); Assert.assertEquals(inst, inst2); @@ -141,7 +142,7 @@ public class AvgHistogramFunctionTest { @Test public void testSerializationInInfinite() { - HistogramFunctionInst inst = new HistogramFunctionInst(); + HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class); inst.accept( MeterEntity.newService("service-test"), new BucketedValues( @@ -153,7 +154,7 @@ public class AvgHistogramFunctionTest { }) ); - final HistogramFunctionInst inst2 = new HistogramFunctionInst(); + final HistogramFunctionInst inst2 = MetricsObjectPool.get(HistogramFunctionInst.class); inst2.deserialize(inst.serialize().build()); Assert.assertEquals(inst, inst2); @@ -163,7 +164,7 @@ public class AvgHistogramFunctionTest { @Test public void testBuilder() throws IllegalAccessException, InstantiationException { - HistogramFunctionInst inst = new HistogramFunctionInst(); + HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class); inst.accept( MeterEntity.newService("service-test"), new BucketedValues( @@ -193,7 +194,7 @@ public class AvgHistogramFunctionTest { @Test public void testGroup() { - HistogramFunctionInst inst = new HistogramFunctionInst(); + HistogramFunctionInst inst = MetricsObjectPool.get(HistogramFunctionInst.class); BucketedValues bv1 = new BucketedValues( BUCKETS, new long[] { 0, @@ -244,11 +245,11 @@ public class AvgHistogramFunctionTest { }, results); } - private static class HistogramFunctionInst extends AvgHistogramFunction { + public static class HistogramFunctionInst extends AvgHistogramFunction { @Override public AcceptableValue<BucketedValues> createNew() { - return new HistogramFunctionInst(); + return MetricsObjectPool.get(HistogramFunctionInst.class); } } } diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetricsTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetricsTest.java index 4867dc5..9e848d6 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetricsTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/LongAvgMetricsTest.java @@ -18,6 +18,7 @@ package org.apache.skywalking.oap.server.core.analysis.metrics; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData; import org.junit.Assert; import org.junit.Test; @@ -25,7 +26,7 @@ import org.junit.Test; public class LongAvgMetricsTest { @Test public void testEntranceCombine() { - LongAvgMetricsImpl impl = new LongAvgMetricsImpl(); + LongAvgMetricsImpl impl = MetricsObjectPool.get(LongAvgMetricsImpl.class); impl.combine(12, 1); impl.combine(24, 2); impl.combine(36, 3); @@ -35,11 +36,11 @@ public class LongAvgMetricsTest { @Test public void testSelfCombine() { - LongAvgMetricsImpl impl = new LongAvgMetricsImpl(); + LongAvgMetricsImpl impl = MetricsObjectPool.get(LongAvgMetricsImpl.class); impl.combine(12, 1); impl.combine(24, 2); - LongAvgMetricsImpl impl2 = new LongAvgMetricsImpl(); + LongAvgMetricsImpl impl2 = MetricsObjectPool.get(LongAvgMetricsImpl.class); impl2.combine(24, 1); impl2.combine(48, 2); @@ -49,7 +50,7 @@ public class LongAvgMetricsTest { Assert.assertEquals(18, impl.getValue()); } - public class LongAvgMetricsImpl extends LongAvgMetrics { + public static class LongAvgMetricsImpl extends LongAvgMetrics { @Override protected String id0() { diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetricsTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetricsTest.java index f3dcd24..0c7be6e 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetricsTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MaxLongMetricsTest.java @@ -18,6 +18,7 @@ package org.apache.skywalking.oap.server.core.analysis.metrics; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData; import org.junit.Assert; import org.junit.Test; @@ -29,7 +30,7 @@ public class MaxLongMetricsTest { @Test public void testEntranceCombine() { - MaxLongMetricsImpl impl = new MaxLongMetricsImpl(); + MaxLongMetricsImpl impl = MetricsObjectPool.get(MaxLongMetricsImpl.class); impl.combine(10); impl.combine(5); impl.combine(20); @@ -39,11 +40,11 @@ public class MaxLongMetricsTest { @Test public void testSelfCombine() { - MaxLongMetricsImpl impl = new MaxLongMetricsImpl(); + MaxLongMetricsImpl impl = MetricsObjectPool.get(MaxLongMetricsImpl.class); impl.combine(10); impl.combine(5); - MaxLongMetricsImpl impl2 = new MaxLongMetricsImpl(); + MaxLongMetricsImpl impl2 = MetricsObjectPool.get(MaxLongMetricsImpl.class); impl2.combine(2); impl2.combine(6); @@ -51,7 +52,7 @@ public class MaxLongMetricsTest { Assert.assertEquals(10, impl.getValue()); } - public class MaxLongMetricsImpl extends MaxLongMetrics { + public static class MaxLongMetricsImpl extends MaxLongMetrics { @Override protected String id0() { diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MetricsTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MetricsTest.java index 351441e..2b9dcfd 100644 --- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MetricsTest.java +++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/MetricsTest.java @@ -18,6 +18,7 @@ package org.apache.skywalking.oap.server.core.analysis.metrics; +import org.apache.skywalking.oap.server.core.MetricsObjectPool; import org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData; import org.junit.Assert; import org.junit.Test; @@ -25,13 +26,13 @@ import org.junit.Test; public class MetricsTest { @Test public void testTransferToTimeBucket() { - MetricsMocker mocker = new MetricsMocker(); + MetricsMocker mocker = MetricsObjectPool.get(MetricsMocker.class); mocker.setTimeBucket(201809120511L); Assert.assertEquals(2018091205L, mocker.toTimeBucketInHour()); Assert.assertEquals(20180912L, mocker.toTimeBucketInDay()); - mocker = new MetricsMocker(); + mocker = MetricsObjectPool.get(MetricsMocker.class); mocker.setTimeBucket(2018091205L); Assert.assertEquals(20180912L, mocker.toTimeBucketInDay()); @@ -39,7 +40,7 @@ public class MetricsTest { @Test public void testIllegalTransferToTimeBucket() { - MetricsMocker mocker = new MetricsMocker(); + MetricsMocker mocker = MetricsObjectPool.get(MetricsMocker.class); mocker.setTimeBucket(2018091205L); boolean status = true; @@ -50,7 +51,7 @@ public class MetricsTest { } Assert.assertFalse(status); - mocker = new MetricsMocker(); + mocker = MetricsObjectPool.get(MetricsMocker.class); mocker.setTimeBucket(20180912L); status = true; @@ -70,7 +71,7 @@ public class MetricsTest { Assert.assertFalse(status); } - public class MetricsMocker extends Metrics { + public static class MetricsMocker extends Metrics { @Override protected String id0() { @@ -111,5 +112,10 @@ public class MetricsTest { public int remoteHashCode() { return 0; } + + @Override + public void recycle() { + handle.recycle(this); + } } }
