UNPKG

@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
"use strict"; 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