Skip to content

Commit 1adf937

Browse files
committed
refactor: adjust metadata implementation
1 parent 10b8f3a commit 1adf937

6 files changed

Lines changed: 49 additions & 68 deletions

File tree

packages/utils/src/lib/profiler/trace-file-utils.ts

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -281,15 +281,18 @@ export const deserializeTraceEvent = (json: string): TraceEvent =>
281281
* @param metadata - Optional additional metadata to merge into the trace metadata
282282
* @returns TraceMetadata object with source, startTime, and merged custom metadata
283283
*/
284-
export function getTraceMetadata(
285-
startDate?: Date,
286-
metadata?: Record<string, unknown>,
287-
): TraceMetadata {
284+
export function getTraceMetadata({
285+
startDate,
286+
...metadata
287+
}: Partial<TraceMetadata> = {}): TraceMetadata {
288+
const parsedStartDate = (
289+
startDate instanceof Date ? startDate : new Date()
290+
).toISOString();
288291
return {
289292
source: 'DevTools',
290-
startTime: startDate?.toISOString() ?? new Date().toISOString(),
291-
hardwareConcurrency: 1,
293+
startTime: parsedStartDate,
292294
dataOrigin: 'TraceEvents',
295+
hardwareConcurrency: navigator.hardwareConcurrency,
293296
...metadata,
294297
};
295298
}
@@ -301,13 +304,9 @@ export function getTraceMetadata(
301304
*/
302305
export const createTraceFile = (opt: {
303306
traceEvents: TraceEvent[];
304-
startTime?: string;
305307
metadata?: Partial<TraceMetadata>;
306308
}): TraceEventContainer => ({
307309
traceEvents: opt.traceEvents.map(encodeEvent),
308310
displayTimeUnit: 'ms',
309-
metadata: getTraceMetadata(
310-
opt.startTime ? new Date(opt.startTime) : new Date(),
311-
opt.metadata,
312-
),
311+
metadata: getTraceMetadata(opt.metadata),
313312
});

packages/utils/src/lib/profiler/trace-file-utils.unit.test.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ describe('getTraceFile', () => {
6262
it('should use custom startTime when provided', () => {
6363
const result = createTraceFile({
6464
traceEvents: [],
65-
startTime: '2023-01-01T00:00:00.000Z',
65+
metadata: {
66+
startTime: '2023-01-01T00:00:00.000Z',
67+
},
6668
});
6769

6870
expect(result).toHaveProperty(
@@ -520,14 +522,14 @@ describe('getTraceMetadata', () => {
520522

521523
it('should use provided startDate', () => {
522524
const startDate = new Date('2023-01-01T00:00:00.000Z');
523-
const metadata = getTraceMetadata(startDate);
525+
const metadata = getTraceMetadata({ startDate });
524526

525527
expect(metadata.startTime).toBe('2023-01-01T00:00:00.000Z');
526528
});
527529

528530
it('should merge custom metadata', () => {
529531
const customMetadata = { version: '1.0.0', platform: 'node' };
530-
const metadata = getTraceMetadata(undefined, customMetadata);
532+
const metadata = getTraceMetadata(customMetadata);
531533

532534
expect(metadata).toStrictEqual({
533535
source: 'DevTools',

packages/utils/src/lib/profiler/wal-json-trace.ts

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ import {
55
complete,
66
createTraceFile,
77
deserializeTraceEvent,
8-
encodeEvent,
98
getInstantEventTracingStartedInBrowser,
109
serializeTraceEvent,
1110
} from './trace-file-utils.js';
12-
import type { TraceEvent } from './trace-file.type.js';
11+
import type { TraceEvent, TraceMetadata } from './trace-file.type.js';
1312

1413
/** Name for the trace start margin event */
1514
const TRACE_START_MARGIN_NAME = '[trace padding start]';
@@ -22,40 +21,37 @@ const TRACE_MARGIN_DURATION_US = 20_000;
2221

2322
export function generateTraceContent(
2423
events: TraceEvent[],
25-
metadata?: Record<string, unknown>,
24+
metadata?: Partial<TraceMetadata>,
2625
): string {
27-
const traceContainer = createTraceFile({
28-
traceEvents: events,
29-
startTime: new Date().toISOString(),
30-
metadata: {
31-
...metadata,
32-
generatedAt: new Date().toISOString(),
33-
},
34-
});
35-
3626
const fallbackTs = defaultClock.epochNowUs();
3727
const sortedEvents =
3828
events.length > 0 ? [...events].sort((a, b) => a.ts - b.ts) : [];
3929

4030
const firstTs = sortedEvents.at(0)?.ts ?? fallbackTs;
4131
const lastTs = sortedEvents.at(-1)?.ts ?? fallbackTs;
4232

43-
return JSON.stringify({
44-
...traceContainer,
45-
traceEvents: [
46-
getInstantEventTracingStartedInBrowser({
47-
ts: firstTs - TRACE_MARGIN_US,
48-
url: events.length > 0 ? 'generated-trace' : 'empty-trace',
49-
}),
50-
complete(TRACE_START_MARGIN_NAME, TRACE_MARGIN_DURATION_US, {
51-
ts: firstTs - TRACE_MARGIN_US,
52-
}),
53-
...sortedEvents.map(encodeEvent),
54-
complete(TRACE_END_MARGIN_NAME, TRACE_MARGIN_DURATION_US, {
55-
ts: lastTs + TRACE_MARGIN_US,
56-
}),
57-
],
58-
});
33+
return JSON.stringify(
34+
createTraceFile({
35+
traceEvents: [
36+
getInstantEventTracingStartedInBrowser({
37+
ts: firstTs - TRACE_MARGIN_US,
38+
// TODO: add the stringifies command of the process that was traced when sharded WAL is implemented in profiler
39+
url: events.length > 0 ? 'generated-trace' : 'empty-trace',
40+
}),
41+
complete(TRACE_START_MARGIN_NAME, TRACE_MARGIN_DURATION_US, {
42+
ts: firstTs - TRACE_MARGIN_US,
43+
}),
44+
...sortedEvents,
45+
complete(TRACE_END_MARGIN_NAME, TRACE_MARGIN_DURATION_US, {
46+
ts: lastTs + TRACE_MARGIN_US,
47+
}),
48+
],
49+
metadata: {
50+
...metadata,
51+
startTime: new Date(firstTs / 1000).toISOString(),
52+
},
53+
}),
54+
);
5955
}
6056

6157
/**
@@ -79,7 +75,7 @@ export function traceEventWalFormat() {
7975
finalExtension: '.json',
8076
codec: traceEventCodec,
8177
finalizer: (
82-
records: (TraceEvent | InvalidEntry<string>)[],
78+
records: (TraceEvent | InvalidEntry)[],
8379
metadata?: Record<string, unknown>,
8480
) =>
8581
generateTraceContent(

packages/utils/src/lib/profiler/wal-json-trace.unit.test.ts

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -154,31 +154,28 @@ describe('traceEventCodec', () => {
154154
describe('encode direction (memory object → JSON string)', () => {
155155
it('should encode instant event to JSON string', () => {
156156
const encoded = traceEventCodec.encode(instantEvent);
157-
expect(typeof encoded).toBe('string');
158157
const parsed = JSON.parse(encoded);
159158
expect(parsed.args.detail).toBe(JSON.stringify({ custom: 'data' }));
160159
expect(parsed.args.data.detail).toBe(JSON.stringify({ nested: 'value' }));
161160
});
162161

163162
it('should encode span begin event to JSON string', () => {
164163
const encoded = traceEventCodec.encode(spanBeginEvent);
165-
expect(typeof encoded).toBe('string');
166164
const decoded = traceEventCodec.decode(encoded);
167165
expect(decoded).toStrictEqual(spanBeginEvent);
168166
});
169167

170168
it('should encode span end event to JSON string', () => {
171169
const encoded = traceEventCodec.encode(spanEndEvent);
172-
expect(typeof encoded).toBe('string');
173170
const decoded = traceEventCodec.decode(encoded);
174171
expect(decoded).toStrictEqual(spanEndEvent);
175172
});
176173

177174
it('should encode nested detail objects as JSON strings', () => {
178175
const encoded = traceEventCodec.encode(instantEvent);
179176
const parsed = JSON.parse(encoded);
180-
expect(typeof parsed.args.detail).toBe('string');
181-
expect(typeof parsed.args.data.detail).toBe('string');
177+
expect(parsed.args.detail).toBeString();
178+
expect(parsed.args.data.detail).toBeString();
182179
expect(JSON.parse(parsed.args.detail)).toStrictEqual({ custom: 'data' });
183180
expect(JSON.parse(parsed.args.data.detail)).toStrictEqual({
184181
nested: 'value',
@@ -221,7 +218,7 @@ describe('traceEventCodec', () => {
221218
describe('generateTraceContent', () => {
222219
it('should generate trace content for empty events array', () => {
223220
const events: TraceEvent[] = [];
224-
const metadata = { version: '1.0.0', generatedAt: '2024-01-01T00:00:00Z' };
221+
const metadata = { version: '1.0.0' };
225222

226223
const result = generateTraceContent(events, metadata);
227224

@@ -262,7 +259,6 @@ describe('generateTraceContent', () => {
262259
hardwareConcurrency: 1,
263260
dataOrigin: 'TraceEvents',
264261
version: '1.0.0',
265-
generatedAt: expect.any(String),
266262
},
267263
});
268264
});
@@ -336,7 +332,6 @@ describe('generateTraceContent', () => {
336332
startTime: expect.any(String),
337333
hardwareConcurrency: 1,
338334
dataOrigin: 'TraceEvents',
339-
generatedAt: expect.any(String),
340335
},
341336
});
342337
});
@@ -471,7 +466,6 @@ describe('traceEventWalFormat', () => {
471466
};
472467

473468
const encoded = format.codec.encode(testEvent);
474-
expect(typeof encoded).toBe('string');
475469

476470
const decoded = format.codec.decode(encoded);
477471
expect(decoded).toStrictEqual(testEvent);
@@ -519,25 +513,9 @@ describe('traceEventWalFormat', () => {
519513

520514
const result = format.finalizer(records);
521515

522-
expect(typeof result).toBe('string');
523516
const parsed = JSON.parse(result);
524517
expect(parsed).toHaveProperty('traceEvents');
525518
expect(parsed).toHaveProperty('metadata');
526519
expect(parsed.traceEvents).toBeArray();
527520
});
528-
529-
it('should include generatedAt in finalizer metadata', () => {
530-
const format = traceEventWalFormat();
531-
const records: TraceEvent[] = [];
532-
533-
const result = format.finalizer(records);
534-
const parsed = JSON.parse(result);
535-
536-
expect(parsed.metadata).toHaveProperty('generatedAt');
537-
expect(typeof parsed.metadata.generatedAt).toBe('string');
538-
// Should be recent timestamp
539-
expect(new Date(parsed.metadata.generatedAt).getTime()).toBeGreaterThan(
540-
Date.now() - 10_000,
541-
);
542-
});
543521
});

testing/test-setup-config/src/lib/vitest-setup-files.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const UNIT_TEST_SETUP_FILES = [
2727
'../../testing/test-setup/src/lib/performance.setup-file.ts',
2828
'../../testing/test-setup/src/lib/portal-client.mock.ts',
2929
'../../testing/test-setup/src/lib/process.setup-file.ts',
30+
'../../testing/test-setup/src/lib/navigator.setup-file.ts',
3031
...CUSTOM_MATCHERS,
3132
] as const;
3233

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
beforeEach(() => {
2+
vi.stubGlobal('navigator', {
3+
hardwareConcurrency: 1,
4+
});
5+
});

0 commit comments

Comments
 (0)