tracemeld 0.1.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/build/analysis/bottleneck.d.ts +23 -0
- package/build/analysis/bottleneck.js +55 -0
- package/build/analysis/bottleneck.js.map +1 -0
- package/build/analysis/explain.d.ts +38 -0
- package/build/analysis/explain.js +139 -0
- package/build/analysis/explain.js.map +1 -0
- package/build/analysis/hotpaths.d.ts +19 -0
- package/build/analysis/hotpaths.js +55 -0
- package/build/analysis/hotpaths.js.map +1 -0
- package/build/analysis/hotspots.d.ts +24 -0
- package/build/analysis/hotspots.js +75 -0
- package/build/analysis/hotspots.js.map +1 -0
- package/build/analysis/query.d.ts +25 -0
- package/build/analysis/query.js +102 -0
- package/build/analysis/query.js.map +1 -0
- package/build/analysis/spinpaths.d.ts +17 -0
- package/build/analysis/spinpaths.js +48 -0
- package/build/analysis/spinpaths.js.map +1 -0
- package/build/analysis/starvations.d.ts +21 -0
- package/build/analysis/starvations.js +76 -0
- package/build/analysis/starvations.js.map +1 -0
- package/build/analysis/summary.d.ts +27 -0
- package/build/analysis/summary.js +130 -0
- package/build/analysis/summary.js.map +1 -0
- package/build/analysis/waste.d.ts +19 -0
- package/build/analysis/waste.js +33 -0
- package/build/analysis/waste.js.map +1 -0
- package/build/cli.d.ts +2 -0
- package/build/cli.js +4 -0
- package/build/cli.js.map +1 -0
- package/build/exporters/collapsed.d.ts +2 -0
- package/build/exporters/collapsed.js +34 -0
- package/build/exporters/collapsed.js.map +1 -0
- package/build/importers/chrome-trace.d.ts +2 -0
- package/build/importers/chrome-trace.js +146 -0
- package/build/importers/chrome-trace.js.map +1 -0
- package/build/importers/collapsed.d.ts +2 -0
- package/build/importers/collapsed.js +52 -0
- package/build/importers/collapsed.js.map +1 -0
- package/build/importers/detect.d.ts +2 -0
- package/build/importers/detect.js +60 -0
- package/build/importers/detect.js.map +1 -0
- package/build/importers/gecko.d.ts +2 -0
- package/build/importers/gecko.js +77 -0
- package/build/importers/gecko.js.map +1 -0
- package/build/importers/import.d.ts +11 -0
- package/build/importers/import.js +98 -0
- package/build/importers/import.js.map +1 -0
- package/build/importers/pprof.d.ts +2 -0
- package/build/importers/pprof.js +238 -0
- package/build/importers/pprof.js.map +1 -0
- package/build/importers/types.d.ts +6 -0
- package/build/importers/types.js +2 -0
- package/build/importers/types.js.map +1 -0
- package/build/index.d.ts +6 -0
- package/build/index.js +6 -0
- package/build/index.js.map +1 -0
- package/build/instrument/mark.d.ts +11 -0
- package/build/instrument/mark.js +13 -0
- package/build/instrument/mark.js.map +1 -0
- package/build/instrument/trace.d.ts +16 -0
- package/build/instrument/trace.js +107 -0
- package/build/instrument/trace.js.map +1 -0
- package/build/model/frame-table.d.ts +10 -0
- package/build/model/frame-table.js +27 -0
- package/build/model/frame-table.js.map +1 -0
- package/build/model/profile.d.ts +20 -0
- package/build/model/profile.js +89 -0
- package/build/model/profile.js.map +1 -0
- package/build/model/state.d.ts +21 -0
- package/build/model/state.js +59 -0
- package/build/model/state.js.map +1 -0
- package/build/model/types.d.ts +73 -0
- package/build/model/types.js +10 -0
- package/build/model/types.js.map +1 -0
- package/build/patterns/blind-edit.d.ts +3 -0
- package/build/patterns/blind-edit.js +119 -0
- package/build/patterns/blind-edit.js.map +1 -0
- package/build/patterns/redundant-read.d.ts +3 -0
- package/build/patterns/redundant-read.js +72 -0
- package/build/patterns/redundant-read.js.map +1 -0
- package/build/patterns/registry.d.ts +10 -0
- package/build/patterns/registry.js +27 -0
- package/build/patterns/registry.js.map +1 -0
- package/build/patterns/retry-loop.d.ts +3 -0
- package/build/patterns/retry-loop.js +57 -0
- package/build/patterns/retry-loop.js.map +1 -0
- package/build/patterns/types.d.ts +14 -0
- package/build/patterns/types.js +2 -0
- package/build/patterns/types.js.map +1 -0
- package/build/server.d.ts +3 -0
- package/build/server.js +247 -0
- package/build/server.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { FrameTable } from '../model/frame-table.js';
|
|
2
|
+
export function importCollapsed(content, name) {
|
|
3
|
+
const frameTable = new FrameTable();
|
|
4
|
+
const samples = [];
|
|
5
|
+
const lines = content.split('\n');
|
|
6
|
+
for (const line of lines) {
|
|
7
|
+
const trimmed = line.trim();
|
|
8
|
+
if (trimmed.length === 0)
|
|
9
|
+
continue;
|
|
10
|
+
const lastSpace = trimmed.lastIndexOf(' ');
|
|
11
|
+
if (lastSpace < 0)
|
|
12
|
+
continue;
|
|
13
|
+
const stackStr = trimmed.substring(0, lastSpace).trim();
|
|
14
|
+
const countStr = trimmed.substring(lastSpace + 1).trim();
|
|
15
|
+
const count = parseInt(countStr, 10);
|
|
16
|
+
if (isNaN(count) || stackStr.length === 0)
|
|
17
|
+
continue;
|
|
18
|
+
const frameNames = stackStr.split(';');
|
|
19
|
+
const stack = [];
|
|
20
|
+
for (const frameName of frameNames) {
|
|
21
|
+
stack.push(frameTable.getOrInsert({ name: frameName }));
|
|
22
|
+
}
|
|
23
|
+
samples.push({
|
|
24
|
+
timestamp: null,
|
|
25
|
+
stack,
|
|
26
|
+
values: [count],
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
format: 'collapsed',
|
|
31
|
+
profile: {
|
|
32
|
+
id: crypto.randomUUID(),
|
|
33
|
+
name,
|
|
34
|
+
created_at: Date.now(),
|
|
35
|
+
value_types: [{ key: 'weight', unit: 'none', description: 'Sample weight/count' }],
|
|
36
|
+
categories: [],
|
|
37
|
+
frames: [...frameTable.frames],
|
|
38
|
+
lanes: [
|
|
39
|
+
{
|
|
40
|
+
id: 'main',
|
|
41
|
+
name: 'main',
|
|
42
|
+
kind: 'main',
|
|
43
|
+
samples,
|
|
44
|
+
spans: [],
|
|
45
|
+
markers: [],
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
metadata: { source_format: 'collapsed' },
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=collapsed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collapsed.js","sourceRoot":"","sources":["../../src/importers/collapsed.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,IAAY;IAC3D,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IACpC,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEnC,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,SAAS,GAAG,CAAC;YAAE,SAAS;QAE5B,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEpD,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,SAAS,EAAE,IAAI;YACf,KAAK;YACL,MAAM,EAAE,CAAC,KAAK,CAAC;SAChB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE;YACP,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;YACvB,IAAI;YACJ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,WAAW,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;YAClF,UAAU,EAAE,EAAE;YACd,MAAM,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;YAC9B,KAAK,EAAE;gBACL;oBACE,EAAE,EAAE,MAAM;oBACV,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,MAAM;oBACZ,OAAO;oBACP,KAAK,EAAE,EAAE;oBACT,OAAO,EAAE,EAAE;iBACZ;aACF;YACD,QAAQ,EAAE,EAAE,aAAa,EAAE,WAAW,EAAE;SACzC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export function detectFormat(content) {
|
|
2
|
+
const trimmed = content.trim();
|
|
3
|
+
if (trimmed.length === 0)
|
|
4
|
+
return 'unknown';
|
|
5
|
+
// Try JSON formats first
|
|
6
|
+
if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
|
|
7
|
+
try {
|
|
8
|
+
const parsed = JSON.parse(trimmed);
|
|
9
|
+
if (Array.isArray(parsed)) {
|
|
10
|
+
return detectArrayFormat(parsed);
|
|
11
|
+
}
|
|
12
|
+
if (typeof parsed === 'object' && parsed !== null) {
|
|
13
|
+
return detectJsonFormat(parsed);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Not valid JSON, fall through to text formats
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (isCollapsedStacks(trimmed))
|
|
21
|
+
return 'collapsed';
|
|
22
|
+
return 'unknown';
|
|
23
|
+
}
|
|
24
|
+
function detectJsonFormat(obj) {
|
|
25
|
+
if (typeof obj['$schema'] === 'string' && obj['$schema'].includes('speedscope')) {
|
|
26
|
+
return 'speedscope';
|
|
27
|
+
}
|
|
28
|
+
if ('traceEvents' in obj && Array.isArray(obj['traceEvents'])) {
|
|
29
|
+
return 'chrome_trace';
|
|
30
|
+
}
|
|
31
|
+
if ('meta' in obj && 'threads' in obj && typeof obj['meta'] === 'object' && obj['meta'] !== null) {
|
|
32
|
+
const meta = obj['meta'];
|
|
33
|
+
if (typeof meta['version'] === 'number') {
|
|
34
|
+
return 'gecko';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return 'unknown';
|
|
38
|
+
}
|
|
39
|
+
function detectArrayFormat(arr) {
|
|
40
|
+
if (arr.length > 0 && typeof arr[0] === 'object' && arr[0] !== null) {
|
|
41
|
+
const first = arr[0];
|
|
42
|
+
if ('ph' in first)
|
|
43
|
+
return 'chrome_trace';
|
|
44
|
+
}
|
|
45
|
+
return 'unknown';
|
|
46
|
+
}
|
|
47
|
+
function isCollapsedStacks(content) {
|
|
48
|
+
const lines = content.split('\n').filter((l) => l.trim().length > 0);
|
|
49
|
+
if (lines.length === 0)
|
|
50
|
+
return false;
|
|
51
|
+
const pattern = /^.+\s+\d+$/;
|
|
52
|
+
const checkCount = Math.min(lines.length, 5);
|
|
53
|
+
let matchCount = 0;
|
|
54
|
+
for (let i = 0; i < checkCount; i++) {
|
|
55
|
+
if (pattern.test(lines[i]))
|
|
56
|
+
matchCount++;
|
|
57
|
+
}
|
|
58
|
+
return matchCount / checkCount >= 0.8;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/importers/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { FrameTable } from '../model/frame-table.js';
|
|
2
|
+
export function importGecko(content, name) {
|
|
3
|
+
const gecko = JSON.parse(content);
|
|
4
|
+
const frameTable = new FrameTable();
|
|
5
|
+
const lanes = [];
|
|
6
|
+
const categories = (gecko.meta.categories ?? []).map((c) => ({
|
|
7
|
+
name: c.name,
|
|
8
|
+
color: c.color,
|
|
9
|
+
subcategories: c.subcategories,
|
|
10
|
+
}));
|
|
11
|
+
for (const thread of gecko.threads) {
|
|
12
|
+
if (thread.samples.length === 0)
|
|
13
|
+
continue;
|
|
14
|
+
const samples = [];
|
|
15
|
+
let cumulativeTime = 0;
|
|
16
|
+
for (let i = 0; i < thread.samples.length; i++) {
|
|
17
|
+
cumulativeTime += thread.samples.timeDeltas[i] ?? 0;
|
|
18
|
+
const stackIdx = thread.samples.stack[i];
|
|
19
|
+
const stack = resolveStack(thread, frameTable, stackIdx);
|
|
20
|
+
const weight = thread.samples.weight[i] ?? 1;
|
|
21
|
+
samples.push({
|
|
22
|
+
timestamp: gecko.meta.startTime + cumulativeTime,
|
|
23
|
+
stack,
|
|
24
|
+
values: [weight * gecko.meta.interval],
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
lanes.push({
|
|
28
|
+
id: `${thread.pid}:${thread.tid}`,
|
|
29
|
+
name: thread.name,
|
|
30
|
+
pid: thread.pid,
|
|
31
|
+
tid: thread.tid,
|
|
32
|
+
kind: thread.isMainThread === true ? 'main' : 'worker',
|
|
33
|
+
samples,
|
|
34
|
+
spans: [],
|
|
35
|
+
markers: [],
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
format: 'gecko',
|
|
40
|
+
profile: {
|
|
41
|
+
id: crypto.randomUUID(),
|
|
42
|
+
name: gecko.meta.product ?? name,
|
|
43
|
+
created_at: gecko.meta.startTime,
|
|
44
|
+
value_types: [{ key: 'wall_ms', unit: 'milliseconds', description: 'Wall-clock duration' }],
|
|
45
|
+
categories,
|
|
46
|
+
frames: [...frameTable.frames],
|
|
47
|
+
lanes,
|
|
48
|
+
metadata: { source_format: 'gecko', version: gecko.meta.version },
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function resolveStack(thread, frameTable, stackIdx) {
|
|
53
|
+
const frameIndices = [];
|
|
54
|
+
let current = stackIdx;
|
|
55
|
+
while (current != null) {
|
|
56
|
+
const frameIdx = thread.stackTable.frame[current];
|
|
57
|
+
const funcIdx = thread.frameTable.func[frameIdx];
|
|
58
|
+
const nameIdx = thread.funcTable.name[funcIdx];
|
|
59
|
+
const funcName = thread.stringArray[nameIdx] ?? `<unknown ${funcIdx}>`;
|
|
60
|
+
const fileNameIdx = thread.funcTable.fileName?.[funcIdx];
|
|
61
|
+
const file = fileNameIdx != null ? (thread.stringArray[fileNameIdx] ?? undefined) : undefined;
|
|
62
|
+
const line = thread.funcTable.lineNumber?.[funcIdx] ?? undefined;
|
|
63
|
+
const col = thread.funcTable.columnNumber?.[funcIdx] ?? undefined;
|
|
64
|
+
const category = thread.frameTable.category[frameIdx];
|
|
65
|
+
frameIndices.push(frameTable.getOrInsert({
|
|
66
|
+
name: funcName,
|
|
67
|
+
file,
|
|
68
|
+
line: line ?? undefined,
|
|
69
|
+
col: col ?? undefined,
|
|
70
|
+
category_index: category,
|
|
71
|
+
}));
|
|
72
|
+
current = thread.stackTable.prefix[current];
|
|
73
|
+
}
|
|
74
|
+
frameIndices.reverse();
|
|
75
|
+
return frameIndices;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=gecko.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gecko.js","sourceRoot":"","sources":["../../src/importers/gecko.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ImportFormat } from './types.js';
|
|
2
|
+
import { ProfileBuilder } from '../model/profile.js';
|
|
3
|
+
export interface ImportProfileResult {
|
|
4
|
+
format_detected: string;
|
|
5
|
+
lanes_added: number;
|
|
6
|
+
frames_added: number;
|
|
7
|
+
samples_added: number;
|
|
8
|
+
spans_added: number;
|
|
9
|
+
value_types: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function importProfile(content: string, name: string, formatHint?: ImportFormat | 'auto', mergeInto?: ProfileBuilder): ImportProfileResult;
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { detectFormat } from './detect.js';
|
|
2
|
+
import { importCollapsed } from './collapsed.js';
|
|
3
|
+
import { importChromeTrace } from './chrome-trace.js';
|
|
4
|
+
import { importGecko } from './gecko.js';
|
|
5
|
+
import { importPprof } from './pprof.js';
|
|
6
|
+
export function importProfile(content, name, formatHint = 'auto', mergeInto) {
|
|
7
|
+
const format = formatHint === 'auto' ? detectFormat(content) : formatHint;
|
|
8
|
+
if (format === 'unknown') {
|
|
9
|
+
throw new Error(`Unable to detect format for '${name}'. Format is unknown.`);
|
|
10
|
+
}
|
|
11
|
+
const imported = runImporter(content, name, format);
|
|
12
|
+
let samplesAdded = 0;
|
|
13
|
+
let spansAdded = 0;
|
|
14
|
+
for (const lane of imported.profile.lanes) {
|
|
15
|
+
samplesAdded += lane.samples.length;
|
|
16
|
+
spansAdded += lane.spans.length;
|
|
17
|
+
}
|
|
18
|
+
const framesAdded = imported.profile.frames.length;
|
|
19
|
+
const lanesAdded = imported.profile.lanes.length;
|
|
20
|
+
const valueTypes = imported.profile.value_types.map((vt) => vt.key);
|
|
21
|
+
if (mergeInto) {
|
|
22
|
+
mergeImportedProfile(mergeInto, imported);
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
format_detected: format,
|
|
26
|
+
lanes_added: lanesAdded,
|
|
27
|
+
frames_added: framesAdded,
|
|
28
|
+
samples_added: samplesAdded,
|
|
29
|
+
spans_added: spansAdded,
|
|
30
|
+
value_types: valueTypes,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function runImporter(content, name, format) {
|
|
34
|
+
switch (format) {
|
|
35
|
+
case 'collapsed':
|
|
36
|
+
return importCollapsed(content, name);
|
|
37
|
+
case 'chrome_trace':
|
|
38
|
+
return importChromeTrace(content, name);
|
|
39
|
+
case 'gecko':
|
|
40
|
+
return importGecko(content, name);
|
|
41
|
+
case 'pprof':
|
|
42
|
+
return importPprof(content, name);
|
|
43
|
+
case 'speedscope':
|
|
44
|
+
throw new Error(`Format '${format}' is not yet implemented`);
|
|
45
|
+
default:
|
|
46
|
+
throw new Error(`Unknown format: ${format}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function mergeImportedProfile(builder, imported) {
|
|
50
|
+
// Reconcile value types: build a mapping from imported indices to builder indices
|
|
51
|
+
const valueIndexMap = new Map();
|
|
52
|
+
for (let i = 0; i < imported.profile.value_types.length; i++) {
|
|
53
|
+
const builderIdx = builder.addValueType(imported.profile.value_types[i]);
|
|
54
|
+
valueIndexMap.set(i, builderIdx);
|
|
55
|
+
}
|
|
56
|
+
// Remap a values array from imported indices to builder indices
|
|
57
|
+
function remapValues(importedValues) {
|
|
58
|
+
const result = builder.emptyValues();
|
|
59
|
+
for (let i = 0; i < importedValues.length; i++) {
|
|
60
|
+
const targetIdx = valueIndexMap.get(i);
|
|
61
|
+
if (targetIdx !== undefined && targetIdx < result.length) {
|
|
62
|
+
result[targetIdx] = importedValues[i];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
// Re-map frame indices from imported profile to the builder's frame table
|
|
68
|
+
const frameIndexMap = new Map();
|
|
69
|
+
for (let i = 0; i < imported.profile.frames.length; i++) {
|
|
70
|
+
const newIdx = builder.frameTable.getOrInsert(imported.profile.frames[i]);
|
|
71
|
+
frameIndexMap.set(i, newIdx);
|
|
72
|
+
}
|
|
73
|
+
// Add lanes with remapped frames and values
|
|
74
|
+
for (const lane of imported.profile.lanes) {
|
|
75
|
+
const newLane = builder.addLane(`imported:${lane.id}`, lane.kind);
|
|
76
|
+
newLane.name = lane.name;
|
|
77
|
+
newLane.pid = lane.pid;
|
|
78
|
+
newLane.tid = lane.tid;
|
|
79
|
+
for (const sample of lane.samples) {
|
|
80
|
+
newLane.samples.push({
|
|
81
|
+
...sample,
|
|
82
|
+
stack: sample.stack.map((idx) => frameIndexMap.get(idx) ?? idx),
|
|
83
|
+
values: remapValues(sample.values),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
for (const span of lane.spans) {
|
|
87
|
+
newLane.spans.push({
|
|
88
|
+
...span,
|
|
89
|
+
frame_index: frameIndexMap.get(span.frame_index) ?? span.frame_index,
|
|
90
|
+
values: remapValues(span.values),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
for (const marker of lane.markers) {
|
|
94
|
+
newLane.markers.push({ ...marker });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/importers/import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import { FrameTable } from '../model/frame-table.js';
|
|
2
|
+
import pako from 'pako';
|
|
3
|
+
export function importPprof(content, name) {
|
|
4
|
+
// Convert binary string to Uint8Array
|
|
5
|
+
const bytes = new Uint8Array(content.length);
|
|
6
|
+
for (let i = 0; i < content.length; i++) {
|
|
7
|
+
bytes[i] = content.charCodeAt(i);
|
|
8
|
+
}
|
|
9
|
+
// Decompress if gzipped
|
|
10
|
+
let decompressed;
|
|
11
|
+
if (bytes.length >= 2 && bytes[0] === 0x1f && bytes[1] === 0x8b) {
|
|
12
|
+
decompressed = pako.ungzip(bytes);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
decompressed = bytes;
|
|
16
|
+
}
|
|
17
|
+
const pprof = decodeProfile(decompressed);
|
|
18
|
+
const frameTable = new FrameTable();
|
|
19
|
+
const samples = [];
|
|
20
|
+
const valueTypes = pprof.sampleTypes.map((st) => ({
|
|
21
|
+
key: pprof.stringTable[st.type] ?? 'unknown',
|
|
22
|
+
unit: mapUnit(pprof.stringTable[st.unit] ?? ''),
|
|
23
|
+
description: `${pprof.stringTable[st.type] ?? ''} (${pprof.stringTable[st.unit] ?? ''})`,
|
|
24
|
+
}));
|
|
25
|
+
for (const sample of pprof.samples) {
|
|
26
|
+
const stack = [];
|
|
27
|
+
// location_ids are leaf-to-root, reverse for root-to-leaf
|
|
28
|
+
for (let i = sample.locationIds.length - 1; i >= 0; i--) {
|
|
29
|
+
const loc = pprof.locations.get(sample.locationIds[i]);
|
|
30
|
+
if (!loc)
|
|
31
|
+
continue;
|
|
32
|
+
for (const line of loc.lines) {
|
|
33
|
+
const func = pprof.functions.get(line.functionId);
|
|
34
|
+
if (!func)
|
|
35
|
+
continue;
|
|
36
|
+
const funcName = pprof.stringTable[func.name] ?? '<unknown>';
|
|
37
|
+
const fileName = pprof.stringTable[func.filename] || undefined;
|
|
38
|
+
stack.push(frameTable.getOrInsert({
|
|
39
|
+
name: funcName,
|
|
40
|
+
file: fileName,
|
|
41
|
+
line: line.line || undefined,
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
samples.push({ timestamp: null, stack, values: sample.values });
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
format: 'pprof',
|
|
49
|
+
profile: {
|
|
50
|
+
id: crypto.randomUUID(),
|
|
51
|
+
name,
|
|
52
|
+
created_at: Date.now(),
|
|
53
|
+
value_types: valueTypes,
|
|
54
|
+
categories: [],
|
|
55
|
+
frames: [...frameTable.frames],
|
|
56
|
+
lanes: [{ id: 'main', name: 'main', kind: 'main', samples, spans: [], markers: [] }],
|
|
57
|
+
metadata: { source_format: 'pprof' },
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function mapUnit(unit) {
|
|
62
|
+
const map = {
|
|
63
|
+
nanoseconds: 'nanoseconds',
|
|
64
|
+
microseconds: 'microseconds',
|
|
65
|
+
milliseconds: 'milliseconds',
|
|
66
|
+
seconds: 'seconds',
|
|
67
|
+
bytes: 'bytes',
|
|
68
|
+
};
|
|
69
|
+
return map[unit] ?? 'none';
|
|
70
|
+
}
|
|
71
|
+
class ProtoReader {
|
|
72
|
+
data;
|
|
73
|
+
pos = 0;
|
|
74
|
+
constructor(data) {
|
|
75
|
+
this.data = data;
|
|
76
|
+
}
|
|
77
|
+
hasMore() {
|
|
78
|
+
return this.pos < this.data.length;
|
|
79
|
+
}
|
|
80
|
+
readVarint() {
|
|
81
|
+
let result = 0;
|
|
82
|
+
let shift = 0;
|
|
83
|
+
while (this.pos < this.data.length) {
|
|
84
|
+
const byte = this.data[this.pos++];
|
|
85
|
+
// Use multiplication instead of bitwise shift to handle values > 2^28
|
|
86
|
+
result += (byte & 0x7f) * (2 ** shift);
|
|
87
|
+
if ((byte & 0x80) === 0)
|
|
88
|
+
break;
|
|
89
|
+
shift += 7;
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
readTag() {
|
|
94
|
+
const v = this.readVarint();
|
|
95
|
+
return { field: Math.floor(v / 8), wireType: v % 8 };
|
|
96
|
+
}
|
|
97
|
+
readBytes() {
|
|
98
|
+
const len = this.readVarint();
|
|
99
|
+
const result = this.data.slice(this.pos, this.pos + len);
|
|
100
|
+
this.pos += len;
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
readString() {
|
|
104
|
+
return new TextDecoder().decode(this.readBytes());
|
|
105
|
+
}
|
|
106
|
+
readSubMessage() {
|
|
107
|
+
return new ProtoReader(this.readBytes());
|
|
108
|
+
}
|
|
109
|
+
skip(wireType) {
|
|
110
|
+
switch (wireType) {
|
|
111
|
+
case 0:
|
|
112
|
+
this.readVarint();
|
|
113
|
+
break;
|
|
114
|
+
case 1:
|
|
115
|
+
this.pos += 8;
|
|
116
|
+
break;
|
|
117
|
+
case 2: {
|
|
118
|
+
const len = this.readVarint();
|
|
119
|
+
this.pos += len;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
case 5:
|
|
123
|
+
this.pos += 4;
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function decodeProfile(data) {
|
|
129
|
+
const result = {
|
|
130
|
+
stringTable: [],
|
|
131
|
+
sampleTypes: [],
|
|
132
|
+
samples: [],
|
|
133
|
+
locations: new Map(),
|
|
134
|
+
functions: new Map(),
|
|
135
|
+
};
|
|
136
|
+
const reader = new ProtoReader(data);
|
|
137
|
+
while (reader.hasMore()) {
|
|
138
|
+
const { field, wireType } = reader.readTag();
|
|
139
|
+
switch (field) {
|
|
140
|
+
case 1:
|
|
141
|
+
result.sampleTypes.push(decodeSampleType(reader.readSubMessage()));
|
|
142
|
+
break;
|
|
143
|
+
case 2:
|
|
144
|
+
result.samples.push(decodeSample(reader.readSubMessage()));
|
|
145
|
+
break;
|
|
146
|
+
case 4: {
|
|
147
|
+
const loc = decodeLocation(reader.readSubMessage());
|
|
148
|
+
result.locations.set(loc.id, { lines: loc.lines });
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
case 5: {
|
|
152
|
+
const fn = decodeFunction(reader.readSubMessage());
|
|
153
|
+
result.functions.set(fn.id, { name: fn.name, filename: fn.filename });
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
case 6:
|
|
157
|
+
result.stringTable.push(reader.readString());
|
|
158
|
+
break;
|
|
159
|
+
default:
|
|
160
|
+
reader.skip(wireType);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
function decodeSampleType(reader) {
|
|
166
|
+
let type = 0;
|
|
167
|
+
let unit = 0;
|
|
168
|
+
while (reader.hasMore()) {
|
|
169
|
+
const { field, wireType } = reader.readTag();
|
|
170
|
+
if (field === 1)
|
|
171
|
+
type = reader.readVarint();
|
|
172
|
+
else if (field === 2)
|
|
173
|
+
unit = reader.readVarint();
|
|
174
|
+
else
|
|
175
|
+
reader.skip(wireType);
|
|
176
|
+
}
|
|
177
|
+
return { type, unit };
|
|
178
|
+
}
|
|
179
|
+
function decodeSample(reader) {
|
|
180
|
+
const locationIds = [];
|
|
181
|
+
const values = [];
|
|
182
|
+
while (reader.hasMore()) {
|
|
183
|
+
const { field, wireType } = reader.readTag();
|
|
184
|
+
if (field === 1)
|
|
185
|
+
locationIds.push(reader.readVarint());
|
|
186
|
+
else if (field === 2)
|
|
187
|
+
values.push(reader.readVarint());
|
|
188
|
+
else
|
|
189
|
+
reader.skip(wireType);
|
|
190
|
+
}
|
|
191
|
+
return { locationIds, values };
|
|
192
|
+
}
|
|
193
|
+
function decodeLocation(reader) {
|
|
194
|
+
let id = 0;
|
|
195
|
+
const lines = [];
|
|
196
|
+
while (reader.hasMore()) {
|
|
197
|
+
const { field, wireType } = reader.readTag();
|
|
198
|
+
if (field === 1)
|
|
199
|
+
id = reader.readVarint();
|
|
200
|
+
else if (field === 4)
|
|
201
|
+
lines.push(decodeLine(reader.readSubMessage()));
|
|
202
|
+
else
|
|
203
|
+
reader.skip(wireType);
|
|
204
|
+
}
|
|
205
|
+
return { id, lines };
|
|
206
|
+
}
|
|
207
|
+
function decodeLine(reader) {
|
|
208
|
+
let functionId = 0;
|
|
209
|
+
let line = 0;
|
|
210
|
+
while (reader.hasMore()) {
|
|
211
|
+
const { field, wireType } = reader.readTag();
|
|
212
|
+
if (field === 1)
|
|
213
|
+
functionId = reader.readVarint();
|
|
214
|
+
else if (field === 2)
|
|
215
|
+
line = reader.readVarint();
|
|
216
|
+
else
|
|
217
|
+
reader.skip(wireType);
|
|
218
|
+
}
|
|
219
|
+
return { functionId, line };
|
|
220
|
+
}
|
|
221
|
+
function decodeFunction(reader) {
|
|
222
|
+
let id = 0;
|
|
223
|
+
let name = 0;
|
|
224
|
+
let filename = 0;
|
|
225
|
+
while (reader.hasMore()) {
|
|
226
|
+
const { field, wireType } = reader.readTag();
|
|
227
|
+
if (field === 1)
|
|
228
|
+
id = reader.readVarint();
|
|
229
|
+
else if (field === 2)
|
|
230
|
+
name = reader.readVarint();
|
|
231
|
+
else if (field === 4)
|
|
232
|
+
filename = reader.readVarint();
|
|
233
|
+
else
|
|
234
|
+
reader.skip(wireType);
|
|
235
|
+
}
|
|
236
|
+
return { id, name, filename };
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=pprof.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pprof.js","sourceRoot":"","sources":["../../src/importers/pprof.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/importers/types.ts"],"names":[],"mappings":""}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createServer, startServer } from './server.js';
|
|
2
|
+
export type { Profile, Frame, Lane, Span, Sample, Marker, ValueType, Category, DetectedPattern, } from './model/types.js';
|
|
3
|
+
export { LLM_VALUE_TYPES } from './model/types.js';
|
|
4
|
+
export { ProfileBuilder } from './model/profile.js';
|
|
5
|
+
export { FrameTable } from './model/frame-table.js';
|
|
6
|
+
export { ProfilerState } from './model/state.js';
|
package/build/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createServer, startServer } from './server.js';
|
|
2
|
+
export { LLM_VALUE_TYPES } from './model/types.js';
|
|
3
|
+
export { ProfileBuilder } from './model/profile.js';
|
|
4
|
+
export { FrameTable } from './model/frame-table.js';
|
|
5
|
+
export { ProfilerState } from './model/state.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAYxD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ProfilerState } from '../model/state.js';
|
|
2
|
+
export interface MarkInput {
|
|
3
|
+
what: string;
|
|
4
|
+
severity?: 'info' | 'warning' | 'error';
|
|
5
|
+
data?: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export interface MarkResult {
|
|
8
|
+
marker_id: string;
|
|
9
|
+
timestamp: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function handleMark(state: ProfilerState, input: MarkInput): MarkResult;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function handleMark(state, input) {
|
|
2
|
+
const laneId = state.activeLaneId;
|
|
3
|
+
const markerId = state.nextMarkerId();
|
|
4
|
+
const timestamp = Date.now();
|
|
5
|
+
state.builder.addMarker(laneId, {
|
|
6
|
+
timestamp,
|
|
7
|
+
name: input.what,
|
|
8
|
+
severity: input.severity ?? 'info',
|
|
9
|
+
data: input.data,
|
|
10
|
+
});
|
|
11
|
+
return { marker_id: markerId, timestamp };
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=mark.js.map
|