in oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/meter/function/avg/AvgHistogramPercentileFunction.java [196:271]
public void calculate() {
if (!isCalculated) {
final Set<String> keys = summation.keys();
for (String key : keys) {
long value = 0;
if (count.get(key) != 0) {
value = summation.get(key) / count.get(key);
if (value == 0L && summation.get(key) > 0L) {
value = 1;
}
}
dataset.put(key, value);
}
dataset.keys().stream()
.map(key -> {
DataLabel dataLabel = new DataLabel();
if (key.contains(":")) {
int index = key.lastIndexOf(":");
dataLabel.put(key.substring(0, index));
return Tuple.of(dataLabel, key);
} else {
return Tuple.of(dataLabel, key);
}
})
.collect(groupingBy(Tuple2::_1, mapping(Tuple2::_2, Collector.of(
DataTable::new,
(dt, key) -> {
String v;
if (key.contains(":")) {
int index = key.lastIndexOf(":");
v = key.substring(index + 1);
} else {
v = key;
}
dt.put(v, dataset.get(key));
},
DataTable::append
))))
.forEach((labels, subDataset) -> {
long total;
total = subDataset.sumOfValues();
int[] roofs = new int[ranks.size()];
for (int i = 0; i < ranks.size(); i++) {
roofs[i] = Math.round(total * ranks.get(i) * 1.0f / 100);
}
int count = 0;
final List<String> sortedKeys = subDataset.sortedKeys(Comparator.comparingLong(Long::parseLong));
int loopIndex = 0;
for (String key : sortedKeys) {
final Long value = subDataset.get(key);
count += value;
for (int rankIdx = loopIndex; rankIdx < roofs.length; rankIdx++) {
int roof = roofs[rankIdx];
if (count >= roof) {
if (labels.isEmpty()) {
labels.put(PERCENTILE_LABEL_NAME, String.valueOf(ranks.get(rankIdx)));
percentileValues.put(labels, Long.parseLong(key));
} else {
labels.put(PERCENTILE_LABEL_NAME, String.valueOf(ranks.get(rankIdx)));
percentileValues.put(labels, Long.parseLong(key));
}
loopIndex++;
} else {
break;
}
}
}
});
}
}