Skip to content

Commit 555075e

Browse files
ENG-9598 Adding distribution summary support (#30)
* ENG-9598 Adding distribution summary support * Typo in docs * Increasing test coverage * Review comments Co-authored-by: kotharironak <[email protected]> Co-authored-by: kotharironak <[email protected]>
1 parent 6b7860b commit 555075e

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

platform-metrics/src/main/java/org/hypertrace/core/serviceframework/metrics/PlatformMetricsRegistry.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.github.mweirauch.micrometer.jvm.extras.ProcessThreadMetrics;
1414
import io.micrometer.core.instrument.Clock;
1515
import io.micrometer.core.instrument.Counter;
16+
import io.micrometer.core.instrument.DistributionSummary;
1617
import io.micrometer.core.instrument.Gauge;
1718
import io.micrometer.core.instrument.ImmutableTag;
1819
import io.micrometer.core.instrument.MeterRegistry;
@@ -339,6 +340,40 @@ public static <T extends Number> T registerGauge(String name, Map<String, String
339340
return number;
340341
}
341342

343+
/**
344+
* Registers a DistributionSummary (with predefined percentiles computed locally) for the given
345+
* name with the service's metric registry and reports it periodically to the configured
346+
* reporters. Apart from the provided tags, the reporting service's default tags also will be
347+
* reported with the metrics.
348+
* <p>
349+
* See https://micrometer.io/docs/concepts#_distribution_summaries for more details.
350+
*/
351+
public static DistributionSummary registerDistributionSummary(String name,
352+
Map<String, String> tags) {
353+
return registerDistributionSummary(name, tags, false);
354+
}
355+
356+
/**
357+
* Registers a DistributionSummary for the given name with the service's metric registry and
358+
* reports it periodically to the configured reporters Apart from the provided tags, the reporting
359+
* service's default tags also will be reported with the metrics.
360+
* <p>
361+
* Param histogram – Determines whether percentile histograms should be published.
362+
* <p>
363+
* For more details - https://micrometer.io/docs/concepts#_distribution_summaries,
364+
* https://micrometer.io/docs/concepts#_histograms_and_percentiles
365+
*/
366+
public static DistributionSummary registerDistributionSummary(String name,
367+
Map<String, String> tags, boolean histogram) {
368+
DistributionSummary.Builder builder = DistributionSummary.builder(name)
369+
.publishPercentiles(0.5, 0.95, 0.99)
370+
.tags(addDefaultTags(tags));
371+
if (histogram) {
372+
builder = builder.publishPercentileHistogram();
373+
}
374+
return builder.register(METER_REGISTRY);
375+
}
376+
342377
/**
343378
* Registers metrics for the given executor service with the service's metric registry and
344379
* reports them periodically to the configured reporters. Apart from the given tags, the

platform-metrics/src/test/java/org/hypertrace/core/serviceframework/metrics/PlatformMetricsRegistryTest.java

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
package org.hypertrace.core.serviceframework.metrics;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
45

56
import com.typesafe.config.Config;
67
import com.typesafe.config.ConfigFactory;
78
import io.micrometer.core.instrument.Counter;
9+
import io.micrometer.core.instrument.DistributionSummary;
810
import io.micrometer.core.instrument.Timer;
911
import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
12+
import java.util.Arrays;
13+
import java.util.HashMap;
1014
import java.util.List;
1115
import java.util.Map;
1216
import java.util.concurrent.TimeUnit;
1317
import java.util.concurrent.atomic.AtomicInteger;
18+
import java.util.stream.Collectors;
1419
import org.junit.jupiter.api.AfterEach;
1520
import org.junit.jupiter.api.Assertions;
1621
import org.junit.jupiter.api.Test;
@@ -117,6 +122,40 @@ public void testGauge() {
117122
assertEquals(11, gauge.get());
118123
}
119124

125+
@Test
126+
public void testDistributionSummary() {
127+
initializeCustomRegistry(List.of("testing"));
128+
129+
DistributionSummary distribution = PlatformMetricsRegistry
130+
.registerDistributionSummary("my.distribution", Map.of("foo", "bar"));
131+
distribution.record(100);
132+
assertEquals(1, distribution.count());
133+
assertEquals(100, distribution.totalAmount());
134+
135+
// Try to register the same summary again and we should get the same instance.
136+
distribution = PlatformMetricsRegistry
137+
.registerDistributionSummary("my.distribution", Map.of("foo", "bar"));
138+
distribution.record(50);
139+
assertEquals(2, distribution.count());
140+
assertEquals(150, distribution.totalAmount());
141+
assertEquals(75, distribution.mean());
142+
assertTrue(
143+
Arrays.stream(distribution.takeSnapshot().percentileValues()).map(m -> m.percentile())
144+
.collect(
145+
Collectors.toList()).containsAll(List.of(0.5, 0.95, 0.99)));
146+
147+
// Create a new distribution with histogram enabled
148+
distribution = PlatformMetricsRegistry
149+
.registerDistributionSummary("my.distribution", new HashMap<>(), true);
150+
distribution.record(100);
151+
assertEquals(1, distribution.count());
152+
assertEquals(100, distribution.totalAmount());
153+
assertTrue(
154+
Arrays.stream(distribution.takeSnapshot().percentileValues()).map(m -> m.percentile())
155+
.collect(
156+
Collectors.toList()).containsAll(List.of(0.5, 0.95, 0.99)));
157+
}
158+
120159
@Test
121160
public void test_initializePrometheusPushGateway_withNullUrlAddress_throwsException() {
122161
Assertions.assertThrows(IllegalArgumentException.class,

0 commit comments

Comments
 (0)