You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2020/01/10 12:28:45 UTC

[skywalking] branch percentile updated: Fix percentile bug and oal engine bug.

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

wusheng pushed a commit to branch percentile
in repository https://gitbox.apache.org/repos/asf/skywalking.git


The following commit(s) were added to refs/heads/percentile by this push:
     new 446032a  Fix percentile bug and oal engine bug.
446032a is described below

commit 446032a0e904e1a3eabaec31d3985459b219352d
Author: Wu Sheng <wu...@foxmail.com>
AuthorDate: Fri Jan 10 20:27:38 2020 +0800

    Fix percentile bug and oal engine bug.
---
 .../code-templates/metrics/deserialize.ftl         |  4 +-
 .../resources/code-templates/metrics/serialize.ftl |  2 +-
 .../core/analysis/metrics/PercentileMetrics.java   | 46 +++++++++++++---------
 3 files changed, 30 insertions(+), 22 deletions(-)

diff --git a/oap-server/oal-rt/src/main/resources/code-templates/metrics/deserialize.ftl b/oap-server/oal-rt/src/main/resources/code-templates/metrics/deserialize.ftl
index faf7e17..d61cd4f 100644
--- a/oap-server/oal-rt/src/main/resources/code-templates/metrics/deserialize.ftl
+++ b/oap-server/oal-rt/src/main/resources/code-templates/metrics/deserialize.ftl
@@ -16,12 +16,12 @@ public void deserialize(org.apache.skywalking.oap.server.core.remote.grpc.proto.
     </#list>
 
     <#list serializeFields.intKeyLongValueHashMapFields as field>
-        setDetailGroup(new org.apache.skywalking.oap.server.core.analysis.metrics.IntKeyLongValueHashMap(30));
+        ${field.setter}(new org.apache.skywalking.oap.server.core.analysis.metrics.IntKeyLongValueHashMap(30));
 
         java.util.Iterator iterator = remoteData.getDataIntLongPairListList().iterator();
         while (iterator.hasNext()) {
             org.apache.skywalking.oap.server.core.remote.grpc.proto.IntKeyLongValuePair element = (org.apache.skywalking.oap.server.core.remote.grpc.proto.IntKeyLongValuePair)(iterator.next());
-            super.getDetailGroup().put(new Integer(element.getKey()), new org.apache.skywalking.oap.server.core.analysis.metrics.IntKeyLongValue(element.getKey(), element.getValue()));
+            super.${field.getter}().put(new Integer(element.getKey()), new org.apache.skywalking.oap.server.core.analysis.metrics.IntKeyLongValue(element.getKey(), element.getValue()));
         }
     </#list>
 }
\ No newline at end of file
diff --git a/oap-server/oal-rt/src/main/resources/code-templates/metrics/serialize.ftl b/oap-server/oal-rt/src/main/resources/code-templates/metrics/serialize.ftl
index f2960da..ba3dfbe 100644
--- a/oap-server/oal-rt/src/main/resources/code-templates/metrics/serialize.ftl
+++ b/oap-server/oal-rt/src/main/resources/code-templates/metrics/serialize.ftl
@@ -16,7 +16,7 @@ public org.apache.skywalking.oap.server.core.remote.grpc.proto.RemoteData.Builde
         remoteBuilder.addDataIntegers(${field.getter}());
     </#list>
     <#list serializeFields.intKeyLongValueHashMapFields as field>
-        java.util.Iterator iterator = super.getDetailGroup().values().iterator();
+        java.util.Iterator iterator = super.${field.getter}().values().iterator();
         while (iterator.hasNext()) {
             remoteBuilder.addDataIntLongPairList(((org.apache.skywalking.oap.server.core.analysis.metrics.IntKeyLongValue)(iterator.next())).serialize());
         }
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 976d21a..ec09208 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
@@ -36,7 +36,7 @@ import org.apache.skywalking.oap.server.core.storage.annotation.Column;
  */
 @MetricsFunction(functionName = "percentile")
 public abstract class PercentileMetrics extends GroupMetrics implements MultiIntValuesHolder {
-    protected static final String DETAIL_GROUP = "detail_group";
+    protected static final String DATASET = "dataset";
     protected static final String VALUE = "value";
     protected static final String PRECISION = "precision";
 
@@ -44,13 +44,13 @@ public abstract class PercentileMetrics extends GroupMetrics implements MultiInt
 
     @Getter @Setter @Column(columnName = VALUE, isValue = true) private IntKeyLongValueHashMap percentileValues;
     @Getter @Setter @Column(columnName = PRECISION) private int precision;
-    @Getter @Setter @Column(columnName = DETAIL_GROUP) private IntKeyLongValueHashMap detailGroup;
+    @Getter @Setter @Column(columnName = DATASET) private IntKeyLongValueHashMap dataset;
 
     private boolean isCalculated;
 
     public PercentileMetrics() {
         percentileValues = new IntKeyLongValueHashMap(5);
-        detailGroup = new IntKeyLongValueHashMap(30);
+        dataset = new IntKeyLongValueHashMap(30);
     }
 
     @Entrance
@@ -59,10 +59,10 @@ public abstract class PercentileMetrics extends GroupMetrics implements MultiInt
         this.precision = precision;
 
         int index = value / precision;
-        IntKeyLongValue element = detailGroup.get(index);
+        IntKeyLongValue element = dataset.get(index);
         if (element == null) {
             element = new IntKeyLongValue(index, 1);
-            detailGroup.put(element.getKey(), element);
+            dataset.put(element.getKey(), element);
         } else {
             element.addValue(1);
         }
@@ -73,29 +73,37 @@ public abstract class PercentileMetrics extends GroupMetrics implements MultiInt
         this.isCalculated = false;
 
         PxxMetrics pxxMetrics = (PxxMetrics)metrics;
-        combine(pxxMetrics.getDetailGroup(), this.detailGroup);
+        combine(pxxMetrics.getDetailGroup(), this.dataset);
     }
 
     @Override
     public final void calculate() {
 
         if (!isCalculated) {
-            int total = detailGroup.values().stream().mapToInt(element -> (int)element.getValue()).sum();
+            int total = dataset.values().stream().mapToInt(element -> (int)element.getValue()).sum();
+
+            int index = 0;
+            int[] roofs = new int[RANKS.length];
             for (int i = 0; i < RANKS.length; i++) {
-                int percentileRank = RANKS[i];
-                int roof = Math.round(total * percentileRank * 1.0f / 100);
+                roofs[i] = Math.round(total * RANKS[i] * 1.0f / 100);
+            }
+
+            int count = 0;
+            IntKeyLongValue[] sortedData = dataset.values().stream().sorted(new Comparator<IntKeyLongValue>() {
+                @Override public int compare(IntKeyLongValue o1, IntKeyLongValue o2) {
+                    return o1.getKey() - o2.getKey();
+                }
+            }).toArray(IntKeyLongValue[]::new);
+            for (IntKeyLongValue element : sortedData) {
+                count += element.getValue();
+                for (int i = index; i < roofs.length; i++) {
+                    int roof = roofs[i];
 
-                int count = 0;
-                IntKeyLongValue[] sortedData = detailGroup.values().stream().sorted(new Comparator<IntKeyLongValue>() {
-                    @Override public int compare(IntKeyLongValue o1, IntKeyLongValue o2) {
-                        return o1.getKey() - o2.getKey();
-                    }
-                }).toArray(IntKeyLongValue[]::new);
-                for (IntKeyLongValue element : sortedData) {
-                    count += element.getValue();
                     if (count >= roof) {
-                        percentileValues.put(i, new IntKeyLongValue(i, element.getKey() * precision));
-                        return;
+                        percentileValues.put(index, new IntKeyLongValue(index, element.getKey() * precision));
+                        index++;
+                    } else {
+                        break;
                     }
                 }
             }