Skip to content

Commit 36b7645

Browse files
committed
Merge branch 'declarative-config-scopes' into declarative-config-0.4
2 parents 6267222 + d97bba3 commit 36b7645

File tree

7 files changed

+212
-41
lines changed

7 files changed

+212
-41
lines changed

buildSrc/src/main/kotlin/otel.java-conventions.gradle.kts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,7 @@ tasks {
8787
// https://groups.google.com/forum/#!topic/bazel-discuss/_R3A9TJSoPM
8888
"-Xlint:-processing",
8989
// We suppress the "options" warning because it prevents compilation on modern JDKs
90-
"-Xlint:-options",
91-
// Fail build on any warning
92-
"-Werror",
90+
"-Xlint:-options"
9391
),
9492
)
9593
}

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

Lines changed: 51 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.ExperimentalTracerConfigModel;
12+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalTracerConfiguratorModel;
13+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalTracerMatcherAndConfigModel;
914
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
1015
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
16+
import io.opentelemetry.sdk.internal.ScopeConfigurator;
17+
import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder;
1118
import io.opentelemetry.sdk.trace.SdkTracerProvider;
1219
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
1320
import io.opentelemetry.sdk.trace.SpanLimits;
21+
import io.opentelemetry.sdk.trace.internal.SdkTracerProviderUtil;
22+
import io.opentelemetry.sdk.trace.internal.TracerConfig;
1423
import io.opentelemetry.sdk.trace.samplers.Sampler;
1524
import java.io.Closeable;
1625
import java.util.List;
@@ -59,6 +68,48 @@ public SdkTracerProviderBuilder create(
5968
SpanProcessorFactory.getInstance().create(processor, spiHelper, closeables)));
6069
}
6170

71+
ExperimentalTracerConfiguratorModel tracerConfiguratorModel =
72+
tracerProviderModel.getTracerConfiguratorDevelopment();
73+
if (tracerConfiguratorModel != null) {
74+
ExperimentalTracerConfigModel defaultConfigModel = tracerConfiguratorModel.getDefaultConfig();
75+
ScopeConfiguratorBuilder<TracerConfig> configuratorBuilder = ScopeConfigurator.builder();
76+
if (defaultConfigModel != null) {
77+
configuratorBuilder.setDefault(
78+
TracerConfigFactory.INSTANCE.create(defaultConfigModel, spiHelper, closeables));
79+
}
80+
List<ExperimentalTracerMatcherAndConfigModel> tracerMatcherAndConfigs =
81+
tracerConfiguratorModel.getTracers();
82+
if (tracerMatcherAndConfigs != null) {
83+
for (ExperimentalTracerMatcherAndConfigModel tracerMatcherAndConfig :
84+
tracerMatcherAndConfigs) {
85+
String name = requireNonNull(tracerMatcherAndConfig.getName(), "tracer matcher name");
86+
ExperimentalTracerConfigModel config = tracerMatcherAndConfig.getConfig();
87+
if (name == null || config == null) {
88+
continue;
89+
}
90+
configuratorBuilder.addCondition(
91+
ScopeConfiguratorBuilder.nameMatchesGlob(name),
92+
TracerConfigFactory.INSTANCE.create(config, spiHelper, closeables));
93+
}
94+
}
95+
SdkTracerProviderUtil.setTracerConfigurator(builder, configuratorBuilder.build());
96+
}
97+
6298
return builder;
6399
}
100+
101+
private static class TracerConfigFactory
102+
implements Factory<ExperimentalTracerConfigModel, TracerConfig> {
103+
104+
private static final TracerConfigFactory INSTANCE = new TracerConfigFactory();
105+
106+
@Override
107+
public TracerConfig create(
108+
ExperimentalTracerConfigModel model, SpiHelper spiHelper, List<Closeable> closeables) {
109+
if (model.getDisabled() != null && model.getDisabled()) {
110+
return TracerConfig.disabled();
111+
}
112+
return TracerConfig.defaultConfig();
113+
}
114+
}
64115
}

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

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,22 @@
1414
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AlwaysOnSamplerModel;
1515
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.AttributeLimitsModel;
1616
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchSpanProcessorModel;
17+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalTracerConfigModel;
18+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalTracerConfiguratorModel;
19+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ExperimentalTracerMatcherAndConfigModel;
1720
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpHttpExporterModel;
1821
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SamplerModel;
1922
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanExporterModel;
23+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanLimitsModel;
2024
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
2125
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
26+
import io.opentelemetry.sdk.internal.ScopeConfigurator;
27+
import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder;
2228
import io.opentelemetry.sdk.trace.SdkTracerProvider;
29+
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
2330
import io.opentelemetry.sdk.trace.SpanLimits;
31+
import io.opentelemetry.sdk.trace.internal.SdkTracerProviderUtil;
32+
import io.opentelemetry.sdk.trace.internal.TracerConfig;
2433
import java.io.Closeable;
2534
import java.util.ArrayList;
2635
import java.util.Collections;
@@ -66,8 +75,7 @@ private static Stream<Arguments> createArguments() {
6675
new AttributeLimitsModel(),
6776
new TracerProviderModel()
6877
.withLimits(
69-
new io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model
70-
.SpanLimitsModel()
78+
new SpanLimitsModel()
7179
.withAttributeCountLimit(1)
7280
.withAttributeValueLengthLimit(2)
7381
.withEventCountLimit(3)
@@ -82,8 +90,25 @@ private static Stream<Arguments> createArguments() {
8290
new BatchSpanProcessorModel()
8391
.withExporter(
8492
new SpanExporterModel()
85-
.withOtlpHttp(new OtlpHttpExporterModel())))))),
86-
SdkTracerProvider.builder()
93+
.withOtlpHttp(new OtlpHttpExporterModel())))))
94+
.withTracerConfiguratorDevelopment(
95+
new ExperimentalTracerConfiguratorModel()
96+
.withDefaultConfig(
97+
new ExperimentalTracerConfigModel().withDisabled(true))
98+
.withTracers(
99+
Collections.singletonList(
100+
new ExperimentalTracerMatcherAndConfigModel()
101+
.withName("foo")
102+
.withConfig(
103+
new ExperimentalTracerConfigModel()
104+
.withDisabled(false)))))),
105+
addTracerConfigurator(
106+
SdkTracerProvider.builder(),
107+
ScopeConfigurator.<TracerConfig>builder()
108+
.setDefault(TracerConfig.disabled())
109+
.addCondition(
110+
ScopeConfiguratorBuilder.nameMatchesGlob("foo"), TracerConfig.enabled())
111+
.build())
87112
.setSpanLimits(
88113
SpanLimits.builder()
89114
.setMaxNumberOfAttributes(1)
@@ -100,4 +125,10 @@ private static Stream<Arguments> createArguments() {
100125
.build())
101126
.build()));
102127
}
128+
129+
private static SdkTracerProviderBuilder addTracerConfigurator(
130+
SdkTracerProviderBuilder builder, ScopeConfigurator<TracerConfig> tracerConfigurator) {
131+
SdkTracerProviderUtil.setTracerConfigurator(builder, tracerConfigurator);
132+
return builder;
133+
}
103134
}

sdk/common/src/main/java/io/opentelemetry/sdk/internal/GlobUtil.java

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import java.util.function.Predicate;
99
import java.util.regex.Pattern;
10+
import javax.annotation.Nullable;
1011

1112
/**
1213
* Utilities for glob pattern matching.
@@ -30,22 +31,7 @@ private GlobUtil() {}
3031
* </ul>
3132
*/
3233
public static Predicate<String> toGlobPatternPredicate(String globPattern) {
33-
// Match all
34-
if (globPattern.equals("*")) {
35-
return unused -> true;
36-
}
37-
38-
// If globPattern contains '*' or '?', convert it to a regex and return corresponding predicate
39-
for (int i = 0; i < globPattern.length(); i++) {
40-
char c = globPattern.charAt(i);
41-
if (c == '*' || c == '?') {
42-
Pattern pattern = toRegexPattern(globPattern);
43-
return string -> pattern.matcher(string).matches();
44-
}
45-
}
46-
47-
// Exact match, ignoring case
48-
return globPattern::equalsIgnoreCase;
34+
return new GlobPatternPredicate(globPattern);
4935
}
5036

5137
/**
@@ -79,4 +65,42 @@ private static Pattern toRegexPattern(String globPattern) {
7965
}
8066
return Pattern.compile(patternBuilder.toString());
8167
}
68+
69+
private static class GlobPatternPredicate implements Predicate<String> {
70+
private final String globPattern;
71+
@Nullable private final Pattern pattern;
72+
73+
private GlobPatternPredicate(String globPattern) {
74+
this.globPattern = globPattern;
75+
// If globPattern contains '*' or '?', convert it to a regex and return corresponding
76+
// predicate
77+
Pattern pattern = null;
78+
for (int i = 0; i < globPattern.length(); i++) {
79+
char c = globPattern.charAt(i);
80+
if (c == '*' || c == '?') {
81+
pattern = toRegexPattern(globPattern);
82+
break;
83+
}
84+
}
85+
this.pattern = pattern;
86+
}
87+
88+
@Override
89+
public boolean test(String s) {
90+
if (pattern != null) {
91+
return pattern.matcher(s).matches();
92+
}
93+
// Match all
94+
if (globPattern.equals("*")) {
95+
return true;
96+
}
97+
// Exact match, ignoring case
98+
return globPattern.equalsIgnoreCase(s);
99+
}
100+
101+
@Override
102+
public String toString() {
103+
return "GlobPatternPredicate{globPattern=" + globPattern + "}";
104+
}
105+
}
82106
}

sdk/common/src/main/java/io/opentelemetry/sdk/internal/ScopeConfigurator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public interface ScopeConfigurator<T> extends Function<InstrumentationScopeInfo,
1919

2020
/** Create a new builder. */
2121
static <T> ScopeConfiguratorBuilder<T> builder() {
22-
return new ScopeConfiguratorBuilder<>(unused -> null);
22+
return new ScopeConfiguratorBuilder<>(null);
2323
}
2424

2525
/**

sdk/common/src/main/java/io/opentelemetry/sdk/internal/ScopeConfiguratorBuilder.java

Lines changed: 82 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
99
import java.util.ArrayList;
1010
import java.util.List;
11+
import java.util.Objects;
12+
import java.util.StringJoiner;
1113
import java.util.function.Predicate;
14+
import java.util.stream.Collectors;
1215
import javax.annotation.Nullable;
1316

1417
/**
@@ -22,11 +25,11 @@
2225
*/
2326
public final class ScopeConfiguratorBuilder<T> {
2427

25-
private final ScopeConfigurator<T> baseScopeConfigurator;
28+
@Nullable private final ScopeConfigurator<T> baseScopeConfigurator;
2629
@Nullable private T defaultScopeConfig;
2730
private final List<Condition<T>> conditions = new ArrayList<>();
2831

29-
ScopeConfiguratorBuilder(ScopeConfigurator<T> baseScopeConfigurator) {
32+
ScopeConfiguratorBuilder(@Nullable ScopeConfigurator<T> baseScopeConfigurator) {
3033
this.baseScopeConfigurator = baseScopeConfigurator;
3134
}
3235

@@ -71,8 +74,7 @@ public ScopeConfiguratorBuilder<T> addCondition(
7174
* @see #addCondition(Predicate, Object)
7275
*/
7376
public static Predicate<InstrumentationScopeInfo> nameMatchesGlob(String globPattern) {
74-
Predicate<String> globPredicate = GlobUtil.toGlobPatternPredicate(globPattern);
75-
return scopeInfo -> globPredicate.test(scopeInfo.getName());
77+
return new ScopeNameMatcher(GlobUtil.toGlobPatternPredicate(globPattern));
7678
}
7779

7880
/**
@@ -82,33 +84,96 @@ public static Predicate<InstrumentationScopeInfo> nameMatchesGlob(String globPat
8284
* @see #addCondition(Predicate, Object)
8385
*/
8486
public static Predicate<InstrumentationScopeInfo> nameEquals(String scopeName) {
85-
return scopeInfo -> scopeInfo.getName().equals(scopeName);
87+
return new ScopeNameMatcher(name -> name.equals(scopeName));
8688
}
8789

8890
/** Build a {@link ScopeConfigurator} with the configuration of this builder. */
8991
public ScopeConfigurator<T> build() {
90-
// TODO: return an instance with toString implementation which self describes rules
91-
return scopeInfo -> {
92-
T scopeConfig = baseScopeConfigurator.apply(scopeInfo);
93-
if (scopeConfig != null) {
94-
return scopeConfig;
92+
return new ScopeConfiguratorImpl<>(baseScopeConfigurator, defaultScopeConfig, conditions);
93+
}
94+
95+
private static final class Condition<T> {
96+
private final Predicate<InstrumentationScopeInfo> scopeMatcher;
97+
private final T scopeConfig;
98+
99+
private Condition(Predicate<InstrumentationScopeInfo> scopeMatcher, T scopeConfig) {
100+
this.scopeMatcher = scopeMatcher;
101+
this.scopeConfig = scopeConfig;
102+
}
103+
104+
@Override
105+
public String toString() {
106+
StringJoiner joiner = new StringJoiner(", ", "Condition{", "}");
107+
joiner.add("scopeMatcher=" + scopeMatcher);
108+
joiner.add("scopeConfig=" + scopeConfig);
109+
return joiner.toString();
110+
}
111+
}
112+
113+
private static class ScopeConfiguratorImpl<T> implements ScopeConfigurator<T> {
114+
@Nullable private final ScopeConfigurator<T> baseScopeConfigurator;
115+
@Nullable private final T defaultScopeConfig;
116+
private final List<Condition<T>> conditions;
117+
118+
private ScopeConfiguratorImpl(
119+
@Nullable ScopeConfigurator<T> baseScopeConfigurator,
120+
@Nullable T defaultScopeConfig,
121+
List<Condition<T>> conditions) {
122+
this.baseScopeConfigurator = baseScopeConfigurator;
123+
this.defaultScopeConfig = defaultScopeConfig;
124+
this.conditions = conditions;
125+
}
126+
127+
@Override
128+
@Nullable
129+
public T apply(InstrumentationScopeInfo scopeInfo) {
130+
if (baseScopeConfigurator != null) {
131+
T scopeConfig = baseScopeConfigurator.apply(scopeInfo);
132+
if (scopeConfig != null) {
133+
return scopeConfig;
134+
}
95135
}
96136
for (Condition<T> condition : conditions) {
97137
if (condition.scopeMatcher.test(scopeInfo)) {
98138
return condition.scopeConfig;
99139
}
100140
}
101141
return defaultScopeConfig;
102-
};
142+
}
143+
144+
@Override
145+
public String toString() {
146+
StringJoiner joiner = new StringJoiner(", ", "ScopeConfiguratorImpl{", "}");
147+
if (baseScopeConfigurator != null) {
148+
joiner.add("baseScopeConfigurator=" + baseScopeConfigurator);
149+
}
150+
if (defaultScopeConfig != null) {
151+
joiner.add("defaultScopeConfig=" + defaultScopeConfig);
152+
}
153+
joiner.add(
154+
"conditions="
155+
+ conditions.stream()
156+
.map(Objects::toString)
157+
.collect(Collectors.joining(",", "[", "]")));
158+
return joiner.toString();
159+
}
103160
}
104161

105-
private static final class Condition<T> {
106-
private final Predicate<InstrumentationScopeInfo> scopeMatcher;
107-
private final T scopeConfig;
162+
private static class ScopeNameMatcher implements Predicate<InstrumentationScopeInfo> {
163+
private final Predicate<String> nameMatcher;
108164

109-
private Condition(Predicate<InstrumentationScopeInfo> scopeMatcher, T scopeConfig) {
110-
this.scopeMatcher = scopeMatcher;
111-
this.scopeConfig = scopeConfig;
165+
private ScopeNameMatcher(Predicate<String> nameMatcher) {
166+
this.nameMatcher = nameMatcher;
167+
}
168+
169+
@Override
170+
public boolean test(InstrumentationScopeInfo scopeInfo) {
171+
return nameMatcher.test(scopeInfo.getName());
172+
}
173+
174+
@Override
175+
public String toString() {
176+
return "ScopeNameMatcher{nameMatcher=" + nameMatcher + "}";
112177
}
113178
}
114179
}

sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ public String toString() {
187187
+ sharedState.getSampler()
188188
+ ", spanProcessor="
189189
+ sharedState.getActiveSpanProcessor()
190+
+ ", tracerConfigurator="
191+
+ tracerConfigurator
190192
+ '}';
191193
}
192194
}

0 commit comments

Comments
 (0)