Skip to content

Commit 72e13ec

Browse files
robert-smartbearRobert Bartoszewskidependabot[bot]
authored
Fixed an issue causing viewLoad phase child spans being wrongly attributed to viewDataLoading phase (#543)
* Merge pull request #537 from bugsnag/robert/plat-15319_enable_setting_attributes_onSpanEnd_for_blocked_spans Fixed an issue where onSpanEnd callbacks would fail to set attributes of blocked spans * Fixed an issue where early network span attributes wouldn't be updated in reprocessing (#538) Co-authored-by: Robert Bartoszewski <[email protected]> * Fixed an issue preventing some preloaded ViewLoad spans from being adjusted (#541) Co-authored-by: Robert Bartoszewski <[email protected]> * 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]> * Bump github/codeql-action from 4.31.6 to 4.31.7 (#536) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.31.6 to 4.31.7. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](github/codeql-action@fe4161a...cf1bb45) --- updated-dependencies: - dependency-name: github/codeql-action dependency-version: 4.31.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump actions/checkout from 6.0.0 to 6.0.1 (#535) Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.0 to 6.0.1. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](actions/checkout@1af3b93...8e8c483) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Fixed an issue where spans weren't sent when BugsnagPerformance has been started on a background thread (#539) Co-authored-by: Robert Bartoszewski <[email protected]> * Removed commented out code * Fixed an issue causing viewLoad phase child spans being wrongly attributed to viewDataLoading phase * Fixed build error --------- Signed-off-by: dependabot[bot] <[email protected]> Co-authored-by: Robert Bartoszewski <[email protected]> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1 parent b98957c commit 72e13ec

File tree

8 files changed

+75
-41
lines changed

8 files changed

+75
-41
lines changed

Sources/BugsnagPerformance/Private/Instrumentation/ViewLoadInstrumentation/Lifecycle/LoadingIndicators/ViewLoadLoadingIndicatorState.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
@interface ViewLoadLoadingIndicatorState : NSObject
1313

14-
@property(nonatomic, strong) NSArray<BugsnagPerformanceSpanCondition *> *conditions;
14+
@property(nonatomic, strong) NSMutableArray<BugsnagPerformanceSpanCondition *> *conditions;
1515
@property(nonatomic, strong) BugsnagPerformanceSpan *loadingIndicatorSpan;
1616
@property(nonatomic) BOOL needsSpanUpdate;
1717

Sources/BugsnagPerformance/Private/Instrumentation/ViewLoadInstrumentation/Lifecycle/LoadingIndicators/ViewLoadLoadingIndicatorState.mm

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,14 @@
99
#import "ViewLoadLoadingIndicatorState.h"
1010

1111
@implementation ViewLoadLoadingIndicatorState
12+
13+
- (instancetype)init
14+
{
15+
self = [super init];
16+
if (self) {
17+
_conditions = [NSMutableArray array];
18+
}
19+
return self;
20+
}
21+
1222
@end

Sources/BugsnagPerformance/Private/Instrumentation/ViewLoadInstrumentation/Lifecycle/LoadingIndicators/ViewLoadLoadingIndicatorsHandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class ViewLoadLoadingIndicatorsHandler {
1919
public:
2020
virtual void onLoadingIndicatorWasAdded(BugsnagPerformanceLoadingIndicatorView *loadingIndicator) noexcept = 0;
2121
virtual void onViewControllerUpdatedView(UIViewController *viewController) noexcept = 0;
22+
virtual void onViewControllerDidAppear(UIViewController *viewController) noexcept = 0;
2223
virtual void setCallbacks(ViewLoadLoadingIndicatorsHandlerCallbacks *callbacks) noexcept = 0;
2324
virtual ~ViewLoadLoadingIndicatorsHandler() {}
2425
};

Sources/BugsnagPerformance/Private/Instrumentation/ViewLoadInstrumentation/Lifecycle/LoadingIndicators/ViewLoadLoadingIndicatorsHandlerImpl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class ViewLoadLoadingIndicatorsHandlerImpl: public ViewLoadLoadingIndicatorsHand
2727

2828
void onLoadingIndicatorWasAdded(BugsnagPerformanceLoadingIndicatorView *loadingIndicator) noexcept;
2929
void onViewControllerUpdatedView(UIViewController *viewController) noexcept;
30+
void onViewControllerDidAppear(UIViewController *viewController) noexcept;
3031
void setCallbacks(ViewLoadLoadingIndicatorsHandlerCallbacks *callbacks) noexcept {
3132
callbacks_ = callbacks;
3233
}
@@ -39,6 +40,10 @@ class ViewLoadLoadingIndicatorsHandlerImpl: public ViewLoadLoadingIndicatorsHand
3940

4041
void updateIndicatorsState(BugsnagPerformanceLoadingIndicatorView *loadingIndicator, ViewLoadLoadingIndicatorState *state) noexcept;
4142
ViewLoadLoadingIndicatorState *newState(BugsnagPerformanceLoadingIndicatorView *loadingIndicator) noexcept;
43+
void addToState(ViewLoadLoadingIndicatorState *state,
44+
BugsnagPerformanceLoadingIndicatorView *loadingIndicator,
45+
ViewLoadInstrumentationState *viewLoadState,
46+
BOOL isFirstViewController) noexcept;
4247
void updateLoadingIndicators(UIView *view) noexcept;
4348
bool checkNeedsSpanUpdate(BugsnagPerformanceLoadingIndicatorView *loadingIndicator,
4449
BugsnagPerformanceSpanContext *parentContext) noexcept;

Sources/BugsnagPerformance/Private/Instrumentation/ViewLoadInstrumentation/Lifecycle/LoadingIndicators/ViewLoadLoadingIndicatorsHandlerImpl.mm

Lines changed: 42 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@
2929
updateLoadingIndicators(viewController.view);
3030
}
3131

32+
void
33+
ViewLoadLoadingIndicatorsHandlerImpl::onViewControllerDidAppear(UIViewController *viewController) noexcept {
34+
std::lock_guard<std::mutex> guard(mutex_);
35+
updateLoadingIndicators(viewController.view);
36+
}
37+
3238
#pragma mark Helpers
3339

3440
void
@@ -43,46 +49,54 @@
4349

4450
ViewLoadLoadingIndicatorState *
4551
ViewLoadLoadingIndicatorsHandlerImpl::newState(BugsnagPerformanceLoadingIndicatorView *loadingIndicator) noexcept {
46-
NSMutableArray<BugsnagPerformanceSpanCondition *> *newConditions = [NSMutableArray array];
47-
auto needsSpanUpdate = false;
4852
auto hasFoundFirstViewController = false;
49-
BugsnagPerformanceSpan *loadingIndicatorSpan;
5053

54+
auto state = [ViewLoadLoadingIndicatorState new];
5155
UIView *view = loadingIndicator;
5256
while (view != nil) {
53-
ViewLoadInstrumentationState *state = repository_->getInstrumentationState(view);
54-
__strong UIViewController *viewController = state.viewController;
55-
if (state != nil &&
56-
state.overallSpan.isValid &&
57-
viewController != nil) {
58-
59-
if (callbacks_.onLoading) {
60-
BugsnagPerformanceSpanCondition *condition = callbacks_.onLoading(viewController);
61-
if (condition != nil) {
62-
[newConditions addObject:condition];
63-
}
64-
}
65-
if (callbacks_.getParentContext &&
66-
!hasFoundFirstViewController &&
67-
loadingIndicator.name != nil) {
68-
BugsnagPerformanceSpanContext *parentContext = callbacks_.getParentContext(viewController);
69-
needsSpanUpdate = checkNeedsSpanUpdate(loadingIndicator, parentContext);
70-
if (parentContext && needsSpanUpdate) {
71-
loadingIndicatorSpan = spanFactory_->startLoadingIndicatorSpan(loadingIndicator.name, parentContext);
72-
}
73-
}
57+
ViewLoadInstrumentationState *viewLoadState = repository_->getInstrumentationState(view);
58+
if (viewLoadState.overallSpan.isValid && viewLoadState.viewController != nil) {
59+
addToState(state,
60+
loadingIndicator,
61+
viewLoadState,
62+
!hasFoundFirstViewController);
7463
hasFoundFirstViewController = true;
7564
}
65+
7666
view = view.superview;
7767
}
7868

79-
auto state = [ViewLoadLoadingIndicatorState new];
80-
state.conditions = newConditions;
81-
state.loadingIndicatorSpan = loadingIndicatorSpan;
82-
state.needsSpanUpdate = needsSpanUpdate;
8369
return state;
8470
}
8571

72+
void
73+
ViewLoadLoadingIndicatorsHandlerImpl::addToState(ViewLoadLoadingIndicatorState *state,
74+
BugsnagPerformanceLoadingIndicatorView *loadingIndicator,
75+
ViewLoadInstrumentationState *viewLoadState,
76+
BOOL isFirstViewController) noexcept {
77+
__strong UIViewController *viewController = viewLoadState.viewController;
78+
79+
if (viewController == nil || !viewLoadState.hasAppeared) {
80+
return;
81+
}
82+
if (callbacks_.onLoading) {
83+
BugsnagPerformanceSpanCondition *condition = callbacks_.onLoading(viewController);
84+
if (condition != nil) {
85+
[state.conditions addObject:condition];
86+
}
87+
}
88+
if (callbacks_.getParentContext &&
89+
isFirstViewController &&
90+
loadingIndicator.name != nil) {
91+
BugsnagPerformanceSpanContext *parentContext = callbacks_.getParentContext(viewController);
92+
BOOL needsSpanUpdate = checkNeedsSpanUpdate(loadingIndicator, parentContext);
93+
if (parentContext && needsSpanUpdate) {
94+
state.needsSpanUpdate = needsSpanUpdate;
95+
state.loadingIndicatorSpan = spanFactory_->startLoadingIndicatorSpan(loadingIndicator.name, parentContext);
96+
}
97+
}
98+
}
99+
86100
void
87101
ViewLoadLoadingIndicatorsHandlerImpl::updateLoadingIndicators(UIView *view) noexcept {
88102
if ([view isKindOfClass:[BugsnagPerformanceLoadingIndicatorView class]]) {

Sources/BugsnagPerformance/Private/Instrumentation/ViewLoadInstrumentation/Lifecycle/ViewLoadLifecycleHandlerImpl.mm

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,9 @@
9696
state.overallSpan);
9797
originalImplementation();
9898
[state.viewDidAppearSpan end];
99+
state.hasAppeared = true;
99100
updateViewIfNeeded(state, viewController);
101+
loadingIndicatorsHandler_->onViewControllerDidAppear(viewController);
100102
endOverallSpan(state, viewController, CFAbsoluteTimeGetCurrent());
101103
}
102104

@@ -167,14 +169,6 @@
167169
loadingIndicatorsHandler_->onLoadingIndicatorWasAdded(loadingIndicator);
168170
}
169171

170-
//void
171-
//ViewLoadLifecycleHandlerImpl::onLoadingIndicatorWasRemoved(BugsnagPerformanceLoadingIndicatorView *loadingIndicator) noexcept {
172-
// if (loadingIndicator == nil) {
173-
// return;
174-
// }
175-
// loadingIndicatorsHandler_->onLoadingIndicatorWasRemoved(loadingIndicator);
176-
//}
177-
178172
#pragma mark Helpers
179173

180174
void
@@ -186,10 +180,7 @@
186180
BugsnagPerformanceSpan *overallSpan = state.overallSpan;
187181
[crosstalkAPI_ willEndViewLoadSpan:overallSpan viewController:viewController];
188182

189-
if (state.loadingPhaseSpan != nil) {
190-
// Adjust span start time to reflect the view appearing time
191-
[state.loadingPhaseSpan updateStartTime:[NSDate date]];
192-
} else {
183+
if (state.loadingPhaseSpan == nil) {
193184
[state.overallSpan blockWithTimeout:kLoadingBlockTimeout];
194185
}
195186

Sources/BugsnagPerformance/Private/Instrumentation/ViewLoadInstrumentation/State/ViewLoadInstrumentationState.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ typedef void (^ ViewLoadInstrumentationStateOnDeallocCallback)(ViewLoadInstrumen
1818
@interface ViewLoadInstrumentationState : NSObject
1919

2020
@property (nonatomic) BOOL isMarkedAsPreloaded;
21+
@property (nonatomic) BOOL hasAppeared;
2122
@property (nonatomic, nullable, weak) UIViewController *viewController;
2223
@property (nonatomic, nullable, weak) UIView *view;
2324
@property (nonatomic, nullable, strong) BugsnagPerformanceSpan *overallSpan;

features/default/loading_indicator.feature

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Feature: LoadingIndicator view to mark data loading phase
2727
* a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController" is a child of span named "[ViewLoad/UIKit]/Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController"
2828
* a span named "[ViewLoad/UIKit]/Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController" ended at the same time as a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController"
2929
* a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController" duration is equal or greater than 2.0
30+
* a span named "[ViewLoadPhase/viewDidAppear]/Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController" ended before a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController" started
3031
* every span field "kind" equals 1
3132
* a span string attribute "bugsnag.span.category" equals "view_load"
3233
* a span string attribute "bugsnag.view.name" equals "Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController"
@@ -69,6 +70,8 @@ Feature: LoadingIndicator view to mark data loading phase
6970
* a span named "[ViewLoad/UIKit]/Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController" ended at the same time as a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController"
7071
* a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController" duration is equal or greater than 2.0
7172
* a span named "SimpleStopScenarioIndicatorName" duration is equal or greater than 2.0
73+
* a span named "[ViewLoadPhase/viewDidAppear]/Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController" ended before a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController" started
74+
* a span named "[ViewLoadPhase/viewDidAppear]/Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController" ended before a span named "SimpleStopScenarioIndicatorName" started
7275
* every span field "kind" equals 1
7376
* a span string attribute "bugsnag.span.category" equals "view_load"
7477
* a span string attribute "bugsnag.view.name" equals "Fixture.LoadingIndicatorViewSimpleStopScenario_ViewController"
@@ -105,6 +108,7 @@ Feature: LoadingIndicator view to mark data loading phase
105108
* a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController" is a child of span named "[ViewLoad/UIKit]/Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController"
106109
* a span named "[ViewLoad/UIKit]/Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController" ended at the same time as a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController"
107110
* a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController" duration is equal or greater than 2.0
111+
* a span named "[ViewLoadPhase/viewDidAppear]/Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController" ended before a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController" started
108112
* every span field "kind" equals 1
109113
* a span string attribute "bugsnag.span.category" equals "view_load"
110114
* a span string attribute "bugsnag.view.name" equals "Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController"
@@ -147,6 +151,8 @@ Feature: LoadingIndicator view to mark data loading phase
147151
* a span named "[ViewLoad/UIKit]/Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController" ended at the same time as a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController"
148152
* a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController" duration is equal or greater than 2.0
149153
* a span named "SimpleRemoveScenarioIndicatorName" duration is equal or greater than 2.0
154+
* a span named "[ViewLoadPhase/viewDidAppear]/Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController" ended before a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController" started
155+
* a span named "[ViewLoadPhase/viewDidAppear]/Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController" ended before a span named "SimpleRemoveScenarioIndicatorName" started
150156
* every span field "kind" equals 1
151157
* a span string attribute "bugsnag.span.category" equals "view_load"
152158
* a span string attribute "bugsnag.view.name" equals "Fixture.LoadingIndicatorViewSimpleRemoveScenario_ViewController"
@@ -196,6 +202,8 @@ Feature: LoadingIndicator view to mark data loading phase
196202
* a span named "[ViewLoad/UIKit]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController" ended at the same time as a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController"
197203
* a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ParentViewController" duration is equal or greater than 3.0
198204
* a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController" duration is equal or greater than 3.0
205+
* a span named "[ViewLoadPhase/viewDidAppear]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ParentViewController" ended before a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ParentViewController" started
206+
* a span named "[ViewLoadPhase/viewDidAppear]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController" ended before a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController" started
199207
* every span field "kind" equals 1
200208
* a span string attribute "bugsnag.span.category" equals "view_load"
201209
* a span string attribute "bugsnag.view.name" equals "Fixture.LoadingIndicatorViewNestedViewStopScenario_ParentViewController"
@@ -291,6 +299,8 @@ Feature: LoadingIndicator view to mark data loading phase
291299
* a span named "[ViewLoad/UIKit]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController" ended at the same time as a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController"
292300
* a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ParentViewController" duration is equal or greater than 3.0
293301
* a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController" duration is equal or greater than 2.0
302+
* a span named "[ViewLoadPhase/viewDidAppear]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ParentViewController" ended before a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ParentViewController" started
303+
* a span named "[ViewLoadPhase/viewDidAppear]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController" ended before a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController" started
294304
* every span field "kind" equals 1
295305
* a span string attribute "bugsnag.span.category" equals "view_load"
296306
* a span string attribute "bugsnag.view.name" equals "Fixture.LoadingIndicatorViewNestedViewStopScenario_ParentViewController"
@@ -350,6 +360,8 @@ Feature: LoadingIndicator view to mark data loading phase
350360
* a span named "[ViewLoad/UIKit]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController" ended at the same time as a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController"
351361
* a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ParentViewController" duration is equal or greater than 3.0
352362
* a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController" duration is equal or greater than 2.0
363+
* a span named "[ViewLoadPhase/viewDidAppear]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ParentViewController" ended before a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ParentViewController" started
364+
* a span named "[ViewLoadPhase/viewDidAppear]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController" ended before a span named "[ViewLoadPhase/viewDataLoading]/Fixture.LoadingIndicatorViewNestedViewStopScenario_ChildViewController" started
353365
* a span named "NestedViewStopScenarioIndicatorName1" duration is equal or greater than 4.0
354366
* a span named "NestedViewStopScenarioIndicatorName2" duration is equal or greater than 2.0
355367
* a span named "NestedViewStopScenarioIndicatorName3" duration is equal or greater than 3.0

0 commit comments

Comments
 (0)