Skip to content

Commit c03efbc

Browse files
authored
Add an option to the SDK builder to specify an initial TraceConfig (#2192)
* Add an option to set the initial TraceConfig when building an SDK, and a TracerSdkProvider. * add the missing javadoc
1 parent b3bf869 commit c03efbc

File tree

5 files changed

+63
-9
lines changed

5 files changed

+63
-9
lines changed

sdk/all/src/main/java/io/opentelemetry/sdk/OpenTelemetrySdk.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import io.opentelemetry.sdk.trace.SpanProcessor;
2323
import io.opentelemetry.sdk.trace.TracerSdkManagement;
2424
import io.opentelemetry.sdk.trace.TracerSdkProvider;
25+
import io.opentelemetry.sdk.trace.config.TraceConfig;
2526
import java.util.ArrayList;
2627
import java.util.List;
2728
import java.util.concurrent.atomic.AtomicBoolean;
@@ -114,6 +115,7 @@ public static class Builder extends DefaultOpenTelemetry.Builder {
114115
private Resource resource;
115116
private final List<SpanProcessor> spanProcessors = new ArrayList<>();
116117
private IdGenerator idGenerator;
118+
private TraceConfig traceConfig;
117119

118120
/**
119121
* Sets the {@link TracerSdkProvider} to use. This can be used to configure tracing settings by
@@ -212,6 +214,18 @@ public Builder setIdGenerator(IdGenerator idGenerator) {
212214
return this;
213215
}
214216

217+
/**
218+
* Set the {@link TraceConfig} that will be initially set on the Tracing SDK.
219+
*
220+
* <p>Using {@link #setTracerProvider(TracerProvider)} will override this setting.
221+
*
222+
* @return this
223+
*/
224+
public Builder setTraceConfig(TraceConfig traceConfig) {
225+
this.traceConfig = traceConfig;
226+
return this;
227+
}
228+
215229
/**
216230
* Returns a new {@link OpenTelemetrySdk} built with the configuration of this {@link Builder}.
217231
*/
@@ -253,6 +267,9 @@ private TracerSdkProvider buildTracerProvider() {
253267
if (idGenerator != null) {
254268
tracerProviderBuilder.setIdGenerator(idGenerator);
255269
}
270+
if (traceConfig != null) {
271+
tracerProviderBuilder.setTraceConfig(traceConfig);
272+
}
256273
return tracerProviderBuilder.build();
257274
}
258275

sdk/all/src/test/java/io/opentelemetry/sdk/OpenTelemetrySdkTest.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import io.opentelemetry.sdk.trace.IdGenerator;
2828
import io.opentelemetry.sdk.trace.SpanProcessor;
2929
import io.opentelemetry.sdk.trace.TracerSdkProvider;
30+
import io.opentelemetry.sdk.trace.config.TraceConfig;
3031
import org.junit.jupiter.api.Test;
3132
import org.junit.jupiter.api.extension.ExtendWith;
3233
import org.mockito.Mock;
@@ -116,11 +117,13 @@ void building() {
116117
void testConfiguration_tracerSettings() {
117118
Resource resource = Resource.create(Attributes.builder().put("cat", "meow").build());
118119
IdGenerator idGenerator = mock(IdGenerator.class);
120+
TraceConfig traceConfig = mock(TraceConfig.class);
119121
OpenTelemetrySdk openTelemetry =
120122
OpenTelemetrySdk.builder()
121123
.setClock(clock)
122124
.setResource(resource)
123125
.setIdGenerator(idGenerator)
126+
.setTraceConfig(traceConfig)
124127
.build();
125128
TracerProvider unobfuscatedTracerProvider =
126129
((ObfuscatedTracerProvider) openTelemetry.getTracerProvider()).unobfuscate();
@@ -132,7 +135,8 @@ void testConfiguration_tracerSettings() {
132135
.extracting("sharedState")
133136
.hasFieldOrPropertyWithValue("clock", clock)
134137
.hasFieldOrPropertyWithValue("resource", resource)
135-
.hasFieldOrPropertyWithValue("idGenerator", idGenerator);
138+
.hasFieldOrPropertyWithValue("idGenerator", idGenerator)
139+
.hasFieldOrPropertyWithValue("activeTraceConfig", traceConfig);
136140

137141
assertThat(openTelemetry.getMeterProvider()).isInstanceOf(MeterSdkProvider.class);
138142
// Since MeterProvider is in a different package, the only alternative to this reflective

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

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ public static Builder builder() {
4242
return new Builder();
4343
}
4444

45-
private TracerSdkProvider(Clock clock, IdGenerator idsGenerator, Resource resource) {
46-
this.sharedState = new TracerSharedState(clock, idsGenerator, resource);
45+
private TracerSdkProvider(
46+
Clock clock, IdGenerator idsGenerator, Resource resource, TraceConfig traceConfig) {
47+
this.sharedState = new TracerSharedState(clock, idsGenerator, resource, traceConfig);
4748
this.tracerSdkComponentRegistry = new TracerSdkComponentRegistry(sharedState);
4849
}
4950

@@ -92,14 +93,15 @@ public CompletableResultCode forceFlush() {
9293
}
9394

9495
/**
95-
* Builder class for the TracerSdkFactory. Has fully functional default implementations of all
96+
* Builder class for the TraceSdkProvider. Has fully functional default implementations of all
9697
* three required interfaces.
9798
*/
9899
public static class Builder {
99100

100101
private Clock clock = SystemClock.getInstance();
101102
private IdGenerator idsGenerator = IdGenerator.random();
102103
private Resource resource = Resource.getDefault();
104+
private TraceConfig traceConfig = TraceConfig.getDefault();
103105

104106
/**
105107
* Assign a {@link Clock}.
@@ -139,12 +141,23 @@ public Builder setResource(Resource resource) {
139141
}
140142

141143
/**
142-
* Create a new TracerSdkFactory instance.
144+
* Assign an initial {@link TraceConfig} that should be used with this SDK.
143145
*
144-
* @return An initialized TracerSdkFactory.
146+
* @return this
147+
*/
148+
public Builder setTraceConfig(TraceConfig traceConfig) {
149+
this.traceConfig = traceConfig;
150+
Objects.requireNonNull(traceConfig);
151+
return this;
152+
}
153+
154+
/**
155+
* Create a new TraceSdkProvider instance.
156+
*
157+
* @return An initialized TraceSdkProvider.
145158
*/
146159
public TracerSdkProvider build() {
147-
return new TracerSdkProvider(clock, idsGenerator, resource);
160+
return new TracerSdkProvider(clock, idsGenerator, resource, traceConfig);
148161
}
149162

150163
private Builder() {}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,19 @@ final class TracerSharedState {
2222

2323
// Reads and writes are atomic for reference variables. Use volatile to ensure that these
2424
// operations are visible on other CPUs as well.
25-
private volatile TraceConfig activeTraceConfig = TraceConfig.getDefault();
25+
private volatile TraceConfig activeTraceConfig;
2626
private volatile SpanProcessor activeSpanProcessor = NoopSpanProcessor.getInstance();
2727
private volatile boolean isStopped = false;
2828

2929
@GuardedBy("lock")
3030
private final List<SpanProcessor> registeredSpanProcessors = new ArrayList<>();
3131

32-
TracerSharedState(Clock clock, IdGenerator idGenerator, Resource resource) {
32+
TracerSharedState(
33+
Clock clock, IdGenerator idGenerator, Resource resource, TraceConfig traceConfig) {
3334
this.clock = clock;
3435
this.idGenerator = idGenerator;
3536
this.resource = resource;
37+
this.activeTraceConfig = traceConfig;
3638
}
3739

3840
Clock getClock() {

sdk/trace/src/test/java/io/opentelemetry/sdk/trace/TracerSdkProviderTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,19 @@ void builder_HappyPath() {
4848
.setClock(mock(Clock.class))
4949
.setResource(mock(Resource.class))
5050
.setIdGenerator(mock(IdGenerator.class))
51+
.setTraceConfig(mock(TraceConfig.class))
5152
.build())
5253
.isNotNull();
5354
}
5455

56+
@Test
57+
void builder_NullTraceConfig() {
58+
assertThrows(
59+
NullPointerException.class,
60+
() -> TracerSdkProvider.builder().setTraceConfig(null),
61+
"traceConfig");
62+
}
63+
5564
@Test
5665
void builder_NullClock() {
5766
assertThrows(
@@ -107,6 +116,15 @@ void updateActiveTraceConfig() {
107116
assertThat(tracerFactory.getActiveTraceConfig()).isEqualTo(newConfig);
108117
}
109118

119+
@Test
120+
void build_traceConfig() {
121+
TraceConfig initialTraceConfig = mock(TraceConfig.class);
122+
TracerSdkProvider tracerSdkProvider =
123+
TracerSdkProvider.builder().setTraceConfig(initialTraceConfig).build();
124+
125+
assertThat(tracerSdkProvider.getActiveTraceConfig()).isSameAs(initialTraceConfig);
126+
}
127+
110128
@Test
111129
void shutdown() {
112130
tracerFactory.shutdown();

0 commit comments

Comments
 (0)