Skip to content

Commit d836f91

Browse files
authored
Restore percentile and bucket data to JSON metrics output (#7849)
1 parent 61181fb commit d836f91

File tree

1 file changed

+43
-3
lines changed
  • webserver/observe/metrics/src/main/java/io/helidon/webserver/observe/metrics

1 file changed

+43
-3
lines changed

webserver/observe/metrics/src/main/java/io/helidon/webserver/observe/metrics/JsonFormatter.java

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.HashSet;
2323
import java.util.Iterator;
2424
import java.util.List;
25+
import java.util.Locale;
2526
import java.util.Map;
2627
import java.util.Optional;
2728
import java.util.Set;
@@ -43,6 +44,7 @@
4344
import io.helidon.metrics.api.DistributionSummary;
4445
import io.helidon.metrics.api.FunctionalCounter;
4546
import io.helidon.metrics.api.Gauge;
47+
import io.helidon.metrics.api.HistogramSnapshot;
4648
import io.helidon.metrics.api.Meter;
4749
import io.helidon.metrics.api.MeterRegistry;
4850
import io.helidon.metrics.api.MeterRegistryFormatter;
@@ -451,14 +453,16 @@ protected void apply(JsonObjectBuilder builder) {
451453
sameNameBuilder.add(valueId("count", childID), typedChild.count());
452454
} else if (child instanceof DistributionSummary typedChild) {
453455
sameNameBuilder.add(valueId("count", childID), typedChild.count());
454-
sameNameBuilder.add(valueId("max", childID), typedChild.snapshot().max());
455-
sameNameBuilder.add(valueId("mean", childID), typedChild.snapshot().mean());
456+
sameNameBuilder.add(valueId("max", childID), typedChild.max());
457+
sameNameBuilder.add(valueId("mean", childID), typedChild.mean());
456458
sameNameBuilder.add(valueId("total", childID), typedChild.totalAmount());
459+
addDetails(typedChild.snapshot(), childID, null);
457460
} else if (child instanceof Timer typedChild) {
458461
sameNameBuilder.add(valueId("count", childID), typedChild.count());
459-
sameNameBuilder.add(valueId("elapsedTime", childID), typedChild.totalTime(TimeUnit.SECONDS));
460462
sameNameBuilder.add(valueId("max", childID), typedChild.max(TimeUnit.SECONDS));
461463
sameNameBuilder.add(valueId("mean", childID), typedChild.mean(TimeUnit.SECONDS));
464+
sameNameBuilder.add(valueId("elapsedTime", childID), typedChild.totalTime(TimeUnit.SECONDS));
465+
addDetails(typedChild.snapshot(), childID, timeUnit(typedChild));
462466
} else if (child instanceof FunctionalCounter typedChild) {
463467
sameNameBuilder.add(valueId("count", childID), typedChild.count());
464468
} else if (child instanceof Gauge typedChild) {
@@ -471,6 +475,42 @@ protected void apply(JsonObjectBuilder builder) {
471475
builder.add(meterId.name(), sameNameBuilder);
472476
}
473477

478+
private void addDetails(HistogramSnapshot snapshot, Meter.Id childId, TimeUnit timeUnit) {
479+
snapshot.percentileValues().forEach(vap ->
480+
sameNameBuilder
481+
.add(valueId(percentileName(vap.percentile()),
482+
childId),
483+
timeUnit != null
484+
? vap.value(timeUnit)
485+
: vap.value()));
486+
snapshot.histogramCounts().forEach(bucket ->
487+
sameNameBuilder
488+
.add(valueId(bucketName(timeUnit != null
489+
? bucket.boundary(timeUnit)
490+
: bucket.boundary()),
491+
childId),
492+
bucket.count()));
493+
}
494+
495+
private static String percentileName(double percentile) {
496+
return "p" + percentile;
497+
}
498+
499+
private static String bucketName(double boundary) {
500+
return "b" + boundary;
501+
}
502+
503+
private static TimeUnit timeUnit(Timer timer) {
504+
if (timer.baseUnit().isPresent()) {
505+
try {
506+
return TimeUnit.valueOf(timer.baseUnit().get().toUpperCase(Locale.getDefault()));
507+
} catch (IllegalArgumentException ex) {
508+
return TimeUnit.SECONDS;
509+
}
510+
}
511+
return TimeUnit.SECONDS;
512+
}
513+
474514
private static String valueId(String valueName, Meter.Id meterId) {
475515
return valueName + tagsPortion(meterId);
476516
}

0 commit comments

Comments
 (0)