Make setMinimumCollectionInterval package private (#4310)
* Make setMinimumCollectionInterval package private, centralize experimental utilities * Default minimum collection interval to zero
This commit is contained in:
		
							parent
							
								
									6bc06f86ca
								
							
						
					
					
						commit
						725ce32db3
					
				|  | @ -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( | ||||
|  |  | |||
|  | @ -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; | ||||
|     } | ||||
| 
 | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
|  | @ -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); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | @ -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); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -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); | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | @ -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)); | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -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) | ||||
|  |  | |||
|  | @ -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()); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue