Skip to content

Commit f52c502

Browse files
robert-smartbearRobert Bartoszewski
andauthored
Fixed an issue allowing conditions to change spans endDate to an earlier date (#478)
Co-authored-by: Robert Bartoszewski <robert.smartbear@gmail.com>
1 parent 73137f4 commit f52c502

29 files changed

+183
-22
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ Changelog
99

1010
### Bug fixes
1111

12+
* Fixed an issue allowing conditions to change spans endDate to an earlier date.
13+
[478](https://github.com/bugsnag/bugsnag-cocoa-performance/pull/478)
14+
1215
* Fixed an issue preventing spans that have ended but are still blocked to be blocked with another condition.
1316
[471](https://github.com/bugsnag/bugsnag-cocoa-performance/pull/471)
1417

Sources/BugsnagPerformance/Private/Tracer.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@
220220
}
221221
BugsnagPerformanceSpanCondition *condition = [BugsnagPerformanceSpanCondition conditionWithSpan:span onClosedCallback:^(BugsnagPerformanceSpanCondition *c, CFAbsoluteTime endTime) {
222222
__strong BugsnagPerformanceSpan *strongSpan = c.span;
223-
if (strongSpan.state == SpanStateEnded) {
223+
if (strongSpan.state == SpanStateEnded && endTime > strongSpan.endAbsTime) {
224224
[strongSpan markEndAbsoluteTime:endTime];
225225
}
226226
} onUpgradedCallback:^BugsnagPerformanceSpanContext *(BugsnagPerformanceSpanCondition *c) {

features/default/automatic_spans.feature

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ Feature: Automatic instrumentation spans
7272
* a span named "[ViewLoadPhase/Subview layout]/Fixture.ViewController" is a child of span named "[ViewLoad/UIKit]/Fixture.ViewController"
7373
* a span named "[ViewLoadPhase/viewDidLayoutSubviews]/Fixture.ViewController" is a child of span named "[ViewLoad/UIKit]/Fixture.ViewController"
7474
* a span named "[AppStart/iOSCold]" ended at the same time as a span named "[AppStartPhase/UI init]"
75-
* a span named "[ViewLoad/UIKit]/Fixture.ViewController" ended at the same time as a span named "[AppStartPhase/UI init]"
75+
* a span named "[ViewLoad/UIKit]/Fixture.ViewController" ended before a span named "[AppStartPhase/UI init]"
7676

7777
Scenario: AutoInstrumentViewLoadScenario
7878
Given I run "AutoInstrumentViewLoadScenario"
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
Feature: Conditions
2+
3+
Scenario: Manually creating and ending conditions
4+
Given I run "ConditionsBasicScenario"
5+
And I wait for 1 span
6+
Then the trace "Content-Type" header equals "application/json"
7+
* the trace "Bugsnag-Integrity" header matches the regex "^sha1 [A-Fa-f0-9]{40}$"
8+
* the trace "Bugsnag-Span-Sampling" header equals "1:1"
9+
* 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$"
10+
* every span field "name" equals "ConditionsBasicScenario"
11+
* every span field "spanId" matches the regex "^[A-Fa-f0-9]{16}$"
12+
* every span field "traceId" matches the regex "^[A-Fa-f0-9]{32}$"
13+
* every span field "kind" equals 1
14+
* every span field "startTimeUnixNano" matches the regex "^[0-9]+$"
15+
* every span field "endTimeUnixNano" matches the regex "^[0-9]+$"
16+
* every span bool attribute "bugsnag.span.first_class" is true
17+
* every span string attribute "bugsnag.span.category" equals "custom"
18+
* a span named "ConditionsBasicScenario" duration is equal or greater than 1.0
19+
20+
Scenario: Span can be blocked again after being ended as long as it is still blocked
21+
Given I run "ConditionsBlockingBlockedEndedSpanScenario"
22+
And I wait for 1 span
23+
Then the trace "Content-Type" header equals "application/json"
24+
* the trace "Bugsnag-Integrity" header matches the regex "^sha1 [A-Fa-f0-9]{40}$"
25+
* the trace "Bugsnag-Span-Sampling" header equals "1:1"
26+
* 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$"
27+
* every span field "name" equals "ConditionsBlockingBlockedEndedSpanScenario"
28+
* every span field "spanId" matches the regex "^[A-Fa-f0-9]{16}$"
29+
* every span field "traceId" matches the regex "^[A-Fa-f0-9]{32}$"
30+
* every span field "kind" equals 1
31+
* every span field "startTimeUnixNano" matches the regex "^[0-9]+$"
32+
* every span field "endTimeUnixNano" matches the regex "^[0-9]+$"
33+
* every span bool attribute "bugsnag.span.first_class" is true
34+
* every span string attribute "bugsnag.span.category" equals "custom"
35+
* a span named "ConditionsBlockingBlockedEndedSpanScenario" duration is equal or greater than 2.0
36+
37+
Scenario: Condition should not override endTime to an earlier time
38+
Given I run "ConditionsOverrideEndTimeBackwardsScenario"
39+
And I wait for 1 span
40+
Then the trace "Content-Type" header equals "application/json"
41+
* the trace "Bugsnag-Integrity" header matches the regex "^sha1 [A-Fa-f0-9]{40}$"
42+
* the trace "Bugsnag-Span-Sampling" header equals "1:1"
43+
* 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$"
44+
* every span field "name" equals "ConditionsOverrideEndTimeBackwardsScenario"
45+
* every span field "spanId" matches the regex "^[A-Fa-f0-9]{16}$"
46+
* every span field "traceId" matches the regex "^[A-Fa-f0-9]{32}$"
47+
* every span field "kind" equals 1
48+
* every span field "startTimeUnixNano" matches the regex "^[0-9]+$"
49+
* every span field "endTimeUnixNano" matches the regex "^[0-9]+$"
50+
* every span bool attribute "bugsnag.span.first_class" is true
51+
* every span string attribute "bugsnag.span.category" equals "custom"
52+
* a span named "ConditionsOverrideEndTimeBackwardsScenario" duration is equal or greater than 1.0
53+

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@
7878
9691A9E12CA7588700707CDF /* FrameMetricsNonFirstClassSpanInstrumentRenderingOnScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9691A9E02CA7588700707CDF /* FrameMetricsNonFirstClassSpanInstrumentRenderingOnScenario.swift */; };
7979
96986D9E2D5060E600A44C34 /* SpanConditionsSimpleConditionScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96986D9D2D5060E600A44C34 /* SpanConditionsSimpleConditionScenario.swift */; };
8080
96986DA02D50654500A44C34 /* SpanConditionsMultipleConditionsScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96986D9F2D50654500A44C34 /* SpanConditionsMultipleConditionsScenario.swift */; };
81+
969EE0E22E784E6400600F63 /* ConditionsBasicScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 969EE0E02E784E6400600F63 /* ConditionsBasicScenario.swift */; };
82+
969EE0E32E784E6400600F63 /* ConditionsOverrideEndTimeBackwardsScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 969EE0E12E784E6400600F63 /* ConditionsOverrideEndTimeBackwardsScenario.swift */; };
83+
969EE0E92E7851F000600F63 /* ConditionsBlockingBlockedEndedSpanScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 969EE0E82E7851F000600F63 /* ConditionsBlockingBlockedEndedSpanScenario.swift */; };
8184
96A25F3C2D6BC98100A18116 /* AutoInstrumentAppStartsWithViewLoadScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96A25F3A2D6BC98100A18116 /* AutoInstrumentAppStartsWithViewLoadScenario.swift */; };
8285
96D528CC2C72B14300FEA2E2 /* AppDataOverrideScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96D528CB2C72B14300FEA2E2 /* AppDataOverrideScenario.swift */; };
8386
96D528CE2C75DC7000FEA2E2 /* FixedSamplingProbabilityOneScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96D528CD2C75DC7000FEA2E2 /* FixedSamplingProbabilityOneScenario.swift */; };
@@ -183,6 +186,9 @@
183186
9691A9E02CA7588700707CDF /* FrameMetricsNonFirstClassSpanInstrumentRenderingOnScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrameMetricsNonFirstClassSpanInstrumentRenderingOnScenario.swift; sourceTree = "<group>"; };
184187
96986D9D2D5060E600A44C34 /* SpanConditionsSimpleConditionScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpanConditionsSimpleConditionScenario.swift; sourceTree = "<group>"; };
185188
96986D9F2D50654500A44C34 /* SpanConditionsMultipleConditionsScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpanConditionsMultipleConditionsScenario.swift; sourceTree = "<group>"; };
189+
969EE0E02E784E6400600F63 /* ConditionsBasicScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConditionsBasicScenario.swift; sourceTree = "<group>"; };
190+
969EE0E12E784E6400600F63 /* ConditionsOverrideEndTimeBackwardsScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConditionsOverrideEndTimeBackwardsScenario.swift; sourceTree = "<group>"; };
191+
969EE0E82E7851F000600F63 /* ConditionsBlockingBlockedEndedSpanScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConditionsBlockingBlockedEndedSpanScenario.swift; sourceTree = "<group>"; };
186192
96A25F3A2D6BC98100A18116 /* AutoInstrumentAppStartsWithViewLoadScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutoInstrumentAppStartsWithViewLoadScenario.swift; sourceTree = "<group>"; };
187193
96D528CB2C72B14300FEA2E2 /* AppDataOverrideScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDataOverrideScenario.swift; sourceTree = "<group>"; };
188194
96D528CD2C75DC7000FEA2E2 /* FixedSamplingProbabilityOneScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FixedSamplingProbabilityOneScenario.swift; sourceTree = "<group>"; };
@@ -320,6 +326,9 @@
320326
CBAAE2582912601D006D4AA0 /* BatchingScenario.swift */,
321327
CB0496932913CA300097E526 /* BatchingWithTimeoutScenario.swift */,
322328
09301DC02B63A65A000A7C12 /* ComplexViewScenario.swift */,
329+
969EE0E02E784E6400600F63 /* ConditionsBasicScenario.swift */,
330+
969EE0E82E7851F000600F63 /* ConditionsBlockingBlockedEndedSpanScenario.swift */,
331+
969EE0E12E784E6400600F63 /* ConditionsOverrideEndTimeBackwardsScenario.swift */,
323332
098FC87B2D40EAB8001B627D /* CPUMetricsScenario.swift */,
324333
09DC62292C6DE242000AA8E1 /* EarlySpanOnEndScenario.swift */,
325334
CBC90CDD29CDCFF700280884 /* FirstClassNoScenario.swift */,
@@ -477,12 +486,15 @@
477486
09E045612C98649D003882D3 /* SetAttributeCountLimitScenario.swift in Sources */,
478487
962CE7EE2E62240E00380522 /* LoadingIndicatorViewSimpleStopScenario.swift in Sources */,
479488
962CE7F12E62240E00380522 /* LoadingIndicatorViewSimpleRemoveScenario.swift in Sources */,
489+
969EE0E92E7851F000600F63 /* ConditionsBlockingBlockedEndedSpanScenario.swift in Sources */,
480490
09637A432B0617FE00F4F776 /* MazeRunnerCommand.swift in Sources */,
481491
09F3F5302D6F17B300BAA0A3 /* RenderingMetricsScenario.swift in Sources */,
482492
966634E22C9DE648004A934D /* FrameMetricsNoSlowFramesScenario.swift in Sources */,
483493
9691A9DF2CA5E62800707CDF /* FrameMetricsSpanInstrumentRenderingOffScenario.swift in Sources */,
484494
09F025092BA08817007D9F73 /* AutoInstrumentNetworkNullURLScenario.swift in Sources */,
485495
0185C47228F6C983006F9BDC /* AutoInstrumentViewLoadScenario.swift in Sources */,
496+
969EE0E22E784E6400600F63 /* ConditionsBasicScenario.swift in Sources */,
497+
969EE0E32E784E6400600F63 /* ConditionsOverrideEndTimeBackwardsScenario.swift in Sources */,
486498
09D59E172BDFA23600199E1B /* ManualNetworkTracePropagationScenario.swift in Sources */,
487499
96D528D02C77F38400FEA2E2 /* FixedSamplingProbabilityZeroScenario.swift in Sources */,
488500
09D59E1D2BE105F700199E1B /* AutoInstrumentNetworkTracePropagationScenario.swift in Sources */,

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@
7777
96986DA42D506B8F00A44C34 /* SpanConditionsMultipleConditionsScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96986DA12D506B8F00A44C34 /* SpanConditionsMultipleConditionsScenario.swift */; };
7878
96986DA52D506B8F00A44C34 /* SpanConditionsConditionTimedOutScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96986DA22D506B8F00A44C34 /* SpanConditionsConditionTimedOutScenario.swift */; };
7979
96986DA62D506B8F00A44C34 /* SpanConditionsSimpleConditionScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96986DA32D506B8F00A44C34 /* SpanConditionsSimpleConditionScenario.swift */; };
80+
969EE0E72E784E7A00600F63 /* ConditionsBasicScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 969EE0E42E784E7A00600F63 /* ConditionsBasicScenario.swift */; };
81+
969EE0EC2E78521500600F63 /* ConditionsOverrideEndTimeBackwardsScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 969EE0EB2E78521500600F63 /* ConditionsOverrideEndTimeBackwardsScenario.swift */; };
82+
969EE0ED2E78521500600F63 /* ConditionsBlockingBlockedEndedSpanScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 969EE0EA2E78521500600F63 /* ConditionsBlockingBlockedEndedSpanScenario.swift */; };
8083
96A25F402D6BC9BF00A18116 /* AutoInstrumentAppStartsWithViewLoadScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96A25F3E2D6BC9BF00A18116 /* AutoInstrumentAppStartsWithViewLoadScenario.swift */; };
8184
96D528CC2C72B14300FEA2E2 /* AppDataOverrideScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96D528CB2C72B14300FEA2E2 /* AppDataOverrideScenario.swift */; };
8285
96D528CE2C75DC7000FEA2E2 /* FixedSamplingProbabilityOneScenario.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96D528CD2C75DC7000FEA2E2 /* FixedSamplingProbabilityOneScenario.swift */; };
@@ -197,6 +200,9 @@
197200
96986DA12D506B8F00A44C34 /* SpanConditionsMultipleConditionsScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpanConditionsMultipleConditionsScenario.swift; sourceTree = "<group>"; };
198201
96986DA22D506B8F00A44C34 /* SpanConditionsConditionTimedOutScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpanConditionsConditionTimedOutScenario.swift; sourceTree = "<group>"; };
199202
96986DA32D506B8F00A44C34 /* SpanConditionsSimpleConditionScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpanConditionsSimpleConditionScenario.swift; sourceTree = "<group>"; };
203+
969EE0E42E784E7A00600F63 /* ConditionsBasicScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConditionsBasicScenario.swift; sourceTree = "<group>"; };
204+
969EE0EA2E78521500600F63 /* ConditionsBlockingBlockedEndedSpanScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConditionsBlockingBlockedEndedSpanScenario.swift; sourceTree = "<group>"; };
205+
969EE0EB2E78521500600F63 /* ConditionsOverrideEndTimeBackwardsScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConditionsOverrideEndTimeBackwardsScenario.swift; sourceTree = "<group>"; };
200206
96A25F3E2D6BC9BF00A18116 /* AutoInstrumentAppStartsWithViewLoadScenario.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AutoInstrumentAppStartsWithViewLoadScenario.swift; sourceTree = "<group>"; };
201207
96D528CB2C72B14300FEA2E2 /* AppDataOverrideScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDataOverrideScenario.swift; sourceTree = "<group>"; };
202208
96D528CD2C75DC7000FEA2E2 /* FixedSamplingProbabilityOneScenario.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FixedSamplingProbabilityOneScenario.swift; sourceTree = "<group>"; };
@@ -336,6 +342,9 @@
336342
CBAAE2582912601D006D4AA0 /* BatchingScenario.swift */,
337343
CB0496932913CA300097E526 /* BatchingWithTimeoutScenario.swift */,
338344
09301DC02B63A65A000A7C12 /* ComplexViewScenario.swift */,
345+
969EE0E42E784E7A00600F63 /* ConditionsBasicScenario.swift */,
346+
969EE0EA2E78521500600F63 /* ConditionsBlockingBlockedEndedSpanScenario.swift */,
347+
969EE0EB2E78521500600F63 /* ConditionsOverrideEndTimeBackwardsScenario.swift */,
339348
09F3F5292D6C72B300BAA0A3 /* CPUMetricsScenario.swift */,
340349
09DC62292C6DE242000AA8E1 /* EarlySpanOnEndScenario.swift */,
341350
CBC90CDD29CDCFF700280884 /* FirstClassNoScenario.swift */,
@@ -484,6 +493,8 @@
484493
buildActionMask = 2147483647;
485494
files = (
486495
CBE43A9929A8EFA3000B4205 /* ProbabilityExpiryScenario.swift in Sources */,
496+
969EE0EC2E78521500600F63 /* ConditionsOverrideEndTimeBackwardsScenario.swift in Sources */,
497+
969EE0ED2E78521500600F63 /* ConditionsBlockingBlockedEndedSpanScenario.swift in Sources */,
487498
CBE0872B29F81BBB007455F2 /* AutoInstrumentNetworkNoParentScenario.swift in Sources */,
488499
962CE7F62E62242500380522 /* LoadingIndicatorViewSimpleRemoveScenario.swift in Sources */,
489500
962CE7F82E62242500380522 /* LoadingIndicatorViewSimpleStopScenario.swift in Sources */,
@@ -573,6 +584,7 @@
573584
01E7918A28EC7B5E00855993 /* ManualSpanBeforeStartScenario.swift in Sources */,
574585
962CE8012E64FF6100380522 /* LoadingIndicatorViewNestedViewStopScenario.swift in Sources */,
575586
09DC622A2C6DE242000AA8E1 /* EarlySpanOnEndScenario.swift in Sources */,
587+
969EE0E72E784E7A00600F63 /* ConditionsBasicScenario.swift in Sources */,
576588
CBE615F729A4C1F0000E72D8 /* ParentSpanScenario.swift in Sources */,
577589
);
578590
runOnlyForDeploymentPostprocessing = 0;

features/fixtures/ios/Scenarios/AppDataOverrideScenario.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// AppDataOverrideScenario.swift
33
// Fixture
44
//
5-
// Created by Robert B on 16/08/2024.
5+
// Created by Robert Bartoszewski on 16/08/2024.
66
//
77

88
import BugsnagPerformance

features/fixtures/ios/Scenarios/AutoInstrumentAppStartsWithViewLoadScenario.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// AutoInstrumentAppStartsWithViewLoadScenario.swift
33
// Fixture
44
//
5-
// Created by Robert B on 20/02/2025.
5+
// Created by Robert Bartoszewski on 20/02/2025.
66
//
77

88
import BugsnagPerformance

features/fixtures/ios/Scenarios/AutoInstrumentGenericViewLoadScenario.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// AutoInstrumentGenericViewLoadScenario.swift
33
// Fixture
44
//
5-
// Created by Robert B on 07/12/2023.
5+
// Created by Robert Bartoszewski on 07/12/2023.
66
//
77

88
import UIKit

features/fixtures/ios/Scenarios/AutoInstrumentNavigationViewLoadScenario.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// AutoInstrumentNavigationViewLoadScenario.swift
33
// Fixture
44
//
5-
// Created by Robert B on 16/06/2023.
5+
// Created by Robert Bartoszewski on 16/06/2023.
66
//
77

88
import Foundation

0 commit comments

Comments
 (0)