Skip to content
Open
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
@@ -1,2 +1,5 @@
Comparing source compatibility of opentelemetry-sdk-metrics-1.69.0-SNAPSHOT.jar against opentelemetry-sdk-metrics-1.68.0.jar
No changes.
*** MODIFIED CLASS: PUBLIC ABSTRACT io.opentelemetry.sdk.metrics.View (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++ NEW METHOD: PUBLIC(+) FINAL(+) boolean equals(java.lang.Object)
+++ NEW METHOD: PUBLIC(+) FINAL(+) int hashCode()
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 @@ -95,6 +97,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 @@ -305,7 +305,7 @@ WriteableMetricStorage registerSynchronousMetricStorage(InstrumentDescriptor ins
if (Aggregation.drop() == registeredView.getView().getAggregation()) {
continue;
}
registeredStorages.add(
SynchronousMetricStorage storage =
registry.register(
SynchronousMetricStorage.create(
reader,
Expand All @@ -314,7 +314,10 @@ WriteableMetricStorage registerSynchronousMetricStorage(InstrumentDescriptor ins
instrument,
meterProviderSharedState.getExemplarFilter(),
meterEnabled,
getContextScopedAttributesFilter())));
getContextScopedAttributesFilter()));
if (!registeredStorages.contains(storage)) {
registeredStorages.add(storage);
}
}
}

Expand All @@ -339,15 +342,18 @@ SdkObservableMeasurement registerObservableMeasurement(
if (Aggregation.drop() == registeredView.getView().getAggregation()) {
continue;
}
registeredStorages.add(
AsynchronousMetricStorage<?> storage =
registry.register(
AsynchronousMetricStorage.create(
reader,
registeredView,
meterProviderSharedState.getClock(),
instrumentDescriptor,
meterProviderSharedState.getExemplarFilter(),
meterEnabled)));
meterEnabled));
if (!registeredStorages.contains(storage)) {
registeredStorages.add(storage);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,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 Down Expand Up @@ -55,6 +56,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 @@ -78,15 +80,18 @@ public static SdkMeterProviderBuilder builder() {
ExemplarFilterInternal exemplarFilter,
ScopeConfigurator<MeterConfig> meterConfigurator,
@Nullable
BiPredicate<InstrumentationScopeInfo, AttributeKey<?>> contextScopedAttributesFilter) {
BiPredicate<InstrumentationScopeInfo, AttributeKey<?>> contextScopedAttributesFilter,
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 =
Expand Down Expand Up @@ -210,6 +215,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 @@ -19,6 +19,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 @@ -52,6 +53,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 @@ -171,7 +173,10 @@ public SdkMeterProviderBuilder registerView(InstrumentSelector selector, View vi
view,
AttributesFilters.byKeyName(view.getAttributeFilter()),
view.getCardinalityLimit(),
SourceInfo.fromCurrentStack()));
SourceInfo.fromCurrentStack(),
view.getExplicitAggregation(),
view.getExplicitAttributeFilter(),
view.getExplicitCardinalityLimit()));
return this;
}

Expand Down Expand Up @@ -263,6 +268,17 @@ SdkMeterProviderBuilder setContextScopedAttributesFilter(
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 @@ -275,6 +291,7 @@ public SdkMeterProvider build() {
effectiveSdkResourceProvider,
exemplarFilter,
meterConfiguratorBuilder.build(),
contextScopedAttributesFilter);
contextScopedAttributesFilter,
viewMatchingMode);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
package io.opentelemetry.sdk.metrics;

import com.google.auto.value.AutoValue;
import java.util.Objects;
import java.util.StringJoiner;
import java.util.function.Predicate;
import javax.annotation.Nullable;
Expand Down Expand Up @@ -33,8 +34,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 +83,15 @@ static View create(
*/
public abstract int getCardinalityLimit();

@Nullable
abstract Aggregation getExplicitAggregation();

@Nullable
abstract Predicate<String> getExplicitAttributeFilter();

@Nullable
abstract Integer getExplicitCardinalityLimit();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Including getExplicitAggregation(), getExplicitAttributeFilter(), and getExplicitCardinalityLimit() in View.equals means View.builder().build() and View.builder().setAggregation(Aggregation.defaultAggregation()).build() are no longer considered equal. Should we exclude those three internal tracking fields from equals and hashCode so View equality only compares the effective view settings?


@Override
public final String toString() {
StringJoiner joiner = new StringJoiner(", ", "View{", "}");
Expand All @@ -85,4 +106,36 @@ public final String toString() {
joiner.add("cardinalityLimit=" + getCardinalityLimit());
return joiner.toString();
}

@Override
public final boolean equals(@Nullable Object o) {
if (o == this) {
return true;
}
if (o instanceof View) {
View that = (View) o;
return Objects.equals(this.getName(), that.getName())
&& Objects.equals(this.getDescription(), that.getDescription())
&& this.getAggregation().equals(that.getAggregation())
&& this.getAttributeFilter().equals(that.getAttributeFilter())
&& this.getCardinalityLimit() == that.getCardinalityLimit();
}
return false;
}

@Override
public final int hashCode() {
int hash = 1;
hash *= 1000003;
hash ^= (getName() == null) ? 0 : getName().hashCode();
hash *= 1000003;
hash ^= (getDescription() == null) ? 0 : getDescription().hashCode();
hash *= 1000003;
hash ^= getAggregation().hashCode();
hash *= 1000003;
hash ^= getAttributeFilter().hashCode();
hash *= 1000003;
hash ^= getCardinalityLimit();
return hash;
}
}
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 @@ -10,6 +10,7 @@
import io.opentelemetry.sdk.common.internal.ScopeConfigurator;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
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;
Expand Down Expand Up @@ -133,4 +134,20 @@ public static SdkMeterProviderBuilder setContextScopedAttributesFilter(
}
return sdkMeterProviderBuilder;
}

/** 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;
}
}
Loading
Loading