@gravitylabsllc/porthole 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +123 -0
- package/dist/adb.js +430 -21
- package/dist/adb.js.map +1 -1
- package/dist/args.js +144 -0
- package/dist/args.js.map +1 -0
- package/dist/capture.js +139 -30
- package/dist/capture.js.map +1 -1
- package/dist/cli.js +221 -62
- package/dist/cli.js.map +1 -1
- package/dist/device.js +337 -4
- package/dist/device.js.map +1 -1
- package/dist/index.js +2030 -377
- package/dist/index.js.map +1 -1
- package/dist/moment.js +240 -0
- package/dist/moment.js.map +1 -0
- package/dist/perfetto.js +826 -0
- package/dist/perfetto.js.map +1 -0
- package/dist/report.js +68 -7
- package/dist/report.js.map +1 -1
- package/dist/save.js +252 -0
- package/dist/save.js.map +1 -0
- package/dist/sessions.js +704 -0
- package/dist/sessions.js.map +1 -0
- package/dist/system.js +169 -0
- package/dist/system.js.map +1 -0
- package/dist/systrace.js +198 -0
- package/dist/systrace.js.map +1 -0
- package/dist/timeline.js +731 -29
- package/dist/timeline.js.map +1 -1
- package/dist/trace.js +317 -27
- package/dist/trace.js.map +1 -1
- package/dist/watermark.js +220 -0
- package/dist/watermark.js.map +1 -0
- package/package.json +10 -4
- package/src/adb.ts +583 -0
- package/src/args.ts +177 -0
- package/src/capture.ts +292 -0
- package/src/cli.ts +367 -0
- package/src/device.ts +635 -0
- package/src/index.ts +2545 -0
- package/src/moment.ts +306 -0
- package/src/perfetto.ts +972 -0
- package/src/report.ts +285 -0
- package/src/save.ts +322 -0
- package/src/sessions.ts +894 -0
- package/src/system.ts +221 -0
- package/src/systrace.ts +258 -0
- package/src/timeline.ts +1036 -0
- package/src/trace.ts +769 -0
- package/src/watermark.ts +337 -0
- package/ui/dist/assets/index-BzqwnvoU.js +70 -0
- package/ui/dist/assets/index-DtnyBXCM.css +1 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index--1mlZuNZ.css +0 -1
- package/ui/dist/assets/index-BeVGHRFm.js +0 -68
package/dist/timeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}
|
package/dist/trace.js
CHANGED
|
@@ -5,20 +5,34 @@
|
|
|
5
5
|
* from a capture is a short list of what is worth looking at; what CI wants is
|
|
6
6
|
* a number it can compare. Both come from here.
|
|
7
7
|
*/
|
|
8
|
+
/**
|
|
9
|
+
* The shape of the trace file.
|
|
10
|
+
*
|
|
11
|
+
* Nothing validates against it on read, so it is a label rather than a gate.
|
|
12
|
+
* Adding an optional field or a new metric key is therefore compatible by
|
|
13
|
+
* construction — `compare` fills a key the other side lacks with zero — and does
|
|
14
|
+
* not move this number. Removing or repurposing one would.
|
|
15
|
+
*/
|
|
8
16
|
export const TRACE_VERSION = 1;
|
|
9
|
-
|
|
17
|
+
/** Exported for `index.ts`'s `exits` section (GRA-58): the same loose coercion every event field here already gets, so a device's numeric fields don't need retyping at a second call site. */
|
|
18
|
+
export const num = (value, fallback = 0) => {
|
|
10
19
|
if (typeof value === "number")
|
|
11
20
|
return value;
|
|
12
21
|
const parsed = Number(value);
|
|
13
22
|
return Number.isFinite(parsed) ? parsed : fallback;
|
|
14
23
|
};
|
|
15
|
-
const str = (value, fallback = "") => typeof value === "string" ? value : value == null ? fallback : String(value);
|
|
24
|
+
export const str = (value, fallback = "") => typeof value === "string" ? value : value == null ? fallback : String(value);
|
|
16
25
|
/**
|
|
17
26
|
* The value below which `share` of the samples fall.
|
|
18
27
|
*
|
|
19
28
|
* Percentiles rather than means throughout: a mean frame time is the one number
|
|
20
29
|
* guaranteed to hide the problem, because the frames anyone cares about are the
|
|
21
30
|
* tail.
|
|
31
|
+
*
|
|
32
|
+
* Only ever fed completed work. A span that was still open has a floor under
|
|
33
|
+
* its duration and not a duration, and a floor mixed into a distribution of
|
|
34
|
+
* completions drags the tail *down* — the longest wait in the run would make
|
|
35
|
+
* the p95 look better. Open spans are counted and named separately instead.
|
|
22
36
|
*/
|
|
23
37
|
function percentile(values, share) {
|
|
24
38
|
if (values.length === 0)
|
|
@@ -27,20 +41,62 @@ function percentile(values, share) {
|
|
|
27
41
|
const index = Math.min(sorted.length - 1, Math.floor(share * sorted.length));
|
|
28
42
|
return Math.round(sorted[index]);
|
|
29
43
|
}
|
|
44
|
+
// Predicates rather than inline `!s.open`, so the narrowing survives `filter`
|
|
45
|
+
// and the compiler is the thing that stops `atLeastMs` reaching a percentile.
|
|
46
|
+
const isCompleted = (span) => !span.open;
|
|
47
|
+
const isOpen = (span) => span.open;
|
|
48
|
+
/**
|
|
49
|
+
* Start/end pairs recovered from the event stream — including the ones with no
|
|
50
|
+
* end.
|
|
51
|
+
*
|
|
52
|
+
* A span still open when the recording stops is the shape of a hang: a request
|
|
53
|
+
* that never returns, a query that never completes, a job wedged on a lock. It
|
|
54
|
+
* used to be dropped here, which meant the trace reported fewer calls than were
|
|
55
|
+
* made, no percentile influence, and no finding about the one that mattered —
|
|
56
|
+
* the run that most needed investigating came back looking like the quietest on
|
|
57
|
+
* record. They are emitted instead, marked `open`, carrying a floor under their
|
|
58
|
+
* duration measured to the last event seen.
|
|
59
|
+
*
|
|
60
|
+
* An end with no start is the mirror case and is not a hang: that is a capture
|
|
61
|
+
* that attached mid-call. It keeps the device's own `elapsedMs`.
|
|
62
|
+
*/
|
|
30
63
|
function spans(events, prefix) {
|
|
31
64
|
const open = new Map();
|
|
32
65
|
const out = [];
|
|
66
|
+
let lastAt = 0;
|
|
33
67
|
for (const event of events) {
|
|
68
|
+
lastAt = Math.max(lastAt, event.t);
|
|
34
69
|
const id = str(event.data.id);
|
|
35
|
-
if (event.event === `${prefix}_start`)
|
|
36
|
-
|
|
70
|
+
if (event.event === `${prefix}_start`) {
|
|
71
|
+
// Not an unconditional `set`. A repeated id is the device contradicting
|
|
72
|
+
// itself, and overwriting would silently discard the earlier start — the
|
|
73
|
+
// same class of defect as dropping open spans. Keeping the first start
|
|
74
|
+
// keeps the floor conservative and invents nothing.
|
|
75
|
+
if (!open.has(id))
|
|
76
|
+
open.set(id, { at: event.t, data: event.data });
|
|
77
|
+
}
|
|
37
78
|
else if (event.event === `${prefix}_end`) {
|
|
38
79
|
const started = open.get(id);
|
|
39
80
|
open.delete(id);
|
|
40
|
-
const ms = started === undefined ? num(event.data.elapsedMs) : event.t - started;
|
|
41
|
-
out.push({
|
|
81
|
+
const ms = started === undefined ? num(event.data.elapsedMs) : event.t - started.at;
|
|
82
|
+
out.push({
|
|
83
|
+
open: false,
|
|
84
|
+
ms,
|
|
85
|
+
data: event.data,
|
|
86
|
+
endedAt: event.t,
|
|
87
|
+
startedAt: started ? started.at : null,
|
|
88
|
+
});
|
|
42
89
|
}
|
|
43
90
|
}
|
|
91
|
+
// Insertion order, so these come out oldest first.
|
|
92
|
+
for (const started of open.values()) {
|
|
93
|
+
out.push({
|
|
94
|
+
open: true,
|
|
95
|
+
atLeastMs: lastAt - started.at,
|
|
96
|
+
startedAt: started.at,
|
|
97
|
+
data: started.data,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
44
100
|
return out;
|
|
45
101
|
}
|
|
46
102
|
export function metricsOf(events) {
|
|
@@ -64,23 +120,54 @@ export function metricsOf(events) {
|
|
|
64
120
|
"mainThread.stalls": stalls.length,
|
|
65
121
|
"mainThread.worstMs": stalls.reduce((worst, e) => Math.max(worst, num(e.data.durationMs)), 0),
|
|
66
122
|
"mainThread.blockedMs": stalls.reduce((sum, e) => sum + num(e.data.durationMs), 0),
|
|
123
|
+
// Counts are over everything that started, percentiles over what finished.
|
|
124
|
+
// A query that never came back still happened, and still cost the user the
|
|
125
|
+
// wait; it just has no duration to put in a distribution.
|
|
67
126
|
"db.queries": db.length,
|
|
127
|
+
"db.stillOpen": db.filter(isOpen).length,
|
|
68
128
|
"db.onMainThread": db.filter((q) => q.data.onMainThread === "true" || q.data.onMainThread === true).length,
|
|
69
|
-
|
|
129
|
+
// Over completed queries only — see `percentile`.
|
|
130
|
+
"db.p95Ms": percentile(db.filter(isCompleted).map((q) => q.ms), 0.95),
|
|
70
131
|
"http.calls": http.length,
|
|
132
|
+
"http.stillOpen": http.filter(isOpen).length,
|
|
71
133
|
"http.failed": http.filter((c) => num(c.data.status) >= 400 || c.data.error !== undefined)
|
|
72
134
|
.length,
|
|
73
|
-
|
|
135
|
+
// Over completed calls only — see `percentile`.
|
|
136
|
+
"http.p95Ms": percentile(http.filter(isCompleted).map((c) => c.ms), 0.95),
|
|
74
137
|
"recompose.total": recompose.length,
|
|
75
138
|
"recompose.peakPerFrame": perFrame.size ? Math.max(...perFrame.values()) : 0,
|
|
76
139
|
"memory.peakHeapMb": memory.reduce((peak, e) => Math.max(peak, num(e.data.heapUsedMb)), 0),
|
|
77
140
|
"memory.peakRamMb": memory.reduce((peak, e) => Math.max(peak, num(e.data.totalRamMb)), 0),
|
|
78
141
|
"memory.blockingGcMs": gc.reduce((sum, e) => sum + num(e.data.pausedMs), 0),
|
|
79
142
|
"work.runs": work.length,
|
|
143
|
+
"work.stillOpen": work.filter(isOpen).length,
|
|
80
144
|
"work.retries": work.filter((w) => w.data.retrying === "true").length,
|
|
81
145
|
"work.failures": work.filter((w) => str(w.data.state) === "FAILED").length,
|
|
82
146
|
};
|
|
83
147
|
}
|
|
148
|
+
/**
|
|
149
|
+
* The envelope from the earliest to the latest of a set of real, timestamped
|
|
150
|
+
* events — for a finding that aggregates several occurrences (a run of
|
|
151
|
+
* blocking GCs, every `trimMemory` call) rather than naming one. Unlike a
|
|
152
|
+
* trace-side aggregate summed with no timestamp at all, each contributor here
|
|
153
|
+
* has a real `t`, so the envelope is read off the events that produced the
|
|
154
|
+
* finding, not invented for it. Undefined only for an empty list, which no
|
|
155
|
+
* caller should ever pass — every call site already checked `.length > 0`.
|
|
156
|
+
*/
|
|
157
|
+
function eventWindow(events) {
|
|
158
|
+
if (events.length === 0)
|
|
159
|
+
return undefined;
|
|
160
|
+
const ts = events.map((e) => e.t);
|
|
161
|
+
return { from: Math.min(...ts), to: Math.max(...ts) };
|
|
162
|
+
}
|
|
163
|
+
/** `eventWindow`'s counterpart for a list of spans rather than raw events. */
|
|
164
|
+
function spanWindow(spans) {
|
|
165
|
+
if (spans.length === 0)
|
|
166
|
+
return undefined;
|
|
167
|
+
const starts = spans.map((s) => (s.open ? s.startedAt : (s.startedAt ?? s.endedAt)));
|
|
168
|
+
const ends = spans.map((s) => (s.open ? s.startedAt : s.endedAt));
|
|
169
|
+
return { from: Math.min(...starts), to: Math.max(...ends) };
|
|
170
|
+
}
|
|
84
171
|
/** The mark in force at a moment, or undefined if the run was not marked. */
|
|
85
172
|
function markAt(marks, at) {
|
|
86
173
|
let current;
|
|
@@ -102,12 +189,129 @@ export function frameBudgetMs(refreshHz) {
|
|
|
102
189
|
const hz = refreshHz > 1 ? refreshHz : 60;
|
|
103
190
|
return Math.round((1000 / hz) * 10) / 10;
|
|
104
191
|
}
|
|
105
|
-
|
|
192
|
+
/**
|
|
193
|
+
* The budget clause every place that names a frame budget in prose shares
|
|
194
|
+
* (GRA-185's "second, smaller thing": `frames` and `findings` used to print
|
|
195
|
+
* the same quantity two different ways on the same panel). `findingsOf`'s
|
|
196
|
+
* own `frames-dropped` title and `frames`' tool text (index.ts) both call
|
|
197
|
+
* this, so the two cannot drift apart again the way GRA-185 found them.
|
|
198
|
+
*
|
|
199
|
+
* When `assumed` is true this is a guess dressed as one, not printed as an
|
|
200
|
+
* observed fact — `resolveProfile`'s own doc comment explains why the
|
|
201
|
+
* fallback matters enough to say so in the sentence itself.
|
|
202
|
+
*/
|
|
203
|
+
export function describeBudget(profile) {
|
|
204
|
+
const ms = frameBudgetMs(profile.refreshHz);
|
|
205
|
+
return profile.assumed
|
|
206
|
+
? `${ms}ms (assumed ${Math.round(profile.refreshHz)}Hz; no display profile seen)`
|
|
207
|
+
: `${ms}ms at ${Math.round(profile.refreshHz)}Hz`;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* `null` unless `event` is a `device`/`profile` event — the one place that
|
|
211
|
+
* shape is read off the wire, shared by `resolveProfile` below (the live-
|
|
212
|
+
* buffer scan) and `sessions.ts`'s `SessionWriter.append` (capturing it into
|
|
213
|
+
* `meta.json` as it flows past), so the two readings can never disagree
|
|
214
|
+
* about what a profile event means.
|
|
215
|
+
*/
|
|
216
|
+
export function profileFromEvent(event) {
|
|
217
|
+
if (event.event !== "device" || str(event.data.kind) !== "profile")
|
|
218
|
+
return null;
|
|
219
|
+
return {
|
|
220
|
+
model: str(event.data.model),
|
|
221
|
+
sdkInt: num(event.data.sdkInt),
|
|
222
|
+
abi: str(event.data.abi),
|
|
223
|
+
cores: num(event.data.cores),
|
|
224
|
+
deviceRamMb: num(event.data.deviceRamMb),
|
|
225
|
+
refreshHz: num(event.data.refreshHz, 60),
|
|
226
|
+
lowRamDevice: event.data.lowRamDevice === "true" || event.data.lowRamDevice === true,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* GRA-185 ruling 1: the device profile used for the frame budget must not
|
|
231
|
+
* depend on whether the requested window happens to contain the one
|
|
232
|
+
* `device`/`profile` event `DeviceCollector` emits at startup — a window
|
|
233
|
+
* that starts after startup used to silently fall back to 60Hz and print it
|
|
234
|
+
* as though it were observed. Resolved in one order, everywhere:
|
|
235
|
+
*
|
|
236
|
+
* 1. The most recent profile event in the *live* buffer at or before the
|
|
237
|
+
* window's end, **regardless of the window's start** — `liveEvents`
|
|
238
|
+
* here must be the whole ring (or run), never pre-filtered to `from`.
|
|
239
|
+
* 2. Else the profile recorded in the current session's `meta.json`
|
|
240
|
+
* (`SessionWriter.append` captures it as it flows past — see that
|
|
241
|
+
* function's own comment) — covers a window the live ring has already
|
|
242
|
+
* rolled the startup event out of, or a disk-only read
|
|
243
|
+
* (`saveFromSessions`) with no live ring at all.
|
|
244
|
+
* 3. Else the fallback: assumed 60Hz, `assumed: true`. Every caller
|
|
245
|
+
* (`findings`, `save_moment`, `porthole save`, `/api/findings`,
|
|
246
|
+
* `/api/save`, and `frames`' own prose) resolves through this one
|
|
247
|
+
* function — no second copy of the search order to drift from it.
|
|
248
|
+
*/
|
|
249
|
+
export function resolveProfile(params) {
|
|
250
|
+
const { liveEvents, windowTo, sessionProfile } = params;
|
|
251
|
+
let latest = null;
|
|
252
|
+
for (const event of liveEvents) {
|
|
253
|
+
if (event.t > windowTo)
|
|
254
|
+
continue;
|
|
255
|
+
const data = profileFromEvent(event);
|
|
256
|
+
if (!data)
|
|
257
|
+
continue;
|
|
258
|
+
if (!latest || event.t > latest.t)
|
|
259
|
+
latest = { t: event.t, data };
|
|
260
|
+
}
|
|
261
|
+
if (latest)
|
|
262
|
+
return { assumed: false, refreshHz: latest.data.refreshHz, full: latest.data };
|
|
263
|
+
if (sessionProfile)
|
|
264
|
+
return { assumed: false, refreshHz: sessionProfile.refreshHz, full: sessionProfile };
|
|
265
|
+
return { assumed: true, refreshHz: 60 };
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* What was still running when the recording stopped.
|
|
269
|
+
*
|
|
270
|
+
* Its own finding rather than a line folded into the counts, because an
|
|
271
|
+
* unfinished call is not a slow call and the two want different responses. The
|
|
272
|
+
* wording carries "at least" into the title and the detail on purpose: the
|
|
273
|
+
* number is a floor, and a reader who copies it into a bug report should copy
|
|
274
|
+
* that qualifier with it.
|
|
275
|
+
*/
|
|
276
|
+
function stillOpenFinding(lane, id, noun, describe, marks) {
|
|
277
|
+
const open = lane.filter(isOpen);
|
|
278
|
+
if (open.length === 0)
|
|
279
|
+
return undefined;
|
|
280
|
+
const oldest = open.reduce((a, b) => (a.atLeastMs >= b.atLeastMs ? a : b));
|
|
281
|
+
const { label, evidence } = describe(oldest.data);
|
|
282
|
+
const count = open.length;
|
|
283
|
+
return {
|
|
284
|
+
id,
|
|
285
|
+
severity: "warning",
|
|
286
|
+
confidence: "observed",
|
|
287
|
+
title: `${count} ${count === 1 ? noun.one : noun.many} ${count === 1 ? "was" : "were"} ` +
|
|
288
|
+
`still open when the capture ended, the oldest for at least ${oldest.atLeastMs}ms`,
|
|
289
|
+
detail: `oldest: ${label} — at least, not exactly: it had not finished, so that is a floor under the wait`,
|
|
290
|
+
count,
|
|
291
|
+
during: markAt(marks, oldest.startedAt),
|
|
292
|
+
evidence: { oldestAtLeastMs: oldest.atLeastMs, ...evidence },
|
|
293
|
+
// `to` is the last moment we know it was still open — the capture's own
|
|
294
|
+
// last event, which is exactly what `atLeastMs` is already measured
|
|
295
|
+
// against — not an invented "now". A window that stopped narrating
|
|
296
|
+
// wherever the run happened to end would be lying about how sure it is.
|
|
297
|
+
window: { from: oldest.startedAt, to: oldest.startedAt + oldest.atLeastMs },
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
export function findingsOf(events, marks, refreshHz,
|
|
301
|
+
/** GRA-185: true when `refreshHz` is the 60Hz fallback rather than something the device reported — flips `frames-dropped` from `observed` to `correlated` and says so in the title, instead of stating a guess as fact. Defaults to false so every existing caller (a bare refresh rate, no opinion on how it was derived) keeps behaving exactly as before. */
|
|
302
|
+
assumed = false) {
|
|
106
303
|
const findings = [];
|
|
107
304
|
const db = spans(events, "db");
|
|
108
305
|
const http = spans(events, "http");
|
|
109
306
|
const work = spans(events, "work");
|
|
110
|
-
|
|
307
|
+
// Completed queries only, and not merely to have an `ms` to sort on: which
|
|
308
|
+
// thread a query ran on is reported by the *end* event, so an open span has
|
|
309
|
+
// nothing to answer the question with. A query still running on the main
|
|
310
|
+
// thread when the capture stopped is reported by `db-still-open` instead,
|
|
311
|
+
// which is the more alarming finding of the two anyway.
|
|
312
|
+
const onMain = db
|
|
313
|
+
.filter(isCompleted)
|
|
314
|
+
.filter((q) => q.data.onMainThread === "true" || q.data.onMainThread === true);
|
|
111
315
|
if (onMain.length > 0) {
|
|
112
316
|
const worst = onMain.reduce((a, b) => (a.ms >= b.ms ? a : b));
|
|
113
317
|
findings.push({
|
|
@@ -118,6 +322,7 @@ export function findingsOf(events, marks, refreshHz) {
|
|
|
118
322
|
detail: `Worst was ${worst.ms}ms: ${str(worst.data.sql).slice(0, 80)}`,
|
|
119
323
|
count: onMain.length,
|
|
120
324
|
evidence: { worstMs: worst.ms, sql: str(worst.data.sql) },
|
|
325
|
+
window: { from: worst.startedAt ?? worst.endedAt, to: worst.endedAt },
|
|
121
326
|
});
|
|
122
327
|
}
|
|
123
328
|
const stalls = events.filter((e) => e.event === "blocked");
|
|
@@ -135,9 +340,16 @@ export function findingsOf(events, marks, refreshHz) {
|
|
|
135
340
|
at: worst.t,
|
|
136
341
|
stack: str(worst.data.stack).split("\n").slice(0, 6),
|
|
137
342
|
},
|
|
343
|
+
// `blocked` is reported when the stall ends, so `worst.t` is its end and
|
|
344
|
+
// the start is however long before that its own duration says.
|
|
345
|
+
window: { from: worst.t - num(worst.data.durationMs), to: worst.t },
|
|
138
346
|
});
|
|
139
347
|
}
|
|
140
|
-
|
|
348
|
+
// Completed only — see the same reasoning as `onMain` above: a status or an
|
|
349
|
+
// error is reported by the *end* event, so an open span cannot be a failure
|
|
350
|
+
// yet, only a hang (`http-still-open` already covers that). Filtering here
|
|
351
|
+
// also gives `first` a real `endedAt`/`startedAt` to place a window with.
|
|
352
|
+
const failed = http.filter(isCompleted).filter((c) => num(c.data.status) >= 400 || c.data.error !== undefined);
|
|
141
353
|
if (failed.length > 0) {
|
|
142
354
|
const first = failed[0];
|
|
143
355
|
findings.push({
|
|
@@ -147,8 +359,26 @@ export function findingsOf(events, marks, refreshHz) {
|
|
|
147
359
|
title: `${failed.length} HTTP ${failed.length === 1 ? "call" : "calls"} failed`,
|
|
148
360
|
detail: `${str(first.data.method)} ${str(first.data.url)} → ${str(first.data.status) || str(first.data.error)}`,
|
|
149
361
|
count: failed.length,
|
|
362
|
+
window: { from: first.startedAt ?? first.endedAt, to: first.endedAt },
|
|
150
363
|
});
|
|
151
364
|
}
|
|
365
|
+
// The hang lanes. A capture is most often run *because* something hung, so
|
|
366
|
+
// these are the findings least able to afford being absent.
|
|
367
|
+
const open = [
|
|
368
|
+
stillOpenFinding(http, "http-still-open", { one: "HTTP call", many: "HTTP calls" }, (data) => ({
|
|
369
|
+
label: `${str(data.method)} ${str(data.url)}`.trim() || "unidentified call",
|
|
370
|
+
evidence: { method: str(data.method), url: str(data.url) },
|
|
371
|
+
}), marks),
|
|
372
|
+
stillOpenFinding(db, "db-still-open", { one: "database query", many: "database queries" }, (data) => ({
|
|
373
|
+
label: str(data.sql).slice(0, 80) || "unidentified query",
|
|
374
|
+
evidence: { sql: str(data.sql) },
|
|
375
|
+
}), marks),
|
|
376
|
+
stillOpenFinding(work, "work-still-open", { one: "background job", many: "background jobs" }, (data) => ({
|
|
377
|
+
label: str(data.name) || str(data.id) || "unidentified job",
|
|
378
|
+
evidence: { name: str(data.name), id: str(data.id) },
|
|
379
|
+
}), marks),
|
|
380
|
+
].filter((finding) => finding !== undefined);
|
|
381
|
+
findings.push(...open);
|
|
152
382
|
const frames = events.filter((e) => e.event === "frame");
|
|
153
383
|
if (frames.length > 0) {
|
|
154
384
|
const missed = frames.reduce((sum, e) => sum + num(e.data.missedFrames, 1), 0);
|
|
@@ -163,13 +393,17 @@ export function findingsOf(events, marks, refreshHz) {
|
|
|
163
393
|
findings.push({
|
|
164
394
|
id: "frames-dropped",
|
|
165
395
|
severity: "warning",
|
|
166
|
-
confidence: "observed",
|
|
167
|
-
title: `${missed} frames missed their deadline (budget ${
|
|
396
|
+
confidence: assumed ? "correlated" : "observed",
|
|
397
|
+
title: `${missed} frames missed their deadline (budget ${describeBudget({ refreshHz, assumed })})`,
|
|
168
398
|
detail: commonest
|
|
169
399
|
? `worst ${num(worst.data.totalMs)}ms · most often in ${commonest[0]}`
|
|
170
400
|
: undefined,
|
|
171
401
|
count: missed,
|
|
172
402
|
during: markAt(marks, worst.t),
|
|
403
|
+
// A `frame` event is posted when the frame finishes, so `worst.t` is its
|
|
404
|
+
// end and its own totalMs backdates the start — the same reasoning as
|
|
405
|
+
// `main-thread-stall`.
|
|
406
|
+
window: { from: worst.t - num(worst.data.totalMs), to: worst.t },
|
|
173
407
|
});
|
|
174
408
|
}
|
|
175
409
|
const gc = events.filter((e) => e.event === "gc" && num(e.data.blocking) > 0);
|
|
@@ -181,6 +415,11 @@ export function findingsOf(events, marks, refreshHz) {
|
|
|
181
415
|
confidence: "observed",
|
|
182
416
|
title: `${gc.length} blocking collections paused the app for ${paused}ms`,
|
|
183
417
|
count: gc.length,
|
|
418
|
+
// Not `spanning`: unlike a trace-side aggregate that sums duration with
|
|
419
|
+
// no timestamp of its own, every contributing collection here is a real
|
|
420
|
+
// event with a real `t`, so a window from the earliest to the latest is
|
|
421
|
+
// exactly where the count came from, not an invented range.
|
|
422
|
+
window: eventWindow(gc),
|
|
184
423
|
});
|
|
185
424
|
}
|
|
186
425
|
const trims = events.filter((e) => e.event === "device" && str(e.data.kind) === "trimMemory");
|
|
@@ -192,6 +431,7 @@ export function findingsOf(events, marks, refreshHz) {
|
|
|
192
431
|
title: `the system asked for memory back ${trims.length} ${trims.length === 1 ? "time" : "times"}`,
|
|
193
432
|
detail: `worst level: ${str(trims[trims.length - 1].data.level)}`,
|
|
194
433
|
count: trims.length,
|
|
434
|
+
window: eventWindow(trims),
|
|
195
435
|
});
|
|
196
436
|
}
|
|
197
437
|
const retried = work.filter((w) => w.data.retrying === "true");
|
|
@@ -202,6 +442,7 @@ export function findingsOf(events, marks, refreshHz) {
|
|
|
202
442
|
confidence: "observed",
|
|
203
443
|
title: `${retried.length} background ${retried.length === 1 ? "job" : "jobs"} retried`,
|
|
204
444
|
count: retried.length,
|
|
445
|
+
window: spanWindow(retried),
|
|
205
446
|
});
|
|
206
447
|
}
|
|
207
448
|
// The only correlated one, and a note for that reason.
|
|
@@ -229,26 +470,75 @@ export function findingsOf(events, marks, refreshHz) {
|
|
|
229
470
|
? `most often within a frame of ${trigger[0]} — ordering, not proof`
|
|
230
471
|
: undefined,
|
|
231
472
|
count: hottest[1],
|
|
473
|
+
// Scoped to the hottest component's own recompositions, not every
|
|
474
|
+
// recompose in the run, so the window is as tight as the count it
|
|
475
|
+
// labels rather than as wide as the whole capture.
|
|
476
|
+
window: eventWindow(recompose.filter((e) => str(e.data.name) === hottest[0])),
|
|
232
477
|
});
|
|
233
478
|
}
|
|
234
479
|
}
|
|
480
|
+
// exit-findings (GRA-58): a death the device reported, at the severity the
|
|
481
|
+
// ticket named explicitly — ANR, crash, native crash, low memory and
|
|
482
|
+
// excessive resource usage are `error` (each means the system killed the
|
|
483
|
+
// app, for a reason worth an agent's attention); a user-requested exit is
|
|
484
|
+
// a `note` (informational: the app is not running, but nothing is wrong).
|
|
485
|
+
// Everything else — REASON_OTHER, a signal, a background kill — produces
|
|
486
|
+
// no finding at all: those are the normal shape of an app's process being
|
|
487
|
+
// recycled, not evidence of anything.
|
|
488
|
+
const exits = events.filter((e) => e.event === "exit");
|
|
489
|
+
for (const exit of exits) {
|
|
490
|
+
const reason = str(exit.data.reason);
|
|
491
|
+
const severity = EXIT_ERROR_REASONS.has(reason)
|
|
492
|
+
? "error"
|
|
493
|
+
: reason === "REASON_USER_REQUESTED"
|
|
494
|
+
? "note"
|
|
495
|
+
: undefined;
|
|
496
|
+
if (!severity)
|
|
497
|
+
continue;
|
|
498
|
+
const versionName = exit.data.versionName != null ? str(exit.data.versionName) : null;
|
|
499
|
+
const versionAssumed = exit.data.versionAssumed === true;
|
|
500
|
+
const build = versionName ? `${versionName}${versionAssumed ? " (assumed)" : ""}` : "an unknown build";
|
|
501
|
+
const topFrame = str(exit.data.mainStack).split("\n")[0] || undefined;
|
|
502
|
+
// GRA-113: `spanning`, not `window`. `exit.t` is a timestamp in *this*
|
|
503
|
+
// process's uptime clock — the one reporting the death, at its next
|
|
504
|
+
// check-in — not the dead process's, whose own uptime clock reset with
|
|
505
|
+
// it and is gone. Placing the finding at `exit.t` would draw the death as
|
|
506
|
+
// though it happened just now, in the wrong process's session.
|
|
507
|
+
const predates = "the death predates this process's uptime clock, so it cannot be placed on this session's timeline";
|
|
508
|
+
const description = str(exit.data.description) || undefined;
|
|
509
|
+
findings.push({
|
|
510
|
+
id: `exit-${num(exit.data.timestamp)}`,
|
|
511
|
+
severity,
|
|
512
|
+
confidence: "observed",
|
|
513
|
+
title: `${reason} — ${build}` + (topFrame ? ` — ${topFrame}` : ""),
|
|
514
|
+
detail: description ? `${description} (${predates})` : predates,
|
|
515
|
+
during: markAt(marks, exit.t),
|
|
516
|
+
evidence: {
|
|
517
|
+
reason,
|
|
518
|
+
versionName,
|
|
519
|
+
versionAssumed,
|
|
520
|
+
timestamp: num(exit.data.timestamp),
|
|
521
|
+
...(topFrame ? { topFrame } : {}),
|
|
522
|
+
},
|
|
523
|
+
spanning: true,
|
|
524
|
+
});
|
|
525
|
+
}
|
|
235
526
|
const order = { error: 0, warning: 1, note: 2 };
|
|
236
527
|
return findings.sort((a, b) => order[a.severity] - order[b.severity]);
|
|
237
528
|
}
|
|
529
|
+
/** `error`-severity exit reasons (GRA-58#exit-findings) — see `findingsOf`'s own comment for the rest of the mapping. */
|
|
530
|
+
const EXIT_ERROR_REASONS = new Set([
|
|
531
|
+
"REASON_ANR",
|
|
532
|
+
"REASON_CRASH",
|
|
533
|
+
"REASON_CRASH_NATIVE",
|
|
534
|
+
"REASON_LOW_MEMORY",
|
|
535
|
+
"REASON_EXCESSIVE_RESOURCE_USAGE",
|
|
536
|
+
]);
|
|
238
537
|
export function buildTrace(options) {
|
|
239
|
-
const { events, hello } = options;
|
|
240
|
-
const
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
model: str(profile.data.model),
|
|
244
|
-
sdkInt: num(profile.data.sdkInt),
|
|
245
|
-
abi: str(profile.data.abi),
|
|
246
|
-
cores: num(profile.data.cores),
|
|
247
|
-
deviceRamMb: num(profile.data.deviceRamMb),
|
|
248
|
-
refreshHz: num(profile.data.refreshHz, 60),
|
|
249
|
-
lowRamDevice: profile.data.lowRamDevice === "true",
|
|
250
|
-
}
|
|
251
|
-
: { model: str(hello?.device), sdkInt: num(hello?.sdkInt), refreshHz: 60 };
|
|
538
|
+
const { events, hello, profile } = options;
|
|
539
|
+
const device = profile.assumed
|
|
540
|
+
? { model: str(hello?.device), sdkInt: num(hello?.sdkInt), refreshHz: profile.refreshHz }
|
|
541
|
+
: { ...profile.full, refreshHz: profile.refreshHz };
|
|
252
542
|
const marks = events
|
|
253
543
|
.filter((e) => e.event === "mark")
|
|
254
544
|
.map((e) => ({
|
|
@@ -269,7 +559,7 @@ export function buildTrace(options) {
|
|
|
269
559
|
device,
|
|
270
560
|
marks,
|
|
271
561
|
metrics: metricsOf(events),
|
|
272
|
-
findings: findingsOf(events, marks,
|
|
562
|
+
findings: findingsOf(events, marks, profile.refreshHz, profile.assumed),
|
|
273
563
|
events: options.withEvents ? events : undefined,
|
|
274
564
|
};
|
|
275
565
|
}
|