Skip to content

Commit 86ce839

Browse files
committed
wip
1 parent c71bd9d commit 86ce839

File tree

9 files changed

+205
-44
lines changed

9 files changed

+205
-44
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
@@ -86,9 +86,7 @@ tasks {
8686
// https://groups.google.com/forum/#!topic/bazel-discuss/_R3A9TJSoPM
8787
"-Xlint:-processing",
8888
// We suppress the "options" warning because it prevents compilation on modern JDKs
89-
"-Xlint:-options",
90-
// Fail build on any warning
91-
"-Werror",
89+
"-Xlint:-options"
9290
),
9391
)
9492
}

sdk-extensions/incubator/build.gradle.kts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ dependencies {
6060
// it was needed after 0.3.0 release because file_format in the examples weren't updated prior to the release tag
6161
// val configurationTag = "0.3.0"
6262
// val configurationRef = "refs/tags/v$configurationTag" // Replace with commit SHA to point to experiment with a specific commit
63-
val configurationRef = "cea3905ce0a542d573968c3c47d413143d473cf4"
64-
val configurationRepoZip = "https://github.com/open-telemetry/opentelemetry-configuration/archive/$configurationRef.zip"
63+
val configurationRef = "348beb6e6dc68394b3862267de1d146d546a6661"
64+
val configurationRepoZip = "https://github.com/jack-berg/opentelemetry-configuration/archive/$configurationRef.zip"
6565
val buildDirectory = layout.buildDirectory.asFile.get()
6666

6767
val downloadConfigurationSchema by tasks.registering(Download::class) {

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

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,18 @@
66
package io.opentelemetry.sdk.extension.incubator.fileconfig;
77

88
import io.opentelemetry.sdk.autoconfigure.internal.SpiHelper;
9+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ScopeMatcherAndConfigModel;
910
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
11+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerConfigModel;
12+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerConfiguratorModel;
1013
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerProviderModel;
14+
import io.opentelemetry.sdk.internal.ScopeConfigurator;
15+
import io.opentelemetry.sdk.internal.ScopeConfiguratorBuilder;
1116
import io.opentelemetry.sdk.trace.SdkTracerProvider;
1217
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
1318
import io.opentelemetry.sdk.trace.SpanLimits;
19+
import io.opentelemetry.sdk.trace.internal.SdkTracerProviderUtil;
20+
import io.opentelemetry.sdk.trace.internal.TracerConfig;
1421
import io.opentelemetry.sdk.trace.samplers.Sampler;
1522
import java.io.Closeable;
1623
import java.util.List;
@@ -59,6 +66,44 @@ public SdkTracerProviderBuilder create(
5966
SpanProcessorFactory.getInstance().create(processor, spiHelper, closeables)));
6067
}
6168

69+
TracerConfiguratorModel tracerConfiguratorModel = tracerProviderModel.getTracerConfigurator();
70+
if (tracerConfiguratorModel != null) {
71+
TracerConfigModel defaultConfigModel = tracerConfiguratorModel.getDefaultConfig();
72+
ScopeConfiguratorBuilder<TracerConfig> configuratorBuilder = ScopeConfigurator.builder();
73+
if (defaultConfigModel != null) {
74+
configuratorBuilder.setDefault(
75+
TracerConfigFactory.INSTANCE.create(defaultConfigModel, spiHelper, closeables));
76+
}
77+
List<ScopeMatcherAndConfigModel> scopeConfigs = tracerConfiguratorModel.getScopeConfigs();
78+
if (scopeConfigs != null) {
79+
for (ScopeMatcherAndConfigModel scopeMatcherAndConfigModel : scopeConfigs) {
80+
String name = scopeMatcherAndConfigModel.getName();
81+
TracerConfigModel config = scopeMatcherAndConfigModel.getConfig();
82+
if (name == null || config == null) {
83+
continue;
84+
}
85+
configuratorBuilder.addCondition(
86+
ScopeConfiguratorBuilder.nameMatchesGlob(name),
87+
TracerConfigFactory.INSTANCE.create(config, spiHelper, closeables));
88+
}
89+
}
90+
SdkTracerProviderUtil.setTracerConfigurator(builder, configuratorBuilder.build());
91+
}
92+
6293
return builder;
6394
}
95+
96+
private static class TracerConfigFactory implements Factory<TracerConfigModel, TracerConfig> {
97+
98+
private static final TracerConfigFactory INSTANCE = new TracerConfigFactory();
99+
100+
@Override
101+
public TracerConfig create(
102+
TracerConfigModel model, SpiHelper spiHelper, List<Closeable> closeables) {
103+
if (model.getEnabled() != null && !model.getEnabled()) {
104+
return TracerConfig.disabled();
105+
}
106+
return TracerConfig.defaultConfig();
107+
}
108+
}
64109
}

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ void parse_BadInputStream() {
8888
.hasMessage("Unable to parse configuration input stream");
8989
}
9090

91-
@Test
9291
void parse_KitchenSinkExampleFile() throws IOException {
9392
OpenTelemetryConfigurationModel expected = new OpenTelemetryConfigurationModel();
9493

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

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,20 @@
1616
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.BatchSpanProcessorModel;
1717
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.OtlpModel;
1818
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SamplerModel;
19+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.ScopeMatcherAndConfigModel;
1920
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanExporterModel;
21+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanLimitsModel;
2022
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.SpanProcessorModel;
23+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerConfigModel;
24+
import io.opentelemetry.sdk.extension.incubator.fileconfig.internal.model.TracerConfiguratorModel;
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)
@@ -81,8 +89,22 @@ private static Stream<Arguments> createArguments() {
8189
.withBatch(
8290
new BatchSpanProcessorModel()
8391
.withExporter(
84-
new SpanExporterModel().withOtlp(new OtlpModel())))))),
85-
SdkTracerProvider.builder()
92+
new SpanExporterModel().withOtlp(new OtlpModel())))))
93+
.withTracerConfigurator(
94+
new TracerConfiguratorModel()
95+
.withDefaultConfig(new TracerConfigModel().withEnabled(false))
96+
.withScopeConfigs(
97+
Collections.singletonList(
98+
new ScopeMatcherAndConfigModel()
99+
.withName("foo")
100+
.withConfig(new TracerConfigModel().withEnabled(true)))))),
101+
addTracerConfigurator(
102+
SdkTracerProvider.builder(),
103+
ScopeConfigurator.<TracerConfig>builder()
104+
.setDefault(TracerConfig.disabled())
105+
.addCondition(
106+
ScopeConfiguratorBuilder.nameMatchesGlob("foo"), TracerConfig.enabled())
107+
.build())
86108
.setSpanLimits(
87109
SpanLimits.builder()
88110
.setMaxNumberOfAttributes(1)
@@ -99,4 +121,10 @@ private static Stream<Arguments> createArguments() {
99121
.build())
100122
.build()));
101123
}
124+
125+
private static SdkTracerProviderBuilder addTracerConfigurator(
126+
SdkTracerProviderBuilder builder, ScopeConfigurator<TracerConfig> tracerConfigurator) {
127+
SdkTracerProviderUtil.setTracerConfigurator(builder, tracerConfigurator);
128+
return builder;
129+
}
102130
}

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
@@ -165,6 +165,8 @@ public String toString() {
165165
+ sharedState.getSampler()
166166
+ ", spanProcessor="
167167
+ sharedState.getActiveSpanProcessor()
168+
+ ", tracerConfigurator="
169+
+ tracerConfigurator
168170
+ '}';
169171
}
170172
}

0 commit comments

Comments
 (0)