Skip to content

Commit 39aabf4

Browse files
robert-smartbearRobert Bartoszewski
andauthored
Fixed an issue where current context would not calculated properly whenever there is an ended and blocked span on the top of the stack (#540)
Co-authored-by: Robert Bartoszewski <[email protected]>
1 parent 1fc957a commit 39aabf4

File tree

5 files changed

+64
-6
lines changed

5 files changed

+64
-6
lines changed

Sources/BugsnagPerformance/Private/SpanStackingHandler.mm

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,13 @@ static inline os_activity_id_t currentActivityId() {
5252
SpanStackingHandler::currentSpan() {
5353
std::lock_guard<std::mutex> guard(mutex_);
5454
std::shared_ptr<SpanActivityState> state = spanStateForActivity(currentActivityId());
55-
if (state == nullptr) {
56-
return nullptr;
57-
}
58-
if (!(state->span.state == SpanStateOpen)) {
59-
return nullptr;
55+
while (state != nullptr) {
56+
if (state->span.state == SpanStateOpen) {
57+
return state->span;
58+
}
59+
state = spanStateForActivity(state->parentActivityId);
6060
}
61-
return state->span;
61+
return nullptr;
6262
}
6363

6464
void

features/default/manual_spans.feature

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,3 +567,18 @@ Feature: Manual creation of spans
567567
* the trace payload field "resourceSpans.0.scopeSpans.0.spans.0.parentSpanId" is null
568568
* the trace payload field "resourceSpans.0.scopeSpans.0.spans.1.parentSpanId" matches the regex "^[A-Fa-f0-9]{16}$"
569569
* the trace payload field "resourceSpans.0.scopeSpans.0.spans.2.parentSpanId" is null
570+
571+
Scenario: Parent context should be calculated despite blocked spans on the stack
572+
Given I run "ManualParentBlockedSpanScenario"
573+
And I wait to receive at least 4 spans
574+
Then the trace "Content-Type" header equals "application/json"
575+
* the trace "Bugsnag-Integrity" header matches the regex "^sha1 [A-Fa-f0-9]{40}$"
576+
* the trace "Bugsnag-Sent-At" header matches the regex "^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\d\.\d\d\dZ$"
577+
* a span field "name" equals "ManualParentBlockedSpanScenarioParent"
578+
* a span field "name" equals "ManualParentBlockedSpanScenarioBlocked1"
579+
* a span field "name" equals "ManualParentBlockedSpanScenarioBlocked2"
580+
* a span field "name" equals "ManualParentBlockedSpanScenarioChild"
581+
* a span named "ManualParentBlockedSpanScenarioBlocked1" is a child of span named "ManualParentBlockedSpanScenarioParent"
582+
* a span named "ManualParentBlockedSpanScenarioBlocked2" is a child of span named "ManualParentBlockedSpanScenarioBlocked1"
583+
* a span named "ManualParentBlockedSpanScenarioChild" is a child of span named "ManualParentBlockedSpanScenarioParent"
584+

features/fixtures/ios/Fixture.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
96DADF512EAFCB1100B56CE6 /* ManualSpanEndOnDestroyScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96DADF502EAFCB1100B56CE6 /* ManualSpanEndOnDestroyScenario.swift */; };
8282
96F129352DCE0CFE00A6FB2B /* ManualSpanWithRemoteContextParentScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96F129342DCE0CFE00A6FB2B /* ManualSpanWithRemoteContextParentScenario.swift */; };
8383
96F5268C2C259E4E0095D600 /* ManualNetworkSpanCallbackSetToNilScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96F5268B2C259E4E0095D600 /* ManualNetworkSpanCallbackSetToNilScenario.swift */; };
84+
96F901172EE836CC0026F5B9 /* ManualParentBlockedSpanScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96F901162EE836CC0026F5B9 /* ManualParentBlockedSpanScenario.swift */; };
8485
96F901092EE7B7FF0026F5B9 /* AutoInstrumentNetworkEarlyCallbackScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96F901082EE7B7FF0026F5B9 /* AutoInstrumentNetworkEarlyCallbackScenario.swift */; };
8586
CB0496942913CA300097E526 /* BatchingWithTimeoutScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0496932913CA300097E526 /* BatchingWithTimeoutScenario.swift */; };
8687
CB0AD76E2965BBDA002A3FB6 /* InitialPScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0AD76D2965BBDA002A3FB6 /* InitialPScenario.swift */; };
@@ -187,6 +188,7 @@
187188
96DADF572EAFCE6D00B56CE6 /* BugsnagPerformanceSpan+Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BugsnagPerformanceSpan+Internal.h"; sourceTree = "<group>"; };
188189
96F129342DCE0CFE00A6FB2B /* ManualSpanWithRemoteContextParentScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManualSpanWithRemoteContextParentScenario.swift; sourceTree = "<group>"; };
189190
96F5268B2C259E4E0095D600 /* ManualNetworkSpanCallbackSetToNilScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManualNetworkSpanCallbackSetToNilScenario.swift; sourceTree = "<group>"; };
191+
96F901162EE836CC0026F5B9 /* ManualParentBlockedSpanScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManualParentBlockedSpanScenario.swift; sourceTree = "<group>"; };
190192
96F901082EE7B7FF0026F5B9 /* AutoInstrumentNetworkEarlyCallbackScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoInstrumentNetworkEarlyCallbackScenario.swift; sourceTree = "<group>"; };
191193
CB0496932913CA300097E526 /* BatchingWithTimeoutScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatchingWithTimeoutScenario.swift; sourceTree = "<group>"; };
192194
CB0AD76D2965BBDA002A3FB6 /* InitialPScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InitialPScenario.swift; sourceTree = "<group>"; };
@@ -343,6 +345,7 @@
343345
96F5268B2C259E4E0095D600 /* ManualNetworkSpanCallbackSetToNilScenario.swift */,
344346
CBE6B66A28FD66B400D1CF78 /* ManualNetworkSpanScenario.swift */,
345347
09D59E162BDFA23600199E1B /* ManualNetworkTracePropagationScenario.swift */,
348+
96F901162EE836CC0026F5B9 /* ManualParentBlockedSpanScenario.swift */,
346349
093EE63C2C32E5B900632B30 /* ManualParentSpanScenario.swift */,
347350
01E7918928EC7B5E00855993 /* ManualSpanBeforeStartScenario.swift */,
348351
96DADF502EAFCB1100B56CE6 /* ManualSpanEndOnDestroyScenario.swift */,
@@ -481,6 +484,7 @@
481484
09F3F5302D6F17B300BAA0A3 /* RenderingMetricsScenario.swift in Sources */,
482485
966634E22C9DE648004A934D /* FrameMetricsNoSlowFramesScenario.swift in Sources */,
483486
9691A9DF2CA5E62800707CDF /* FrameMetricsSpanInstrumentRenderingOffScenario.swift in Sources */,
487+
96F901172EE836CC0026F5B9 /* ManualParentBlockedSpanScenario.swift in Sources */,
484488
09F025092BA08817007D9F73 /* AutoInstrumentNetworkNullURLScenario.swift in Sources */,
485489
0185C47228F6C983006F9BDC /* AutoInstrumentViewLoadScenario.swift in Sources */,
486490
09D59E172BDFA23600199E1B /* ManualNetworkTracePropagationScenario.swift in Sources */,

features/fixtures/ios/FixtureXcFramework.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
96E0B34B2CD0E21C008AEB9C /* AutoInstrumentNetworkSharedSessionInvalidateScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96E0B34A2CD0E21C008AEB9C /* AutoInstrumentNetworkSharedSessionInvalidateScenario.swift */; };
8181
96F129332DCE0CDD00A6FB2B /* RenderingMetricsScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96F129322DCE0CDD00A6FB2B /* RenderingMetricsScenario.swift */; };
8282
96F5268C2C259E4E0095D600 /* ManualNetworkSpanCallbackSetToNilScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96F5268B2C259E4E0095D600 /* ManualNetworkSpanCallbackSetToNilScenario.swift */; };
83+
96F901192EE836E10026F5B9 /* ManualParentBlockedSpanScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96F901182EE836E10026F5B9 /* ManualParentBlockedSpanScenario.swift */; };
8384
96F9010B2EE7B81F0026F5B9 /* AutoInstrumentNetworkEarlyCallbackScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96F9010A2EE7B81F0026F5B9 /* AutoInstrumentNetworkEarlyCallbackScenario.swift */; };
8485
CB0496942913CA300097E526 /* BatchingWithTimeoutScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0496932913CA300097E526 /* BatchingWithTimeoutScenario.swift */; };
8586
CB0AD76E2965BBDA002A3FB6 /* InitialPScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0AD76D2965BBDA002A3FB6 /* InitialPScenario.swift */; };
@@ -202,6 +203,7 @@
202203
96E0B34A2CD0E21C008AEB9C /* AutoInstrumentNetworkSharedSessionInvalidateScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutoInstrumentNetworkSharedSessionInvalidateScenario.swift; sourceTree = "<group>"; };
203204
96F129322DCE0CDD00A6FB2B /* RenderingMetricsScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RenderingMetricsScenario.swift; sourceTree = "<group>"; };
204205
96F5268B2C259E4E0095D600 /* ManualNetworkSpanCallbackSetToNilScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManualNetworkSpanCallbackSetToNilScenario.swift; sourceTree = "<group>"; };
206+
96F901182EE836E10026F5B9 /* ManualParentBlockedSpanScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManualParentBlockedSpanScenario.swift; sourceTree = "<group>"; };
205207
96F9010A2EE7B81F0026F5B9 /* AutoInstrumentNetworkEarlyCallbackScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoInstrumentNetworkEarlyCallbackScenario.swift; sourceTree = "<group>"; };
206208
CB0496932913CA300097E526 /* BatchingWithTimeoutScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatchingWithTimeoutScenario.swift; sourceTree = "<group>"; };
207209
CB0AD76D2965BBDA002A3FB6 /* InitialPScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InitialPScenario.swift; sourceTree = "<group>"; };
@@ -361,6 +363,7 @@
361363
96F5268B2C259E4E0095D600 /* ManualNetworkSpanCallbackSetToNilScenario.swift */,
362364
CBE6B66A28FD66B400D1CF78 /* ManualNetworkSpanScenario.swift */,
363365
09D59E162BDFA23600199E1B /* ManualNetworkTracePropagationScenario.swift */,
366+
96F901182EE836E10026F5B9 /* ManualParentBlockedSpanScenario.swift */,
364367
093EE63C2C32E5B900632B30 /* ManualParentSpanScenario.swift */,
365368
01E7918928EC7B5E00855993 /* ManualSpanBeforeStartScenario.swift */,
366369
96DADF532EAFCB6300B56CE6 /* ManualSpanEndOnDestroyScenario.swift */,
@@ -531,6 +534,7 @@
531534
0983A1792B14B20C00DDF4FF /* AutoInstrumentSwiftUIScenario.swift in Sources */,
532535
CBF62109291A4F47004BEE0B /* RetryScenario.swift in Sources */,
533536
CB7FD92B299BB4E300499E13 /* ManualUIViewLoadScenario.swift in Sources */,
537+
96F901192EE836E10026F5B9 /* ManualParentBlockedSpanScenario.swift in Sources */,
534538
9691A9E12CA7588700707CDF /* FrameMetricsNonFirstClassSpanInstrumentRenderingOnScenario.swift in Sources */,
535539
09F3F52C2D6C72BD00BAA0A3 /* MemoryMetricsScenario.swift in Sources */,
536540
09637A3F2B06082200F4F776 /* Logging.m in Sources */,
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// ManualParentBlockedSpanScenario.swift
3+
// Fixture
4+
//
5+
// Created by Robert Bartoszewski on 09/12/2025.
6+
//
7+
8+
import BugsnagPerformance
9+
10+
@objcMembers
11+
class ManualParentBlockedSpanScenario: Scenario {
12+
13+
override func setInitialBugsnagConfiguration() {
14+
super.setInitialBugsnagConfiguration()
15+
bugsnagPerfConfig.internal.autoTriggerExportOnBatchSize = 4;
16+
}
17+
18+
override func run() {
19+
let parentSpan = BugsnagPerformance.startSpan(name: "ManualParentBlockedSpanScenarioParent")
20+
let blockedSpan1 = BugsnagPerformance.startSpan(name: "ManualParentBlockedSpanScenarioBlocked1")
21+
let blockedSpan2 = BugsnagPerformance.startSpan(name: "ManualParentBlockedSpanScenarioBlocked2")
22+
let condition1 = blockedSpan1.block(timeout: 1.0)
23+
condition1?.upgrade()
24+
blockedSpan1.end()
25+
let condition2 = blockedSpan2.block(timeout: 1.0)
26+
condition2?.upgrade()
27+
blockedSpan2.end()
28+
29+
BugsnagPerformance.startSpan(name: "ManualParentBlockedSpanScenarioChild").end()
30+
parentSpan.end()
31+
32+
condition1?.cancel()
33+
condition2?.cancel()
34+
}
35+
}

0 commit comments

Comments
 (0)