Skip to content

Commit 5da8472

Browse files
author
Ignacio Bonafonte
authored
Allow SpanBuilder to start spans directly as active. (#245)
1 parent 75f35b7 commit 5da8472

File tree

10 files changed

+49
-36
lines changed

10 files changed

+49
-36
lines changed

Examples/Datadog Sample/main.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,8 @@ func simpleSpan() {
6767
}
6868

6969
func childSpan() {
70-
let span = tracer.spanBuilder(spanName: "parentSpan").setSpanKind(spanKind: .client).startSpan()
70+
let span = tracer.spanBuilder(spanName: "parentSpan").setSpanKind(spanKind: .client).setActive(true).startSpan()
7171
span.setAttribute(key: sampleKey, value: sampleValue)
72-
OpenTelemetry.instance.contextProvider.setActiveSpan(span)
7372
let childSpan = tracer.spanBuilder(spanName: "childSpan").setSpanKind(spanKind: .client).startSpan()
7473
childSpan.setAttribute(key: sampleKey, value: sampleValue)
7574
childSpan.end()

Examples/Logging Tracer/LoggingTracer.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,5 +72,9 @@ class LoggingTracer: Tracer {
7272
func setAttribute(key: String, value: AttributeValue) -> Self {
7373
return self
7474
}
75+
76+
func setActive(_ active: Bool) -> Self {
77+
return self
78+
}
7579
}
7680
}

Examples/Logging Tracer/main.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ OpenTelemetry.registerTracerProvider(tracerProvider: LoggingTracerProvider())
1313
var tracer = OpenTelemetry.instance.tracerProvider.get(instrumentationName: "ConsoleApp", instrumentationVersion: "semver:1.0.0")
1414

1515

16-
let span1 = tracer.spanBuilder(spanName: "Main (span1)").startSpan()
17-
OpenTelemetry.instance.contextProvider.setActiveSpan(span1)
16+
let span1 = tracer.spanBuilder(spanName: "Main (span1)").setActive(true).startSpan()
1817
let semaphore = DispatchSemaphore(value: 0)
1918
DispatchQueue.global().async {
2019
let span2 = tracer.spanBuilder(spanName: "Main (span2)").startSpan()

Examples/OTLP Exporter/main.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,8 @@ func createSpans() {
5353
}
5454
Thread.sleep(forTimeInterval: 0.5)
5555

56-
let parentSpan2 = tracer.spanBuilder(spanName: "Another").setSpanKind(spanKind: .client).startSpan()
56+
let parentSpan2 = tracer.spanBuilder(spanName: "Another").setSpanKind(spanKind: .client).setActive(true).startSpan()
5757
parentSpan2.setAttribute(key: sampleKey, value: sampleValue)
58-
OpenTelemetry.instance.contextProvider.setActiveSpan(parentSpan2)
5958
// do more Work
6059
for _ in 1...3 {
6160
doWork()

Examples/Simple Exporter/main.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,9 @@ func simpleSpan() {
3232
}
3333

3434
func childSpan() {
35-
let span = tracer.spanBuilder(spanName: "parentSpan").setSpanKind(spanKind: .client).startSpan()
35+
let span = tracer.spanBuilder(spanName: "parentSpan").setSpanKind(spanKind: .client).setActive(true).startSpan()
3636
span.setAttribute(key: sampleKey, value: sampleValue)
3737
Thread.sleep(forTimeInterval: 0.2)
38-
OpenTelemetry.instance.contextProvider.setActiveSpan(span)
3938
let childSpan = tracer.spanBuilder(spanName: "childSpan").setSpanKind(spanKind: .client).startSpan()
4039
childSpan.setAttribute(key: sampleKey, value: sampleValue)
4140
Thread.sleep(forTimeInterval: 0.5)

Sources/Importers/OpenTracingShim/TracerShim.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,7 @@ public class TracerShim: OTTracer, BaseShimProtocol {
5959
builder.setStartTime(time: startTime)
6060
}
6161

62-
let span = builder.startSpan()
63-
OpenTelemetry.instance.contextProvider.setActiveSpan(span)
62+
let span = builder.setActive(true).startSpan()
6463
let spanShim = SpanShim(telemetryInfo: telemetryInfo, span: span)
6564
if let baggage = baggage {
6665
spanContextTable.create(spanShim: spanShim, distContext: baggage)

Sources/OpenTelemetryApi/Trace/PropagatedSpanBuilder.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,9 @@ class PropagatedSpanBuilder: SpanBuilder {
5959
public func setAttribute(key: String, value: AttributeValue) -> Self {
6060
return self
6161
}
62+
63+
func setActive(_ active: Bool) -> Self {
64+
return self
65+
}
66+
6267
}

Sources/OpenTelemetryApi/Trace/SpanBuilder.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@ public protocol SpanBuilder: AnyObject {
102102
/// - Parameter startTimestamp: the explicit start timestamp of the newly created Span in nanos since epoch.
103103
@discardableResult func setStartTime(time: Date) -> Self
104104

105+
/// Sets the Span as the active Span in the current context when started.
106+
/// - Parameter active: If the span will be set as the activeSpan
107+
@discardableResult func setActive(_ active: Bool) -> Self
108+
105109
/// Starts a new Span.
106110
///
107111
/// Users must manually call Span.end() to end this Span

Sources/OpenTelemetrySdk/Trace/SpanBuilderSdk.swift

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class SpanBuilderSdk: SpanBuilder {
3131
private var totalNumberOfLinksAdded: Int = 0
3232
private var parentType: ParentType = .currentSpan
3333

34+
private var startAsActive: Bool = false
35+
3436
private var startTime = Date()
3537

3638
init(spanName: String,
@@ -98,6 +100,11 @@ class SpanBuilderSdk: SpanBuilder {
98100
return self
99101
}
100102

103+
@discardableResult func setActive(_ active: Bool) -> Self {
104+
startAsActive = active
105+
return self
106+
}
107+
101108
func startSpan() -> Span {
102109
var parentContext = getParentContext(parentType: parentType, explicitParent: parent, remoteParent: remoteParent)
103110
let traceId: TraceId
@@ -130,20 +137,24 @@ class SpanBuilderSdk: SpanBuilder {
130137

131138
attributes.updateValues(attributes: samplingDecision.attributes)
132139

133-
return RecordEventsReadableSpan.startSpan(context: spanContext,
134-
name: spanName,
135-
instrumentationLibraryInfo: instrumentationLibraryInfo,
136-
kind: spanKind,
137-
parentContext: parentContext,
138-
hasRemoteParent: parentContext?.isRemote ?? false,
139-
spanLimits: spanLimits,
140-
spanProcessor: tracerSharedState.activeSpanProcessor,
141-
clock: SpanBuilderSdk.getClock(parent: SpanBuilderSdk.getParentSpan(parentType: parentType, explicitParent: parent), clock: tracerSharedState.clock),
142-
resource: tracerSharedState.resource,
143-
attributes: attributes,
144-
links: links,
145-
totalRecordedLinks: totalNumberOfLinksAdded,
146-
startTime: startTime)
140+
let createdSpan = RecordEventsReadableSpan.startSpan(context: spanContext,
141+
name: spanName,
142+
instrumentationLibraryInfo: instrumentationLibraryInfo,
143+
kind: spanKind,
144+
parentContext: parentContext,
145+
hasRemoteParent: parentContext?.isRemote ?? false,
146+
spanLimits: spanLimits,
147+
spanProcessor: tracerSharedState.activeSpanProcessor,
148+
clock: SpanBuilderSdk.getClock(parent: SpanBuilderSdk.getParentSpan(parentType: parentType, explicitParent: parent), clock: tracerSharedState.clock),
149+
resource: tracerSharedState.resource,
150+
attributes: attributes,
151+
links: links,
152+
totalRecordedLinks: totalNumberOfLinksAdded,
153+
startTime: startTime)
154+
if startAsActive {
155+
OpenTelemetry.instance.contextProvider.setActiveSpan(createdSpan)
156+
}
157+
return createdSpan
147158
}
148159

149160
private static func getClock(parent: Span?, clock: Clock) -> Clock {

Tests/OpenTelemetrySdkTests/Trace/SpanBuilderSdkTests.swift

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,7 @@ class SpanBuilderSdkTest: XCTestCase {
189189
}
190190

191191
func testNoParent() {
192-
let parent = tracerSdk.spanBuilder(spanName: spanName).startSpan()
193-
OpenTelemetry.instance.contextProvider.setActiveSpan(parent)
192+
let parent = tracerSdk.spanBuilder(spanName: spanName).setActive(true).startSpan()
194193
let span = tracerSdk.spanBuilder(spanName: spanName).setNoParent().startSpan()
195194
XCTAssertNotEqual(span.context.traceId, parent.context.traceId)
196195
let spanNoParent = tracerSdk.spanBuilder(spanName: spanName).setNoParent().setParent(parent).setNoParent().startSpan()
@@ -222,8 +221,7 @@ class SpanBuilderSdkTest: XCTestCase {
222221
}
223222

224223
func testParentCurrentSpan() {
225-
let parent = tracerSdk.spanBuilder(spanName: spanName).startSpan()
226-
OpenTelemetry.instance.contextProvider.setActiveSpan(parent)
224+
let parent = tracerSdk.spanBuilder(spanName: spanName).setActive(true).startSpan()
227225
let span = tracerSdk.spanBuilder(spanName: spanName).startSpan() as! RecordEventsReadableSpan
228226
XCTAssertEqual(span.context.traceId, parent.context.traceId)
229227
XCTAssertEqual(span.parentContext?.spanId, parent.context.spanId)
@@ -243,8 +241,7 @@ class SpanBuilderSdkTest: XCTestCase {
243241
setenv("OTEL_TRACE_PARENT", "00-ff000000000000000000000000000041-ff00000000000041-01", 1)
244242
let providerWithEnv = TracerProviderSdk()
245243
let tracerAux = providerWithEnv.get(instrumentationName: "SpanBuilderWithEnvTest")
246-
let parent = tracerAux.spanBuilder(spanName: spanName).setNoParent().startSpan()
247-
OpenTelemetry.instance.contextProvider.setActiveSpan(parent)
244+
let parent = tracerAux.spanBuilder(spanName: spanName).setNoParent().setActive(true).startSpan()
248245
let span = tracerAux.spanBuilder(spanName: spanName).setParent(parent).startSpan()
249246
XCTAssertEqual(span.context.traceId, parent.context.traceId)
250247
XCTAssertEqual(parent.context.traceId.hexString, "ff000000000000000000000000000041")
@@ -261,8 +258,7 @@ class SpanBuilderSdkTest: XCTestCase {
261258
}
262259

263260
func testParentCurrentSpan_timestampConverter() {
264-
let parent = tracerSdk.spanBuilder(spanName: spanName).startSpan()
265-
OpenTelemetry.instance.contextProvider.setActiveSpan(parent)
261+
let parent = tracerSdk.spanBuilder(spanName: spanName).setActive(true).startSpan()
266262
let span = tracerSdk.spanBuilder(spanName: spanName).startSpan() as! RecordEventsReadableSpan
267263
XCTAssert(span.clock === (parent as! RecordEventsReadableSpan).clock)
268264
parent.end()
@@ -288,16 +284,14 @@ class SpanBuilderSdkTest: XCTestCase {
288284
os_activity_scope_enter(activity1, &activity1State)
289285

290286
XCTAssertNil(OpenTelemetry.instance.contextProvider.activeSpan)
291-
let parent = tracerSdk.spanBuilder(spanName: spanName).startSpan()
292-
OpenTelemetry.instance.contextProvider.setActiveSpan(parent)
287+
let parent = tracerSdk.spanBuilder(spanName: spanName).setActive(true).startSpan()
293288

294289
var activity2State = os_activity_scope_state_s()
295290
let activity2 = _os_activity_create(dso, "Activity-2", OS_ACTIVITY_CURRENT, OS_ACTIVITY_FLAG_DEFAULT)
296291
os_activity_scope_enter(activity2, &activity2State)
297292

298293
XCTAssertEqual(parent.context, OpenTelemetry.instance.contextProvider.activeSpan?.context)
299-
let span = tracerSdk.spanBuilder(spanName: spanName).startSpan() as! RecordEventsReadableSpan
300-
OpenTelemetry.instance.contextProvider.setActiveSpan(span)
294+
let span = tracerSdk.spanBuilder(spanName: spanName).setActive(true).startSpan() as! RecordEventsReadableSpan
301295

302296
var activity3State = os_activity_scope_state_s()
303297
let activity3 = _os_activity_create(dso, "Activity-3", OS_ACTIVITY_CURRENT, OS_ACTIVITY_FLAG_DEFAULT)

0 commit comments

Comments
 (0)