Make setMinimumCollectionInterval package private (#4310)

* Make setMinimumCollectionInterval package private, centralize experimental utilities

* Default minimum collection interval to zero
This commit is contained in:
jack-berg 2022-03-31 09:49:53 -05:00 committed by GitHub
parent 6bc06f86ca
commit 725ce32db3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 137 additions and 99 deletions

View File

@ -11,7 +11,6 @@ import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.metrics.data.MetricData;
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader;
import java.time.Duration;
import java.util.Collection;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeEachCallback;
@ -34,10 +33,7 @@ class MicrometerTestingExtension implements AfterEachCallback, BeforeEachCallbac
metricReader = InMemoryMetricReader.create();
SdkMeterProvider meterProvider =
SdkMeterProvider.builder()
.registerMetricReader(metricReader)
.setMinimumCollectionInterval(Duration.ZERO)
.build();
SdkMeterProvider.builder().registerMetricReader(metricReader).build();
MeterRegistry otelMeterRegistry =
configureOtelRegistry(
OpenTelemetryMeterRegistry.builder(

View File

@ -8,6 +8,7 @@ package io.opentelemetry.sdk.autoconfigure;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
import io.opentelemetry.sdk.metrics.export.MetricExporter;
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
import io.opentelemetry.sdk.metrics.internal.exemplar.ExemplarFilter;
import java.util.function.BiFunction;
@ -27,14 +28,15 @@ final class MeterProviderConfiguration {
}
switch (exemplarFilter) {
case "none":
ExemplarFilter.setExemplarFilter(meterProviderBuilder, ExemplarFilter.neverSample());
SdkMeterProviderUtil.setExemplarFilter(meterProviderBuilder, ExemplarFilter.neverSample());
break;
case "all":
ExemplarFilter.setExemplarFilter(meterProviderBuilder, ExemplarFilter.alwaysSample());
SdkMeterProviderUtil.setExemplarFilter(meterProviderBuilder, ExemplarFilter.alwaysSample());
break;
case "with_sampled_trace":
default:
ExemplarFilter.setExemplarFilter(meterProviderBuilder, ExemplarFilter.sampleWithTraces());
SdkMeterProviderUtil.setExemplarFilter(
meterProviderBuilder, ExemplarFilter.sampleWithTraces());
break;
}

View File

@ -8,7 +8,6 @@ package io.opentelemetry.sdk.testing.exporter;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import java.time.Duration;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@ -24,7 +23,6 @@ class InMemoryMetricReaderTest {
deltaReader = InMemoryMetricReader.createDelta();
provider =
SdkMeterProvider.builder()
.setMinimumCollectionInterval(Duration.ofSeconds(0))
.registerMetricReader(cumulativeReader)
.registerMetricReader(deltaReader)
.build();

View File

@ -19,7 +19,6 @@ import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/** Builder class for the {@link SdkMeterProvider}. */
public final class SdkMeterProviderBuilder {
@ -32,12 +31,11 @@ public final class SdkMeterProviderBuilder {
private static final ExemplarFilter DEFAULT_EXEMPLAR_FILTER = ExemplarFilter.sampleWithTraces();
/**
* By default, the minimum collection interval is 100ns.
* By default, the minimum collection interval is 0ns.
*
* @see #setMinimumCollectionInterval(Duration)
*/
private static final long DEFAULT_MIN_COLLECTION_INTERVAL_NANOS =
TimeUnit.MILLISECONDS.toNanos(100);
private static final long DEFAULT_MIN_COLLECTION_INTERVAL_NANOS = 0;
private Clock clock = Clock.getDefault();
private Resource resource = Resource.getDefault();
@ -137,7 +135,7 @@ public final class SdkMeterProviderBuilder {
* @param duration The duration.
* @return this
*/
public SdkMeterProviderBuilder setMinimumCollectionInterval(Duration duration) {
SdkMeterProviderBuilder setMinimumCollectionInterval(Duration duration) {
Objects.requireNonNull(duration, "duration");
checkArgument(!duration.isNegative(), "duration must not be negative");
minimumCollectionIntervalNanos = duration.toNanos();

View File

@ -0,0 +1,104 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.metrics.internal;
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
import io.opentelemetry.sdk.metrics.ViewBuilder;
import io.opentelemetry.sdk.metrics.internal.exemplar.ExemplarFilter;
import io.opentelemetry.sdk.metrics.internal.view.AttributesProcessor;
import io.opentelemetry.sdk.metrics.internal.view.StringPredicates;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.time.Duration;
import java.util.function.Predicate;
/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
* any time.
*/
public final class SdkMeterProviderUtil {
private SdkMeterProviderUtil() {}
/**
* Reflectively assign the {@link ExemplarFilter} to the {@link SdkMeterProviderBuilder}.
*
* @param sdkMeterProviderBuilder the
*/
public static void setExemplarFilter(
SdkMeterProviderBuilder sdkMeterProviderBuilder, ExemplarFilter exemplarFilter) {
try {
Method method =
SdkMeterProviderBuilder.class.getDeclaredMethod(
"setExemplarFilter", ExemplarFilter.class);
method.setAccessible(true);
method.invoke(sdkMeterProviderBuilder, exemplarFilter);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new IllegalStateException(
"Error calling setExemplarFilter on SdkMeterProviderBuilder", e);
}
}
/**
* Reflectively set the minimum duration between synchronous collections for the {@link
* SdkMeterProviderBuilder}. If collections occur more frequently than this, synchronous
* collection will be suppressed.
*
* @param duration The duration.
*/
public static void setMinimumCollectionInterval(
SdkMeterProviderBuilder sdkMeterProviderBuilder, Duration duration) {
try {
Method method =
SdkMeterProviderBuilder.class.getDeclaredMethod(
"setMinimumCollectionInterval", Duration.class);
method.setAccessible(true);
method.invoke(sdkMeterProviderBuilder, duration);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
throw new IllegalStateException(
"Error calling setMinimumCollectionInterval on SdkMeterProviderBuilder", e);
}
}
/**
* Reflectively add an {@link AttributesProcessor} to the {@link ViewBuilder} which appends
* key-values from baggage to all measurements.
*
* <p>Note: This runs after all other attribute processing added so far.
*
* @param viewBuilder the builder
* @param keyFilter Only baggage key values pairs where the key matches this predicate will be
* appended.
*/
public static void appendFilteredBaggageAttributes(
ViewBuilder viewBuilder, Predicate<String> keyFilter) {
addAttributesProcessor(viewBuilder, AttributesProcessor.appendBaggageByKeyName(keyFilter));
}
/**
* Reflectively add an {@link AttributesProcessor} to the {@link ViewBuilder} which appends all
* key-values from baggage to all measurements.
*
* <p>Note: This runs after all other attribute processing added so far.
*
* @param viewBuilder the builder
*/
public static void appendAllBaggageAttributes(ViewBuilder viewBuilder) {
appendFilteredBaggageAttributes(viewBuilder, StringPredicates.ALL);
}
private static void addAttributesProcessor(
ViewBuilder viewBuilder, AttributesProcessor attributesProcessor) {
try {
Method method =
ViewBuilder.class.getDeclaredMethod("addAttributesProcessor", AttributesProcessor.class);
method.setAccessible(true);
method.invoke(viewBuilder, attributesProcessor);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
throw new IllegalStateException("Error adding AttributesProcessor to ViewBuilder", e);
}
}
}

View File

@ -7,9 +7,6 @@ package io.opentelemetry.sdk.metrics.internal.exemplar;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.context.Context;
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Exemplar filters are used to pre-filter measurements before attempting to store them in a
@ -42,23 +39,4 @@ public interface ExemplarFilter {
static ExemplarFilter neverSample() {
return NeverSampleFilter.INSTANCE;
}
/**
* Reflectively assign the {@link ExemplarFilter} to the {@link SdkMeterProviderBuilder}.
*
* @param sdkMeterProviderBuilder the
*/
static void setExemplarFilter(
SdkMeterProviderBuilder sdkMeterProviderBuilder, ExemplarFilter exemplarFilter) {
try {
Method method =
SdkMeterProviderBuilder.class.getDeclaredMethod(
"setExemplarFilter", ExemplarFilter.class);
method.setAccessible(true);
method.invoke(sdkMeterProviderBuilder, exemplarFilter);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new IllegalStateException(
"Error calling setExemplarFilter on SdkMeterProviderBuilder", e);
}
}
}

View File

@ -1,59 +0,0 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.metrics.internal.view;
import io.opentelemetry.sdk.metrics.ViewBuilder;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.function.Predicate;
/**
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
* any time.
*/
public class ViewUtil {
private ViewUtil() {}
/**
* Add an {@link AttributesProcessor} to the {@link ViewBuilder} which appends key-values from
* baggage to all measurements.
*
* <p>Note: This runs after all other attribute processing added so far.
*
* @param viewBuilder the builder
* @param keyFilter Only baggage key values pairs where the key matches this predicate will be
* appended.
*/
public static void appendFilteredBaggageAttributes(
ViewBuilder viewBuilder, Predicate<String> keyFilter) {
addAttributesProcessor(viewBuilder, AttributesProcessor.appendBaggageByKeyName(keyFilter));
}
/**
* Add an {@link AttributesProcessor} to the {@link ViewBuilder} which which appends all
* key-values from baggage to all measurements.
*
* <p>Note: This runs after all other attribute processing added so far.
*
* @param viewBuilder the builder
*/
public static void appendAllBaggageAttributes(ViewBuilder viewBuilder) {
appendFilteredBaggageAttributes(viewBuilder, StringPredicates.ALL);
}
private static void addAttributesProcessor(
ViewBuilder viewBuilder, AttributesProcessor attributesProcessor) {
try {
Method method =
ViewBuilder.class.getDeclaredMethod("addAttributesProcessor", AttributesProcessor.class);
method.setAccessible(true);
method.invoke(viewBuilder, attributesProcessor);
} catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
throw new IllegalStateException("Error adding AttributesProcessor to ViewBuilder", e);
}
}
}

View File

@ -5,10 +5,15 @@
package io.opentelemetry.sdk.metrics;
import static org.assertj.core.api.Assertions.as;
import static org.assertj.core.api.Assertions.assertThat;
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.junit.jupiter.api.Test;
class SdkMeterProviderBuilderTest {
@ -23,4 +28,19 @@ class SdkMeterProviderBuilderTest {
.extracting("sharedState")
.hasFieldOrPropertyWithValue("resource", Resource.getDefault());
}
@Test
void setMinimumCollectionInterval() {
assertThat(SdkMeterProvider.builder().setMinimumCollectionInterval(Duration.ofSeconds(10)))
.extracting(
"minimumCollectionIntervalNanos", as(InstanceOfAssertFactories.type(Long.class)))
.isEqualTo(TimeUnit.SECONDS.toNanos(10));
SdkMeterProviderBuilder builder = SdkMeterProvider.builder();
SdkMeterProviderUtil.setMinimumCollectionInterval(builder, Duration.ofSeconds(10));
assertThat(builder)
.extracting(
"minimumCollectionIntervalNanos", as(InstanceOfAssertFactories.type(Long.class)))
.isEqualTo(TimeUnit.SECONDS.toNanos(10));
}
}

View File

@ -27,8 +27,8 @@ import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.metrics.data.LongPointData;
import io.opentelemetry.sdk.metrics.data.MetricData;
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
import io.opentelemetry.sdk.metrics.internal.export.AbstractMetricReader;
import io.opentelemetry.sdk.metrics.internal.view.ViewUtil;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader;
import io.opentelemetry.sdk.testing.time.TestClock;
@ -684,7 +684,7 @@ class SdkMeterProviderTest {
InstrumentSelector.builder().setType(InstrumentType.COUNTER).setName("test").build();
InMemoryMetricReader reader = InMemoryMetricReader.create();
ViewBuilder viewBuilder = View.builder().setAggregation(Aggregation.sum());
ViewUtil.appendAllBaggageAttributes(viewBuilder);
SdkMeterProviderUtil.appendAllBaggageAttributes(viewBuilder);
SdkMeterProvider provider =
sdkMeterProviderBuilder
.registerMetricReader(reader)

View File

@ -16,6 +16,7 @@ import io.opentelemetry.api.trace.TraceState;
import io.opentelemetry.context.Context;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
import org.assertj.core.api.InstanceOfAssertFactories;
import org.junit.jupiter.api.Test;
@ -78,7 +79,7 @@ class ExemplarFilterTest {
@Test
void setExemplarFilter() {
SdkMeterProviderBuilder builder = SdkMeterProvider.builder();
ExemplarFilter.setExemplarFilter(builder, ExemplarFilter.alwaysSample());
SdkMeterProviderUtil.setExemplarFilter(builder, ExemplarFilter.alwaysSample());
assertThat(builder)
.extracting("exemplarFilter", as(InstanceOfAssertFactories.type(ExemplarFilter.class)))
.isEqualTo(ExemplarFilter.alwaysSample());