Skip to content

Commit 0515195

Browse files
committed
Longest match wins in per-meter default implementation
1 parent 9807805 commit 0515195

File tree

2 files changed

+72
-11
lines changed

2 files changed

+72
-11
lines changed

Diff for: implementations/micrometer-registry-otlp/src/main/java/io/micrometer/registry/otlp/OtlpMeterRegistry.java

+26-11
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package io.micrometer.registry.otlp;
1717

1818
import io.micrometer.common.lang.Nullable;
19+
import io.micrometer.common.util.StringUtils;
1920
import io.micrometer.common.util.internal.logging.InternalLogger;
2021
import io.micrometer.common.util.internal.logging.InternalLoggerFactory;
2122
import io.micrometer.core.instrument.*;
@@ -50,6 +51,7 @@
5051
import java.util.concurrent.ScheduledExecutorService;
5152
import java.util.concurrent.ThreadFactory;
5253
import java.util.concurrent.TimeUnit;
54+
import java.util.function.Supplier;
5355
import java.util.function.ToDoubleFunction;
5456
import java.util.function.ToLongFunction;
5557

@@ -503,22 +505,35 @@ static double[] getSloWithPositiveInf(DistributionStatisticConfig distributionSt
503505
return sloWithPositiveInf;
504506
}
505507

506-
private static HistogramFlavor histogramFlavorPerMeter(OtlpConfig config, Meter.Id id) {
507-
for (Map.Entry<String, HistogramFlavor> entry : config.histogramFlavorPerMeter().entrySet()) {
508-
if (id.getName().startsWith(entry.getKey())) {
509-
return entry.getValue();
510-
}
508+
// VisibleForTesting
509+
static HistogramFlavor histogramFlavorPerMeter(OtlpConfig config, Meter.Id id) {
510+
return lookup(config.histogramFlavorPerMeter(), id, config.histogramFlavor());
511+
}
512+
513+
// VisibleForTesting
514+
static Integer maxBucketsPerMeter(OtlpConfig config, Meter.Id id) {
515+
return lookup(config.maxBucketsPerMeter(), id, config.maxBucketCount());
516+
}
517+
518+
private static <T> T lookup(Map<String, T> values, Meter.Id id, T defaultValue) {
519+
if (values.isEmpty()) {
520+
return defaultValue;
511521
}
512-
return config.histogramFlavor();
522+
return doLookup(values, id, () -> defaultValue);
513523
}
514524

515-
private static Integer maxBucketsPerMeter(OtlpConfig config, Meter.Id id) {
516-
for (Map.Entry<String, Integer> entry : config.maxBucketsPerMeter().entrySet()) {
517-
if (id.getName().startsWith(entry.getKey())) {
518-
return entry.getValue();
525+
private static <T> T doLookup(Map<String, T> values, Meter.Id id, Supplier<T> defaultValue) {
526+
String name = id.getName();
527+
while (StringUtils.isNotEmpty(name)) {
528+
T result = values.get(name);
529+
if (result != null) {
530+
return result;
519531
}
532+
int lastDot = name.lastIndexOf('.');
533+
name = (lastDot != -1) ? name.substring(0, lastDot) : "";
520534
}
521-
return config.maxBucketCount();
535+
536+
return defaultValue.get();
522537
}
523538

524539
/**

Diff for: implementations/micrometer-registry-otlp/src/test/java/io/micrometer/registry/otlp/OtlpMeterRegistryTest.java

+46
Original file line numberDiff line numberDiff line change
@@ -914,6 +914,52 @@ public Map<String, Integer> maxBucketsPerMeter() {
914914
.hasSize(56);
915915
}
916916

917+
@Test
918+
void longestMatchWinsByDefaultHistogramFlavorPerMeter() {
919+
Map<String, HistogramFlavor> histogramFlavorPerMeter = new HashMap<>();
920+
histogramFlavorPerMeter.put("http", EXPLICIT_BUCKET_HISTOGRAM);
921+
histogramFlavorPerMeter.put("http.server", BASE2_EXPONENTIAL_BUCKET_HISTOGRAM);
922+
OtlpConfig config = new OtlpConfig() {
923+
@Override
924+
public String get(String key) {
925+
return null;
926+
}
927+
928+
@Override
929+
public Map<String, HistogramFlavor> histogramFlavorPerMeter() {
930+
return histogramFlavorPerMeter;
931+
}
932+
};
933+
934+
assertThat(OtlpMeterRegistry.histogramFlavorPerMeter(config, createIdWithName("http.server.requests")))
935+
.isEqualTo(BASE2_EXPONENTIAL_BUCKET_HISTOGRAM);
936+
}
937+
938+
@Test
939+
void longestMatchWinsByDefaultMaxBucketsPerMeter() {
940+
Map<String, Integer> maxBucketsPerMeter = new HashMap<>();
941+
maxBucketsPerMeter.put("http", 10);
942+
maxBucketsPerMeter.put("http.server", 20);
943+
OtlpConfig config = new OtlpConfig() {
944+
@Override
945+
public String get(String key) {
946+
return null;
947+
}
948+
949+
@Override
950+
public Map<String, Integer> maxBucketsPerMeter() {
951+
return maxBucketsPerMeter;
952+
}
953+
};
954+
955+
assertThat(OtlpMeterRegistry.maxBucketsPerMeter(config, createIdWithName("http.server.requests")))
956+
.isEqualTo(20);
957+
}
958+
959+
private Meter.Id createIdWithName(String name) {
960+
return new Meter.Id(name, Tags.empty(), null, null, Meter.Type.OTHER);
961+
}
962+
917963
protected Metric writeToMetric(Meter meter) {
918964
OtlpMetricConverter otlpMetricConverter = new OtlpMetricConverter(clock, otlpConfig().step(),
919965
registry.getBaseTimeUnit(), otlpConfig().aggregationTemporality(),

0 commit comments

Comments
 (0)