Skip to content

Commit b642953

Browse files
Make withSpan set span status to .error if operation closure throws (#201)
1 parent 3feb981 commit b642953

File tree

4 files changed

+33
-12
lines changed

4 files changed

+33
-12
lines changed

Sources/Tracing/TracerProtocol+Legacy.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ extension LegacyTracer {
229229
}
230230
} catch {
231231
span.recordError(error)
232+
span.setStatus(.init(code: .error))
232233
throw error // rethrow
233234
}
234235
}
@@ -333,6 +334,7 @@ extension LegacyTracer {
333334
}
334335
} catch {
335336
span.recordError(error)
337+
span.setStatus(.init(code: .error))
336338
throw error // rethrow
337339
}
338340
}
@@ -383,6 +385,7 @@ extension LegacyTracer {
383385
}
384386
} catch {
385387
span.recordError(error)
388+
span.setStatus(.init(code: .error))
386389
throw error // rethrow
387390
}
388391
}
@@ -437,6 +440,7 @@ extension LegacyTracer {
437440
}
438441
} catch {
439442
span.recordError(error)
443+
span.setStatus(.init(code: .error))
440444
throw error // rethrow
441445
}
442446
}
@@ -485,6 +489,7 @@ extension LegacyTracer {
485489
}
486490
} catch {
487491
span.recordError(error)
492+
span.setStatus(.init(code: .error))
488493
throw error // rethrow
489494
}
490495
}

Sources/Tracing/TracerProtocol.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,7 @@ extension Tracer {
180180
}
181181
} catch {
182182
span.recordError(error)
183+
span.setStatus(.init(code: .error))
183184
throw error // rethrow
184185
}
185186
}
@@ -231,6 +232,7 @@ extension Tracer {
231232
}
232233
} catch {
233234
span.recordError(error)
235+
span.setStatus(.init(code: .error))
234236
throw error // rethrow
235237
}
236238
}
@@ -284,6 +286,7 @@ extension Tracer {
284286
}
285287
} catch {
286288
span.recordError(error)
289+
span.setStatus(.init(code: .error))
287290
throw error // rethrow
288291
}
289292
}
@@ -321,6 +324,7 @@ extension Tracer {
321324
}
322325
} catch {
323326
span.recordError(error)
327+
span.setStatus(.init(code: .error))
324328
throw error // rethrow
325329
}
326330
}
@@ -375,6 +379,7 @@ extension Tracer {
375379
}
376380
} catch {
377381
span.recordError(error)
382+
span.setStatus(.init(code: .error))
378383
throw error // rethrow
379384
}
380385
}
@@ -425,6 +430,7 @@ extension Tracer {
425430
}
426431
} catch {
427432
span.recordError(error)
433+
span.setStatus(.init(code: .error))
428434
throw error // rethrow
429435
}
430436
}

Tests/TracingTests/TestTracer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ extension ServiceContext {
120120
final class TestSpan: Span {
121121
let kind: SpanKind
122122

123-
private var status: SpanStatus?
123+
var status: SpanStatus?
124124

125125
package let startTimestampNanosSinceEpoch: UInt64
126126
package private(set) var endTimestampNanosSinceEpoch: UInt64?

Tests/TracingTests/TracerTests.swift

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,19 @@ struct TracerTests {
7878
let tracer = TestTracer()
7979

8080
var spanEnded = false
81-
tracer.onEndSpan = { _ in spanEnded = true }
81+
var spanStatus: SpanStatus? = nil
82+
tracer.onEndSpan = { span in
83+
spanEnded = true
84+
spanStatus = span.status
85+
}
8286

8387
do {
8488
_ = try tracer.withAnySpan("hello", context: .topLevel) { _ in
8589
throw ExampleSpanError()
8690
}
8791
} catch {
8892
#expect(spanEnded == true)
93+
#expect(spanStatus?.code == .error)
8994
#expect(error as? ExampleSpanError == ExampleSpanError())
9095
return
9196
}
@@ -117,7 +122,11 @@ struct TracerTests {
117122
let tracer = TestTracer()
118123

119124
var spanEnded = false
120-
tracer.onEndSpan = { _ in spanEnded = true }
125+
var spanStatus: SpanStatus? = nil
126+
tracer.onEndSpan = { span in
127+
spanEnded = true
128+
spanStatus = span.status
129+
}
121130

122131
func operation(span: any Tracing.Span) throws -> String {
123132
throw ExampleSpanError()
@@ -127,6 +136,7 @@ struct TracerTests {
127136
_ = try tracer.withAnySpan("hello", operation)
128137
} catch {
129138
#expect(spanEnded == true)
139+
#expect(spanStatus?.code == .error)
130140
#expect(error as? ExampleSpanError == ExampleSpanError())
131141
return
132142
}
@@ -181,8 +191,8 @@ struct TracerTests {
181191
func withSpan_automaticBaggagePropagation_async_throws() async throws {
182192
let tracer = TestTracer()
183193

184-
let spanEnded: LockedValueBox<Bool> = .init(false)
185-
tracer.onEndSpan = { _ in spanEnded.withValue { $0 = true } }
194+
let endedSpan: LockedValueBox<TestSpan?> = .init(nil)
195+
tracer.onEndSpan = { span in endedSpan.withValue { $0 = span } }
186196

187197
let operation: @Sendable (any Tracing.Span) async throws -> String = { _ in
188198
throw ExampleSpanError()
@@ -191,7 +201,7 @@ struct TracerTests {
191201
do {
192202
_ = try await tracer.withAnySpan("hello", operation)
193203
} catch {
194-
#expect(spanEnded.withValue { $0 } == true)
204+
#expect(endedSpan.withValue { $0?.status?.code } == .error)
195205
#expect(error as? ExampleSpanError == ExampleSpanError())
196206
return
197207
}
@@ -202,8 +212,8 @@ struct TracerTests {
202212
func static_Tracer_withSpan_automaticBaggagePropagation_async_throws() async throws {
203213
let tracer = TestTracer()
204214

205-
let spanEnded: LockedValueBox<Bool> = .init(false)
206-
tracer.onEndSpan = { _ in spanEnded.withValue { $0 = true } }
215+
let endedSpan: LockedValueBox<TestSpan?> = .init(nil)
216+
tracer.onEndSpan = { span in endedSpan.withValue { $0 = span } }
207217

208218
let operation: @Sendable (any Tracing.Span) async throws -> String = { _ in
209219
throw ExampleSpanError()
@@ -212,7 +222,7 @@ struct TracerTests {
212222
do {
213223
_ = try await tracer.withSpan("hello", operation)
214224
} catch {
215-
#expect(spanEnded.withValue { $0 } == true)
225+
#expect(endedSpan.withValue { $0?.status?.code } == .error)
216226
#expect(error as? ExampleSpanError == ExampleSpanError())
217227
return
218228
}
@@ -223,8 +233,8 @@ struct TracerTests {
223233
func static_Tracer_withSpan_automaticBaggagePropagation_throws() async throws {
224234
let tracer = TestTracer()
225235

226-
let spanEnded: LockedValueBox<Bool> = .init(false)
227-
tracer.onEndSpan = { _ in spanEnded.withValue { $0 = true } }
236+
let endedSpan: LockedValueBox<TestSpan?> = .init(nil)
237+
tracer.onEndSpan = { span in endedSpan.withValue { $0 = span } }
228238

229239
let operation: @Sendable (any Tracing.Span) async throws -> String = { _ in
230240
throw ExampleSpanError()
@@ -233,7 +243,7 @@ struct TracerTests {
233243
do {
234244
_ = try await tracer.withSpan("hello", operation)
235245
} catch {
236-
#expect(spanEnded.withValue { $0 } == true)
246+
#expect(endedSpan.withValue { $0?.status?.code } == .error)
237247
#expect(error as? ExampleSpanError == ExampleSpanError())
238248
return
239249
}

0 commit comments

Comments
 (0)