Skip to content

Commit 0cbc0cb

Browse files
committed
Address review comment: check instrument compatibility before applying View enabled=false
1 parent 68c46b6 commit 0cbc0cb

3 files changed

Lines changed: 55 additions & 10 deletions

File tree

‎sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/view/ViewRegistry.java‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,14 +111,11 @@ public List<RegisteredView> findViews(
111111
// Find matching views for the instrument
112112
for (RegisteredView entry : registeredViews) {
113113
if (matchesSelector(entry.getInstrumentSelector(), descriptor, meterScope)) {
114-
if (Boolean.FALSE.equals(entry.getEnabled())) {
115-
result.add(applyDropAggregation(entry));
116-
continue;
117-
}
118114
AggregatorFactory viewAggregatorFactory =
119115
(AggregatorFactory) entry.getView().getAggregation();
120116
if (viewAggregatorFactory.isCompatibleWithInstrument(descriptor)) {
121-
if (descriptor.getAdvice().isOptIn() && !Boolean.TRUE.equals(entry.getEnabled())) {
117+
if (Boolean.FALSE.equals(entry.getEnabled())
118+
|| (descriptor.getAdvice().isOptIn() && !Boolean.TRUE.equals(entry.getEnabled()))) {
122119
result.add(applyDropAggregation(entry));
123120
} else if (Boolean.TRUE.equals(entry.getEnabled())
124121
&& descriptor.getAdvice().hasAttributes()

‎sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/internal/view/ViewRegistryTest.java‎

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,7 @@ void findViews_ApplyAdvice() {
530530
}
531531

532532
@Test
533+
@SuppressLogger(ViewRegistry.class)
533534
void findViews_OptInAndViewEnabled() {
534535
ViewBuilder enabledViewBuilder = View.builder().setDescription("enabled view");
535536
SdkMeterProviderUtil.setEnabled(enabledViewBuilder, /* enabled= */ true);
@@ -547,6 +548,15 @@ void findViews_OptInAndViewEnabled() {
547548
disabledViewBuilder.build(),
548549
/* enabled= */ false);
549550

551+
ViewBuilder incompatibleDisabledViewBuilder =
552+
View.builder().setAggregation(Aggregation.explicitBucketHistogram());
553+
SdkMeterProviderUtil.setEnabled(incompatibleDisabledViewBuilder, /* enabled= */ false);
554+
RegisteredView incompatibleDisabledView =
555+
registeredView(
556+
InstrumentSelector.builder().setName("incompatible_disabled").build(),
557+
incompatibleDisabledViewBuilder.build(),
558+
/* enabled= */ false);
559+
550560
RegisteredView unsetEnabledView =
551561
registeredView(
552562
InstrumentSelector.builder().setName("opt_in_unset_view").build(),
@@ -557,7 +567,7 @@ void findViews_OptInAndViewEnabled() {
557567
ViewRegistry.create(
558568
DefaultAggregationSelector.getDefault(),
559569
CardinalityLimitSelector.defaultCardinalityLimitSelector(),
560-
Arrays.asList(enabledView, disabledView, unsetEnabledView));
570+
Arrays.asList(enabledView, disabledView, incompatibleDisabledView, unsetEnabledView));
561571

562572
// OptIn instrument with no matching view gets DROP_REGISTERED_VIEW
563573
assertThat(
@@ -615,6 +625,21 @@ void findViews_OptInAndViewEnabled() {
615625
.hasSize(1)
616626
.element(0)
617627
.satisfies(rv -> assertThat(rv.getView().getAggregation()).isEqualTo(Aggregation.drop()));
628+
629+
// Incompatible view with enabled=false still logs a warning and is ignored
630+
assertThat(
631+
viewRegistry.findViews(
632+
InstrumentDescriptor.create(
633+
"incompatible_disabled",
634+
"",
635+
"",
636+
InstrumentType.OBSERVABLE_COUNTER,
637+
InstrumentValueType.LONG,
638+
Advice.empty()),
639+
INSTRUMENTATION_SCOPE_INFO))
640+
.isEqualTo(Collections.singletonList(DEFAULT_REGISTERED_VIEW));
641+
logs.assertContains(
642+
"View aggregation explicit_bucket_histogram is incompatible with instrument incompatible_disabled of type OBSERVABLE_COUNTER");
618643
}
619644

620645
private static void assertAdviceFilter(RegisteredView view, AttributeKey<?>... expectedKeys) {

‎sdk/metrics/src/testIncubating/java/io/opentelemetry/sdk/metrics/OptInAdviceTest.java‎

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,24 @@ void optInCounterNotEnabledByViewWithAggregationOnly() {
170170
void nonOptInInstrumentDisabledByViewEnabledFalse(
171171
InstrumentFactory instrumentFactory, PointsAssert<AbstractPointAssert<?, ?>> unused) {
172172
InMemoryMetricReader reader = InMemoryMetricReader.create();
173+
ViewBuilder viewBuilder = View.builder();
174+
SdkMeterProviderUtil.setEnabled(viewBuilder, /* enabled= */ false);
175+
meterProvider =
176+
SdkMeterProvider.builder()
177+
.registerMetricReader(reader)
178+
.registerView(InstrumentSelector.builder().setName("test").build(), viewBuilder.build())
179+
.build();
180+
181+
TestInstrument instrument = instrumentFactory.create(meterProvider, "test", /* optIn= */ false);
182+
assertThat(instrument.isEnabled()).isFalse();
183+
instrument.record(1, ATTRIBUTES);
184+
185+
assertThat(reader.collectAllMetrics()).isEmpty();
186+
}
187+
188+
@Test
189+
void nonOptInCounterDisabledByViewEnabledFalseOverridesAggregation() {
190+
InMemoryMetricReader reader = InMemoryMetricReader.create();
173191
ViewBuilder viewBuilder =
174192
View.builder()
175193
.setAggregation(
@@ -179,12 +197,17 @@ void nonOptInInstrumentDisabledByViewEnabledFalse(
179197
meterProvider =
180198
SdkMeterProvider.builder()
181199
.registerMetricReader(reader)
182-
.registerView(InstrumentSelector.builder().setName("test").build(), viewBuilder.build())
200+
.registerView(
201+
InstrumentSelector.builder().setName("test_counter").build(), viewBuilder.build())
183202
.build();
184203

185-
TestInstrument instrument = instrumentFactory.create(meterProvider, "test", /* optIn= */ false);
186-
assertThat(instrument.isEnabled()).isFalse();
187-
instrument.record(1, ATTRIBUTES);
204+
ExtendedLongCounter counter =
205+
(ExtendedLongCounter)
206+
((ExtendedLongCounterBuilder) meterProvider.get("meter").counterBuilder("test_counter"))
207+
.setOptInAdvice(false)
208+
.build();
209+
assertThat(counter.isEnabled()).isFalse();
210+
counter.add(1, ATTRIBUTES);
188211

189212
assertThat(reader.collectAllMetrics()).isEmpty();
190213
}

0 commit comments

Comments
 (0)