Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalMeterConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalMeterConfiguratorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalMeterMatcherAndConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalViewMatchingModeModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.MeterProviderModelAccessor;
import io.opentelemetry.sdk.common.internal.ScopeConfigurator;
import io.opentelemetry.sdk.common.internal.ScopeConfiguratorBuilder;
Expand All @@ -24,6 +25,7 @@
import io.opentelemetry.sdk.metrics.export.CardinalityLimitSelector;
import io.opentelemetry.sdk.metrics.internal.MeterConfig;
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
import io.opentelemetry.sdk.metrics.internal.view.ViewMatchingMode;
import java.util.List;

final class MeterProviderFactory implements Factory<MeterProviderModel, SdkMeterProviderBuilder> {
Expand Down Expand Up @@ -97,6 +99,16 @@ public SdkMeterProviderBuilder create(
SdkMeterProviderUtil.setMeterConfigurator(builder, configuratorBuilder.build());
}

ExperimentalViewMatchingModeModel viewMatchingModeModel =
MeterProviderModelAccessor.getViewMatchingMode(model);
if (viewMatchingModeModel != null) {
ViewMatchingMode viewMatchingMode =
viewMatchingModeModel == ExperimentalViewMatchingModeModel.COMPOSABLE
? ViewMatchingMode.COMPOSABLE
: ViewMatchingMode.INDEPENDENT;
SdkMeterProviderUtil.setViewMatchingMode(builder, viewMatchingMode);
}

ExemplarFilterModel exemplarFilterModel = model.getExemplarFilter();
if (exemplarFilterModel != null) {
builder.setExemplarFilter(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
package io.opentelemetry.sdk.autoconfigure.declarativeconfig;

import static io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil.setMeterConfigurator;
import static io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil.setViewMatchingMode;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;

import io.opentelemetry.common.ComponentLoader;
Expand All @@ -23,6 +24,7 @@
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalMeterConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalMeterConfiguratorModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalMeterMatcherAndConfigModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.ExperimentalViewMatchingModeModel;
import io.opentelemetry.sdk.autoconfigure.declarativeconfig.model.internal.MeterProviderModelAccessor;
import io.opentelemetry.sdk.common.internal.ScopeConfigurator;
import io.opentelemetry.sdk.common.internal.ScopeConfiguratorBuilder;
Expand All @@ -32,6 +34,7 @@
import io.opentelemetry.sdk.metrics.View;
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader;
import io.opentelemetry.sdk.metrics.internal.MeterConfig;
import io.opentelemetry.sdk.metrics.internal.view.ViewMatchingMode;
import java.io.Closeable;
import java.util.ArrayList;
import java.util.Collections;
Expand Down Expand Up @@ -73,6 +76,11 @@ private static Stream<Arguments> createArguments() {
return Stream.of(
Arguments.argumentSet(
"defaults", new MeterProviderModel(), SdkMeterProvider.builder().build()),
Arguments.argumentSet(
"with view matching mode composable",
MeterProviderModelAccessor.setViewMatchingMode(
new MeterProviderModel(), ExperimentalViewMatchingModeModel.COMPOSABLE),
setViewMatchingMode(SdkMeterProvider.builder(), ViewMatchingMode.COMPOSABLE).build()),
Arguments.argumentSet(
"with reader view and meter configurator",
MeterProviderModelAccessor.setMeterConfigurator(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import io.opentelemetry.sdk.metrics.internal.export.RegisteredReader;
import io.opentelemetry.sdk.metrics.internal.state.MeterProviderSharedState;
import io.opentelemetry.sdk.metrics.internal.view.RegisteredView;
import io.opentelemetry.sdk.metrics.internal.view.ViewMatchingMode;
import io.opentelemetry.sdk.metrics.internal.view.ViewRegistry;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.resources.internal.SdkResourceProvider;
Expand All @@ -52,6 +53,7 @@ public final class SdkMeterProvider implements MeterProvider, Closeable {
static final String DEFAULT_METER_NAME = "unknown";

private final List<RegisteredView> registeredViews;
private final ViewMatchingMode viewMatchingMode;
private final List<RegisteredReader> registeredReaders;
private final List<MetricProducer> metricProducers;
private final MeterProviderSharedState sharedState;
Expand All @@ -73,16 +75,19 @@ public static SdkMeterProviderBuilder builder() {
Clock clock,
SdkResourceProvider resourceProvider,
ExemplarFilterInternal exemplarFilter,
ScopeConfigurator<MeterConfig> meterConfigurator) {
ScopeConfigurator<MeterConfig> meterConfigurator,
ViewMatchingMode viewMatchingMode) {
this.resourceProvider = resourceProvider;
this.registeredViews = registeredViews;
this.viewMatchingMode = viewMatchingMode;
this.registeredReaders =
metricReaders.entrySet().stream()
.map(
entry ->
RegisteredReader.create(
entry.getKey(),
ViewRegistry.create(entry.getKey(), entry.getValue(), registeredViews)))
ViewRegistry.create(
entry.getKey(), entry.getValue(), registeredViews, viewMatchingMode)))
.collect(toList());
this.metricProducers = metricProducers;
this.sharedState = MeterProviderSharedState.create(clock, resourceProvider, exemplarFilter);
Expand Down Expand Up @@ -206,6 +211,8 @@ public String toString() {
+ metricProducers
+ ", views="
+ registeredViews
+ ", viewMatchingMode="
+ viewMatchingMode
+ ", meterConfigurator="
+ meterConfigurator
+ "}";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import io.opentelemetry.sdk.metrics.internal.exemplar.ExemplarFilterInternal;
import io.opentelemetry.sdk.metrics.internal.view.AttributesFilters;
import io.opentelemetry.sdk.metrics.internal.view.RegisteredView;
import io.opentelemetry.sdk.metrics.internal.view.ViewMatchingMode;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.resources.internal.SdkResourceProvider;
import java.util.ArrayList;
Expand Down Expand Up @@ -50,6 +51,7 @@ public final class SdkMeterProviderBuilder {
new IdentityHashMap<>();
private final List<MetricProducer> metricProducers = new ArrayList<>();
private final List<RegisteredView> registeredViews = new ArrayList<>();
private ViewMatchingMode viewMatchingMode = ViewMatchingMode.INDEPENDENT;
private ExemplarFilterInternal exemplarFilter = DEFAULT_EXEMPLAR_FILTER;
private ScopeConfiguratorBuilder<MeterConfig> meterConfiguratorBuilder =
MeterConfig.configuratorBuilder();
Expand Down Expand Up @@ -240,6 +242,17 @@ SdkMeterProviderBuilder addMeterConfiguratorCondition(
return this;
}

/**
* Set the view matching mode.
*
* <p>This method is experimental so not public. You may reflectively call it using {@link
* SdkMeterProviderUtil#setViewMatchingMode(SdkMeterProviderBuilder, ViewMatchingMode)}.
*/
SdkMeterProviderBuilder setViewMatchingMode(ViewMatchingMode viewMatchingMode) {
this.viewMatchingMode = Objects.requireNonNull(viewMatchingMode, "viewMatchingMode");
return this;
}

/** Returns an {@link SdkMeterProvider} built with the configuration of this builder. */
public SdkMeterProvider build() {
SdkResourceProvider effectiveSdkResourceProvider =
Expand All @@ -251,6 +264,7 @@ public SdkMeterProvider build() {
clock,
effectiveSdkResourceProvider,
exemplarFilter,
meterConfiguratorBuilder.build());
meterConfiguratorBuilder.build(),
viewMatchingMode);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,19 @@ static View create(
@Nullable String description,
Aggregation aggregation,
Predicate<String> attributeFilter,
int cardinalityLimit) {
return new AutoValue_View(name, description, aggregation, attributeFilter, cardinalityLimit);
int cardinalityLimit,
@Nullable Aggregation explicitAggregation,
@Nullable Predicate<String> explicitAttributeFilter,
@Nullable Integer explicitCardinalityLimit) {
return new AutoValue_View(
name,
description,
aggregation,
attributeFilter,
cardinalityLimit,
explicitAggregation,
explicitAttributeFilter,
explicitCardinalityLimit);
}

View() {}
Expand Down Expand Up @@ -71,6 +82,15 @@ static View create(
*/
public abstract int getCardinalityLimit();

@Nullable
abstract Aggregation getExplicitAggregation();

@Nullable
abstract Predicate<String> getExplicitAttributeFilter();

@Nullable
abstract Integer getExplicitCardinalityLimit();

@Override
public final String toString() {
StringJoiner joiner = new StringJoiner(", ", "View{", "}");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ public final class ViewBuilder {

@Nullable private String name;
@Nullable private String description;
private Aggregation aggregation = Aggregation.defaultAggregation();
private Predicate<String> attributeFilter = StringPredicates.ALL;
private int cardinalityLimit = MetricStorage.DEFAULT_MAX_CARDINALITY;
@Nullable private Aggregation explicitAggregation;
@Nullable private Predicate<String> explicitAttributeFilter;
@Nullable private Integer explicitCardinalityLimit;

ViewBuilder() {}

Expand Down Expand Up @@ -58,12 +58,13 @@ public ViewBuilder setDescription(String description) {
* @param aggregation aggregation to use.
*/
public ViewBuilder setAggregation(Aggregation aggregation) {
Objects.requireNonNull(aggregation, "aggregation");
if (!(aggregation instanceof AggregatorFactory)) {
throw new IllegalArgumentException(
"Custom Aggregation implementations are currently not supported. "
+ "Use one of the standard implementations returned by the static factories in the Aggregation class.");
}
this.aggregation = aggregation;
this.explicitAggregation = aggregation;
return this;
}

Expand Down Expand Up @@ -104,7 +105,7 @@ public ViewBuilder setAttributeFilter(Set<String> keysToRetain) {
*/
public ViewBuilder setAttributeFilter(Predicate<String> keyFilter) {
Objects.requireNonNull(keyFilter, "keyFilter");
this.attributeFilter = keyFilter;
this.explicitAttributeFilter = keyFilter;
return this;
}

Expand All @@ -121,12 +122,28 @@ public ViewBuilder setCardinalityLimit(int cardinalityLimit) {
if (cardinalityLimit <= 0) {
throw new IllegalArgumentException("cardinalityLimit must be > 0");
}
this.cardinalityLimit = cardinalityLimit;
this.explicitCardinalityLimit = cardinalityLimit;
return this;
}

/** Returns a {@link View} with the configuration of this builder. */
public View build() {
return View.create(name, description, aggregation, attributeFilter, cardinalityLimit);
Aggregation aggregation =
explicitAggregation != null ? explicitAggregation : Aggregation.defaultAggregation();
Predicate<String> attributeFilter =
explicitAttributeFilter != null ? explicitAttributeFilter : StringPredicates.ALL;
int cardinalityLimit =
explicitCardinalityLimit != null
? explicitCardinalityLimit
: MetricStorage.DEFAULT_MAX_CARDINALITY;
return View.create(
name,
description,
aggregation,
attributeFilter,
cardinalityLimit,
explicitAggregation,
explicitAttributeFilter,
explicitCardinalityLimit);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,16 @@

import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
import io.opentelemetry.sdk.common.internal.ScopeConfigurator;
import io.opentelemetry.sdk.metrics.Aggregation;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
import io.opentelemetry.sdk.metrics.View;
import io.opentelemetry.sdk.metrics.internal.view.ViewMatchingMode;
import io.opentelemetry.sdk.resources.internal.SdkResourceProvider;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.function.Predicate;
import javax.annotation.Nullable;

/**
* A collection of methods that allow use of experimental features prior to availability in public
Expand Down Expand Up @@ -111,4 +115,57 @@ public static void resetForTest(SdkMeterProvider sdkMeterProvider) {
throw new IllegalStateException("Error calling resetForTest on SdkMeterProvider", e);
}
}

/** Reflectively set the {@link ViewMatchingMode} on the {@link SdkMeterProviderBuilder}. */
public static SdkMeterProviderBuilder setViewMatchingMode(
SdkMeterProviderBuilder sdkMeterProviderBuilder, ViewMatchingMode viewMatchingMode) {
try {
Method method =
SdkMeterProviderBuilder.class.getDeclaredMethod(
"setViewMatchingMode", ViewMatchingMode.class);
method.setAccessible(true);
method.invoke(sdkMeterProviderBuilder, viewMatchingMode);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new IllegalStateException(
"Error calling setViewMatchingMode on SdkMeterProviderBuilder", e);
}
return sdkMeterProviderBuilder;
}

/** Reflectively get the explicit aggregation configured on a {@link View}. */
@Nullable
public static Aggregation getExplicitAggregation(View view) {
try {
Method method = View.class.getDeclaredMethod("getExplicitAggregation");
method.setAccessible(true);
return (Aggregation) method.invoke(view);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new IllegalStateException("Error calling getExplicitAggregation on View", e);
}
}

/** Reflectively get the explicit attribute filter configured on a {@link View}. */
@Nullable
@SuppressWarnings("unchecked")
public static Predicate<String> getExplicitAttributeFilter(View view) {
try {
Method method = View.class.getDeclaredMethod("getExplicitAttributeFilter");
method.setAccessible(true);
return (Predicate<String>) method.invoke(view);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new IllegalStateException("Error calling getExplicitAttributeFilter on View", e);
}
}

/** Reflectively get the explicit cardinality limit configured on a {@link View}. */
@Nullable
public static Integer getExplicitCardinalityLimit(View view) {
try {
Method method = View.class.getDeclaredMethod("getExplicitCardinalityLimit");
method.setAccessible(true);
return (Integer) method.invoke(view);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new IllegalStateException("Error calling getExplicitCardinalityLimit on View", e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,14 @@

import com.google.auto.value.AutoValue;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.sdk.metrics.Aggregation;
import io.opentelemetry.sdk.metrics.InstrumentSelector;
import io.opentelemetry.sdk.metrics.View;
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
import io.opentelemetry.sdk.metrics.internal.debug.SourceInfo;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;

/**
Expand Down Expand Up @@ -54,6 +58,21 @@ public static RegisteredView create(
/** The {@link SourceInfo} from where the view was registered. */
public abstract SourceInfo getViewSourceInfo();

@Nullable
public Aggregation getExplicitAggregation() {
return SdkMeterProviderUtil.getExplicitAggregation(getView());
}

@Nullable
public Predicate<String> getExplicitAttributeFilter() {
return SdkMeterProviderUtil.getExplicitAttributeFilter(getView());
}

@Nullable
public Integer getExplicitCardinalityLimit() {
return SdkMeterProviderUtil.getExplicitCardinalityLimit(getView());
}

@Override
public final String toString() {
return "RegisteredView{"
Expand Down
Loading
Loading