Skip to content

Commit 6c780f1

Browse files
authored
Add declarative config support for ExemplarFilter (#7769)
1 parent 0f0cbb7 commit 6c780f1

File tree

10 files changed

+134
-22
lines changed

10 files changed

+134
-22
lines changed

sdk-extensions/autoconfigure/src/test/java/io/opentelemetry/sdk/autoconfigure/MeterProviderConfigurationTest.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
1313
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
1414
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
15-
import io.opentelemetry.sdk.metrics.internal.exemplar.AlwaysOffFilter;
16-
import io.opentelemetry.sdk.metrics.internal.exemplar.AlwaysOnFilter;
15+
import io.opentelemetry.sdk.metrics.internal.exemplar.AlwaysOffExemplarFilter;
16+
import io.opentelemetry.sdk.metrics.internal.exemplar.AlwaysOnExemplarFilter;
1717
import io.opentelemetry.sdk.metrics.internal.exemplar.ExemplarFilter;
1818
import io.opentelemetry.sdk.metrics.internal.exemplar.TraceBasedExemplarFilter;
1919
import java.util.ArrayList;
@@ -36,13 +36,13 @@ void configureMeterProvider_ConfiguresExemplarFilter() {
3636
assertExemplarFilter(Collections.singletonMap("otel.metrics.exemplar.filter", "Trace_based"))
3737
.isInstanceOf(TraceBasedExemplarFilter.class);
3838
assertExemplarFilter(Collections.singletonMap("otel.metrics.exemplar.filter", "always_off"))
39-
.isInstanceOf(AlwaysOffFilter.class);
39+
.isInstanceOf(AlwaysOffExemplarFilter.class);
4040
assertExemplarFilter(Collections.singletonMap("otel.metrics.exemplar.filter", "always_Off"))
41-
.isInstanceOf(AlwaysOffFilter.class);
41+
.isInstanceOf(AlwaysOffExemplarFilter.class);
4242
assertExemplarFilter(Collections.singletonMap("otel.metrics.exemplar.filter", "always_on"))
43-
.isInstanceOf(AlwaysOnFilter.class);
43+
.isInstanceOf(AlwaysOnExemplarFilter.class);
4444
assertExemplarFilter(Collections.singletonMap("otel.metrics.exemplar.filter", "ALWAYS_ON"))
45-
.isInstanceOf(AlwaysOnFilter.class);
45+
.isInstanceOf(AlwaysOnExemplarFilter.class);
4646
}
4747

4848
private static ObjectAssert<ExemplarFilter> assertExemplarFilter(Map<String, String> config) {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.extension.incubator.fileconfig;
7+
8+
import io.opentelemetry.api.incubator.config.DeclarativeConfigException;
9+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MeterProviderModel;
10+
import io.opentelemetry.sdk.metrics.internal.exemplar.ExemplarFilter;
11+
12+
final class ExemplarFilterFactory
13+
implements Factory<MeterProviderModel.ExemplarFilter, ExemplarFilter> {
14+
15+
private static final ExemplarFilterFactory INSTANCE = new ExemplarFilterFactory();
16+
17+
private ExemplarFilterFactory() {}
18+
19+
static ExemplarFilterFactory getInstance() {
20+
return INSTANCE;
21+
}
22+
23+
@Override
24+
public ExemplarFilter create(
25+
MeterProviderModel.ExemplarFilter model, DeclarativeConfigContext context) {
26+
switch (model) {
27+
case ALWAYS_ON:
28+
return ExemplarFilter.alwaysOn();
29+
case ALWAYS_OFF:
30+
return ExemplarFilter.alwaysOff();
31+
case TRACE_BASED:
32+
return ExemplarFilter.traceBased();
33+
}
34+
throw new DeclarativeConfigException("Unrecognized exemplar filter: " + model);
35+
}
36+
}

sdk-extensions/incubator/src/main/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MeterProviderFactory.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,12 @@ public SdkMeterProviderBuilder create(
9595
SdkMeterProviderUtil.setMeterConfigurator(builder, configuratorBuilder.build());
9696
}
9797

98+
MeterProviderModel.ExemplarFilter exemplarFilterModel = model.getExemplarFilter();
99+
if (exemplarFilterModel != null) {
100+
SdkMeterProviderUtil.setExemplarFilter(
101+
builder, ExemplarFilterFactory.getInstance().create(exemplarFilterModel, context));
102+
}
103+
98104
return builder;
99105
}
100106

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.extension.incubator.fileconfig;
7+
8+
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
9+
import static org.mockito.Mockito.mock;
10+
11+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MeterProviderModel;
12+
import io.opentelemetry.sdk.metrics.internal.exemplar.ExemplarFilter;
13+
import java.util.stream.Stream;
14+
import org.junit.jupiter.params.ParameterizedTest;
15+
import org.junit.jupiter.params.provider.Arguments;
16+
import org.junit.jupiter.params.provider.MethodSource;
17+
18+
class ExemplarFilterFactoryTest {
19+
20+
@ParameterizedTest
21+
@MethodSource("createTestCases")
22+
void create(MeterProviderModel.ExemplarFilter model, ExemplarFilter expectedResult) {
23+
ExemplarFilter exemplarFilter =
24+
ExemplarFilterFactory.getInstance().create(model, mock(DeclarativeConfigContext.class));
25+
assertThat(exemplarFilter.toString()).isEqualTo(expectedResult.toString());
26+
}
27+
28+
private static Stream<Arguments> createTestCases() {
29+
return Stream.of(
30+
Arguments.of(MeterProviderModel.ExemplarFilter.ALWAYS_ON, ExemplarFilter.alwaysOn()),
31+
Arguments.of(MeterProviderModel.ExemplarFilter.ALWAYS_OFF, ExemplarFilter.alwaysOff()),
32+
Arguments.of(MeterProviderModel.ExemplarFilter.TRACE_BASED, ExemplarFilter.traceBased()));
33+
}
34+
}

sdk-extensions/incubator/src/test/java/io/opentelemetry/sdk/extension/incubator/fileconfig/MeterProviderFactoryTest.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.sdk.extension.incubator.fileconfig;
77

8+
import static io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil.setExemplarFilter;
89
import static io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil.setMeterConfigurator;
910
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
1011

@@ -29,6 +30,7 @@
2930
import io.opentelemetry.sdk.metrics.View;
3031
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader;
3132
import io.opentelemetry.sdk.metrics.internal.MeterConfig;
33+
import io.opentelemetry.sdk.metrics.internal.exemplar.ExemplarFilter;
3234
import java.io.Closeable;
3335
import java.util.ArrayList;
3436
import java.util.Collections;
@@ -90,14 +92,18 @@ private static Stream<Arguments> createArguments() {
9092
new ExperimentalMeterMatcherAndConfigModel()
9193
.withName("foo")
9294
.withConfig(
93-
new ExperimentalMeterConfigModel().withDisabled(false))))),
94-
setMeterConfigurator(
95-
SdkMeterProvider.builder(),
96-
ScopeConfigurator.<MeterConfig>builder()
97-
.setDefault(MeterConfig.disabled())
98-
.addCondition(
99-
ScopeConfiguratorBuilder.nameMatchesGlob("foo"), MeterConfig.enabled())
100-
.build())
95+
new ExperimentalMeterConfigModel().withDisabled(false)))))
96+
.withExemplarFilter(MeterProviderModel.ExemplarFilter.ALWAYS_ON),
97+
setExemplarFilter(
98+
setMeterConfigurator(
99+
SdkMeterProvider.builder(),
100+
ScopeConfigurator.<MeterConfig>builder()
101+
.setDefault(MeterConfig.disabled())
102+
.addCondition(
103+
ScopeConfiguratorBuilder.nameMatchesGlob("foo"),
104+
MeterConfig.enabled())
105+
.build()),
106+
ExemplarFilter.alwaysOn())
101107
.registerMetricReader(
102108
PeriodicMetricReader.builder(OtlpHttpMetricExporter.getDefault()).build())
103109
.registerView(

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/exemplar/AlwaysOffFilter.java renamed to sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/exemplar/AlwaysOffExemplarFilter.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
1515
* at any time.
1616
*/
17-
public final class AlwaysOffFilter implements ExemplarFilter {
18-
static final ExemplarFilter INSTANCE = new AlwaysOffFilter();
17+
public final class AlwaysOffExemplarFilter implements ExemplarFilter {
18+
static final ExemplarFilter INSTANCE = new AlwaysOffExemplarFilter();
1919

20-
private AlwaysOffFilter() {}
20+
private AlwaysOffExemplarFilter() {}
2121

2222
@Override
2323
public boolean shouldSampleMeasurement(long value, Attributes attributes, Context context) {
@@ -28,4 +28,9 @@ public boolean shouldSampleMeasurement(long value, Attributes attributes, Contex
2828
public boolean shouldSampleMeasurement(double value, Attributes attributes, Context context) {
2929
return false;
3030
}
31+
32+
@Override
33+
public String toString() {
34+
return "AlwaysOffExemplarFilter";
35+
}
3136
}

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/exemplar/AlwaysOnFilter.java renamed to sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/exemplar/AlwaysOnExemplarFilter.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
1515
* at any time.
1616
*/
17-
public final class AlwaysOnFilter implements ExemplarFilter {
18-
static final ExemplarFilter INSTANCE = new AlwaysOnFilter();
17+
public final class AlwaysOnExemplarFilter implements ExemplarFilter {
18+
static final ExemplarFilter INSTANCE = new AlwaysOnExemplarFilter();
1919

20-
private AlwaysOnFilter() {}
20+
private AlwaysOnExemplarFilter() {}
2121

2222
@Override
2323
public boolean shouldSampleMeasurement(long value, Attributes attributes, Context context) {
@@ -28,4 +28,9 @@ public boolean shouldSampleMeasurement(long value, Attributes attributes, Contex
2828
public boolean shouldSampleMeasurement(double value, Attributes attributes, Context context) {
2929
return true;
3030
}
31+
32+
@Override
33+
public String toString() {
34+
return "AlwaysOnExemplarFilter";
35+
}
3136
}

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/exemplar/ExemplarFilter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ static ExemplarFilter traceBased() {
3232

3333
/** A filter which makes all measurements eligible for being an exemplar. */
3434
static ExemplarFilter alwaysOn() {
35-
return AlwaysOnFilter.INSTANCE;
35+
return AlwaysOnExemplarFilter.INSTANCE;
3636
}
3737

3838
/** A filter which makes no measurements eligible for being an exemplar. */
3939
static ExemplarFilter alwaysOff() {
40-
return AlwaysOffFilter.INSTANCE;
40+
return AlwaysOffExemplarFilter.INSTANCE;
4141
}
4242
}

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/internal/exemplar/TraceBasedExemplarFilter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,9 @@ public boolean shouldSampleMeasurement(double value, Attributes attributes, Cont
3434
private static boolean hasSampledTrace(Context context) {
3535
return Span.fromContext(context).getSpanContext().isSampled();
3636
}
37+
38+
@Override
39+
public String toString() {
40+
return "TraceBasedExemplarFilter";
41+
}
3742
}

sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/internal/exemplar/ExemplarFilterTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,4 +80,19 @@ void setExemplarFilter() {
8080
.extracting("exemplarFilter", as(InstanceOfAssertFactories.type(ExemplarFilter.class)))
8181
.isEqualTo(ExemplarFilter.alwaysOn());
8282
}
83+
84+
@Test
85+
void alwaysOff_toString() {
86+
assertThat(ExemplarFilter.alwaysOff().toString()).isEqualTo("AlwaysOffExemplarFilter");
87+
}
88+
89+
@Test
90+
void alwaysOn_toString() {
91+
assertThat(ExemplarFilter.alwaysOn().toString()).isEqualTo("AlwaysOnExemplarFilter");
92+
}
93+
94+
@Test
95+
void traceBased_toString() {
96+
assertThat(ExemplarFilter.traceBased().toString()).isEqualTo("TraceBasedExemplarFilter");
97+
}
8398
}

0 commit comments

Comments
 (0)