@zendesk/retrace
Version:
define and capture Product Operation Traces along with computed metrics with an optional friendly React beacon API
225 lines • 9.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const vitest_1 = require("vitest");
const convertToRum_1 = require("./convertToRum");
const recordingComputeUtils_1 = require("./recordingComputeUtils");
const createMockFactory_1 = require("./testUtility/createMockFactory");
(0, vitest_1.describe)('convertTraceToRUM', () => {
(0, vitest_1.it)('should round all numeric values in the trace recording', () => {
const definition = {
name: 'test-trace',
relationSchemaName: 'ticket',
relationSchema: { ticketId: String },
requiredSpans: [() => true],
computedSpanDefinitions: {},
computedValueDefinitions: {},
variants: {
origin: { timeout: 45_000 },
},
};
const input = {
id: 'test',
startTime: (0, createMockFactory_1.createTimestamp)(0),
relatedTo: { ticketId: '74' },
variant: 'origin',
};
const recordedItems = new Map([
(0, createMockFactory_1.createMockSpanAndAnnotation)(100.501, {
name: 'test-component',
type: 'component-render',
relatedTo: {},
duration: 50.499,
isIdle: false,
renderCount: 1,
renderedOutput: 'loading',
}),
(0, createMockFactory_1.createMockSpanAndAnnotation)(200.001, {
name: 'test-component',
type: 'component-render',
relatedTo: {},
duration: 50.999,
isIdle: true,
renderCount: 2,
renderedOutput: 'content',
}, { occurrence: 2 }),
]);
const traceRecording = (0, recordingComputeUtils_1.createTraceRecording)({
definition,
input,
recordedItemsByLabel: {},
recordedItems,
}, {
transitionFromState: 'active',
lastRelevantSpanAndAnnotation: undefined,
transitionToState: 'complete',
completeSpanAndAnnotation: undefined,
cpuIdleSpanAndAnnotation: undefined,
lastRequiredSpanAndAnnotation: undefined,
});
const context = {
definition,
input,
recordedItemsByLabel: {},
recordedItems,
};
const result = (0, convertToRum_1.convertTraceToRUM)({ traceRecording, context });
// Check rounded values in embeddedSpans
const embeddedSpan = result.embeddedSpans['component-render|test-component'];
if (embeddedSpan) {
(0, vitest_1.expect)(Number.isInteger(embeddedSpan.totalDuration)).toBe(true);
(0, vitest_1.expect)(Number.isInteger(embeddedSpan.spans[0].startOffset)).toBe(true);
(0, vitest_1.expect)(Number.isInteger(embeddedSpan.spans[0].duration)).toBe(true);
(0, vitest_1.expect)(Number.isInteger(embeddedSpan.spans[1].startOffset)).toBe(true);
(0, vitest_1.expect)(Number.isInteger(embeddedSpan.spans[1].duration)).toBe(true);
// Check specific rounded values
(0, vitest_1.expect)(embeddedSpan.spans[0].startOffset).toBe(101); // 100.501 rounded
(0, vitest_1.expect)(embeddedSpan.spans[0].duration).toBe(50); // 50.499 rounded
(0, vitest_1.expect)(embeddedSpan.spans[1].startOffset).toBe(200); // 200.001 rounded
(0, vitest_1.expect)(embeddedSpan.spans[1].duration).toBe(51); // 50.999 rounded
(0, vitest_1.expect)(result.nonEmbeddedSpans).toEqual([]);
}
});
(0, vitest_1.it)('should return correct non embedded spans', () => {
const definition = {
name: 'test-trace',
relationSchemaName: 'ticket',
relationSchema: { ticketId: String },
requiredSpans: [() => true],
computedSpanDefinitions: {},
computedValueDefinitions: {},
variants: {
origin: { timeout: 45_000 },
},
};
const input = {
id: 'test',
startTime: (0, createMockFactory_1.createTimestamp)(0),
relatedTo: { ticketId: '74' },
variant: 'origin',
};
const recordedItems = new Map([
(0, createMockFactory_1.createMockSpanAndAnnotation)(100.501, {
name: 'test-component',
type: 'component-render',
relatedTo: {},
duration: 50.499,
isIdle: false,
renderCount: 1,
renderedOutput: 'loading',
}),
(0, createMockFactory_1.createMockSpanAndAnnotation)(200.001, {
name: 'test-component',
type: 'component-render',
relatedTo: {},
duration: 50.999,
isIdle: true,
renderCount: 2,
renderedOutput: 'content',
}, { occurrence: 2 }),
]);
const traceRecording = (0, recordingComputeUtils_1.createTraceRecording)({
definition,
input,
recordedItemsByLabel: {},
recordedItems,
}, {
transitionFromState: 'active',
lastRelevantSpanAndAnnotation: undefined,
transitionToState: 'complete',
completeSpanAndAnnotation: undefined,
cpuIdleSpanAndAnnotation: undefined,
lastRequiredSpanAndAnnotation: undefined,
});
const context = {
definition,
input,
recordedItemsByLabel: {},
recordedItems,
};
// we dont want to return any embedded spans
const result = (0, convertToRum_1.convertTraceToRUM)({
traceRecording,
context,
embedSpanSelector: () => false,
});
(0, vitest_1.expect)(Object.keys(result.embeddedSpans)).toHaveLength(0);
(0, vitest_1.expect)(result.nonEmbeddedSpans).toEqual(['component-render|test-component']);
(0, vitest_1.expect)(result.nonEmbeddedSpans).toHaveLength(1);
});
(0, vitest_1.it)('should identify the longest span correctly', () => {
const definition = {
name: 'test-trace',
relationSchemaName: 'ticket',
relationSchema: { ticketId: String },
requiredSpans: [() => true],
computedSpanDefinitions: {},
computedValueDefinitions: {},
variants: {
origin: { timeout: 45_000 },
},
};
const input = {
id: 'test',
startTime: (0, createMockFactory_1.createTimestamp)(0),
relatedTo: { ticketId: '74' },
variant: 'origin',
};
const recordedItems = new Map([
(0, createMockFactory_1.createMockSpanAndAnnotation)(100, {
name: 'short-component',
type: 'component-render',
relatedTo: {},
duration: 30,
isIdle: false,
renderCount: 1,
renderedOutput: 'loading',
}),
(0, createMockFactory_1.createMockSpanAndAnnotation)(200, {
name: 'long-component',
type: 'component-render',
relatedTo: {},
duration: 150,
isIdle: true,
renderCount: 1,
renderedOutput: 'content',
}),
(0, createMockFactory_1.createMockSpanAndAnnotation)(300, {
name: 'medium-component',
type: 'component-render',
relatedTo: {},
duration: 75,
isIdle: false,
renderCount: 1,
renderedOutput: 'error',
}),
]);
const traceRecording = (0, recordingComputeUtils_1.createTraceRecording)({
definition,
input,
recordedItemsByLabel: {},
recordedItems,
}, {
transitionFromState: 'active',
lastRelevantSpanAndAnnotation: undefined,
transitionToState: 'complete',
completeSpanAndAnnotation: undefined,
cpuIdleSpanAndAnnotation: undefined,
lastRequiredSpanAndAnnotation: undefined,
});
const context = {
definition,
input,
recordedItemsByLabel: {},
recordedItems,
};
const result = (0, convertToRum_1.convertTraceToRUM)({ traceRecording, context });
// Should identify the longest span
(0, vitest_1.expect)(result.longestSpan).toBeDefined();
(0, vitest_1.assert)(result.longestSpan);
(0, vitest_1.expect)(result.longestSpan.span.name).toBe('long-component');
(0, vitest_1.expect)(result.longestSpan.span.duration).toBe(150);
(0, vitest_1.expect)(result.longestSpan.span.type).toBe('component-render');
(0, vitest_1.expect)(result.longestSpan.key).toBe('component-render|long-component');
});
});
//# sourceMappingURL=convertToRum.test.js.map