@smoothbricks/lmao 0.2.2 → 0.3.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/README.md +206 -206
- 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 +33 -18
- 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/typeGuards.d.ts +7 -47
- package/dist/lib/schema/typeGuards.d.ts.map +1 -1
- package/dist/lib/schema/typeGuards.js +7 -123
- 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/traceContext.d.ts.map +1 -1
- package/dist/lib/traceContext.js +1 -4
- 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 +122 -24
- 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/typeGuards.ts +7 -151
- 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/traceContext.ts +1 -6
- 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__/CompositeTracer.test.ts +150 -0
- 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
package/dist/lib/tracer.js
CHANGED
|
@@ -58,15 +58,14 @@
|
|
|
58
58
|
*
|
|
59
59
|
* @module tracer
|
|
60
60
|
*/
|
|
61
|
-
import { createTagWriter } from './codegen/fixedPositionWriterGenerator.js';
|
|
62
|
-
import { createSpanLogger as createSpanLoggerFromGenerator } from './codegen/spanLoggerGenerator.js';
|
|
63
61
|
import { Op } from './op.js';
|
|
64
62
|
import { createOpMetadata } from './opContext/defineOp.js';
|
|
63
|
+
import { getPhysicalLayoutPlan, sealCallsitePlan, } from './physicalLayoutPlan.js';
|
|
65
64
|
import { Err, Ok } from './result.js';
|
|
66
65
|
import { createFeatureFlagEvaluator, InMemoryFlagEvaluator } from './schema/evaluator.js';
|
|
67
66
|
import { ENTRY_TYPE_SPAN_EXCEPTION, ENTRY_TYPE_SPAN_OK } from './schema/systemSchema.js';
|
|
68
|
-
import { EMPTY_SCOPE } from './spanBuffer.js';
|
|
69
|
-
import { createSpanContextClass,
|
|
67
|
+
import { EMPTY_SCOPE, getSpanBufferClass } from './spanBuffer.js';
|
|
68
|
+
import { createSpanContextClass, isPhysicalLayoutPlanForContext, writeSpanEnd, } from './spanContext.js';
|
|
70
69
|
import { generateTraceId, isValidTraceId } from './traceId.js';
|
|
71
70
|
function isTraceOverridesArg(value) {
|
|
72
71
|
return value !== null && typeof value === 'object' && !(value instanceof Op);
|
|
@@ -97,8 +96,10 @@ function isPromiseResult(value) {
|
|
|
97
96
|
export class Tracer {
|
|
98
97
|
logBinding;
|
|
99
98
|
SpanContextClass;
|
|
99
|
+
physicalLayoutPlan;
|
|
100
100
|
flagEvaluator;
|
|
101
101
|
ctxDefaults;
|
|
102
|
+
requiredCtxKeys;
|
|
102
103
|
deps;
|
|
103
104
|
createTraceRoot;
|
|
104
105
|
/**
|
|
@@ -111,18 +112,29 @@ export class Tracer {
|
|
|
111
112
|
this.logBinding = binding.logBinding;
|
|
112
113
|
this.bufferStrategy = options.bufferStrategy;
|
|
113
114
|
this.ctxDefaults = binding.ctxDefaults ?? EMPTY_SCOPE;
|
|
115
|
+
const userContextKeys = Object.keys(this.ctxDefaults).sort();
|
|
116
|
+
const requiredCtxKeys = [];
|
|
117
|
+
for (const key of userContextKeys) {
|
|
118
|
+
if (this.ctxDefaults[key] === null)
|
|
119
|
+
requiredCtxKeys.push(key);
|
|
120
|
+
}
|
|
121
|
+
this.requiredCtxKeys = requiredCtxKeys;
|
|
114
122
|
this.deps = binding.deps ?? EMPTY_SCOPE;
|
|
115
123
|
this.flagEvaluator = this._createFlagEvaluator(binding.flags, options.flagEvaluator);
|
|
116
124
|
this.createTraceRoot = options.createTraceRoot;
|
|
117
125
|
// Create SpanContext class for all contexts created by this tracer
|
|
118
126
|
// The class closes over schema/logBinding and provides typed methods
|
|
119
|
-
this.SpanContextClass = createSpanContextClass(binding.logBinding.logSchema, binding.logBinding);
|
|
127
|
+
this.SpanContextClass = createSpanContextClass(binding.logBinding.logSchema, binding.logBinding, undefined, userContextKeys);
|
|
128
|
+
this.physicalLayoutPlan = getPhysicalLayoutPlan(getSpanBufferClass(binding.logBinding.logSchema), 0, this.SpanContextClass, undefined, 'strategy-selected', userContextKeys.join('\u0000'));
|
|
120
129
|
// Bind methods for destructuring (per AGENTS.md - "Always destructure")
|
|
121
130
|
this.trace = this.trace.bind(this);
|
|
122
131
|
this.trace_op = this.trace_op.bind(this);
|
|
123
132
|
this.trace_fn = this.trace_fn.bind(this);
|
|
124
133
|
this.flush = this.flush.bind(this);
|
|
125
134
|
}
|
|
135
|
+
getFlagEvaluatorForContext() {
|
|
136
|
+
return this.flagEvaluator;
|
|
137
|
+
}
|
|
126
138
|
_createFlagEvaluator(flags, evaluator) {
|
|
127
139
|
const delegate = evaluator ?? new InMemoryFlagEvaluator(flags);
|
|
128
140
|
const boundEvaluator = {
|
|
@@ -165,23 +177,23 @@ export class Tracer {
|
|
|
165
177
|
if (fnOrOp instanceof Op) {
|
|
166
178
|
switch (argCount) {
|
|
167
179
|
case 0:
|
|
168
|
-
return this._trace_unknown_op(line, name, overrides, fnOrOp.
|
|
180
|
+
return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn);
|
|
169
181
|
case 1:
|
|
170
|
-
return this._trace_unknown_op(line, name, overrides, fnOrOp.
|
|
182
|
+
return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1]);
|
|
171
183
|
case 2:
|
|
172
|
-
return this._trace_unknown_op(line, name, overrides, fnOrOp.
|
|
184
|
+
return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2]);
|
|
173
185
|
case 3:
|
|
174
|
-
return this._trace_unknown_op(line, name, overrides, fnOrOp.
|
|
186
|
+
return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3]);
|
|
175
187
|
case 4:
|
|
176
|
-
return this._trace_unknown_op(line, name, overrides, fnOrOp.
|
|
188
|
+
return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4]);
|
|
177
189
|
case 5:
|
|
178
|
-
return this._trace_unknown_op(line, name, overrides, fnOrOp.
|
|
190
|
+
return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4], args[fnIdx + 5]);
|
|
179
191
|
case 6:
|
|
180
|
-
return this._trace_unknown_op(line, name, overrides, fnOrOp.
|
|
192
|
+
return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4], args[fnIdx + 5], args[fnIdx + 6]);
|
|
181
193
|
case 7:
|
|
182
|
-
return this._trace_unknown_op(line, name, overrides, fnOrOp.
|
|
194
|
+
return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4], args[fnIdx + 5], args[fnIdx + 6], args[fnIdx + 7]);
|
|
183
195
|
case 8:
|
|
184
|
-
return this._trace_unknown_op(line, name, overrides, fnOrOp.
|
|
196
|
+
return this._trace_unknown_op(line, name, overrides, fnOrOp.callsitePlan, fnOrOp.fn, args[fnIdx + 1], args[fnIdx + 2], args[fnIdx + 3], args[fnIdx + 4], args[fnIdx + 5], args[fnIdx + 6], args[fnIdx + 7], args[fnIdx + 8]);
|
|
185
197
|
default:
|
|
186
198
|
throw new Error(`trace() supports up to 8 op arguments, got ${argCount}`);
|
|
187
199
|
}
|
|
@@ -204,15 +216,22 @@ export class Tracer {
|
|
|
204
216
|
* Supports 0-8 arguments. The transformer rewrites trace() calls to this.
|
|
205
217
|
*/
|
|
206
218
|
_trace_op(line, name, overrides, op, ...opArgs) {
|
|
207
|
-
|
|
219
|
+
if (!isPhysicalLayoutPlanForContext(op.callsitePlan, this.logBinding.logSchema)) {
|
|
220
|
+
throw new TypeError('Op physical layout plan does not match this tracer context');
|
|
221
|
+
}
|
|
222
|
+
const ctx = this._createRootContext(line, name, overrides, op.callsitePlan);
|
|
208
223
|
return this._executeResultWithContext(ctx, (c) => op.fn(c, ...opArgs));
|
|
209
224
|
}
|
|
210
|
-
_trace_unknown_op(line, name, overrides,
|
|
211
|
-
const ctx = this._createRootContext(line, name, overrides,
|
|
225
|
+
_trace_unknown_op(line, name, overrides, callsitePlan, fn, ...opArgs) {
|
|
226
|
+
const ctx = this._createRootContext(line, name, overrides, callsitePlan);
|
|
212
227
|
return this._executeResultWithContext(ctx, (childCtx) => fn(childCtx, ...opArgs));
|
|
213
228
|
}
|
|
214
229
|
_trace_fn(line, name, overrides, fn) {
|
|
215
|
-
const
|
|
230
|
+
const metadata = Object.freeze({
|
|
231
|
+
...createOpMetadata('root', 'tracer', 'runtime', 'unknown', 0),
|
|
232
|
+
_physicalLayoutPlan: this.physicalLayoutPlan,
|
|
233
|
+
});
|
|
234
|
+
const ctx = this._createRootContext(line, name, overrides, sealCallsitePlan(this.physicalLayoutPlan, metadata));
|
|
216
235
|
return this._executeUnknownWithContext(ctx, fn);
|
|
217
236
|
}
|
|
218
237
|
_trace_unknown_fn(line, name, overrides, fn) {
|
|
@@ -234,68 +253,41 @@ export class Tracer {
|
|
|
234
253
|
// ===========================================================================
|
|
235
254
|
// Internal helpers
|
|
236
255
|
// ===========================================================================
|
|
237
|
-
_createRootContext(_line, name, overrides,
|
|
256
|
+
_createRootContext(_line, name, overrides, callsitePlan) {
|
|
238
257
|
// Extract trace_id from overrides if present
|
|
239
258
|
const traceId = isValidTraceId(overrides.trace_id) ? overrides.trace_id : generateTraceId();
|
|
240
|
-
const schema =
|
|
241
|
-
// Validate null-sentinel
|
|
242
|
-
|
|
243
|
-
const overrideRecord = { ...overrides };
|
|
244
|
-
const resolvedUserCtx = this._resolveUserContext(overrideRecord);
|
|
259
|
+
const schema = callsitePlan.schema;
|
|
260
|
+
// Validate required null-sentinel fields before allocating the trace root or buffer.
|
|
261
|
+
this._validateRequiredUserContext(overrides);
|
|
245
262
|
// Create TraceRoot via platform-specific factory
|
|
246
263
|
const traceRoot = this.createTraceRoot(traceId, this);
|
|
247
264
|
// Create root SpanBuffer with pre-built TraceRoot via strategy
|
|
248
|
-
const buffer = this.bufferStrategy.createSpanBuffer(schema, traceRoot,
|
|
249
|
-
metadata);
|
|
265
|
+
const buffer = this.bufferStrategy.createSpanBuffer(schema, traceRoot, callsitePlan.metadata, callsitePlan.capacityTier, callsitePlan.SpanBufferClass);
|
|
250
266
|
// Write span-start entry (row 0)
|
|
251
|
-
writeSpanStart(buffer, name);
|
|
252
|
-
|
|
253
|
-
const tagWriter = createTagWriter(schema, buffer);
|
|
254
|
-
const spanLogger = createSpanLoggerFromGenerator(schema, buffer);
|
|
255
|
-
// Instantiate SpanContext class with direct arguments (no temp object allocation)
|
|
256
|
-
const ctx = new this.SpanContextClass(buffer, schema, spanLogger, tagWriter);
|
|
257
|
-
// Set up deps from config (may be EMPTY_SCOPE if none provided)
|
|
258
|
-
ctx.deps = this.deps;
|
|
259
|
-
ctx.ff = this.flagEvaluator.forContext(ctx);
|
|
260
|
-
// Copy resolved user context onto SpanContext.
|
|
261
|
-
for (const key in resolvedUserCtx) {
|
|
262
|
-
ctx[key] = resolvedUserCtx[key];
|
|
263
|
-
}
|
|
264
|
-
return ctx;
|
|
267
|
+
callsitePlan.appenders.writeSpanStart(buffer, name);
|
|
268
|
+
return new callsitePlan.SpanContextClass(buffer, schema, callsitePlan, this.ctxDefaults, overrides, this.deps, this.flagEvaluator);
|
|
265
269
|
}
|
|
266
270
|
/**
|
|
267
|
-
* Validate null-sentinel required fields
|
|
271
|
+
* Validate null-sentinel required fields without materializing a merged
|
|
272
|
+
* user-context carrier.
|
|
268
273
|
*
|
|
269
274
|
* Per the ctx config pattern:
|
|
270
275
|
* - Properties with null values in ctxDefaults must be provided in overrides
|
|
271
276
|
* - Properties with default values can optionally be overridden
|
|
272
277
|
* - undefined is allowed for optional fields
|
|
273
278
|
*/
|
|
274
|
-
|
|
275
|
-
const
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
if (defaultValue === null) {
|
|
280
|
-
const providedValue = overrides[key];
|
|
281
|
-
if (providedValue === null || providedValue === undefined) {
|
|
282
|
-
throw new Error(`Required context parameter '${key}' must be provided. ` +
|
|
283
|
-
'Properties with null values in ctx config are required.');
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
// Merge defaults with provided overrides (provided values win)
|
|
288
|
-
const resolvedUserCtx = { ...ctxDefaults };
|
|
289
|
-
for (const key of Object.keys(overrides)) {
|
|
290
|
-
if (key === 'trace_id') {
|
|
291
|
-
continue;
|
|
279
|
+
_validateRequiredUserContext(overrides) {
|
|
280
|
+
for (const key of this.requiredCtxKeys) {
|
|
281
|
+
if (!Object.prototype.propertyIsEnumerable.call(overrides, key)) {
|
|
282
|
+
throw new Error(`Required context parameter '${key}' must be provided. ` +
|
|
283
|
+
'Properties with null values in ctx config are required.');
|
|
292
284
|
}
|
|
293
|
-
const
|
|
294
|
-
if (
|
|
295
|
-
|
|
285
|
+
const providedValue = overrides[key];
|
|
286
|
+
if (providedValue === null || providedValue === undefined) {
|
|
287
|
+
throw new Error(`Required context parameter '${key}' must be provided. ` +
|
|
288
|
+
'Properties with null values in ctx config are required.');
|
|
296
289
|
}
|
|
297
290
|
}
|
|
298
|
-
return resolvedUserCtx;
|
|
299
291
|
}
|
|
300
292
|
/**
|
|
301
293
|
* Execute function with context and handle span-ok/span-err/span-exception writes
|
|
@@ -305,7 +297,8 @@ export class Tracer {
|
|
|
305
297
|
* when the function returns an Ok/Err result.
|
|
306
298
|
*/
|
|
307
299
|
_executeResultWithContext(ctx, fn) {
|
|
308
|
-
const buffer = ctx.
|
|
300
|
+
const buffer = ctx._spanBuffer;
|
|
301
|
+
const writeSpanEndEntry = ctx._physicalLayoutPlan.appenders.writeSpanEnd;
|
|
309
302
|
this.onTraceStart(buffer);
|
|
310
303
|
let isAsync = false;
|
|
311
304
|
try {
|
|
@@ -317,7 +310,7 @@ export class Tracer {
|
|
|
317
310
|
writeSpanEnd(buffer, resolved);
|
|
318
311
|
return resolved;
|
|
319
312
|
}, (error) => {
|
|
320
|
-
|
|
313
|
+
writeSpanEndEntry(buffer, ENTRY_TYPE_SPAN_EXCEPTION);
|
|
321
314
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
322
315
|
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
323
316
|
buffer.message(1, errorMessage);
|
|
@@ -332,7 +325,7 @@ export class Tracer {
|
|
|
332
325
|
return result;
|
|
333
326
|
}
|
|
334
327
|
catch (error) {
|
|
335
|
-
|
|
328
|
+
writeSpanEndEntry(buffer, ENTRY_TYPE_SPAN_EXCEPTION);
|
|
336
329
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
337
330
|
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
338
331
|
buffer.message(1, errorMessage);
|
|
@@ -348,7 +341,8 @@ export class Tracer {
|
|
|
348
341
|
}
|
|
349
342
|
}
|
|
350
343
|
_executeUnknownWithContext(ctx, fn) {
|
|
351
|
-
const buffer = ctx.
|
|
344
|
+
const buffer = ctx._spanBuffer;
|
|
345
|
+
const writeSpanEndEntry = ctx._physicalLayoutPlan.appenders.writeSpanEnd;
|
|
352
346
|
// Call trace start hook
|
|
353
347
|
this.onTraceStart(buffer);
|
|
354
348
|
let isAsync = false;
|
|
@@ -362,11 +356,11 @@ export class Tracer {
|
|
|
362
356
|
writeSpanEnd(buffer, resolved);
|
|
363
357
|
}
|
|
364
358
|
else {
|
|
365
|
-
|
|
359
|
+
writeSpanEndEntry(buffer, ENTRY_TYPE_SPAN_OK);
|
|
366
360
|
}
|
|
367
361
|
return resolved;
|
|
368
362
|
}, (error) => {
|
|
369
|
-
|
|
363
|
+
writeSpanEndEntry(buffer, ENTRY_TYPE_SPAN_EXCEPTION);
|
|
370
364
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
371
365
|
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
372
366
|
buffer.message(1, errorMessage);
|
|
@@ -382,13 +376,13 @@ export class Tracer {
|
|
|
382
376
|
writeSpanEnd(buffer, result);
|
|
383
377
|
}
|
|
384
378
|
else {
|
|
385
|
-
|
|
379
|
+
writeSpanEndEntry(buffer, ENTRY_TYPE_SPAN_OK);
|
|
386
380
|
}
|
|
387
381
|
return result;
|
|
388
382
|
}
|
|
389
383
|
catch (error) {
|
|
390
384
|
// Sync exception path
|
|
391
|
-
|
|
385
|
+
writeSpanEndEntry(buffer, ENTRY_TYPE_SPAN_EXCEPTION);
|
|
392
386
|
// Write exception details
|
|
393
387
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
394
388
|
const errorStack = error instanceof Error ? error.stack : undefined;
|
|
@@ -49,7 +49,7 @@ export declare class ArrayQueueTracer<B extends OpContextBinding = OpContextBind
|
|
|
49
49
|
* Consume all queued buffers and clear the queue.
|
|
50
50
|
* Returns an independent copy of the queue contents.
|
|
51
51
|
*
|
|
52
|
-
* @returns Array of root buffers
|
|
52
|
+
* @returns Array of root buffers whose children live in the trace topology arena
|
|
53
53
|
*/
|
|
54
54
|
drain(): SpanBuffer<B['logBinding']['logSchema']>[];
|
|
55
55
|
}
|
|
@@ -57,7 +57,7 @@ export class ArrayQueueTracer extends Tracer {
|
|
|
57
57
|
* Consume all queued buffers and clear the queue.
|
|
58
58
|
* Returns an independent copy of the queue contents.
|
|
59
59
|
*
|
|
60
|
-
* @returns Array of root buffers
|
|
60
|
+
* @returns Array of root buffers whose children live in the trace topology arena
|
|
61
61
|
*/
|
|
62
62
|
drain() {
|
|
63
63
|
const buffers = [...this.queue];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StdioTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/StdioTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"StdioTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/StdioTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAa9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AAgID;;GAEG;AACH,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,iDAAiD;IACjD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,gDAAgD;IAChD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD;;;;;;;;;GASG;AAEH,qBAAa,WAAW,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACvF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IAErD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IAEvC,YAAY,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAKhF;IAMD,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,YAAY;IAoCpB,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAOvF;IAED,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAqBrF;IAED,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAQvF;IAED,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI,CAsBrF;IAED,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAgB3E;CACF"}
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
* // [2025-12-25T10:30:45.226Z] [123456] fetch-user (103.00ms) ========
|
|
31
31
|
* ```
|
|
32
32
|
*/
|
|
33
|
+
import { resolveEntryType, resolveMessage } from '../resolveMessage.js';
|
|
33
34
|
import { ENTRY_TYPE_DEBUG, ENTRY_TYPE_ERROR, ENTRY_TYPE_INFO, ENTRY_TYPE_SPAN_ERR, ENTRY_TYPE_SPAN_EXCEPTION, ENTRY_TYPE_SPAN_OK, ENTRY_TYPE_TRACE, ENTRY_TYPE_WARN, } from '../schema/systemSchema.js';
|
|
34
35
|
import { Tracer } from '../tracer.js';
|
|
35
36
|
// ============================================================================
|
|
@@ -127,19 +128,20 @@ function getLogLevel(entryType) {
|
|
|
127
128
|
}
|
|
128
129
|
}
|
|
129
130
|
function formatTemplateMessage(buffer, row, template) {
|
|
130
|
-
return template.replace(/\{
|
|
131
|
+
return template.replace(/\{([A-Za-z0-9_]+)\}/g, (_full, key) => {
|
|
132
|
+
const placeholder = `{${key}}`;
|
|
131
133
|
const values = Reflect.get(buffer, `${key}_values`);
|
|
132
134
|
if (values == null)
|
|
133
|
-
return
|
|
135
|
+
return placeholder;
|
|
134
136
|
if (Array.isArray(values)) {
|
|
135
137
|
const value = values[row];
|
|
136
|
-
return value === null || value === undefined ?
|
|
138
|
+
return value === null || value === undefined ? placeholder : String(value);
|
|
137
139
|
}
|
|
138
140
|
if (ArrayBuffer.isView(values)) {
|
|
139
141
|
const value = Reflect.get(values, row);
|
|
140
|
-
return value === null || value === undefined ?
|
|
142
|
+
return value === null || value === undefined ? placeholder : String(value);
|
|
141
143
|
}
|
|
142
|
-
return
|
|
144
|
+
return placeholder;
|
|
143
145
|
});
|
|
144
146
|
}
|
|
145
147
|
// ============================================================================
|
|
@@ -208,10 +210,10 @@ export class StdioTracer extends Tracer {
|
|
|
208
210
|
const start = isRootSegment ? 2 : 0;
|
|
209
211
|
const end = current._writeIndex;
|
|
210
212
|
for (let i = start; i < end; i++) {
|
|
211
|
-
const level = getLogLevel(current
|
|
213
|
+
const level = getLogLevel(resolveEntryType(current, i));
|
|
212
214
|
if (!level)
|
|
213
215
|
continue;
|
|
214
|
-
const template = current
|
|
216
|
+
const template = resolveMessage(current, i) ?? '';
|
|
215
217
|
const message = formatTemplateMessage(current, i, template);
|
|
216
218
|
const ts = formatTimestamp(current.timestamp[i]);
|
|
217
219
|
const traceId = current.trace_id;
|
|
@@ -233,7 +235,7 @@ export class StdioTracer extends Tracer {
|
|
|
233
235
|
// --------------------------------------------------------------------------
|
|
234
236
|
onTraceStart(rootBuffer) {
|
|
235
237
|
const traceId = rootBuffer.trace_id;
|
|
236
|
-
const name = rootBuffer
|
|
238
|
+
const name = resolveMessage(rootBuffer, 0);
|
|
237
239
|
const ts = formatTimestamp(rootBuffer.timestamp[0]);
|
|
238
240
|
this.out.write(`[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${name}\n`);
|
|
239
241
|
this.incrementIndent(traceId);
|
|
@@ -242,11 +244,11 @@ export class StdioTracer extends Tracer {
|
|
|
242
244
|
const traceId = rootBuffer.trace_id;
|
|
243
245
|
this.printLogRows(rootBuffer, 1);
|
|
244
246
|
this.decrementIndent(traceId);
|
|
245
|
-
const name = rootBuffer
|
|
247
|
+
const name = resolveMessage(rootBuffer, 0);
|
|
246
248
|
const startTs = rootBuffer.timestamp[0];
|
|
247
249
|
const endTs = rootBuffer.timestamp[1];
|
|
248
250
|
const duration = formatDuration(endTs - startTs);
|
|
249
|
-
const entryType = rootBuffer
|
|
251
|
+
const entryType = resolveEntryType(rootBuffer, 1);
|
|
250
252
|
const status = getStatus(entryType);
|
|
251
253
|
const ts = formatTimestamp(endTs);
|
|
252
254
|
const line = `[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${name} [${status}] (${duration}) ${'='.repeat(40)}\n`;
|
|
@@ -261,7 +263,7 @@ export class StdioTracer extends Tracer {
|
|
|
261
263
|
onSpanStart(childBuffer) {
|
|
262
264
|
const traceId = childBuffer.trace_id;
|
|
263
265
|
const indent = this.getIndent(traceId);
|
|
264
|
-
const name = childBuffer
|
|
266
|
+
const name = resolveMessage(childBuffer, 0);
|
|
265
267
|
const ts = formatTimestamp(childBuffer.timestamp[0]);
|
|
266
268
|
this.out.write(`[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${' '.repeat(indent)}├─ ${name}\n`);
|
|
267
269
|
this.incrementIndent(traceId);
|
|
@@ -271,11 +273,11 @@ export class StdioTracer extends Tracer {
|
|
|
271
273
|
this.decrementIndent(traceId);
|
|
272
274
|
const indent = this.getIndent(traceId);
|
|
273
275
|
this.printLogRows(childBuffer, indent + 1);
|
|
274
|
-
const name = childBuffer
|
|
276
|
+
const name = resolveMessage(childBuffer, 0);
|
|
275
277
|
const startTs = childBuffer.timestamp[0];
|
|
276
278
|
const endTs = childBuffer.timestamp[1];
|
|
277
279
|
const duration = formatDuration(endTs - startTs);
|
|
278
|
-
const entryType = childBuffer
|
|
280
|
+
const entryType = resolveEntryType(childBuffer, 1);
|
|
279
281
|
const status = getStatus(entryType);
|
|
280
282
|
const ts = formatTimestamp(endTs);
|
|
281
283
|
const line = `[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${' '.repeat(indent)}└─ ${name} [${status}] (${duration})\n`;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* TestTracer - A tracer that accumulates completed root trace buffers for test inspection.
|
|
3
3
|
*
|
|
4
|
-
* Child spans are accessible
|
|
4
|
+
* Child spans are accessible through the trace topology arena; no duplicate tracking is needed.
|
|
5
5
|
* This is the primary tracer for tests that need to inspect trace output, convert to Arrow tables,
|
|
6
6
|
* or verify buffer contents.
|
|
7
7
|
*
|
|
@@ -43,9 +43,8 @@ export interface StatsSnapshot<T extends LogSchema = LogSchema> {
|
|
|
43
43
|
/**
|
|
44
44
|
* Test tracer that accumulates root buffers for inspection.
|
|
45
45
|
*
|
|
46
|
-
* Collects all completed root trace buffers in `rootBuffers
|
|
47
|
-
*
|
|
48
|
-
* no need to track them separately.
|
|
46
|
+
* Collects all completed root trace buffers in `rootBuffers`; child spans remain reachable
|
|
47
|
+
* through each root's trace topology arena.
|
|
49
48
|
*
|
|
50
49
|
* Also tracks capacity tuning events via `statsSnapshots` to verify
|
|
51
50
|
* that `onStatsWillResetFor` is called before stats are reset.
|
|
@@ -72,8 +71,7 @@ export interface StatsSnapshot<T extends LogSchema = LogSchema> {
|
|
|
72
71
|
*/
|
|
73
72
|
export declare class TestTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
|
|
74
73
|
/**
|
|
75
|
-
* All completed root trace buffers.
|
|
76
|
-
* Child spans are accessible via each buffer's `_children` tree.
|
|
74
|
+
* All completed root trace buffers. Child spans remain in each root's topology arena.
|
|
77
75
|
*/
|
|
78
76
|
readonly rootBuffers: SpanBuffer<B['logBinding']['logSchema']>[];
|
|
79
77
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/TestTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAU9C;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC5D,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED
|
|
1
|
+
{"version":3,"file":"TestTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/TestTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAU9C;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC5D,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,qBAAa,UAAU,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACtF;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAEtE;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAM5E,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAExE;IAED,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAGrE;IAED,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAExE;IAED,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAEtE;IAED,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAS1E;IAMD;;;OAGG;IACH,KAAK,IAAI,IAAI,CAQZ;CACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* TestTracer - A tracer that accumulates completed root trace buffers for test inspection.
|
|
3
3
|
*
|
|
4
|
-
* Child spans are accessible
|
|
4
|
+
* Child spans are accessible through the trace topology arena; no duplicate tracking is needed.
|
|
5
5
|
* This is the primary tracer for tests that need to inspect trace output, convert to Arrow tables,
|
|
6
6
|
* or verify buffer contents.
|
|
7
7
|
*
|
|
@@ -34,9 +34,8 @@ function isResettableBufferStrategy(value) {
|
|
|
34
34
|
/**
|
|
35
35
|
* Test tracer that accumulates root buffers for inspection.
|
|
36
36
|
*
|
|
37
|
-
* Collects all completed root trace buffers in `rootBuffers
|
|
38
|
-
*
|
|
39
|
-
* no need to track them separately.
|
|
37
|
+
* Collects all completed root trace buffers in `rootBuffers`; child spans remain reachable
|
|
38
|
+
* through each root's trace topology arena.
|
|
40
39
|
*
|
|
41
40
|
* Also tracks capacity tuning events via `statsSnapshots` to verify
|
|
42
41
|
* that `onStatsWillResetFor` is called before stats are reset.
|
|
@@ -64,8 +63,7 @@ function isResettableBufferStrategy(value) {
|
|
|
64
63
|
//#region smoo/lmao!n/tracer-implementations.test
|
|
65
64
|
export class TestTracer extends Tracer {
|
|
66
65
|
/**
|
|
67
|
-
* All completed root trace buffers.
|
|
68
|
-
* Child spans are accessible via each buffer's `_children` tree.
|
|
66
|
+
* All completed root trace buffers. Child spans remain in each root's topology arena.
|
|
69
67
|
*/
|
|
70
68
|
rootBuffers = [];
|
|
71
69
|
/**
|
|
@@ -84,10 +82,10 @@ export class TestTracer extends Tracer {
|
|
|
84
82
|
this.rootBuffers.push(rootBuffer);
|
|
85
83
|
}
|
|
86
84
|
onSpanStart(_childBuffer) {
|
|
87
|
-
// No-op - children are in
|
|
85
|
+
// No-op - children are registered in the trace topology arena
|
|
88
86
|
}
|
|
89
87
|
onSpanEnd(_childBuffer) {
|
|
90
|
-
// No-op - children are in
|
|
88
|
+
// No-op - children are registered in the trace topology arena
|
|
91
89
|
}
|
|
92
90
|
onStatsWillResetFor(buffer) {
|
|
93
91
|
// Capture stats snapshot before they're reset
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -10,12 +10,14 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import type { AnyColumnBuffer, ColumnBuffer, ColumnValueType, EagerBinarySchema, LazyBinarySchema, Nanoseconds, TypedArray } from '@smoothbricks/arrow-builder';
|
|
12
12
|
import type { OpMetadata } from './opContext/opTypes.js';
|
|
13
|
+
import type { MessageLayoutFamily, MessagePhysicalLayout } from './runtimeHint.js';
|
|
13
14
|
import type { LogSchema } from './schema/LogSchema.js';
|
|
14
15
|
import type { InferSchema } from './schema/types.js';
|
|
15
16
|
import type { SpanBufferStats } from './spanBufferStats.js';
|
|
16
17
|
import type { TraceId } from './traceId.js';
|
|
17
18
|
import type { ITraceRoot } from './traceRoot.js';
|
|
18
|
-
|
|
19
|
+
import type { VocabularyGeneration } from './vocabularyRegistry.js';
|
|
20
|
+
export type { LogBinding, RemapDescriptor, RemappedColumn } from './logBinding.js';
|
|
19
21
|
export type { OpMetadata } from './opContext/opTypes.js';
|
|
20
22
|
export type { extractSpanIdentity, SpanIdentity } from './traceId.js';
|
|
21
23
|
export type { TracerLifecycleHooks } from './traceRoot.js';
|
|
@@ -77,13 +79,29 @@ export interface AnySpanBuffer extends AnyColumnBuffer {
|
|
|
77
79
|
* - Rows 2+: log entry timestamps
|
|
78
80
|
*/
|
|
79
81
|
readonly timestamp: BigInt64Array;
|
|
80
|
-
/**
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
82
|
+
/** Current and specialized layouts expose this direct lane; packed uses `resolveEntryType`. */
|
|
83
|
+
readonly entry_type?: Uint8Array;
|
|
84
|
+
/** Current-mode buffer-local template IDs. Zero selects the raw reference lane. */
|
|
85
|
+
readonly _messageIds?: Uint16Array;
|
|
86
|
+
/** Specialized 1-based global dense message identities. Zero selects the raw/null sidecar sentinel. */
|
|
87
|
+
readonly _logHeaders?: Uint32Array;
|
|
88
|
+
/** Packed row headers: low 8 bits entry type, high 24 bits dense message index plus one. */
|
|
89
|
+
readonly _rowHeaders?: Uint32Array;
|
|
90
|
+
/** Immutable vocabulary generation against which packed message indices resolve. */
|
|
91
|
+
readonly _vocabularyGeneration: VocabularyGeneration;
|
|
92
|
+
/** Concrete semantic message family selected once for this buffer constructor. */
|
|
93
|
+
readonly _messageLayoutFamily: MessageLayoutFamily;
|
|
94
|
+
/**
|
|
95
|
+
* One-shot token set by WASM constructors whose allocation export already
|
|
96
|
+
* initialized row 0, row 1, and the shared write index.
|
|
97
|
+
*/
|
|
98
|
+
_spanStartedAtAllocation?: boolean;
|
|
99
|
+
/** Concrete physical row layout selected once for this buffer constructor. */
|
|
100
|
+
readonly _messagePhysicalLayout: MessagePhysicalLayout;
|
|
101
|
+
/** Dedicated row-0 span name used when the selected capacity lane cannot represent it. */
|
|
102
|
+
_spanName?: string | number;
|
|
103
|
+
/** Dedicated row-1 raw result/exception text for static-only buffers. */
|
|
104
|
+
_terminalMessage?: string;
|
|
87
105
|
/**
|
|
88
106
|
* Timestamp of span start (row 0).
|
|
89
107
|
*
|
|
@@ -112,6 +130,10 @@ export interface AnySpanBuffer extends AnyColumnBuffer {
|
|
|
112
130
|
* Per specs/lmao/01b2: Buffers chain rather than resize for predictable allocation.
|
|
113
131
|
*/
|
|
114
132
|
_overflow?: AnySpanBuffer;
|
|
133
|
+
/** Whether this physical segment has contributed its rows to shared stats. */
|
|
134
|
+
_statsSealed: boolean;
|
|
135
|
+
/** Lifecycle rows excluded when this physical segment is sealed (2 for first segment, 0 for overflow). */
|
|
136
|
+
_statsReservedRows: number;
|
|
115
137
|
/**
|
|
116
138
|
* Span ID - 32-bit counter unique within this trace.
|
|
117
139
|
* Per specs/lmao/01b4_span_identity.md: Monotonic counter, not globally unique.
|
|
@@ -146,29 +168,24 @@ export interface AnySpanBuffer extends AnyColumnBuffer {
|
|
|
146
168
|
*/
|
|
147
169
|
readonly _logSchema: LogSchema;
|
|
148
170
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
* This enables Arrow conversion to iterate column names correctly regardless of
|
|
154
|
-
* whether the buffer is wrapped in a RemappedBufferView.
|
|
171
|
+
* Canonical schema column entries for this buffer.
|
|
172
|
+
* Output remapping lives separately in `_remapDescriptor` and is interpreted
|
|
173
|
+
* only by cold Arrow traversal.
|
|
155
174
|
*/
|
|
156
175
|
readonly _columns: ReadonlyArray<[string, unknown]>;
|
|
176
|
+
/** Immutable cold-path output remapping attached to canonical child buffers. */
|
|
177
|
+
_remapDescriptor?: import('./logBinding.js').RemapDescriptor;
|
|
157
178
|
/**
|
|
158
179
|
* Shared stats for all buffers from same defineOpContext (accessed via constructor.stats).
|
|
159
180
|
* Enables self-tuning capacity learning across all ops in the same context.
|
|
160
181
|
* Underscore prefix since this is an internal property.
|
|
161
182
|
*/
|
|
162
183
|
readonly _stats: SpanBufferStats;
|
|
163
|
-
/**
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
/**
|
|
169
|
-
* Parent span buffer (undefined for root).
|
|
170
|
-
* Set during createChildSpanBuffer().
|
|
171
|
-
*/
|
|
184
|
+
/** Stable trace-owned logical node index. Overflow segments share the same index. */
|
|
185
|
+
_nodeIndex: number;
|
|
186
|
+
/** Trace-topology generation used to reject released or reset handles. */
|
|
187
|
+
_topologyGeneration: number;
|
|
188
|
+
/** Parent span buffer (undefined for root). Preserved for identity access and parent ascent. */
|
|
172
189
|
_parent?: AnySpanBuffer;
|
|
173
190
|
/**
|
|
174
191
|
* Root trace context - shared by all buffers in a trace.
|
|
@@ -199,12 +216,8 @@ export interface AnySpanBuffer extends AnyColumnBuffer {
|
|
|
199
216
|
* - Applied to all rows at Arrow conversion via TypedArray.fill()
|
|
200
217
|
*/
|
|
201
218
|
_scopeValues: Readonly<Record<string, unknown>>;
|
|
202
|
-
/**
|
|
203
|
-
|
|
204
|
-
* Contains span names, log messages, exception messages, etc.
|
|
205
|
-
*/
|
|
206
|
-
readonly message_values: string[];
|
|
207
|
-
readonly message_nulls: Uint8Array;
|
|
219
|
+
/** Raw per-row message lane. Omitted by static-only; `undefined` is the null sentinel. */
|
|
220
|
+
readonly message_values?: (string | undefined)[];
|
|
208
221
|
/**
|
|
209
222
|
* Line number column values - Float64Array (lazy but always present).
|
|
210
223
|
* Contains source code line numbers injected by transformer.
|
|
@@ -290,6 +303,10 @@ export interface AnySpanBuffer extends AnyColumnBuffer {
|
|
|
290
303
|
* @returns The overflow buffer (existing or newly created)
|
|
291
304
|
*/
|
|
292
305
|
getOrCreateOverflow(): AnySpanBuffer;
|
|
306
|
+
/** Account this physical segment's completed rows exactly once. */
|
|
307
|
+
_sealStats(): void;
|
|
308
|
+
/** Account every physical segment in this logical span's overflow chain exactly once. */
|
|
309
|
+
_sealStatsChain(): void;
|
|
293
310
|
/**
|
|
294
311
|
* Check if this span is a parent of another span.
|
|
295
312
|
* Used for tree traversal and validation.
|
|
@@ -347,19 +364,19 @@ type FilterSchemaFields<T> = {
|
|
|
347
364
|
* T is REQUIRED - there is no default. Use AnySpanBuffer for generic processing.
|
|
348
365
|
*/
|
|
349
366
|
export type SpanBuffer<T extends LogSchema> = AnySpanBuffer & {
|
|
350
|
-
_children: SpanBuffer<T>[];
|
|
351
367
|
_parent?: SpanBuffer<T>;
|
|
352
368
|
_overflow?: SpanBuffer<T>;
|
|
353
369
|
readonly _logSchema: T;
|
|
370
|
+
_traceRoot: ITraceRoot<T>;
|
|
354
371
|
_scopeValues: Readonly<Partial<InferSchema<T>>>;
|
|
355
372
|
isParentOf(other: SpanBuffer<T>): boolean;
|
|
356
373
|
isChildOf(other: SpanBuffer<T>): boolean;
|
|
357
374
|
[key: `${string}_values`]: TypedArray | string[] | unknown[] | undefined;
|
|
358
375
|
[key: `${string}_nulls`]: Uint8Array | undefined;
|
|
359
376
|
} & {
|
|
360
|
-
readonly [K in keyof FilterSchemaFields<T['fields']> as `${K & string}_values`]: ValuesArrayType<FilterSchemaFields<T['fields']>[K]>;
|
|
377
|
+
readonly [K in keyof FilterSchemaFields<T['fields']> as K extends 'message' ? never : `${K & string}_values`]: ValuesArrayType<FilterSchemaFields<T['fields']>[K]>;
|
|
361
378
|
} & {
|
|
362
|
-
readonly [K in keyof FilterSchemaFields<T['fields']> as `${K & string}_nulls`]: Uint8Array;
|
|
379
|
+
readonly [K in keyof FilterSchemaFields<T['fields']> as K extends 'message' ? never : `${K & string}_nulls`]: Uint8Array;
|
|
363
380
|
} & {
|
|
364
381
|
[K in keyof FilterSchemaFields<T['fields']>]: (pos: number, val: SetterValueType<FilterSchemaFields<T['fields']>[K]>) => SpanBuffer<T>;
|
|
365
382
|
};
|