You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ke...@apache.org on 2021/02/04 04:25:41 UTC

[skywalking] branch enhance/metrics-combination created (now db540ec)

This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a change to branch enhance/metrics-combination
in repository https://gitbox.apache.org/repos/asf/skywalking.git.


      at db540ec  Metrics combination API supports abandoning results

This branch includes the following new commits:

     new db540ec  Metrics combination API supports abandoning results

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[skywalking] 01/01: Metrics combination API supports abandoning results

Posted by ke...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

kezhenxu94 pushed a commit to branch enhance/metrics-combination
in repository https://gitbox.apache.org/repos/asf/skywalking.git

commit db540ec9e9dcfe4364dc0bb45f013ea9909a7409
Author: kezhenxu94 <ke...@apache.org>
AuthorDate: Thu Feb 4 12:25:12 2021 +0800

    Metrics combination API supports abandoning results
---
 CHANGES.md                                         |  4 +-
 .../server/exporter/provider/grpc/MockMetrics.java |  4 +-
 .../core/alarm/provider/RunningRuleTest.java       | 12 ++---
 .../core/analysis/data/MergableBufferedData.java   |  5 ++-
 .../analysis/manual/endpoint/EndpointTraffic.java  |  4 +-
 .../analysis/manual/instance/InstanceTraffic.java  |  3 +-
 .../manual/networkalias/NetworkAddressAlias.java   |  3 +-
 .../EndpointRelationServerSideMetrics.java         |  4 +-
 .../ServiceInstanceRelationClientSideMetrics.java  |  4 +-
 .../ServiceInstanceRelationServerSideMetrics.java  |  4 +-
 .../service/ServiceRelationClientSideMetrics.java  |  4 +-
 .../service/ServiceRelationServerSideMetrics.java  |  4 +-
 .../analysis/manual/service/ServiceTraffic.java    |  4 +-
 .../analysis/meter/function/HistogramFunction.java |  5 ++-
 .../meter/function/PercentileFunction.java         |  9 ++--
 .../analysis/meter/function/avg/AvgFunction.java   |  3 +-
 .../meter/function/avg/AvgHistogramFunction.java   |  3 +-
 .../avg/AvgHistogramPercentileFunction.java        |  7 +--
 .../meter/function/avg/AvgLabeledFunction.java     |  3 +-
 .../meter/function/latest/LatestFunction.java      |  3 +-
 .../server/core/analysis/metrics/ApdexMetrics.java |  3 +-
 .../server/core/analysis/metrics/CPMMetrics.java   |  3 +-
 .../server/core/analysis/metrics/CountMetrics.java |  3 +-
 .../core/analysis/metrics/DoubleAvgMetrics.java    |  3 +-
 .../core/analysis/metrics/HistogramMetrics.java    |  3 +-
 .../core/analysis/metrics/LongAvgMetrics.java      |  3 +-
 .../core/analysis/metrics/MaxDoubleMetrics.java    |  3 +-
 .../core/analysis/metrics/MaxLongMetrics.java      |  3 +-
 .../oap/server/core/analysis/metrics/Metrics.java  |  3 +-
 .../core/analysis/metrics/MinDoubleMetrics.java    |  3 +-
 .../core/analysis/metrics/MinLongMetrics.java      |  3 +-
 .../core/analysis/metrics/PercentMetrics.java      |  3 +-
 .../core/analysis/metrics/PercentileMetrics.java   |  3 +-
 .../server/core/analysis/metrics/PxxMetrics.java   |  3 +-
 .../server/core/analysis/metrics/RateMetrics.java  |  3 +-
 .../server/core/analysis/metrics/SumMetrics.java   |  3 +-
 .../analysis/worker/MetricsPersistentWorker.java   | 23 ++++++----
 .../server/core/analysis/metrics/MetricsTest.java  |  4 +-
 .../core/analysis/metrics/PercentMetricsTest.java  | 51 +++++++++++++++++++++-
 39 files changed, 150 insertions(+), 68 deletions(-)

diff --git a/CHANGES.md b/CHANGES.md
index 313e778..40dc098 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -10,11 +10,11 @@ Release Notes.
 #### Java Agent
 * Remove invalid mysql configuration in agent.config.
 * Add net.bytebuddy.agent.builder.AgentBuilder.RedefinitionStrategy.Listener 
-  to show detail message when redifine errors occur
+  to show detail message when redefine errors occur
 
 
 #### OAP-Backend
-
+* Metrics combination API supports abandoning results.
 
 #### UI
 
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 ccba7f3..98b8af2 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
@@ -29,8 +29,8 @@ public class MockMetrics extends Metrics {
     }
 
     @Override
-    public void combine(Metrics metrics) {
-
+    public boolean combine(Metrics metrics) {
+        return true;
     }
 
     @Override
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 42c5b00..fc5368d 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
@@ -422,8 +422,8 @@ public class RunningRuleTest {
         }
 
         @Override
-        public void combine(Metrics metrics) {
-
+        public boolean combine(Metrics metrics) {
+            return true;
         }
 
         @Override
@@ -479,8 +479,8 @@ public class RunningRuleTest {
         }
 
         @Override
-        public void combine(Metrics metrics) {
-
+        public boolean combine(Metrics metrics) {
+            return true;
         }
 
         @Override
@@ -531,8 +531,8 @@ public class RunningRuleTest {
         }
 
         @Override
-        public void combine(Metrics metrics) {
-
+        public boolean combine(Metrics metrics) {
+            return true;
         }
 
         @Override
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 9413137..501135d 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
@@ -51,7 +51,10 @@ public class MergableBufferedData<METRICS extends Metrics> implements BufferedDa
         if (existed == null) {
             buffer.put(id, data);
         } else {
-            existed.combine(data);
+            final boolean isAbandoned = !existed.combine(data);
+            if (isAbandoned) {
+                buffer.remove(id);
+            }
         }
     }
 
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 ab41ff4..7d810fa 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
@@ -108,8 +108,8 @@ public class EndpointTraffic extends Metrics {
     }
 
     @Override
-    public void combine(final Metrics metrics) {
-
+    public boolean combine(final Metrics metrics) {
+        return true;
     }
 
     @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 b7e6c6d..414b763 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
@@ -73,7 +73,7 @@ public class InstanceTraffic extends Metrics {
     private JsonObject properties;
 
     @Override
-    public void combine(final Metrics metrics) {
+    public boolean combine(final Metrics metrics) {
         final InstanceTraffic instanceTraffic = (InstanceTraffic) metrics;
         this.lastPingTimestamp = instanceTraffic.getLastPingTimestamp();
         if (instanceTraffic.getProperties() != null && instanceTraffic.getProperties().size() > 0) {
@@ -85,6 +85,7 @@ public class InstanceTraffic extends Metrics {
         if (this.getTimeBucket() > metrics.getTimeBucket()) {
             this.setTimeBucket(metrics.getTimeBucket());
         }
+        return true;
     }
 
     @Override
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 a61c2ed..7c8db5d 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
@@ -67,7 +67,7 @@ public class NetworkAddressAlias extends Metrics {
     private long lastUpdateTimeBucket;
 
     @Override
-    public void combine(final Metrics metrics) {
+    public boolean combine(final Metrics metrics) {
         NetworkAddressAlias alias = (NetworkAddressAlias) metrics;
         this.representServiceId = alias.getRepresentServiceId();
         this.representServiceInstanceId = alias.getRepresentServiceInstanceId();
@@ -78,6 +78,7 @@ public class NetworkAddressAlias extends Metrics {
         if (this.getTimeBucket() > metrics.getTimeBucket()) {
             this.setTimeBucket(metrics.getTimeBucket());
         }
+        return true;
     }
 
     @Override
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 4cebad5..3cf9c2d 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
@@ -69,8 +69,8 @@ public class EndpointRelationServerSideMetrics extends Metrics {
     }
 
     @Override
-    public void combine(Metrics metrics) {
-
+    public boolean combine(Metrics metrics) {
+        return true;
     }
 
     @Override
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 6e27883..009053f 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
@@ -77,8 +77,8 @@ public class ServiceInstanceRelationClientSideMetrics extends Metrics {
     }
 
     @Override
-    public void combine(Metrics metrics) {
-
+    public boolean combine(Metrics metrics) {
+        return true;
     }
 
     @Override
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 7cb879d..287857d 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
@@ -77,8 +77,8 @@ public class ServiceInstanceRelationServerSideMetrics extends Metrics {
     }
 
     @Override
-    public void combine(Metrics metrics) {
-
+    public boolean combine(Metrics metrics) {
+        return true;
     }
 
     @Override
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 544f32f..9da867b 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
@@ -67,8 +67,8 @@ public class ServiceRelationClientSideMetrics extends Metrics {
     }
 
     @Override
-    public void combine(Metrics metrics) {
-
+    public boolean combine(Metrics metrics) {
+        return true;
     }
 
     @Override
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 cfb60fa..b25c398 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
@@ -67,8 +67,8 @@ public class ServiceRelationServerSideMetrics extends Metrics {
     }
 
     @Override
-    public void combine(Metrics metrics) {
-
+    public boolean combine(Metrics metrics) {
+        return true;
     }
 
     @Override
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 0841f8e..aef0095 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
@@ -123,8 +123,8 @@ public class ServiceTraffic extends Metrics {
     }
 
     @Override
-    public void combine(final Metrics metrics) {
-
+    public boolean combine(final Metrics metrics) {
+        return true;
     }
 
     @Override
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 ce23f27..a76e817 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
@@ -75,16 +75,17 @@ public abstract class HistogramFunction extends Metrics implements AcceptableVal
     }
 
     @Override
-    public void combine(final Metrics metrics) {
+    public boolean combine(final Metrics metrics) {
         HistogramFunction histogram = (HistogramFunction) metrics;
 
         if (!dataset.keysEqual(histogram.getDataset())) {
             log.warn("Incompatible input [{}}] for current HistogramFunction[{}], entity {}",
                      histogram, this, entityId
             );
-            return;
+            return true;
         }
         this.dataset.append(histogram.dataset);
+        return true;
     }
 
     @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 b7c81fd..47b7f9f 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
@@ -122,14 +122,14 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa
     }
 
     @Override
-    public void combine(final Metrics metrics) {
+    public boolean combine(final Metrics metrics) {
         PercentileFunction percentile = (PercentileFunction) metrics;
 
         if (!dataset.keysEqual(percentile.getDataset())) {
             log.warn("Incompatible input [{}}] for current PercentileFunction[{}], entity {}",
                      percentile, this, entityId
             );
-            return;
+            return true;
         }
         if (ranks.size() > 0) {
             IntList ranksOfThat = percentile.getRanks();
@@ -137,11 +137,11 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa
                 log.warn("Incompatible ranks size = [{}}] for current PercentileFunction[{}]",
                          ranks.size(), this.ranks.size()
                 );
-                return;
+                return true;
             } else {
                 if (!this.ranks.equals(percentile.getRanks())) {
                     log.warn("Rank {} doesn't exist in the previous ranks {}", percentile.getRanks(), ranks);
-                    return;
+                    return true;
                 }
             }
         }
@@ -149,6 +149,7 @@ public abstract class PercentileFunction extends Metrics implements AcceptableVa
         this.dataset.append(percentile.dataset);
 
         this.isCalculated = false;
+        return true;
     }
 
     @Override
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 4b41fe0..973c733 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
@@ -80,9 +80,10 @@ public abstract class AvgFunction extends Metrics implements AcceptableValue<Lon
     }
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         AvgFunction longAvgMetrics = (AvgFunction) metrics;
         combine(longAvgMetrics.summation, longAvgMetrics.count);
+        return true;
     }
 
     @Override
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 3bcbeb2..772702b 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
@@ -101,10 +101,11 @@ public abstract class AvgHistogramFunction extends Metrics implements Acceptable
     }
 
     @Override
-    public void combine(final Metrics metrics) {
+    public boolean combine(final Metrics metrics) {
         AvgHistogramFunction histogram = (AvgHistogramFunction) metrics;
         this.summation.append(histogram.summation);
         this.count.append(histogram.count);
+        return true;
     }
 
     @Override
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 85f1582..3a2b0f1 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
@@ -154,7 +154,7 @@ public abstract class AvgHistogramPercentileFunction extends Metrics implements
     }
 
     @Override
-    public void combine(final Metrics metrics) {
+    public boolean combine(final Metrics metrics) {
         AvgHistogramPercentileFunction percentile = (AvgHistogramPercentileFunction) metrics;
 
         if (ranks.size() > 0) {
@@ -162,11 +162,11 @@ public abstract class AvgHistogramPercentileFunction extends Metrics implements
                 log.warn("Incompatible ranks size = [{}}] for current PercentileFunction[{}]",
                          ranks.size(), this.ranks.size()
                 );
-                return;
+                return true;
             } else {
                 if (!this.ranks.equals(percentile.getRanks())) {
                     log.warn("Rank {} doesn't exist in the previous ranks {}", percentile.getRanks(), ranks);
-                    return;
+                    return true;
                 }
             }
         }
@@ -175,6 +175,7 @@ public abstract class AvgHistogramPercentileFunction extends Metrics implements
         this.count.append(percentile.count);
 
         this.isCalculated = false;
+        return true;
     }
 
     @Override
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 dfcfb91..498e3da 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
@@ -72,10 +72,11 @@ public abstract class AvgLabeledFunction extends Metrics implements AcceptableVa
     private DataTable value = new DataTable(30);
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         AvgLabeledFunction longAvgMetrics = (AvgLabeledFunction) metrics;
         summation.append(longAvgMetrics.summation);
         count.append(longAvgMetrics.count);
+        return true;
     }
 
     @Override
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 37a4ab6..f62e65f 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
@@ -72,9 +72,10 @@ public abstract class LatestFunction extends Metrics implements AcceptableValue<
         this.value = value;
     }
 
-    @Override public final void combine(Metrics metrics) {
+    @Override public final boolean combine(Metrics metrics) {
         LatestFunction latestFunction = (LatestFunction) metrics;
         combine(latestFunction.value);
+        return true;
     }
 
     @Override public void calculate() {
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 69d24a8..4cf4d25 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
@@ -79,10 +79,11 @@ public abstract class ApdexMetrics extends Metrics implements IntValueHolder {
     }
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         tNum += ((ApdexMetrics) metrics).tNum;
         sNum += ((ApdexMetrics) metrics).sNum;
         totalNum += ((ApdexMetrics) metrics).totalNum;
+        return true;
     }
 
     @Override
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 56361f1..bc0f02f 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
@@ -47,9 +47,10 @@ public abstract class CPMMetrics extends Metrics implements LongValueHolder {
     }
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         CPMMetrics cpmMetrics = (CPMMetrics) metrics;
         combine(cpmMetrics.total);
+        return true;
     }
 
     @Override
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 df75eff..9a22314 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
@@ -42,9 +42,10 @@ public abstract class CountMetrics extends Metrics implements LongValueHolder {
     }
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         CountMetrics countMetrics = (CountMetrics) metrics;
         combine(countMetrics.value);
+        return true;
     }
 
     @Override
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 64ffa32..9356c21 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
@@ -54,9 +54,10 @@ public abstract class DoubleAvgMetrics extends Metrics implements DoubleValueHol
     }
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         DoubleAvgMetrics doubleAvgMetrics = (DoubleAvgMetrics) metrics;
         combine(doubleAvgMetrics.summation, doubleAvgMetrics.count);
+        return true;
     }
 
     @Override
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 76bebfc..dbb4870 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
@@ -75,9 +75,10 @@ public abstract class HistogramMetrics extends Metrics {
     }
 
     @Override
-    public void combine(Metrics metrics) {
+    public boolean combine(Metrics metrics) {
         HistogramMetrics histogramMetrics = (HistogramMetrics) metrics;
         this.dataset.append(histogramMetrics.dataset);
+        return true;
     }
 
     /**
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 a45d26b..661281c 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
@@ -54,9 +54,10 @@ public abstract class LongAvgMetrics extends Metrics implements LongValueHolder
     }
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         LongAvgMetrics longAvgMetrics = (LongAvgMetrics) metrics;
         combine(longAvgMetrics.summation, longAvgMetrics.count);
+        return true;
     }
 
     @Override
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 2421881..5dcef23 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
@@ -43,9 +43,10 @@ public abstract class MaxDoubleMetrics extends Metrics implements DoubleValueHol
     }
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         MaxDoubleMetrics maxDoubleMetrics = (MaxDoubleMetrics) metrics;
         combine(maxDoubleMetrics.value);
+        return true;
     }
 
     @Override
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 4ddfc42..9b70a47 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
@@ -46,9 +46,10 @@ public abstract class MaxLongMetrics extends Metrics implements LongValueHolder
     }
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         MaxLongMetrics maxLongMetrics = (MaxLongMetrics) metrics;
         combine(maxLongMetrics.value);
+        return true;
     }
 
     @Override
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 2531e34..cff9126 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
@@ -56,8 +56,9 @@ public abstract class Metrics extends StreamData implements StorageData {
      * Merge the given metrics instance, these two must be the same metrics type.
      *
      * @param metrics to be merged
+     * @return {@code true} if the combined metrics should be continuously processed, {@code false} it should be abandoned.
      */
-    public abstract void combine(Metrics metrics);
+    public abstract boolean combine(Metrics metrics);
 
     /**
      * Calculate the metrics final value when required.
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 d9a9a51..bdc45e6 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
@@ -43,9 +43,10 @@ public abstract class MinDoubleMetrics extends Metrics implements DoubleValueHol
     }
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         MinDoubleMetrics minDoubleMetrics = (MinDoubleMetrics) metrics;
         combine(minDoubleMetrics.value);
+        return true;
     }
 
     @Override
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 4025ea0..88f7fab 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
@@ -43,9 +43,10 @@ public abstract class MinLongMetrics extends Metrics implements LongValueHolder
     }
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         MinLongMetrics minLongMetrics = (MinLongMetrics) metrics;
         combine(minLongMetrics.value);
+        return true;
     }
 
     @Override
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 eed7afb..aa6d32f 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
@@ -54,9 +54,10 @@ public abstract class PercentMetrics extends Metrics implements IntValueHolder {
     }
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         total += ((PercentMetrics) metrics).total;
         match += ((PercentMetrics) metrics).match;
+        return true;
     }
 
     @Override
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 ecad57e..0e1b2a6 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
@@ -77,11 +77,12 @@ public abstract class PercentileMetrics extends Metrics implements MultiIntValue
     }
 
     @Override
-    public void combine(Metrics metrics) {
+    public boolean combine(Metrics metrics) {
         this.isCalculated = false;
 
         PercentileMetrics percentileMetrics = (PercentileMetrics) metrics;
         this.dataset.append(percentileMetrics.dataset);
+        return true;
     }
 
     @Override
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 79da9db..a65ebce 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
@@ -78,11 +78,12 @@ public abstract class PxxMetrics extends Metrics implements IntValueHolder {
     }
 
     @Override
-    public void combine(Metrics metrics) {
+    public boolean combine(Metrics metrics) {
         this.isCalculated = false;
 
         PxxMetrics pxxMetrics = (PxxMetrics) metrics;
         this.detailGroup.append(pxxMetrics.detailGroup);
+        return true;
     }
 
     @Override
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 df77f3b..830f1d7 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
@@ -55,9 +55,10 @@ public abstract class RateMetrics extends Metrics implements IntValueHolder {
     }
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         denominator += ((RateMetrics) metrics).denominator;
         numerator += ((RateMetrics) metrics).numerator;
+        return true;
     }
 
     @Override
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 c57791e..a2f3d61 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
@@ -42,9 +42,10 @@ public abstract class SumMetrics extends Metrics implements LongValueHolder {
     }
 
     @Override
-    public final void combine(Metrics metrics) {
+    public final boolean combine(Metrics metrics) {
         SumMetrics sumMetrics = (SumMetrics) metrics;
         combine(sumMetrics.value);
+        return true;
     }
 
     @Override
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 5e483c4..5cd37e1 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
@@ -163,6 +163,7 @@ public class MetricsPersistentWorker extends PersistenceWorker<Metrics> {
 
             for (Metrics metrics : metricsList) {
                 Metrics cachedMetrics = context.get(metrics);
+                boolean isAbandoned = true;
                 if (cachedMetrics != null) {
                     /*
                      * If the metrics is not supportUpdate, defined through MetricsExtension#supportUpdate,
@@ -174,21 +175,25 @@ public class MetricsPersistentWorker extends PersistenceWorker<Metrics> {
                     /*
                      * Merge metrics into cachedMetrics, change only happens inside cachedMetrics.
                      */
-                    cachedMetrics.combine(metrics);
-                    cachedMetrics.calculate();
-                    prepareRequests.add(metricsDAO.prepareBatchUpdate(model, cachedMetrics));
-                    nextWorker(cachedMetrics);
+                    isAbandoned = !cachedMetrics.combine(metrics);
+                    if (isAbandoned) {
+                        cachedMetrics.calculate();
+                        prepareRequests.add(metricsDAO.prepareBatchUpdate(model, cachedMetrics));
+                        nextWorker(cachedMetrics);
+                    }
                 } else {
                     metrics.calculate();
                     prepareRequests.add(metricsDAO.prepareBatchInsert(model, metrics));
                     nextWorker(metrics);
                 }
 
-                /*
-                 * 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 (!isAbandoned) {
+                    /*
+                     * 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)));
+                }
             }
         } catch (Throwable t) {
             log.error(t.getMessage(), t);
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 dd0fa80..a4834e8 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
@@ -78,8 +78,8 @@ public class MetricsTest {
         }
 
         @Override
-        public void combine(Metrics metrics) {
-
+        public boolean combine(Metrics metrics) {
+            return true;
         }
 
         @Override
diff --git a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetricsTest.java b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetricsTest.java
index 7b04bc1..fc68c6e 100644
--- a/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetricsTest.java
+++ b/oap-server/server-core/src/test/java/org/apache/skywalking/oap/server/core/analysis/metrics/PercentMetricsTest.java
@@ -64,7 +64,56 @@ public class PercentMetricsTest {
         Assert.assertEquals(5000, impl.getValue());
     }
 
-    public class PercentMetricsImpl extends PercentMetrics {
+    @Test
+    public void testCombineAbandon() {
+
+    }
+
+    public static class DisposableMetrics extends Metrics {
+        long value;
+
+        @Override
+        public boolean combine(final Metrics metrics) {
+            return value > 10;
+        }
+
+        @Override
+        public void calculate() {
+
+        }
+
+        @Override
+        public Metrics toHour() {
+            return null;
+        }
+
+        @Override
+        public Metrics toDay() {
+            return null;
+        }
+
+        @Override
+        public void deserialize(final RemoteData remoteData) {
+
+        }
+
+        @Override
+        public RemoteData.Builder serialize() {
+            return null;
+        }
+
+        @Override
+        public int remoteHashCode() {
+            return 0;
+        }
+
+        @Override
+        public String id() {
+            return "1";
+        }
+    }
+
+    public static class PercentMetricsImpl extends PercentMetrics {
 
         @Override
         public String id() {