Skip to content

Commit e9fe818

Browse files
committed
Add meter and logger scope config
1 parent 36b7645 commit e9fe818

File tree

12 files changed

+216
-66
lines changed

12 files changed

+216
-66
lines changed

sdk-extensions/incubator/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ dependencies {
6262
// it was needed after 0.3.0 release because file_format in the examples weren't updated prior to the release tag
6363
// val configurationTag = "0.3.0"
6464
// val configurationRef = "refs/tags/v$configurationTag" // Replace with commit SHA to point to experiment with a specific commit
65-
val configurationRef = "25da6659f5f214a737ad92a28097418536334518"
65+
val configurationRef = "a94e70f59fb7d9cb524118ca2cd315bd4dedd211"
6666
val configurationRepoZip = "https://github.com/open-telemetry/opentelemetry-configuration/archive/$configurationRef.zip"
6767
val buildDirectory = layout.buildDirectory.asFile.get()
6868

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

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,21 @@
55

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

8+
import static io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfigUtil.requireNonNull;
9+
810
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
11+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerConfigModel;
12+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerConfiguratorModel;
13+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerMatcherAndConfigModel;
914
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessorModel;
1015
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LoggerProviderModel;
16+
import io.opentelemetry.sdk.internal.ScopeConfigurator;
17+
import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder;
1118
import io.opentelemetry.sdk.logs.LogLimits;
1219
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
1320
import io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder;
21+
import io.opentelemetry.sdk.logs.internal.LoggerConfig;
22+
import io.opentelemetry.sdk.logs.internal.SdkLoggerProviderUtil;
1423
import java.io.Closeable;
1524
import java.util.List;
1625

@@ -53,6 +62,50 @@ public SdkLoggerProviderBuilder create(
5362
.create(processor, spiHelper, closeables)));
5463
}
5564

65+
ExperimentalLoggerConfiguratorModel loggerConfiguratorModel =
66+
loggerProviderModel.getLoggerConfiguratorDevelopment();
67+
if (loggerConfiguratorModel != null) {
68+
ExperimentalLoggerConfigModel defaultConfigModel = loggerConfiguratorModel.getDefaultConfig();
69+
ScopeConfiguratorBuilder<LoggerConfig> configuratorBuilder = ScopeConfigurator.builder();
70+
if (defaultConfigModel != null) {
71+
configuratorBuilder.setDefault(
72+
LoggerConfigFactory.INSTANCE.create(defaultConfigModel, spiHelper, closeables));
73+
}
74+
List<ExperimentalLoggerMatcherAndConfigModel> loggerMatcherAndConfigs =
75+
loggerConfiguratorModel.getLoggers();
76+
if (loggerMatcherAndConfigs != null) {
77+
for (ExperimentalLoggerMatcherAndConfigModel loggerMatcherAndConfig :
78+
loggerMatcherAndConfigs) {
79+
String name = requireNonNull(loggerMatcherAndConfig.getName(), "logger matcher name");
80+
ExperimentalLoggerConfigModel config = loggerMatcherAndConfig.getConfig();
81+
if (name == null || config == null) {
82+
continue;
83+
}
84+
configuratorBuilder.addCondition(
85+
ScopeConfiguratorBuilder.nameMatchesGlob(name),
86+
LoggerProviderFactory.LoggerConfigFactory.INSTANCE.create(
87+
config, spiHelper, closeables));
88+
}
89+
}
90+
SdkLoggerProviderUtil.setLoggerConfigurator(builder, configuratorBuilder.build());
91+
}
92+
5693
return builder;
5794
}
95+
96+
private static class LoggerConfigFactory
97+
implements Factory<ExperimentalLoggerConfigModel, LoggerConfig> {
98+
99+
private static final LoggerProviderFactory.LoggerConfigFactory INSTANCE =
100+
new LoggerProviderFactory.LoggerConfigFactory();
101+
102+
@Override
103+
public LoggerConfig create(
104+
ExperimentalLoggerConfigModel model, SpiHelper spiHelper, List<Closeable> closeables) {
105+
if (model.getDisabled() != null && model.getDisabled()) {
106+
return LoggerConfig.disabled();
107+
}
108+
return LoggerConfig.defaultConfig();
109+
}
110+
}
58111
}

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

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,21 @@
88
import static io.opentelemetry.sdk.extension.incubator.fileconfig.FileConfigUtil.requireNonNull;
99

1010
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
11+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalMeterConfigModel;
12+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalMeterConfiguratorModel;
13+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalMeterMatcherAndConfigModel;
1114
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MeterProviderModel;
1215
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricReaderModel;
1316
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewModel;
1417
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewSelectorModel;
1518
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewStreamModel;
19+
import io.opentelemetry.sdk.internal.ScopeConfigurator;
20+
import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder;
1621
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
1722
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
1823
import io.opentelemetry.sdk.metrics.export.CardinalityLimitSelector;
24+
import io.opentelemetry.sdk.metrics.internal.MeterConfig;
25+
import io.opentelemetry.sdk.metrics.internal.SdkMeterProviderUtil;
1926
import java.io.Closeable;
2027
import java.util.List;
2128

@@ -63,6 +70,48 @@ public SdkMeterProviderBuilder create(
6370
});
6471
}
6572

73+
ExperimentalMeterConfiguratorModel meterConfiguratorModel =
74+
model.getMeterConfiguratorDevelopment();
75+
if (meterConfiguratorModel != null) {
76+
ExperimentalMeterConfigModel defaultConfigModel = meterConfiguratorModel.getDefaultConfig();
77+
ScopeConfiguratorBuilder<MeterConfig> configuratorBuilder = ScopeConfigurator.builder();
78+
if (defaultConfigModel != null) {
79+
configuratorBuilder.setDefault(
80+
MeterConfigFactory.INSTANCE.create(defaultConfigModel, spiHelper, closeables));
81+
}
82+
List<ExperimentalMeterMatcherAndConfigModel> meterMatcherAndConfigs =
83+
meterConfiguratorModel.getMeters();
84+
if (meterMatcherAndConfigs != null) {
85+
for (ExperimentalMeterMatcherAndConfigModel meterMatcherAndConfig :
86+
meterMatcherAndConfigs) {
87+
String name = requireNonNull(meterMatcherAndConfig.getName(), "meter matcher name");
88+
ExperimentalMeterConfigModel config = meterMatcherAndConfig.getConfig();
89+
if (name == null || config == null) {
90+
continue;
91+
}
92+
configuratorBuilder.addCondition(
93+
ScopeConfiguratorBuilder.nameMatchesGlob(name),
94+
MeterConfigFactory.INSTANCE.create(config, spiHelper, closeables));
95+
}
96+
}
97+
SdkMeterProviderUtil.setMeterConfigurator(builder, configuratorBuilder.build());
98+
}
99+
66100
return builder;
67101
}
102+
103+
private static class MeterConfigFactory
104+
implements Factory<ExperimentalMeterConfigModel, MeterConfig> {
105+
106+
private static final MeterConfigFactory INSTANCE = new MeterConfigFactory();
107+
108+
@Override
109+
public MeterConfig create(
110+
ExperimentalMeterConfigModel model, SpiHelper spiHelper, List<Closeable> closeables) {
111+
if (model.getDisabled() != null && model.getDisabled()) {
112+
return MeterConfig.disabled();
113+
}
114+
return MeterConfig.defaultConfig();
115+
}
116+
}
68117
}

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

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,27 @@
55

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

8+
import static io.opentelemetry.sdk.logs.internal.SdkLoggerProviderUtil.setLoggerConfigurator;
89
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
910

1011
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter;
1112
import io.opentelemetry.internal.testing.CleanupExtension;
1213
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
1314
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeLimitsModel;
1415
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchLogRecordProcessorModel;
16+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerConfigModel;
17+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerConfiguratorModel;
18+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalLoggerMatcherAndConfigModel;
1519
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordExporterModel;
1620
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordLimitsModel;
1721
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LogRecordProcessorModel;
1822
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.LoggerProviderModel;
1923
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpExporterModel;
24+
import io.opentelemetry.sdk.internal.ScopeConfigurator;
25+
import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder;
2026
import io.opentelemetry.sdk.logs.LogLimits;
2127
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
28+
import io.opentelemetry.sdk.logs.internal.LoggerConfig;
2229
import java.io.Closeable;
2330
import java.util.ArrayList;
2431
import java.util.Collections;
@@ -74,8 +81,25 @@ private static Stream<Arguments> createArguments() {
7481
new BatchLogRecordProcessorModel()
7582
.withExporter(
7683
new LogRecordExporterModel()
77-
.withOtlpHttp(new OtlpHttpExporterModel())))))),
78-
SdkLoggerProvider.builder()
84+
.withOtlpHttp(new OtlpHttpExporterModel())))))
85+
.withLoggerConfiguratorDevelopment(
86+
new ExperimentalLoggerConfiguratorModel()
87+
.withDefaultConfig(
88+
new ExperimentalLoggerConfigModel().withDisabled(true))
89+
.withLoggers(
90+
Collections.singletonList(
91+
new ExperimentalLoggerMatcherAndConfigModel()
92+
.withName("foo")
93+
.withConfig(
94+
new ExperimentalLoggerConfigModel()
95+
.withDisabled(false)))))),
96+
setLoggerConfigurator(
97+
SdkLoggerProvider.builder(),
98+
ScopeConfigurator.<LoggerConfig>builder()
99+
.setDefault(LoggerConfig.disabled())
100+
.addCondition(
101+
ScopeConfiguratorBuilder.nameMatchesGlob("foo"), LoggerConfig.enabled())
102+
.build())
79103
.setLogLimits(
80104
() ->
81105
LogLimits.builder()

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

Lines changed: 62 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,37 @@
55

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

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

1011
import io.opentelemetry.exporter.otlp.http.metrics.OtlpHttpMetricExporter;
1112
import io.opentelemetry.internal.testing.CleanupExtension;
1213
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
14+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalMeterConfigModel;
15+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalMeterConfiguratorModel;
16+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalMeterMatcherAndConfigModel;
1317
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MeterProviderModel;
1418
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.MetricReaderModel;
1519
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpMetricExporterModel;
1620
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PeriodicMetricReaderModel;
1721
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.PushMetricExporterModel;
1822
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewSelectorModel;
1923
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ViewStreamModel;
24+
import io.opentelemetry.sdk.internal.ScopeConfigurator;
25+
import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder;
2026
import io.opentelemetry.sdk.metrics.InstrumentSelector;
2127
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
2228
import io.opentelemetry.sdk.metrics.View;
29+
import io.opentelemetry.sdk.metrics.internal.MeterConfig;
2330
import java.io.Closeable;
2431
import java.util.ArrayList;
2532
import java.util.Collections;
2633
import java.util.List;
27-
import org.junit.jupiter.api.Test;
34+
import java.util.stream.Stream;
2835
import org.junit.jupiter.api.extension.RegisterExtension;
36+
import org.junit.jupiter.params.ParameterizedTest;
37+
import org.junit.jupiter.params.provider.Arguments;
38+
import org.junit.jupiter.params.provider.MethodSource;
2939

3040
class MeterProviderFactoryTest {
3141

@@ -34,65 +44,66 @@ class MeterProviderFactoryTest {
3444
private final SpiHelper spiHelper =
3545
SpiHelper.create(MeterProviderFactoryTest.class.getClassLoader());
3646

37-
@Test
38-
void create_Defaults() {
47+
@ParameterizedTest
48+
@MethodSource("createArguments")
49+
void create(MeterProviderModel model, SdkMeterProvider expectedProvider) {
3950
List<Closeable> closeables = new ArrayList<>();
40-
SdkMeterProvider expectedProvider = SdkMeterProvider.builder().build();
4151
cleanup.addCloseable(expectedProvider);
4252

4353
SdkMeterProvider provider =
44-
MeterProviderFactory.getInstance()
45-
.create(new MeterProviderModel(), spiHelper, closeables)
46-
.build();
54+
MeterProviderFactory.getInstance().create(model, spiHelper, closeables).build();
4755
cleanup.addCloseable(provider);
4856
cleanup.addCloseables(closeables);
4957

5058
assertThat(provider.toString()).isEqualTo(expectedProvider.toString());
5159
}
5260

53-
@Test
54-
void create_Configured() {
55-
List<Closeable> closeables = new ArrayList<>();
56-
SdkMeterProvider expectedProvider =
57-
SdkMeterProvider.builder()
58-
.registerMetricReader(
59-
io.opentelemetry.sdk.metrics.export.PeriodicMetricReader.builder(
60-
OtlpHttpMetricExporter.getDefault())
61-
.build())
62-
.registerView(
63-
InstrumentSelector.builder().setName("instrument-name").build(),
64-
View.builder().setName("stream-name").build())
65-
.build();
66-
cleanup.addCloseable(expectedProvider);
67-
68-
SdkMeterProvider provider =
69-
MeterProviderFactory.getInstance()
70-
.create(
71-
new MeterProviderModel()
72-
.withReaders(
73-
Collections.singletonList(
74-
new MetricReaderModel()
75-
.withPeriodic(
76-
new PeriodicMetricReaderModel()
77-
.withExporter(
78-
new PushMetricExporterModel()
79-
.withOtlpHttp(new OtlpHttpMetricExporterModel())))))
80-
.withViews(
81-
Collections.singletonList(
82-
new io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model
83-
.ViewModel()
84-
.withSelector(
85-
new ViewSelectorModel().withInstrumentName("instrument-name"))
86-
.withStream(
87-
new ViewStreamModel()
88-
.withName("stream-name")
89-
.withAttributeKeys(null)))),
90-
spiHelper,
91-
closeables)
92-
.build();
93-
cleanup.addCloseable(provider);
94-
cleanup.addCloseables(closeables);
95-
96-
assertThat(provider.toString()).isEqualTo(expectedProvider.toString());
61+
private static Stream<Arguments> createArguments() {
62+
return Stream.of(
63+
Arguments.of(new MeterProviderModel(), SdkMeterProvider.builder().build()),
64+
Arguments.of(
65+
new MeterProviderModel()
66+
.withReaders(
67+
Collections.singletonList(
68+
new MetricReaderModel()
69+
.withPeriodic(
70+
new PeriodicMetricReaderModel()
71+
.withExporter(
72+
new PushMetricExporterModel()
73+
.withOtlpHttp(new OtlpHttpMetricExporterModel())))))
74+
.withViews(
75+
Collections.singletonList(
76+
new io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model
77+
.ViewModel()
78+
.withSelector(
79+
new ViewSelectorModel().withInstrumentName("instrument-name"))
80+
.withStream(
81+
new ViewStreamModel()
82+
.withName("stream-name")
83+
.withAttributeKeys(null))))
84+
.withMeterConfiguratorDevelopment(
85+
new ExperimentalMeterConfiguratorModel()
86+
.withDefaultConfig(new ExperimentalMeterConfigModel().withDisabled(true))
87+
.withMeters(
88+
Collections.singletonList(
89+
new ExperimentalMeterMatcherAndConfigModel()
90+
.withName("foo")
91+
.withConfig(
92+
new ExperimentalMeterConfigModel().withDisabled(false))))),
93+
setMeterConfigurator(
94+
SdkMeterProvider.builder(),
95+
ScopeConfigurator.<MeterConfig>builder()
96+
.setDefault(MeterConfig.disabled())
97+
.addCondition(
98+
ScopeConfiguratorBuilder.nameMatchesGlob("foo"), MeterConfig.enabled())
99+
.build())
100+
.registerMetricReader(
101+
io.opentelemetry.sdk.metrics.export.PeriodicMetricReader.builder(
102+
OtlpHttpMetricExporter.getDefault())
103+
.build())
104+
.registerView(
105+
InstrumentSelector.builder().setName("instrument-name").build(),
106+
View.builder().setName("stream-name").build())
107+
.build()));
97108
}
98109
}

0 commit comments

Comments
 (0)