@smoothbricks/lmao 0.2.2 → 0.2.3
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/dist/allocator.wasm +0 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/lib/JsBufferStrategy.d.ts +4 -3
- package/dist/lib/JsBufferStrategy.d.ts.map +1 -1
- package/dist/lib/JsBufferStrategy.js +18 -11
- package/dist/lib/arrow/lease.d.ts +10 -0
- package/dist/lib/arrow/lease.d.ts.map +1 -0
- package/dist/lib/arrow/lease.js +33 -0
- package/dist/lib/arrow/utils.d.ts +3 -4
- package/dist/lib/arrow/utils.d.ts.map +1 -1
- package/dist/lib/arrow/utils.js +12 -13
- package/dist/lib/arrow/vocabularyDictionary.d.ts +21 -0
- package/dist/lib/arrow/vocabularyDictionary.d.ts.map +1 -0
- package/dist/lib/arrow/vocabularyDictionary.js +95 -0
- package/dist/lib/bufferStrategy.d.ts +3 -2
- package/dist/lib/bufferStrategy.d.ts.map +1 -1
- package/dist/lib/cloudflare/traceRows.d.ts.map +1 -1
- package/dist/lib/cloudflare/traceRows.js +3 -2
- package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -1
- package/dist/lib/codegen/evaluatorGenerator.js +12 -11
- package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +44 -82
- package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -1
- package/dist/lib/codegen/fixedPositionWriterGenerator.js +223 -162
- package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts +63 -0
- package/dist/lib/codegen/spanLoggerClosureMaterializer.d.ts.map +1 -0
- package/dist/lib/codegen/spanLoggerClosureMaterializer.js +447 -0
- package/dist/lib/codegen/spanLoggerGenerator.d.ts +36 -19
- package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -1
- package/dist/lib/codegen/spanLoggerGenerator.js +164 -158
- package/dist/lib/convertToArrow.d.ts +7 -2
- package/dist/lib/convertToArrow.d.ts.map +1 -1
- package/dist/lib/convertToArrow.js +499 -285
- package/dist/lib/defineOpContext.js +1 -1
- package/dist/lib/enumMetadata.d.ts +19 -0
- package/dist/lib/enumMetadata.d.ts.map +1 -0
- package/dist/lib/enumMetadata.js +86 -0
- package/dist/lib/flushScheduler.d.ts.map +1 -1
- package/dist/lib/flushScheduler.js +13 -4
- package/dist/lib/library.d.ts +16 -98
- package/dist/lib/library.d.ts.map +1 -1
- package/dist/lib/library.js +32 -525
- package/dist/lib/logBinding.d.ts +21 -27
- package/dist/lib/logBinding.d.ts.map +1 -1
- package/dist/lib/op.d.ts +30 -30
- package/dist/lib/op.d.ts.map +1 -1
- package/dist/lib/op.js +15 -22
- package/dist/lib/opContext/createOpGroup.d.ts +1 -1
- package/dist/lib/opContext/createOpGroup.d.ts.map +1 -1
- package/dist/lib/opContext/createOpGroup.js +22 -29
- package/dist/lib/opContext/defineOp.d.ts +4 -4
- package/dist/lib/opContext/defineOp.d.ts.map +1 -1
- package/dist/lib/opContext/defineOp.js +53 -10
- package/dist/lib/opContext/opGroupTypes.d.ts +2 -2
- package/dist/lib/opContext/opTypes.d.ts +1 -1
- package/dist/lib/opContext/opTypes.d.ts.map +1 -1
- package/dist/lib/opContext/spanContextTypes.d.ts +29 -14
- package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -1
- package/dist/lib/opContext/types.d.ts +4 -4
- package/dist/lib/opContext/types.d.ts.map +1 -1
- package/dist/lib/physicalLayoutPlan.d.ts +89 -0
- package/dist/lib/physicalLayoutPlan.d.ts.map +1 -0
- package/dist/lib/physicalLayoutPlan.js +442 -0
- package/dist/lib/resolveMessage.d.ts +9 -0
- package/dist/lib/resolveMessage.d.ts.map +1 -0
- package/dist/lib/resolveMessage.js +63 -0
- package/dist/lib/result.d.ts +5 -7
- package/dist/lib/result.d.ts.map +1 -1
- package/dist/lib/result.js +19 -26
- package/dist/lib/runtimeHint.d.ts +35 -0
- package/dist/lib/runtimeHint.d.ts.map +1 -0
- package/dist/lib/runtimeHint.js +79 -0
- package/dist/lib/schema/types.d.ts +1 -1
- package/dist/lib/schema/types.d.ts.map +1 -1
- package/dist/lib/span-buffer/aot/v1.d.ts +2 -0
- package/dist/lib/span-buffer/aot/v1.d.ts.map +1 -0
- package/dist/lib/span-buffer/aot/v1.js +24 -0
- package/dist/lib/spanBuffer.d.ts +33 -4
- package/dist/lib/spanBuffer.d.ts.map +1 -1
- package/dist/lib/spanBuffer.js +583 -91
- package/dist/lib/spanBufferStats.d.ts +1 -1
- package/dist/lib/spanBufferStats.d.ts.map +1 -1
- package/dist/lib/spanContext.d.ts +27 -51
- package/dist/lib/spanContext.d.ts.map +1 -1
- package/dist/lib/spanContext.js +822 -344
- package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -1
- package/dist/lib/sqlite/sqlite-common.js +20 -21
- package/dist/lib/testing/bun-harness.d.ts +8 -3
- package/dist/lib/testing/bun-harness.d.ts.map +1 -1
- package/dist/lib/testing/bun-harness.js +30 -18
- package/dist/lib/testing/extractFacts.d.ts +1 -1
- package/dist/lib/testing/extractFacts.d.ts.map +1 -1
- package/dist/lib/testing/extractFacts.js +55 -63
- package/dist/lib/testing/facts.d.ts +1 -1
- package/dist/lib/testing/facts.d.ts.map +1 -1
- package/dist/lib/testing/queryable-span.d.ts +1 -1
- package/dist/lib/testing/queryable-span.d.ts.map +1 -1
- package/dist/lib/testing/queryable-span.js +26 -28
- package/dist/lib/testing/span-query.d.ts.map +1 -1
- package/dist/lib/testing/span-query.js +19 -22
- package/dist/lib/testing/stdio-replay.d.ts.map +1 -1
- package/dist/lib/testing/stdio-replay.js +19 -8
- package/dist/lib/threadId.d.ts.map +1 -1
- package/dist/lib/threadId.js +6 -3
- package/dist/lib/traceRoot.d.ts +30 -8
- package/dist/lib/traceRoot.d.ts.map +1 -1
- package/dist/lib/traceRoot.es.d.ts +17 -15
- package/dist/lib/traceRoot.es.d.ts.map +1 -1
- package/dist/lib/traceRoot.es.js +68 -34
- package/dist/lib/traceRoot.js +11 -0
- package/dist/lib/traceRoot.node.d.ts +17 -19
- package/dist/lib/traceRoot.node.d.ts.map +1 -1
- package/dist/lib/traceRoot.node.js +66 -38
- package/dist/lib/traceTopology.d.ts +42 -0
- package/dist/lib/traceTopology.d.ts.map +1 -0
- package/dist/lib/traceTopology.js +260 -0
- package/dist/lib/tracer.d.ts +9 -5
- package/dist/lib/tracer.d.ts.map +1 -1
- package/dist/lib/tracer.js +65 -71
- package/dist/lib/tracers/ArrayQueueTracer.d.ts +1 -1
- package/dist/lib/tracers/ArrayQueueTracer.js +1 -1
- package/dist/lib/tracers/StdioTracer.d.ts.map +1 -1
- package/dist/lib/tracers/StdioTracer.js +15 -13
- package/dist/lib/tracers/TestTracer.d.ts +4 -6
- package/dist/lib/tracers/TestTracer.d.ts.map +1 -1
- package/dist/lib/tracers/TestTracer.js +6 -8
- package/dist/lib/types.d.ts +49 -32
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/vocabularyRegistry.d.ts +25 -0
- package/dist/lib/vocabularyRegistry.d.ts.map +1 -0
- package/dist/lib/vocabularyRegistry.js +372 -0
- package/dist/lib/wasm/WasmBufferStrategy.d.ts +6 -10
- package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -1
- package/dist/lib/wasm/WasmBufferStrategy.js +44 -37
- package/dist/lib/wasm/wasmAllocator.d.ts +27 -22
- package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -1
- package/dist/lib/wasm/wasmAllocator.js +66 -44
- package/dist/lib/wasm/wasmPhysicalLayout.d.ts +67 -0
- package/dist/lib/wasm/wasmPhysicalLayout.d.ts.map +1 -0
- package/dist/lib/wasm/wasmPhysicalLayout.js +179 -0
- package/dist/lib/wasm/wasmSpanBuffer.d.ts +79 -31
- package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -1
- package/dist/lib/wasm/wasmSpanBuffer.js +442 -272
- package/dist/lib/wasm/wasmTraceRoot.d.ts +24 -22
- package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -1
- package/dist/lib/wasm/wasmTraceRoot.js +110 -71
- package/dist/vocabulary/register/v1.d.ts +2 -0
- package/dist/vocabulary/register/v1.d.ts.map +1 -0
- package/dist/vocabulary/register/v1.js +1 -0
- package/dist/wasm.d.ts +5 -0
- package/dist/wasm.d.ts.map +1 -0
- package/dist/wasm.js +4 -0
- package/package.json +54 -6
- package/src/index.ts +1 -0
- package/src/lib/JsBufferStrategy.ts +27 -9
- package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +335 -37
- package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +97 -26
- package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +75 -15
- package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +30 -6
- package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +18 -21
- package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +5 -2
- package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +25 -7
- package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +3 -2
- package/src/lib/__tests__/buffer-overflow.test.ts +24 -18
- package/src/lib/__tests__/capability-span-context.test.ts +505 -0
- package/src/lib/__tests__/capacity-tuning.test.ts +5 -3
- package/src/lib/__tests__/eager-columns.test.ts +345 -0
- package/src/lib/__tests__/enum-metadata-aot.test.ts +153 -0
- package/src/lib/__tests__/enum-metadata.test.ts +177 -0
- package/src/lib/__tests__/fixtures/empty-vocabulary-runtime.fixture.ts +15 -0
- package/src/lib/__tests__/flushScheduler.test.ts +5 -1
- package/src/lib/__tests__/identity-view.property.test.ts +179 -0
- package/src/lib/__tests__/library.test.ts +19 -235
- package/src/lib/__tests__/message-buffer-families.test.ts +878 -0
- package/src/lib/__tests__/nested-library-tasks.test.ts +14 -15
- package/src/lib/__tests__/op-metadata.test.ts +1 -1
- package/src/lib/__tests__/op-type-safety.test.ts +5 -16
- package/src/lib/__tests__/physical-layout-plan.test.ts +333 -0
- package/src/lib/__tests__/remap-descriptor-integration.test.ts +381 -0
- package/src/lib/__tests__/root-context-construction.test.ts +414 -0
- package/src/lib/__tests__/span-auto-runtime.test.ts +386 -0
- package/src/lib/__tests__/span-buffer-segment-stats.test.ts +221 -0
- package/src/lib/__tests__/span-lifecycle.test.ts +53 -25
- package/src/lib/__tests__/spanbuffer-materializer-parity.test.ts +266 -0
- package/src/lib/__tests__/sync-async-trace.test.ts +24 -23
- package/src/lib/__tests__/tag-writer-aot.test.ts +214 -0
- package/src/lib/__tests__/test-helpers.ts +67 -12
- package/src/lib/__tests__/threadId.test.ts +62 -0
- package/src/lib/__tests__/timestamp.test.ts +221 -93
- package/src/lib/__tests__/traceTopology.property.test.ts +383 -0
- package/src/lib/__tests__/type-narrowing.test.ts +63 -0
- package/src/lib/__tests__/vocabulary-dense-decoding.test.ts +405 -0
- package/src/lib/__tests__/vocabularyRegistry.test.ts +313 -0
- package/src/lib/arrow/lease.ts +43 -0
- package/src/lib/arrow/utils.ts +10 -14
- package/src/lib/arrow/vocabularyDictionary.ts +123 -0
- package/src/lib/bufferStrategy.ts +9 -1
- package/src/lib/cloudflare/traceRows.ts +3 -2
- package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +21 -141
- package/src/lib/codegen/__tests__/fixedPositionWriter-parity.test.ts +273 -0
- package/src/lib/codegen/__tests__/fixedPositionWriter-uint64.test.ts +61 -34
- package/src/lib/codegen/__tests__/nullBitmap.test.ts +33 -37
- package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +34 -18
- package/src/lib/codegen/__tests__/spanLoggerMaterializerParity.test.ts +503 -0
- package/src/lib/codegen/evaluatorGenerator.ts +18 -13
- package/src/lib/codegen/fixedPositionWriterGenerator.ts +329 -245
- package/src/lib/codegen/spanLoggerClosureMaterializer.ts +598 -0
- package/src/lib/codegen/spanLoggerGenerator.ts +241 -177
- package/src/lib/convertToArrow.ts +598 -311
- package/src/lib/defineOpContext.ts +1 -1
- package/src/lib/enumMetadata.ts +121 -0
- package/src/lib/flushScheduler.ts +11 -5
- package/src/lib/library.ts +37 -595
- package/src/lib/logBinding.ts +21 -27
- package/src/lib/op.ts +75 -18
- package/src/lib/opContext/__tests__/retry.test.ts +27 -21
- package/src/lib/opContext/createOpGroup.ts +33 -31
- package/src/lib/opContext/defineOp.ts +88 -11
- package/src/lib/opContext/opGroupTypes.ts +2 -2
- package/src/lib/opContext/opTypes.ts +1 -1
- package/src/lib/opContext/spanContextTypes.ts +98 -17
- package/src/lib/opContext/types.ts +7 -3
- package/src/lib/physicalLayoutPlan.ts +598 -0
- package/src/lib/resolveMessage.ts +67 -0
- package/src/lib/result.ts +20 -33
- package/src/lib/runtimeHint.ts +98 -0
- package/src/lib/schema/__tests__/featureFlags.test.ts +2 -1
- package/src/lib/schema/builder.ts +1 -1
- package/src/lib/schema/types.ts +1 -1
- package/src/lib/span-buffer/aot/v1.ts +26 -0
- package/src/lib/spanBuffer.ts +658 -92
- package/src/lib/spanBufferStats.ts +1 -1
- package/src/lib/spanContext.ts +1350 -861
- package/src/lib/sqlite/sqlite-common.ts +20 -31
- package/src/lib/testing/__tests__/topology-traversal.test.ts +174 -0
- package/src/lib/testing/__tests__/vitest-harness.test.ts +2 -1
- package/src/lib/testing/bun-harness.ts +94 -43
- package/src/lib/testing/extractFacts.ts +64 -78
- package/src/lib/testing/facts.ts +1 -1
- package/src/lib/testing/queryable-span.ts +23 -30
- package/src/lib/testing/span-query.ts +16 -20
- package/src/lib/testing/stdio-replay.ts +25 -8
- package/src/lib/testing/vitest-harness.ts +1 -1
- package/src/lib/threadId.ts +6 -3
- package/src/lib/traceRoot.es.ts +77 -42
- package/src/lib/traceRoot.node.ts +75 -46
- package/src/lib/traceRoot.ts +41 -14
- package/src/lib/traceTopology.ts +279 -0
- package/src/lib/tracer.ts +109 -98
- package/src/lib/tracers/ArrayQueueTracer.ts +1 -1
- package/src/lib/tracers/StdioTracer.ts +15 -13
- package/src/lib/tracers/TestTracer.ts +6 -8
- package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +15 -10
- package/src/lib/tracers/__tests__/TestTracer.test.ts +23 -13
- package/src/lib/types.ts +64 -33
- package/src/lib/vocabularyRegistry.ts +439 -0
- package/src/lib/wasm/WasmBufferStrategy.ts +56 -48
- package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +215 -11
- package/src/lib/wasm/__tests__/allocatorFreeBlockClamp.test.ts +86 -0
- package/src/lib/wasm/__tests__/wasm-identity-view.test.ts +311 -0
- package/src/lib/wasm/__tests__/wasm-integration.test.ts +417 -44
- package/src/lib/wasm/__tests__/wasm-message-buffer-families.test.ts +588 -0
- package/src/lib/wasm/__tests__/wasmAllocator.test.ts +100 -668
- package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +419 -63
- package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +24 -29
- package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +2 -2
- package/src/lib/wasm/wasmAllocator.ts +131 -96
- package/src/lib/wasm/wasmPhysicalLayout.ts +309 -0
- package/src/lib/wasm/wasmSpanBuffer.ts +597 -341
- package/src/lib/wasm/wasmTraceRoot.ts +140 -78
- package/src/vocabulary/register/v1.ts +1 -0
- package/src/wasm.ts +19 -0
- package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +0 -319
- package/src/lib/__tests__/remapped-buffer-view.test.ts +0 -635
- package/src/lib/wasm/allocator.zig +0 -948
|
@@ -7,6 +7,7 @@ import { describe, expect, it } from 'bun:test';
|
|
|
7
7
|
import { Nanoseconds } from '@smoothbricks/arrow-builder';
|
|
8
8
|
import { convertSpanTreeToArrowTable } from '../convertToArrow.js';
|
|
9
9
|
import { defineOpContext } from '../defineOpContext.js';
|
|
10
|
+
import { resolveEntryType, resolveMessage } from '../resolveMessage.js';
|
|
10
11
|
import { defineCodeError } from '../result.js';
|
|
11
12
|
import { S } from '../schema/builder.js';
|
|
12
13
|
import { defineLogSchema } from '../schema/defineLogSchema.js';
|
|
@@ -135,12 +136,13 @@ describe('Span Lifecycle', () => {
|
|
|
135
136
|
|
|
136
137
|
it('should support spanSync for synchronous child spans', async () => {
|
|
137
138
|
const tracer = new TestTracer(ctx, { ...createTestTracerOptions() });
|
|
139
|
+
const childOp = ctx.defineOp('sync-child-op', (childCtx) => {
|
|
140
|
+
childCtx.tag.spanName('sync-child');
|
|
141
|
+
return childCtx.ok('child-ok');
|
|
142
|
+
});
|
|
138
143
|
|
|
139
144
|
const result = await tracer.trace('root-task', async (rootCtx) => {
|
|
140
|
-
const childResult = rootCtx.spanSync('sync-child',
|
|
141
|
-
childCtx.tag.spanName('sync-child');
|
|
142
|
-
return childCtx.ok('child-ok');
|
|
143
|
-
});
|
|
145
|
+
const childResult = rootCtx.spanSync('sync-child', childOp);
|
|
144
146
|
|
|
145
147
|
expect(childResult).not.toBeInstanceOf(Promise);
|
|
146
148
|
expect(childResult.success).toBe(true);
|
|
@@ -496,8 +498,8 @@ describe('Fixed Row Layout', () => {
|
|
|
496
498
|
|
|
497
499
|
expect(result.success).toBe(true);
|
|
498
500
|
expect(capturedBuffer).toBeDefined();
|
|
499
|
-
expect(capturedBuffer
|
|
500
|
-
expect(capturedBuffer
|
|
501
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
|
|
502
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
|
|
501
503
|
});
|
|
502
504
|
|
|
503
505
|
it('should have span-start at row 0 and span-err at row 1 after ctx.err()', async () => {
|
|
@@ -511,8 +513,8 @@ describe('Fixed Row Layout', () => {
|
|
|
511
513
|
|
|
512
514
|
expect(result.success).toBe(false);
|
|
513
515
|
expect(capturedBuffer).toBeDefined();
|
|
514
|
-
expect(capturedBuffer
|
|
515
|
-
expect(capturedBuffer
|
|
516
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
|
|
517
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_ERR);
|
|
516
518
|
});
|
|
517
519
|
|
|
518
520
|
it('should write ok fluent result attributes directly to row 1', async () => {
|
|
@@ -529,7 +531,7 @@ describe('Fixed Row Layout', () => {
|
|
|
529
531
|
throw new Error('capturedBuffer is undefined');
|
|
530
532
|
}
|
|
531
533
|
|
|
532
|
-
expect(capturedBuffer
|
|
534
|
+
expect(resolveMessage(capturedBuffer, 1)).toBe('completed');
|
|
533
535
|
expect(capturedBuffer.userId_values[1]).toBe('user-1');
|
|
534
536
|
expect(capturedBuffer.operation_values[1]).toBe(0);
|
|
535
537
|
expect(capturedBuffer.line_values[1]).toBe(42);
|
|
@@ -553,7 +555,7 @@ describe('Fixed Row Layout', () => {
|
|
|
553
555
|
throw new Error('capturedBuffer is undefined');
|
|
554
556
|
}
|
|
555
557
|
|
|
556
|
-
expect(capturedBuffer
|
|
558
|
+
expect(resolveMessage(capturedBuffer, 1)).toBe('failed');
|
|
557
559
|
expect(capturedBuffer.userId_values[1]).toBe('user-2');
|
|
558
560
|
expect(capturedBuffer.error_code_values[1]).toBe('VALIDATION_ERROR');
|
|
559
561
|
expect(capturedBuffer.line_values[1]).toBe(99);
|
|
@@ -571,8 +573,8 @@ describe('Fixed Row Layout', () => {
|
|
|
571
573
|
}),
|
|
572
574
|
).rejects.toThrow('Unexpected failure');
|
|
573
575
|
expect(capturedBuffer).toBeDefined();
|
|
574
|
-
expect(capturedBuffer
|
|
575
|
-
expect(capturedBuffer
|
|
576
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
|
|
577
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_EXCEPTION);
|
|
576
578
|
});
|
|
577
579
|
|
|
578
580
|
it('should start writeIndex at 2 after span-start is written', async () => {
|
|
@@ -660,21 +662,47 @@ describe('Fixed Row Layout', () => {
|
|
|
660
662
|
expect(buffer._spanStartTime).toBe(Nanoseconds.unsafe(111n));
|
|
661
663
|
});
|
|
662
664
|
|
|
663
|
-
it('
|
|
664
|
-
|
|
665
|
-
|
|
665
|
+
it('preserves strict chronological timestamps across root overflow and a child span', async () => {
|
|
666
|
+
let rootBuffer: AnySpanBuffer | undefined;
|
|
667
|
+
let childBuffer: AnySpanBuffer | undefined;
|
|
668
|
+
const { trace } = new TestTracer(ctx, { ...createTestTracerOptions() });
|
|
666
669
|
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
670
|
+
await trace('timestamp-order-root', async (root) => {
|
|
671
|
+
rootBuffer = root.buffer;
|
|
672
|
+
for (let i = 0; i < 100; i++) root.log.info(`root-${i}`);
|
|
673
|
+
await root.span('timestamp-order-child', async (child) => {
|
|
674
|
+
childBuffer = child.buffer;
|
|
675
|
+
for (let i = 0; i < 100; i++) child.log.info(`child-${i}`);
|
|
676
|
+
return child.ok('child done');
|
|
677
|
+
});
|
|
678
|
+
return root.ok('root done');
|
|
679
|
+
});
|
|
672
680
|
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
681
|
+
if (!rootBuffer || !childBuffer) throw new Error('trace did not expose both lifecycle buffers');
|
|
682
|
+
expect(rootBuffer._overflow).toBeDefined();
|
|
683
|
+
expect(childBuffer._overflow).toBeDefined();
|
|
684
|
+
|
|
685
|
+
const chronological: bigint[] = [rootBuffer.timestamp[0]];
|
|
686
|
+
let segment: AnySpanBuffer | undefined = rootBuffer;
|
|
687
|
+
let first = true;
|
|
688
|
+
while (segment) {
|
|
689
|
+
for (let row = first ? 2 : 0; row < segment._writeIndex; row++) chronological.push(segment.timestamp[row]);
|
|
690
|
+
first = false;
|
|
691
|
+
segment = segment._overflow;
|
|
692
|
+
}
|
|
693
|
+
chronological.push(childBuffer.timestamp[0]);
|
|
694
|
+
segment = childBuffer;
|
|
695
|
+
first = true;
|
|
696
|
+
while (segment) {
|
|
697
|
+
for (let row = first ? 2 : 0; row < segment._writeIndex; row++) chronological.push(segment.timestamp[row]);
|
|
698
|
+
first = false;
|
|
699
|
+
segment = segment._overflow;
|
|
700
|
+
}
|
|
701
|
+
chronological.push(childBuffer.timestamp[1], rootBuffer.timestamp[1]);
|
|
677
702
|
|
|
678
|
-
expect(
|
|
703
|
+
expect(chronological).toHaveLength(204);
|
|
704
|
+
for (let i = 1; i < chronological.length; i++) {
|
|
705
|
+
expect(chronological[i]).toBeGreaterThan(chronological[i - 1]);
|
|
706
|
+
}
|
|
679
707
|
});
|
|
680
708
|
});
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parity suite: SpanBuffer classes built by arrow-builder's compiled
|
|
3
|
+
* (new Function) materializer versus the closure-composed (no-eval)
|
|
4
|
+
* materializer MUST be byte-identical in observable behavior. The closure
|
|
5
|
+
* path — driven by the closureInit/closureMethods extension counterparts in
|
|
6
|
+
* spanBuffer.ts — is what production workerd runs, so any divergence here is
|
|
7
|
+
* a production bug.
|
|
8
|
+
*
|
|
9
|
+
* Non-deterministic state is normalized: span_id bytes inside _identity
|
|
10
|
+
* (global counter), thread id (compared for equality of layout, not value —
|
|
11
|
+
* it IS process-stable so compared directly), wall-clock timestamps are
|
|
12
|
+
* written explicitly so lanes stay deterministic.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { afterEach, describe, expect, it } from 'bun:test';
|
|
16
|
+
import { type MaterializerMode, setMaterializerModeOverride } from '@smoothbricks/arrow-builder';
|
|
17
|
+
import { createOpMetadata } from '../opContext/defineOp.js';
|
|
18
|
+
import type { MessageLayoutFamily, MessagePhysicalLayout } from '../runtimeHint.js';
|
|
19
|
+
import { S } from '../schema/builder.js';
|
|
20
|
+
import { LogSchema } from '../schema/LogSchema.js';
|
|
21
|
+
import { mergeWithSystemSchema } from '../schema/systemSchema.js';
|
|
22
|
+
import { createChildSpanBuffer, createOverflowBuffer, createSpanBuffer, getSpanBufferClass } from '../spanBuffer.js';
|
|
23
|
+
import type { AnySpanBuffer } from '../types.js';
|
|
24
|
+
import { createTestTraceRoot } from './test-helpers.js';
|
|
25
|
+
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
setMaterializerModeOverride(undefined);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
function withMode<T>(mode: MaterializerMode, fn: () => T): T {
|
|
31
|
+
setMaterializerModeOverride(mode);
|
|
32
|
+
try {
|
|
33
|
+
return fn();
|
|
34
|
+
} finally {
|
|
35
|
+
setMaterializerModeOverride(undefined);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const OP_METADATA = createOpMetadata('parity-op', '@test/parity', 'parity.test.ts', 'deadbeef', 7);
|
|
40
|
+
|
|
41
|
+
const FAMILIES: readonly MessageLayoutFamily[] = ['mixed', 'static-only', 'dynamic-only'];
|
|
42
|
+
const PHYSICALS: readonly MessagePhysicalLayout[] = ['current', 'specialized', 'packed'];
|
|
43
|
+
|
|
44
|
+
function makeSchema(): LogSchema {
|
|
45
|
+
return new LogSchema(
|
|
46
|
+
mergeWithSystemSchema({
|
|
47
|
+
userId: S.category(),
|
|
48
|
+
operation: S.enum(['SELECT', 'INSERT', 'UPDATE', 'DELETE']),
|
|
49
|
+
duration: S.number(),
|
|
50
|
+
success: S.boolean(),
|
|
51
|
+
}),
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function callMethod(target: object, name: string, ...args: unknown[]): unknown {
|
|
56
|
+
const method = Reflect.get(target, name);
|
|
57
|
+
if (typeof method !== 'function') throw new Error(`Missing method: ${name}`);
|
|
58
|
+
return Reflect.apply(method, target, args);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Deterministic write script driving generated setters and system lanes. */
|
|
62
|
+
function fillBuffer(buffer: AnySpanBuffer): void {
|
|
63
|
+
callMethod(buffer, 'message', 0, 'span-name');
|
|
64
|
+
if (buffer._messageLayoutFamily === 'static-only') callMethod(buffer, 'message', 1, 'terminal');
|
|
65
|
+
else callMethod(buffer, 'message', 2, 'log-entry');
|
|
66
|
+
buffer.timestamp[0] = 1000n;
|
|
67
|
+
buffer.timestamp[2] = 2000n;
|
|
68
|
+
if (buffer.entry_type) buffer.entry_type[2] = 5;
|
|
69
|
+
if (buffer._rowHeaders) buffer._rowHeaders[2] = (7 << 8) | 5;
|
|
70
|
+
if (buffer._messageIds) buffer._messageIds[2] = 3;
|
|
71
|
+
if (buffer._logHeaders) buffer._logHeaders[2] = 9;
|
|
72
|
+
callMethod(buffer, 'userId', 2, 'alice');
|
|
73
|
+
callMethod(buffer, 'userId', 3, 'bob');
|
|
74
|
+
callMethod(buffer, 'operation', 2, 1);
|
|
75
|
+
callMethod(buffer, 'duration', 2, 12.5);
|
|
76
|
+
callMethod(buffer, 'success', 2, true);
|
|
77
|
+
callMethod(buffer, 'success', 3, false);
|
|
78
|
+
callMethod(buffer, 'duration', 3, null);
|
|
79
|
+
callMethod(buffer, 'line', 2, 42);
|
|
80
|
+
callMethod(buffer, 'uint64_value', 2, 99n);
|
|
81
|
+
buffer._writeIndex = 4;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function snapshotTypedArray(view: unknown): unknown {
|
|
85
|
+
if (view === undefined || view === null) return view;
|
|
86
|
+
if (ArrayBuffer.isView(view) && !(view instanceof DataView)) {
|
|
87
|
+
return {
|
|
88
|
+
ctor: view.constructor.name,
|
|
89
|
+
bytes: Array.from(new Uint8Array(view.buffer, view.byteOffset, view.byteLength)),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
return { unexpected: String(view) };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const SCHEMA_COLUMNS = ['userId', 'operation', 'duration', 'success', 'line', 'uint64_value', 'error_code'] as const;
|
|
96
|
+
|
|
97
|
+
/** Normalized observable state; span-id bytes in _identity are zeroed (global counter). */
|
|
98
|
+
function snapshotBuffer(buffer: AnySpanBuffer): Record<string, unknown> {
|
|
99
|
+
const identity = Array.from(buffer._identity);
|
|
100
|
+
for (let i = 8; i < 12 && i < identity.length; i++) identity[i] = 0;
|
|
101
|
+
const snapshot: Record<string, unknown> = {
|
|
102
|
+
capacity: buffer._capacity,
|
|
103
|
+
writeIndex: buffer._writeIndex,
|
|
104
|
+
identity,
|
|
105
|
+
threadId: buffer.thread_id,
|
|
106
|
+
traceId: buffer.trace_id,
|
|
107
|
+
spanStartTime: buffer._spanStartTime,
|
|
108
|
+
lastLoggedTime: buffer._lastLoggedTime,
|
|
109
|
+
hasParent: Reflect.get(buffer, '_hasParent'),
|
|
110
|
+
parentThreadId: buffer.parent_thread_id,
|
|
111
|
+
statsSealed: buffer._statsSealed,
|
|
112
|
+
statsReservedRows: buffer._statsReservedRows,
|
|
113
|
+
scopeValues: buffer._scopeValues,
|
|
114
|
+
spanName: buffer._spanName,
|
|
115
|
+
terminalMessage: buffer._terminalMessage,
|
|
116
|
+
messageValues: buffer.message_values ? [...buffer.message_values] : undefined,
|
|
117
|
+
timestamp: snapshotTypedArray(buffer.timestamp),
|
|
118
|
+
entryType: snapshotTypedArray(buffer.entry_type),
|
|
119
|
+
messageIds: snapshotTypedArray(buffer._messageIds),
|
|
120
|
+
logHeaders: snapshotTypedArray(buffer._logHeaders),
|
|
121
|
+
rowHeaders: snapshotTypedArray(buffer._rowHeaders),
|
|
122
|
+
systemByteLength: buffer._system.byteLength,
|
|
123
|
+
};
|
|
124
|
+
for (const column of SCHEMA_COLUMNS) {
|
|
125
|
+
const values = buffer.getColumnIfAllocated(column);
|
|
126
|
+
const nulls = buffer.getNullsIfAllocated(column);
|
|
127
|
+
snapshot[`${column}.values`] = Array.isArray(values) ? [...values] : snapshotTypedArray(values);
|
|
128
|
+
snapshot[`${column}.nulls`] = nulls === undefined ? undefined : Array.from(nulls);
|
|
129
|
+
}
|
|
130
|
+
return snapshot;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
interface FamilySnapshots {
|
|
134
|
+
root: Record<string, unknown>;
|
|
135
|
+
child: Record<string, unknown>;
|
|
136
|
+
chained: Record<string, unknown>;
|
|
137
|
+
identitySharedWithRoot: boolean;
|
|
138
|
+
prototypeShared: boolean;
|
|
139
|
+
statics: Record<string, unknown>;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function buildAndSnapshot(
|
|
143
|
+
mode: MaterializerMode,
|
|
144
|
+
schema: LogSchema,
|
|
145
|
+
family: MessageLayoutFamily,
|
|
146
|
+
physical: MessagePhysicalLayout,
|
|
147
|
+
): FamilySnapshots {
|
|
148
|
+
return withMode(mode, () => {
|
|
149
|
+
const SpanBufferClass = getSpanBufferClass(schema, family, physical);
|
|
150
|
+
SpanBufferClass.stats.capacity = 16;
|
|
151
|
+
SpanBufferClass.stats.totalWrites = 0;
|
|
152
|
+
SpanBufferClass.stats.spansCreated = 0;
|
|
153
|
+
const traceRoot = createTestTraceRoot(`parity-${family}-${physical}`);
|
|
154
|
+
|
|
155
|
+
const root = createSpanBuffer(schema, traceRoot, OP_METADATA, 16, SpanBufferClass);
|
|
156
|
+
fillBuffer(root);
|
|
157
|
+
const child = createChildSpanBuffer(root, SpanBufferClass, OP_METADATA, OP_METADATA, 16);
|
|
158
|
+
fillBuffer(child);
|
|
159
|
+
const chained = createOverflowBuffer(root);
|
|
160
|
+
fillBuffer(chained);
|
|
161
|
+
callMethod(root, '_sealStatsChain');
|
|
162
|
+
|
|
163
|
+
return {
|
|
164
|
+
root: snapshotBuffer(root),
|
|
165
|
+
child: snapshotBuffer(child),
|
|
166
|
+
chained: snapshotBuffer(chained),
|
|
167
|
+
identitySharedWithRoot: chained._identity === root._identity,
|
|
168
|
+
prototypeShared: Object.getPrototypeOf(root) === Object.getPrototypeOf(chained),
|
|
169
|
+
statics: {
|
|
170
|
+
family: SpanBufferClass.messageLayoutFamily,
|
|
171
|
+
physical: SpanBufferClass.messagePhysicalLayout,
|
|
172
|
+
totalWrites: SpanBufferClass.stats.totalWrites,
|
|
173
|
+
spansCreated: SpanBufferClass.stats.spansCreated,
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
describe('SpanBuffer materializer parity (compiled vs closure-composed)', () => {
|
|
180
|
+
for (const family of FAMILIES) {
|
|
181
|
+
for (const physical of PHYSICALS) {
|
|
182
|
+
it(`root/child/chained buffers are byte-identical: ${family} x ${physical}`, () => {
|
|
183
|
+
const schema = makeSchema();
|
|
184
|
+
const compiled = buildAndSnapshot('compiled', schema, family, physical);
|
|
185
|
+
const closure = buildAndSnapshot('closure', schema, family, physical);
|
|
186
|
+
expect(closure).toEqual(compiled);
|
|
187
|
+
// Anti-vacuity: the scripts really wrote rows and sealed stats.
|
|
188
|
+
expect(closure.root.writeIndex).toBe(4);
|
|
189
|
+
expect(closure.statics.totalWrites).toBeGreaterThan(0);
|
|
190
|
+
expect(closure.identitySharedWithRoot).toBe(true);
|
|
191
|
+
expect(closure.prototypeShared).toBe(true);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
it('caches classes per materializer mode without cross-mode pollution', () => {
|
|
197
|
+
const schema = makeSchema();
|
|
198
|
+
const Compiled = withMode('compiled', () => getSpanBufferClass(schema));
|
|
199
|
+
const Closure = withMode('closure', () => getSpanBufferClass(schema));
|
|
200
|
+
expect(Compiled).not.toBe(Closure);
|
|
201
|
+
expect(withMode('compiled', () => getSpanBufferClass(schema))).toBe(Compiled);
|
|
202
|
+
expect(withMode('closure', () => getSpanBufferClass(schema))).toBe(Closure);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('exposes identical extension-member descriptors on both prototypes', () => {
|
|
206
|
+
const schema = makeSchema();
|
|
207
|
+
const memberNames = [
|
|
208
|
+
'span_id',
|
|
209
|
+
'thread_id',
|
|
210
|
+
'trace_id',
|
|
211
|
+
'_spanStartTime',
|
|
212
|
+
'_lastLoggedTime',
|
|
213
|
+
'_hasParent',
|
|
214
|
+
'parent_span_id',
|
|
215
|
+
'parent_thread_id',
|
|
216
|
+
'isParentOf',
|
|
217
|
+
'isChildOf',
|
|
218
|
+
'copyThreadIdTo',
|
|
219
|
+
'copyParentThreadIdTo',
|
|
220
|
+
'_logSchema',
|
|
221
|
+
'_messageLayoutFamily',
|
|
222
|
+
'_messagePhysicalLayout',
|
|
223
|
+
'_columns',
|
|
224
|
+
'_stats',
|
|
225
|
+
'_sealStats',
|
|
226
|
+
'_sealStatsChain',
|
|
227
|
+
'getOrCreateOverflow',
|
|
228
|
+
'message',
|
|
229
|
+
];
|
|
230
|
+
const describeMembers = (proto: object) =>
|
|
231
|
+
memberNames.map((name) => {
|
|
232
|
+
const descriptor = Object.getOwnPropertyDescriptor(proto, name);
|
|
233
|
+
if (!descriptor) return { name, missing: true };
|
|
234
|
+
return {
|
|
235
|
+
name,
|
|
236
|
+
kind: descriptor.get ? 'getter' : typeof descriptor.value,
|
|
237
|
+
enumerable: descriptor.enumerable,
|
|
238
|
+
configurable: descriptor.configurable,
|
|
239
|
+
writable: descriptor.writable,
|
|
240
|
+
};
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
const compiled = withMode('compiled', () => describeMembers(getSpanBufferClass(schema).prototype));
|
|
244
|
+
const closure = withMode('closure', () => describeMembers(getSpanBufferClass(schema).prototype));
|
|
245
|
+
expect(closure).toEqual(compiled);
|
|
246
|
+
expect(compiled.some((member) => 'missing' in member)).toBe(false);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it('enforces the static-only message row guard identically', () => {
|
|
250
|
+
const schema = makeSchema();
|
|
251
|
+
const messageFor = (mode: MaterializerMode) =>
|
|
252
|
+
withMode(mode, () => {
|
|
253
|
+
const SpanBufferClass = getSpanBufferClass(schema, 'static-only', 'current');
|
|
254
|
+
const traceRoot = createTestTraceRoot(`static-guard-${mode}`);
|
|
255
|
+
const buffer = createSpanBuffer(schema, traceRoot, OP_METADATA, 16, SpanBufferClass);
|
|
256
|
+
try {
|
|
257
|
+
callMethod(buffer, 'message', 2, 'not allowed');
|
|
258
|
+
} catch (error) {
|
|
259
|
+
return error instanceof Error ? `${error.constructor.name}: ${error.message}` : String(error);
|
|
260
|
+
}
|
|
261
|
+
throw new Error('expected the static-only message guard to throw');
|
|
262
|
+
});
|
|
263
|
+
expect(messageFor('closure')).toBe(messageFor('compiled'));
|
|
264
|
+
expect(messageFor('closure')).toContain('rows 0 and 1');
|
|
265
|
+
});
|
|
266
|
+
});
|
|
@@ -14,6 +14,7 @@ import { describe, expect, it } from 'bun:test';
|
|
|
14
14
|
// Must import test-helpers first to initialize timestamp implementation
|
|
15
15
|
import './test-helpers.js';
|
|
16
16
|
import { defineOpContext } from '../defineOpContext.js';
|
|
17
|
+
import { resolveEntryType } from '../resolveMessage.js';
|
|
17
18
|
import { S } from '../schema/builder.js';
|
|
18
19
|
import { defineLogSchema } from '../schema/defineLogSchema.js';
|
|
19
20
|
import { ENTRY_TYPE_SPAN_EXCEPTION, ENTRY_TYPE_SPAN_OK, ENTRY_TYPE_SPAN_START } from '../schema/systemSchema.js';
|
|
@@ -43,7 +44,7 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
43
44
|
capturedBuffer = ctx.buffer;
|
|
44
45
|
|
|
45
46
|
// At this point, span-start is written (row 0)
|
|
46
|
-
expect(ctx.buffer
|
|
47
|
+
expect(resolveEntryType(ctx.buffer, 0)).toBe(ENTRY_TYPE_SPAN_START);
|
|
47
48
|
|
|
48
49
|
// Row 1 not yet written (happens after function returns)
|
|
49
50
|
return { success: true, value: 42 };
|
|
@@ -54,8 +55,8 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
54
55
|
|
|
55
56
|
// span-ok should be written to row 1 immediately after sync function returns
|
|
56
57
|
expect(capturedBuffer).toBeDefined();
|
|
57
|
-
expect(capturedBuffer
|
|
58
|
-
expect(capturedBuffer
|
|
58
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
|
|
59
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
|
|
59
60
|
|
|
60
61
|
// Timestamp should be written
|
|
61
62
|
expect(capturedBuffer?.timestamp[1]).toBeGreaterThan(0n);
|
|
@@ -78,7 +79,7 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
78
79
|
capturedBuffer = ctx.buffer;
|
|
79
80
|
|
|
80
81
|
// span-start written at row 0
|
|
81
|
-
expect(ctx.buffer
|
|
82
|
+
expect(resolveEntryType(ctx.buffer, 0)).toBe(ENTRY_TYPE_SPAN_START);
|
|
82
83
|
|
|
83
84
|
throw testError;
|
|
84
85
|
});
|
|
@@ -86,8 +87,8 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
86
87
|
|
|
87
88
|
// span-exception should be written to row 1 immediately
|
|
88
89
|
expect(capturedBuffer).toBeDefined();
|
|
89
|
-
expect(capturedBuffer
|
|
90
|
-
expect(capturedBuffer
|
|
90
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
|
|
91
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_EXCEPTION);
|
|
91
92
|
|
|
92
93
|
// Exception details should be written
|
|
93
94
|
expect(capturedBuffer?.timestamp[1]).toBeGreaterThan(0n);
|
|
@@ -114,7 +115,7 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
114
115
|
capturedBuffer = ctx.buffer;
|
|
115
116
|
|
|
116
117
|
// span-start is written at row 0
|
|
117
|
-
expect(ctx.buffer
|
|
118
|
+
expect(resolveEntryType(ctx.buffer, 0)).toBe(ENTRY_TYPE_SPAN_START);
|
|
118
119
|
|
|
119
120
|
// Row 1 not yet written (will be written after Promise resolves)
|
|
120
121
|
// At this point, entry_type[1] may be 0 or pre-initialized
|
|
@@ -142,8 +143,8 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
142
143
|
|
|
143
144
|
// After Promise resolves, span-ok should be written to row 1
|
|
144
145
|
expect(capturedBuffer).toBeDefined();
|
|
145
|
-
expect(capturedBuffer
|
|
146
|
-
expect(capturedBuffer
|
|
146
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
|
|
147
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
|
|
147
148
|
|
|
148
149
|
// Timestamp should be written
|
|
149
150
|
expect(capturedBuffer?.timestamp[1]).toBeGreaterThan(0n);
|
|
@@ -166,7 +167,7 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
166
167
|
capturedBuffer = ctx.buffer;
|
|
167
168
|
|
|
168
169
|
// span-start written at row 0
|
|
169
|
-
expect(ctx.buffer
|
|
170
|
+
expect(resolveEntryType(ctx.buffer, 0)).toBe(ENTRY_TYPE_SPAN_START);
|
|
170
171
|
|
|
171
172
|
// Simulate async work before error
|
|
172
173
|
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
@@ -190,8 +191,8 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
190
191
|
|
|
191
192
|
// After Promise rejects, span-exception should be written to row 1
|
|
192
193
|
expect(capturedBuffer).toBeDefined();
|
|
193
|
-
expect(capturedBuffer
|
|
194
|
-
expect(capturedBuffer
|
|
194
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 0) : undefined).toBe(ENTRY_TYPE_SPAN_START);
|
|
195
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_EXCEPTION);
|
|
195
196
|
|
|
196
197
|
// Timestamp should be written
|
|
197
198
|
expect(capturedBuffer?.timestamp[1]).toBeGreaterThan(0n);
|
|
@@ -227,8 +228,8 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
227
228
|
|
|
228
229
|
// Both buffers should have span-ok written
|
|
229
230
|
expect(buffers.length).toBe(2);
|
|
230
|
-
expect(buffers[0]
|
|
231
|
-
expect(buffers[1]
|
|
231
|
+
expect(resolveEntryType(buffers[0], 1)).toBe(ENTRY_TYPE_SPAN_OK);
|
|
232
|
+
expect(resolveEntryType(buffers[1], 1)).toBe(ENTRY_TYPE_SPAN_OK);
|
|
232
233
|
|
|
233
234
|
// Both traces should be collected
|
|
234
235
|
expect(tracer.rootBuffers.length).toBe(2);
|
|
@@ -270,8 +271,8 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
270
271
|
|
|
271
272
|
// Both buffers should have span-ok written
|
|
272
273
|
expect(buffers.length).toBe(2);
|
|
273
|
-
expect(buffers[0]
|
|
274
|
-
expect(buffers[1]
|
|
274
|
+
expect(resolveEntryType(buffers[0], 1)).toBe(ENTRY_TYPE_SPAN_OK);
|
|
275
|
+
expect(resolveEntryType(buffers[1], 1)).toBe(ENTRY_TYPE_SPAN_OK);
|
|
275
276
|
|
|
276
277
|
// Both traces should be collected
|
|
277
278
|
expect(tracer.rootBuffers.length).toBe(2);
|
|
@@ -315,9 +316,9 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
315
316
|
|
|
316
317
|
// All three buffers should have span-ok
|
|
317
318
|
expect(buffers.length).toBe(3);
|
|
318
|
-
expect(buffers[0]
|
|
319
|
-
expect(buffers[1]
|
|
320
|
-
expect(buffers[2]
|
|
319
|
+
expect(resolveEntryType(buffers[0], 1)).toBe(ENTRY_TYPE_SPAN_OK);
|
|
320
|
+
expect(resolveEntryType(buffers[1], 1)).toBe(ENTRY_TYPE_SPAN_OK);
|
|
321
|
+
expect(resolveEntryType(buffers[2], 1)).toBe(ENTRY_TYPE_SPAN_OK);
|
|
321
322
|
|
|
322
323
|
// All three traces should be collected
|
|
323
324
|
expect(tracer.rootBuffers.length).toBe(3);
|
|
@@ -347,7 +348,7 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
347
348
|
expect(result).toEqual({ id: 123 });
|
|
348
349
|
|
|
349
350
|
// span-ok should be written
|
|
350
|
-
expect(capturedBuffer
|
|
351
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
|
|
351
352
|
});
|
|
352
353
|
|
|
353
354
|
it('should support tags in async trace', async () => {
|
|
@@ -374,7 +375,7 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
374
375
|
expect(result).toEqual({ id: 123 });
|
|
375
376
|
|
|
376
377
|
// span-ok should be written after Promise resolves
|
|
377
|
-
expect(capturedBuffer
|
|
378
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
|
|
378
379
|
});
|
|
379
380
|
|
|
380
381
|
it('should support logging in sync trace', () => {
|
|
@@ -399,7 +400,7 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
399
400
|
expect(result).toBe('done');
|
|
400
401
|
|
|
401
402
|
// span-ok at row 1
|
|
402
|
-
expect(capturedBuffer
|
|
403
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
|
|
403
404
|
|
|
404
405
|
// Events logged at rows 2+ (verified by successful completion)
|
|
405
406
|
});
|
|
@@ -429,7 +430,7 @@ describe('Sync/Async Trace Execution', () => {
|
|
|
429
430
|
expect(result).toBe('done');
|
|
430
431
|
|
|
431
432
|
// span-ok at row 1 (written after Promise resolves)
|
|
432
|
-
expect(capturedBuffer
|
|
433
|
+
expect(capturedBuffer ? resolveEntryType(capturedBuffer, 1) : undefined).toBe(ENTRY_TYPE_SPAN_OK);
|
|
433
434
|
});
|
|
434
435
|
});
|
|
435
436
|
});
|