|
18 | 18 |
|
19 | 19 | using namespace bugsnag; |
20 | 20 |
|
21 | | -void |
22 | | -Tracer::earlyConfigure(BSGEarlyConfiguration *config) noexcept { |
23 | | - willDiscardPrewarmSpans_ = config.appWasLaunchedPreWarmed; |
24 | | -} |
25 | | - |
26 | 21 | void |
27 | 22 | Tracer::preStartSetup() noexcept { |
28 | | - BSGLogDebug(@"Tracer::preStartSetup()"); |
29 | 23 | reprocessEarlySpans(); |
30 | 24 | } |
31 | 25 |
|
32 | 26 | void Tracer::reprocessEarlySpans(void) { |
33 | | - BSGLogDebug(@"Tracer::reprocessEarlySpans()"); |
34 | 27 | // Up until now nothing was configured, so all early spans have been kept. |
35 | 28 | // Now that configuration is complete, force-drain all early spans and re-process them. |
36 | 29 | auto toReprocess = batch_->drain(true); |
37 | | - BSGLogDebug(@"Tracer::reprocessEarlySpans: Reprocessing %zu early spans", toReprocess.count); |
38 | 30 | for (BugsnagPerformanceSpan *span in toReprocess) { |
39 | | - BSGLogDebug(@"Tracer::reprocessEarlySpans: Try to re-add span (%@) to batch", span.name); |
40 | 31 | if (span.state != SpanStateEnded) { |
41 | | - BSGLogDebug(@"Tracer::reprocessEarlySpans: span %@ has state %d, so ignoring", span.name, span.state); |
42 | 32 | continue; |
43 | 33 | } |
44 | 34 | if (!sampler_->sampled(span)) { |
45 | | - BSGLogDebug(@"Tracer::reprocessEarlySpans: span %@ was not sampled (P=%f), so dropping", span.name, sampler_->getProbability()); |
46 | 35 | [span abortUnconditionally]; |
47 | 36 | continue; |
48 | 37 | } |
49 | 38 | [span forceMutate:^() { |
50 | 39 | callOnSpanEndCallbacks(span); |
51 | 40 | }]; |
52 | 41 | if (span.state == SpanStateAborted) { |
53 | | - BSGLogDebug(@"Tracer::reprocessEarlySpans: span %@ was rejected in the OnEnd callbacks, so dropping", span.name); |
54 | 42 | [span abortUnconditionally]; |
55 | 43 | continue; |
56 | 44 | } |
|
61 | 49 |
|
62 | 50 | void |
63 | 51 | Tracer::abortAllOpenSpans() noexcept { |
64 | | - BSGLogDebug(@"Tracer::abortAllOpenSpans()"); |
65 | 52 | potentiallyOpenSpans_->abortAllOpen(); |
66 | 53 | } |
67 | 54 |
|
68 | 55 | void |
69 | 56 | Tracer::sweep() noexcept { |
70 | | - BSGLogDebug(@"Tracer::sweep()"); |
71 | 57 | constexpr unsigned minEntriesBeforeCompacting = 10000; |
72 | 58 | if (potentiallyOpenSpans_->count() >= minEntriesBeforeCompacting) { |
73 | 59 | potentiallyOpenSpans_->compact(); |
|
83 | 69 | } |
84 | 70 |
|
85 | 71 | void Tracer::onSpanEndSet(BugsnagPerformanceSpan *span) { |
86 | | - BSGLogTrace(@"Tracer::onSpanEndSet: for span %@", span.name); |
87 | | - |
88 | 72 | if (shouldInstrumentRendering(span)) { |
89 | 73 | span.endFramerateSnapshot = [frameMetricsCollector_ currentSnapshot]; |
90 | 74 | } |
91 | 75 | } |
92 | 76 |
|
93 | 77 | void Tracer::onSpanClosed(BugsnagPerformanceSpan *span) { |
94 | | - BSGLogTrace(@"Tracer::onSpanClosed: for span %@", span.name); |
95 | | - |
96 | 78 | @synchronized (span) { |
97 | 79 | for (BugsnagPerformanceSpanCondition *condition in span.conditionsToEndOnClose) { |
98 | 80 | [condition closeWithEndTime:span.endTime]; |
|
102 | 84 | spanStackingHandler_->onSpanClosed(span.spanId); |
103 | 85 |
|
104 | 86 | if(span.state == SpanStateAborted) { |
105 | | - BSGLogTrace(@"Tracer::onSpanClosed: span %@ has been aborted, so ignoring", span.name); |
106 | 87 | return; |
107 | 88 | } |
108 | 89 |
|
109 | 90 | if (!sampler_->sampled(span)) { |
110 | | - BSGLogTrace(@"Tracer::onSpanClosed: span %@ was not sampled (P=%f), so dropping", span.name, sampler_->getProbability()); |
111 | 91 | [span abortUnconditionally]; |
112 | 92 | return; |
113 | 93 | } |
114 | 94 |
|
115 | 95 | if (span != nil && span.state == SpanStateEnded) { |
116 | 96 | callOnSpanEndCallbacks(span); |
117 | 97 | if (span.state == SpanStateAborted) { |
118 | | - BSGLogTrace(@"Tracer::onSpanClosed: span %@ was rejected in the OnEnd callbacks, so dropping", span.name); |
119 | 98 | return; |
120 | 99 | } |
121 | 100 | } |
122 | 101 |
|
123 | 102 | if (shouldInstrumentRendering(span)) { |
124 | | - BSGLogTrace(@"Tracer::onSpanClosed: Processing framerate metrics for span %@", span.name); |
125 | 103 | processFrameMetrics(span); |
126 | 104 | } |
127 | 105 |
|
128 | | - BSGLogTrace(@"Tracer::onSpanClosed: Adding span %@ to batch", span.name); |
129 | 106 | batch_->add(span); |
130 | 107 | } |
131 | 108 |
|
|
134 | 111 | return nil; |
135 | 112 | } |
136 | 113 | if (span.state != SpanStateOpen && !span.isBlocked) { |
137 | | - BSGLogDebug(@"Tracer::onSpanBlocked: span %@ has state %d, so ignoring", span.name, span.state); |
138 | 114 | return nil; |
139 | 115 | } |
140 | 116 | BugsnagPerformanceSpanCondition *condition = [BugsnagPerformanceSpanCondition conditionWithSpan:span onClosedCallback:^(BugsnagPerformanceSpanCondition *c, CFAbsoluteTime endTime) { |
|
157 | 133 | [condition addOnDeactivatedCallback:^(BugsnagPerformanceSpanCondition *c) { |
158 | 134 | __strong BugsnagPerformanceSpan *strongSpan = c.span; |
159 | 135 | if (strongSpan.state == SpanStateEnded && !strongSpan.isBlocked) { |
160 | | - BSGLogTrace(@"Tracer::onSpanBlocked: Processing unblocked span %@", span.name); |
161 | 136 | @synchronized (this->blockedSpans_) { |
162 | 137 | [this->blockedSpans_ removeObject:strongSpan]; |
163 | 138 | this->conditionTimeoutExecutor_->cancelTimeout(c); |
|
166 | 141 | } |
167 | 142 | }]; |
168 | 143 | this->conditionTimeoutExecutor_->sheduleTimeout(condition, timeout); |
169 | | - BSGLogTrace(@"Tracer::onSpanBlocked: Blocked span %@ with timeout %f", span.name, timeout); |
170 | 144 | return condition; |
171 | 145 | } |
172 | 146 |
|
|
189 | 163 | return; |
190 | 164 | } |
191 | 165 | if (span.state != SpanStateEnded) { |
192 | | - BSGLogDebug(@"Tracer::callOnSpanEndCallbacks: span %@ has state %d, so ignoring", span.name, span.state); |
193 | 166 | return; |
194 | 167 | } |
195 | 168 |
|
|
204 | 177 | shouldDiscardSpan = false; |
205 | 178 | } |
206 | 179 | if(shouldDiscardSpan) { |
207 | | - BSGLogDebug(@"Tracer::callOnSpanEndCallbacks: span %@ OnEnd callback returned false. Dropping...", span.name); |
208 | 180 | [span abortUnconditionally]; |
209 | 181 | return; |
210 | 182 | } |
211 | 183 | } |
212 | 184 | CFAbsoluteTime callbacksEndTime = CFAbsoluteTimeGetCurrent(); |
213 | | - BSGLogDebug(@"Tracer::callOnSpanEndCallbacks: Adding span %@ to batch", span.name); |
214 | 185 | [span internalSetAttribute:@"bugsnag.span.callbacks_duration" withValue:@(intervalToNanoseconds(callbacksEndTime - callbacksStartTime))]; |
215 | 186 | } |
216 | 187 |
|
|
273 | 244 | } |
274 | 245 |
|
275 | 246 | void Tracer::cancelQueuedSpan(BugsnagPerformanceSpan *span) noexcept { |
276 | | - BSGLogTrace(@"Tracer::cancelQueuedSpan(%@)", span.name); |
277 | 247 | if (span) { |
278 | 248 | [span abortUnconditionally]; |
279 | 249 | batch_->removeSpan(span.traceIdHi, span.traceIdLo, span.spanId); |
280 | 250 | [blockedSpans_ removeObject:span]; |
281 | 251 | } |
282 | 252 | } |
283 | 253 |
|
284 | | -void Tracer::markPrewarmSpan(BugsnagPerformanceSpan *span) noexcept { |
285 | | - BSGLogTrace(@"Tracer::markPrewarmSpan(%@)", span.name); |
286 | | - std::lock_guard<std::mutex> guard(prewarmSpansMutex_); |
287 | | - if (willDiscardPrewarmSpans_) { |
288 | | - [prewarmSpans_ addObject:span]; |
289 | | - } |
290 | | -} |
291 | | - |
292 | 254 | PlainSpanFactoryCallbacks * |
293 | 255 | Tracer::createPlainSpanFactoryCallbacks() noexcept { |
294 | 256 | __block auto blockThis = this; |
|
345 | 307 | return blockThis->spanStackingHandler_->hasSpanWithAttribute(@"bugsnag.span.category", @"view_load"); |
346 | 308 | }; |
347 | 309 |
|
348 | | - auto onSpanStarted = ^(BugsnagPerformanceSpan * _Nonnull span) { |
349 | | - if (blockThis->willDiscardPrewarmSpans_) { |
350 | | - blockThis->markPrewarmSpan(span); |
351 | | - } |
352 | | - }; |
353 | | - |
354 | | - auto onViewLoadSpanStarted = ^(BugsnagPerformanceSpan * _Nonnull span, NSString * _Nonnull className) { |
| 310 | + auto onViewLoadSpanStarted = ^(NSString * _Nonnull className) { |
355 | 311 | if (onViewLoadSpanStarted_ != nil) { |
356 | 312 | onViewLoadSpanStarted_(className); |
357 | 313 | } |
358 | | - onSpanStarted(span); |
359 | 314 | }; |
360 | 315 |
|
361 | 316 | callbacks.onViewLoadSpanStarted = onViewLoadSpanStarted; |
362 | | - callbacks.onViewLoadPhaseSpanStarted = onSpanStarted; |
363 | 317 |
|
364 | 318 | return callbacks; |
365 | 319 | } |
|
376 | 330 | [span endWithAbsoluteTime:endTime]; |
377 | 331 | } |
378 | 332 |
|
379 | | -void |
380 | | -Tracer::onPrewarmPhaseEnded(void) noexcept { |
381 | | - BSGLogDebug(@"Tracer::onPrewarmPhaseEnded()"); |
382 | | - std::lock_guard<std::mutex> guard(prewarmSpansMutex_); |
383 | | - willDiscardPrewarmSpans_ = false; |
384 | | - for (BugsnagPerformanceSpan *span: prewarmSpans_) { |
385 | | - // Only cancel unfinished prewarm spans |
386 | | - if (span.state == SpanStateOpen) { |
387 | | - cancelQueuedSpan(span); |
388 | | - } |
389 | | - } |
390 | | - [prewarmSpans_ removeAllObjects]; |
391 | | -} |
392 | | - |
393 | 333 | bool |
394 | 334 | Tracer::shouldInstrumentRendering(BugsnagPerformanceSpan *span) noexcept { |
395 | 335 | switch (span.metricsOptions.rendering) { |
|
0 commit comments