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;
}
}
}