Micrometer bridge: interpret no SLO config as no buckets advice (#8856)

This commit is contained in:
Mateusz Rzeszutek 2023-07-05 18:55:46 +02:00 committed by GitHub
parent 2dc77a2613
commit d875d997c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 17 deletions

View File

@ -13,6 +13,7 @@ import io.opentelemetry.api.metrics.DoubleHistogramBuilder;
import io.opentelemetry.extension.incubator.metrics.ExtendedDoubleHistogramBuilder;
import java.util.ArrayList;
import java.util.List;
import java.util.NavigableSet;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;
@ -27,22 +28,23 @@ final class HistogramAdviceUtil {
DoubleHistogramBuilder builder,
DistributionStatisticConfig config,
@Nullable TimeUnit timeUnit) {
double[] buckets = config.getServiceLevelObjectiveBoundaries();
if (buckets == null || !(builder instanceof ExtendedDoubleHistogramBuilder)) {
if (!(builder instanceof ExtendedDoubleHistogramBuilder)) {
return;
}
NavigableSet<Double> buckets = config.getHistogramBuckets(false);
ExtendedDoubleHistogramBuilder extendedBuilder = (ExtendedDoubleHistogramBuilder) builder;
extendedBuilder.setAdvice(
advice -> advice.setExplicitBucketBoundaries(computeBuckets(buckets, timeUnit)));
}
private static List<Double> computeBuckets(double[] buckets, @Nullable TimeUnit timeUnit) {
if (buckets.length == 0) {
private static List<Double> computeBuckets(
NavigableSet<Double> buckets, @Nullable TimeUnit timeUnit) {
if (buckets.isEmpty()) {
return emptyList();
}
// micrometer Timers always specify buckets in nanoseconds, we need to convert them to base unit
double timeUnitMultiplier = timeUnit == null ? 1.0 : TimeUtils.nanosToUnit(1, timeUnit);
List<Double> result = new ArrayList<>(buckets.length);
List<Double> result = new ArrayList<>(buckets.size());
for (double b : buckets) {
result.add(b * timeUnitMultiplier);
}

View File

@ -12,17 +12,13 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attri
import io.micrometer.core.instrument.DistributionSummary;
import io.micrometer.core.instrument.Metrics;
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
import io.opentelemetry.sdk.metrics.internal.aggregator.ExplicitBucketHistogramUtils;
import org.assertj.core.api.AbstractIterableAssert;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public abstract class AbstractDistributionSummaryTest {
static final double[] DEFAULT_BUCKETS =
ExplicitBucketHistogramUtils.DEFAULT_HISTOGRAM_BUCKET_BOUNDARIES.stream()
.mapToDouble(d -> d)
.toArray();
static final double[] NO_BUCKETS = new double[0];
protected abstract InstrumentationExtension testing();
@ -65,7 +61,7 @@ public abstract class AbstractDistributionSummaryTest {
.hasSum(7)
.hasCount(3)
.hasAttributes(attributeEntry("tag", "value"))
.hasBucketBoundaries(DEFAULT_BUCKETS)))));
.hasBucketBoundaries(NO_BUCKETS)))));
testing()
.waitAndAssertMetrics(
INSTRUMENTATION_NAME,

View File

@ -15,7 +15,6 @@ import io.micrometer.core.instrument.Timer;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
import io.opentelemetry.sdk.metrics.data.HistogramPointData;
import io.opentelemetry.sdk.metrics.internal.aggregator.ExplicitBucketHistogramUtils;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
import org.assertj.core.api.AbstractIterableAssert;
@ -25,10 +24,7 @@ import org.junit.jupiter.api.Test;
@SuppressWarnings("PreferJavaTimeOverload")
public abstract class AbstractTimerTest {
static final double[] DEFAULT_BUCKETS =
ExplicitBucketHistogramUtils.DEFAULT_HISTOGRAM_BUCKET_BOUNDARIES.stream()
.mapToDouble(d -> d)
.toArray();
static final double[] NO_BUCKETS = new double[0];
protected abstract InstrumentationExtension testing();
@ -63,7 +59,7 @@ public abstract class AbstractTimerTest {
.hasSum(42)
.hasCount(1)
.hasAttributes(attributeEntry("tag", "value"))
.hasBucketBoundaries(DEFAULT_BUCKETS)))));
.hasBucketBoundaries(NO_BUCKETS)))));
testing()
.waitAndAssertMetrics(
INSTRUMENTATION_NAME,