@smoothbricks/lmao 0.1.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 +269 -0
- package/dist/allocator.wasm +0 -0
- package/dist/bun/preload.d.ts +11 -0
- package/dist/bun/preload.d.ts.map +1 -0
- package/dist/bun/preload.js +10 -0
- package/dist/bun/trace-preload.d.ts +8 -0
- package/dist/bun/trace-preload.d.ts.map +1 -0
- package/dist/bun/trace-preload.js +12 -0
- package/dist/es.d.ts +8 -0
- package/dist/es.d.ts.map +1 -0
- package/dist/es.js +9 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -0
- package/dist/lib/JsBufferStrategy.d.ts +49 -0
- package/dist/lib/JsBufferStrategy.d.ts.map +1 -0
- package/dist/lib/JsBufferStrategy.js +60 -0
- package/dist/lib/archive/chunkCompaction.d.ts +15 -0
- package/dist/lib/archive/chunkCompaction.d.ts.map +1 -0
- package/dist/lib/archive/chunkCompaction.js +24 -0
- package/dist/lib/archive/chunkEnvelope.d.ts +21 -0
- package/dist/lib/archive/chunkEnvelope.d.ts.map +1 -0
- package/dist/lib/archive/chunkEnvelope.js +55 -0
- package/dist/lib/archive/chunkRouting.d.ts +10 -0
- package/dist/lib/archive/chunkRouting.d.ts.map +1 -0
- package/dist/lib/archive/chunkRouting.js +47 -0
- package/dist/lib/archive/chunkStats.d.ts +12 -0
- package/dist/lib/archive/chunkStats.d.ts.map +1 -0
- package/dist/lib/archive/chunkStats.js +10 -0
- package/dist/lib/archive/index.d.ts +5 -0
- package/dist/lib/archive/index.d.ts.map +1 -0
- package/dist/lib/archive/index.js +4 -0
- package/dist/lib/arrow/capacityStats.d.ts +9 -0
- package/dist/lib/arrow/capacityStats.d.ts.map +1 -0
- package/dist/lib/arrow/capacityStats.js +231 -0
- package/dist/lib/arrow/dictionaries.d.ts +27 -0
- package/dist/lib/arrow/dictionaries.d.ts.map +1 -0
- package/dist/lib/arrow/dictionaries.js +135 -0
- package/dist/lib/arrow/flechette.d.ts +40 -0
- package/dist/lib/arrow/flechette.d.ts.map +1 -0
- package/dist/lib/arrow/flechette.js +67 -0
- package/dist/lib/arrow/utils.d.ts +38 -0
- package/dist/lib/arrow/utils.d.ts.map +1 -0
- package/dist/lib/arrow/utils.js +112 -0
- package/dist/lib/buffer/Nanoseconds.d.ts +109 -0
- package/dist/lib/buffer/Nanoseconds.d.ts.map +1 -0
- package/dist/lib/buffer/Nanoseconds.js +86 -0
- package/dist/lib/bufferStrategy.d.ts +95 -0
- package/dist/lib/bufferStrategy.d.ts.map +1 -0
- package/dist/lib/bufferStrategy.js +1 -0
- package/dist/lib/capacityTuning.d.ts +50 -0
- package/dist/lib/capacityTuning.d.ts.map +1 -0
- package/dist/lib/capacityTuning.js +65 -0
- package/dist/lib/codegen/evaluatorGenerator.d.ts +35 -0
- package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -0
- package/dist/lib/codegen/evaluatorGenerator.js +199 -0
- package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +139 -0
- package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -0
- package/dist/lib/codegen/fixedPositionWriterGenerator.js +289 -0
- package/dist/lib/codegen/spanLoggerGenerator.d.ts +115 -0
- package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -0
- package/dist/lib/codegen/spanLoggerGenerator.js +575 -0
- package/dist/lib/convertToArrow.d.ts +40 -0
- package/dist/lib/convertToArrow.d.ts.map +1 -0
- package/dist/lib/convertToArrow.js +1467 -0
- package/dist/lib/defineOpContext.d.ts +96 -0
- package/dist/lib/defineOpContext.d.ts.map +1 -0
- package/dist/lib/defineOpContext.js +227 -0
- package/dist/lib/errors/Blocked.d.ts +113 -0
- package/dist/lib/errors/Blocked.d.ts.map +1 -0
- package/dist/lib/errors/Blocked.js +68 -0
- package/dist/lib/errors/CodeError.d.ts +101 -0
- package/dist/lib/errors/CodeError.d.ts.map +1 -0
- package/dist/lib/errors/CodeError.js +42 -0
- package/dist/lib/errors/RetriesExhausted.d.ts +67 -0
- package/dist/lib/errors/RetriesExhausted.d.ts.map +1 -0
- package/dist/lib/errors/RetriesExhausted.js +31 -0
- package/dist/lib/errors/Transient.d.ts +115 -0
- package/dist/lib/errors/Transient.d.ts.map +1 -0
- package/dist/lib/errors/Transient.js +54 -0
- package/dist/lib/errors/index.d.ts +14 -0
- package/dist/lib/errors/index.d.ts.map +1 -0
- package/dist/lib/errors/index.js +16 -0
- package/dist/lib/errors/retry-policy.d.ts +60 -0
- package/dist/lib/errors/retry-policy.d.ts.map +1 -0
- package/dist/lib/errors/retry-policy.js +54 -0
- package/dist/lib/flushScheduler.d.ts +162 -0
- package/dist/lib/flushScheduler.d.ts.map +1 -0
- package/dist/lib/flushScheduler.js +388 -0
- package/dist/lib/library.d.ts +149 -0
- package/dist/lib/library.d.ts.map +1 -0
- package/dist/lib/library.js +588 -0
- package/dist/lib/logApi.d.ts +61 -0
- package/dist/lib/logApi.d.ts.map +1 -0
- package/dist/lib/logApi.js +12 -0
- package/dist/lib/logBinding.d.ts +63 -0
- package/dist/lib/logBinding.d.ts.map +1 -0
- package/dist/lib/logBinding.js +1 -0
- package/dist/lib/op.d.ts +105 -0
- package/dist/lib/op.d.ts.map +1 -0
- package/dist/lib/op.js +59 -0
- package/dist/lib/opContext/contextTypes.d.ts +88 -0
- package/dist/lib/opContext/contextTypes.d.ts.map +1 -0
- package/dist/lib/opContext/contextTypes.js +34 -0
- package/dist/lib/opContext/createOpGroup.d.ts +57 -0
- package/dist/lib/opContext/createOpGroup.d.ts.map +1 -0
- package/dist/lib/opContext/createOpGroup.js +341 -0
- package/dist/lib/opContext/defineOp.d.ts +83 -0
- package/dist/lib/opContext/defineOp.d.ts.map +1 -0
- package/dist/lib/opContext/defineOp.js +197 -0
- package/dist/lib/opContext/featureFlagTypes.d.ts +58 -0
- package/dist/lib/opContext/featureFlagTypes.d.ts.map +1 -0
- package/dist/lib/opContext/featureFlagTypes.js +1 -0
- package/dist/lib/opContext/index.d.ts +13 -0
- package/dist/lib/opContext/index.d.ts.map +1 -0
- package/dist/lib/opContext/index.js +15 -0
- package/dist/lib/opContext/opGroupTypes.d.ts +250 -0
- package/dist/lib/opContext/opGroupTypes.d.ts.map +1 -0
- package/dist/lib/opContext/opGroupTypes.js +31 -0
- package/dist/lib/opContext/opTypes.d.ts +48 -0
- package/dist/lib/opContext/opTypes.d.ts.map +1 -0
- package/dist/lib/opContext/opTypes.js +7 -0
- package/dist/lib/opContext/spanContextTypes.d.ts +347 -0
- package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -0
- package/dist/lib/opContext/spanContextTypes.js +1 -0
- package/dist/lib/opContext/types.d.ts +297 -0
- package/dist/lib/opContext/types.d.ts.map +1 -0
- package/dist/lib/opContext/types.js +16 -0
- package/dist/lib/result.d.ts +308 -0
- package/dist/lib/result.d.ts.map +1 -0
- package/dist/lib/result.js +359 -0
- package/dist/lib/schema/LogSchema.d.ts +62 -0
- package/dist/lib/schema/LogSchema.d.ts.map +1 -0
- package/dist/lib/schema/LogSchema.js +134 -0
- package/dist/lib/schema/builder.d.ts +12 -0
- package/dist/lib/schema/builder.d.ts.map +1 -0
- package/dist/lib/schema/builder.js +169 -0
- package/dist/lib/schema/defineFeatureFlags.d.ts +60 -0
- package/dist/lib/schema/defineFeatureFlags.d.ts.map +1 -0
- package/dist/lib/schema/defineFeatureFlags.js +29 -0
- package/dist/lib/schema/defineLogSchema.d.ts +87 -0
- package/dist/lib/schema/defineLogSchema.d.ts.map +1 -0
- package/dist/lib/schema/defineLogSchema.js +171 -0
- package/dist/lib/schema/evaluator.d.ts +267 -0
- package/dist/lib/schema/evaluator.d.ts.map +1 -0
- package/dist/lib/schema/evaluator.js +169 -0
- package/dist/lib/schema/extend.d.ts +14 -0
- package/dist/lib/schema/extend.d.ts.map +1 -0
- package/dist/lib/schema/extend.js +51 -0
- package/dist/lib/schema/systemSchema.d.ts +112 -0
- package/dist/lib/schema/systemSchema.d.ts.map +1 -0
- package/dist/lib/schema/systemSchema.js +260 -0
- package/dist/lib/schema/typeGuards.d.ts +52 -0
- package/dist/lib/schema/typeGuards.d.ts.map +1 -0
- package/dist/lib/schema/typeGuards.js +127 -0
- package/dist/lib/schema/types.d.ts +156 -0
- package/dist/lib/schema/types.d.ts.map +1 -0
- package/dist/lib/schema/types.js +4 -0
- package/dist/lib/spanBuffer.d.ts +133 -0
- package/dist/lib/spanBuffer.d.ts.map +1 -0
- package/dist/lib/spanBuffer.js +442 -0
- package/dist/lib/spanBufferHelpers.d.ts +53 -0
- package/dist/lib/spanBufferHelpers.d.ts.map +1 -0
- package/dist/lib/spanBufferHelpers.js +65 -0
- package/dist/lib/spanBufferStats.d.ts +38 -0
- package/dist/lib/spanBufferStats.d.ts.map +1 -0
- package/dist/lib/spanBufferStats.js +1 -0
- package/dist/lib/spanContext.d.ts +141 -0
- package/dist/lib/spanContext.d.ts.map +1 -0
- package/dist/lib/spanContext.js +763 -0
- package/dist/lib/sqlite/index.d.ts +14 -0
- package/dist/lib/sqlite/index.d.ts.map +1 -0
- package/dist/lib/sqlite/index.js +12 -0
- package/dist/lib/sqlite/sqlite-async-writer.d.ts +24 -0
- package/dist/lib/sqlite/sqlite-async-writer.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-async-writer.js +65 -0
- package/dist/lib/sqlite/sqlite-common.d.ts +37 -0
- package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-common.js +207 -0
- package/dist/lib/sqlite/sqlite-d1.d.ts +25 -0
- package/dist/lib/sqlite/sqlite-d1.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-d1.js +67 -0
- package/dist/lib/sqlite/sqlite-db.d.ts +29 -0
- package/dist/lib/sqlite/sqlite-db.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-db.js +1 -0
- package/dist/lib/sqlite/sqlite-node.d.ts +16 -0
- package/dist/lib/sqlite/sqlite-node.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-node.js +68 -0
- package/dist/lib/sqlite/sqlite-writer.d.ts +39 -0
- package/dist/lib/sqlite/sqlite-writer.d.ts.map +1 -0
- package/dist/lib/sqlite/sqlite-writer.js +78 -0
- package/dist/lib/testing/bun-harness.d.ts +150 -0
- package/dist/lib/testing/bun-harness.d.ts.map +1 -0
- package/dist/lib/testing/bun-harness.js +729 -0
- package/dist/lib/testing/extractFacts.d.ts +73 -0
- package/dist/lib/testing/extractFacts.d.ts.map +1 -0
- package/dist/lib/testing/extractFacts.js +237 -0
- package/dist/lib/testing/facts.d.ts +235 -0
- package/dist/lib/testing/facts.d.ts.map +1 -0
- package/dist/lib/testing/facts.js +209 -0
- package/dist/lib/testing/index.d.ts +58 -0
- package/dist/lib/testing/index.d.ts.map +1 -0
- package/dist/lib/testing/index.js +74 -0
- package/dist/lib/testing/queryable-span.d.ts +39 -0
- package/dist/lib/testing/queryable-span.d.ts.map +1 -0
- package/dist/lib/testing/queryable-span.js +58 -0
- package/dist/lib/testing/span-query.d.ts +21 -0
- package/dist/lib/testing/span-query.d.ts.map +1 -0
- package/dist/lib/testing/span-query.js +47 -0
- package/dist/lib/testing/stdio-replay.d.ts +4 -0
- package/dist/lib/testing/stdio-replay.d.ts.map +1 -0
- package/dist/lib/testing/stdio-replay.js +42 -0
- package/dist/lib/testing/trace-query.d.ts +59 -0
- package/dist/lib/testing/trace-query.d.ts.map +1 -0
- package/dist/lib/testing/trace-query.js +462 -0
- package/dist/lib/testing/vitest-harness.d.ts +135 -0
- package/dist/lib/testing/vitest-harness.d.ts.map +1 -0
- package/dist/lib/testing/vitest-harness.js +486 -0
- package/dist/lib/threadId.d.ts +58 -0
- package/dist/lib/threadId.d.ts.map +1 -0
- package/dist/lib/threadId.js +123 -0
- package/dist/lib/traceContext.d.ts +116 -0
- package/dist/lib/traceContext.d.ts.map +1 -0
- package/dist/lib/traceContext.js +37 -0
- package/dist/lib/traceId.d.ts +78 -0
- package/dist/lib/traceId.d.ts.map +1 -0
- package/dist/lib/traceId.js +87 -0
- package/dist/lib/traceRoot.d.ts +133 -0
- package/dist/lib/traceRoot.d.ts.map +1 -0
- package/dist/lib/traceRoot.es.d.ts +75 -0
- package/dist/lib/traceRoot.es.d.ts.map +1 -0
- package/dist/lib/traceRoot.es.js +129 -0
- package/dist/lib/traceRoot.js +19 -0
- package/dist/lib/traceRoot.node.d.ts +77 -0
- package/dist/lib/traceRoot.node.d.ts.map +1 -0
- package/dist/lib/traceRoot.node.js +133 -0
- package/dist/lib/traceRoot.universal.d.ts +3 -0
- package/dist/lib/traceRoot.universal.d.ts.map +1 -0
- package/dist/lib/traceRoot.universal.js +17 -0
- package/dist/lib/tracer.d.ts +296 -0
- package/dist/lib/tracer.d.ts.map +1 -0
- package/dist/lib/tracer.js +346 -0
- package/dist/lib/tracers/ArrayQueueTracer.d.ts +56 -0
- package/dist/lib/tracers/ArrayQueueTracer.d.ts.map +1 -0
- package/dist/lib/tracers/ArrayQueueTracer.js +67 -0
- package/dist/lib/tracers/CompositeTracer.d.ts +24 -0
- package/dist/lib/tracers/CompositeTracer.d.ts.map +1 -0
- package/dist/lib/tracers/CompositeTracer.js +57 -0
- package/dist/lib/tracers/NoOpTracer.d.ts +58 -0
- package/dist/lib/tracers/NoOpTracer.d.ts.map +1 -0
- package/dist/lib/tracers/NoOpTracer.js +41 -0
- package/dist/lib/tracers/SQLiteTracer.d.ts +42 -0
- package/dist/lib/tracers/SQLiteTracer.d.ts.map +1 -0
- package/dist/lib/tracers/SQLiteTracer.js +84 -0
- package/dist/lib/tracers/StdioTracer.d.ts +83 -0
- package/dist/lib/tracers/StdioTracer.d.ts.map +1 -0
- package/dist/lib/tracers/StdioTracer.js +270 -0
- package/dist/lib/tracers/TestTracer.d.ts +95 -0
- package/dist/lib/tracers/TestTracer.d.ts.map +1 -0
- package/dist/lib/tracers/TestTracer.js +87 -0
- package/dist/lib/tracers/index.d.ts +12 -0
- package/dist/lib/tracers/index.d.ts.map +1 -0
- package/dist/lib/tracers/index.js +11 -0
- package/dist/lib/types.d.ts +366 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +1 -0
- package/dist/lib/utf8Cache.d.ts +111 -0
- package/dist/lib/utf8Cache.d.ts.map +1 -0
- package/dist/lib/utf8Cache.js +177 -0
- package/dist/lib/wasm/WasmBufferStrategy.d.ts +88 -0
- package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -0
- package/dist/lib/wasm/WasmBufferStrategy.js +138 -0
- package/dist/lib/wasm/wasmAllocator.d.ts +109 -0
- package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -0
- package/dist/lib/wasm/wasmAllocator.js +227 -0
- package/dist/lib/wasm/wasmSpanBuffer.d.ts +123 -0
- package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -0
- package/dist/lib/wasm/wasmSpanBuffer.js +772 -0
- package/dist/lib/wasm/wasmTraceRoot.d.ts +167 -0
- package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -0
- package/dist/lib/wasm/wasmTraceRoot.js +264 -0
- package/dist/node.d.ts +7 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +8 -0
- package/dist/testing.d.ts +18 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +17 -0
- package/package.json +193 -0
- package/src/bun/preload.ts +11 -0
- package/src/bun/trace-preload.ts +14 -0
- package/src/es.ts +11 -0
- package/src/index.ts +194 -0
- package/src/lib/JsBufferStrategy.ts +102 -0
- package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +485 -0
- package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +390 -0
- package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +647 -0
- package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +292 -0
- package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +354 -0
- package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +127 -0
- package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +392 -0
- package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +389 -0
- package/src/lib/__tests__/arrow-conversion-algorithms.test.ts +54 -0
- package/src/lib/__tests__/arrow-test-helpers.ts +71 -0
- package/src/lib/__tests__/binary-e2e.test.ts +203 -0
- package/src/lib/__tests__/buffer-overflow-op-api.test.ts +608 -0
- package/src/lib/__tests__/buffer-overflow.test.ts +612 -0
- package/src/lib/__tests__/capacity-tuning.test.ts +544 -0
- package/src/lib/__tests__/effective-schema.test.ts +439 -0
- package/src/lib/__tests__/flechette.test.ts +42 -0
- package/src/lib/__tests__/flushScheduler.test.ts +537 -0
- package/src/lib/__tests__/integration.test.ts +600 -0
- package/src/lib/__tests__/library.test.ts +934 -0
- package/src/lib/__tests__/nested-library-tasks.test.ts +849 -0
- package/src/lib/__tests__/op-context-binding.test.ts +135 -0
- package/src/lib/__tests__/op-metadata.test.ts +198 -0
- package/src/lib/__tests__/op-type-safety.test.ts +71 -0
- package/src/lib/__tests__/package-exports.test.ts +57 -0
- package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +319 -0
- package/src/lib/__tests__/remapped-buffer-view.test.ts +635 -0
- package/src/lib/__tests__/scope-attributes.test.ts +348 -0
- package/src/lib/__tests__/span-lifecycle.test.ts +680 -0
- package/src/lib/__tests__/sync-async-trace.test.ts +435 -0
- package/src/lib/__tests__/test-helpers.ts +318 -0
- package/src/lib/__tests__/timestamp.test.ts +259 -0
- package/src/lib/__tests__/trace-archive-primitives.test.ts +98 -0
- package/src/lib/__tests__/traceContext-type-enforcement.test.ts +271 -0
- package/src/lib/__tests__/tracer.test.ts +211 -0
- package/src/lib/__tests__/type-narrowing.test.ts +137 -0
- package/src/lib/archive/chunkCompaction.ts +44 -0
- package/src/lib/archive/chunkEnvelope.ts +79 -0
- package/src/lib/archive/chunkRouting.ts +70 -0
- package/src/lib/archive/chunkStats.ts +25 -0
- package/src/lib/archive/index.ts +4 -0
- package/src/lib/arrow/capacityStats.ts +340 -0
- package/src/lib/arrow/dictionaries.ts +159 -0
- package/src/lib/arrow/flechette.ts +114 -0
- package/src/lib/arrow/utils.ts +126 -0
- package/src/lib/buffer/Nanoseconds.ts +131 -0
- package/src/lib/bufferStrategy.ts +106 -0
- package/src/lib/capacityTuning.ts +102 -0
- package/src/lib/codegen/__tests__/__snapshots__/evaluatorGenerator.test.ts.snap +160 -0
- package/src/lib/codegen/__tests__/__snapshots__/scopeGenerator.test.ts.snap +196 -0
- package/src/lib/codegen/__tests__/__snapshots__/spanLoggerGenerator.test.ts.snap +1965 -0
- package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +516 -0
- package/src/lib/codegen/__tests__/nullBitmap.test.ts +207 -0
- package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +237 -0
- package/src/lib/codegen/evaluatorGenerator.ts +309 -0
- package/src/lib/codegen/fixedPositionWriterGenerator.ts +444 -0
- package/src/lib/codegen/spanLoggerGenerator.ts +715 -0
- package/src/lib/convertToArrow.ts +1805 -0
- package/src/lib/defineOpContext.ts +398 -0
- package/src/lib/errors/Blocked.ts +165 -0
- package/src/lib/errors/CodeError.ts +132 -0
- package/src/lib/errors/RetriesExhausted.ts +78 -0
- package/src/lib/errors/Transient.ts +168 -0
- package/src/lib/errors/__tests__/Blocked-config.test.ts +152 -0
- package/src/lib/errors/__tests__/Transient.test.ts +129 -0
- package/src/lib/errors/__tests__/retry-policy.test.ts +85 -0
- package/src/lib/errors/index.ts +24 -0
- package/src/lib/errors/retry-policy.ts +87 -0
- package/src/lib/flushScheduler.ts +509 -0
- package/src/lib/library.ts +682 -0
- package/src/lib/logApi.ts +70 -0
- package/src/lib/logBinding.ts +67 -0
- package/src/lib/op.ts +103 -0
- package/src/lib/opContext/__tests__/retry.test.ts +764 -0
- package/src/lib/opContext/contextTypes.ts +130 -0
- package/src/lib/opContext/createOpGroup.ts +456 -0
- package/src/lib/opContext/defineOp.ts +281 -0
- package/src/lib/opContext/featureFlagTypes.ts +54 -0
- package/src/lib/opContext/index.ts +16 -0
- package/src/lib/opContext/opGroupTypes.ts +342 -0
- package/src/lib/opContext/opTypes.ts +80 -0
- package/src/lib/opContext/spanContextTypes.ts +398 -0
- package/src/lib/opContext/types.ts +403 -0
- package/src/lib/result.ts +550 -0
- package/src/lib/schema/LogSchema.ts +153 -0
- package/src/lib/schema/__tests__/defineLogSchema.test.ts +342 -0
- package/src/lib/schema/__tests__/featureFlags.test.ts +443 -0
- package/src/lib/schema/builder.ts +201 -0
- package/src/lib/schema/defineFeatureFlags.ts +91 -0
- package/src/lib/schema/defineLogSchema.ts +291 -0
- package/src/lib/schema/evaluator.ts +404 -0
- package/src/lib/schema/extend.ts +69 -0
- package/src/lib/schema/systemSchema.ts +339 -0
- package/src/lib/schema/typeGuards.ts +163 -0
- package/src/lib/schema/types.ts +265 -0
- package/src/lib/spanBuffer.ts +571 -0
- package/src/lib/spanBufferHelpers.ts +73 -0
- package/src/lib/spanBufferStats.ts +40 -0
- package/src/lib/spanContext.ts +1566 -0
- package/src/lib/sqlite/__tests__/sqlite-common.test.ts +89 -0
- package/src/lib/sqlite/index.ts +26 -0
- package/src/lib/sqlite/sqlite-async-writer.ts +101 -0
- package/src/lib/sqlite/sqlite-common.ts +309 -0
- package/src/lib/sqlite/sqlite-d1.ts +104 -0
- package/src/lib/sqlite/sqlite-db.ts +32 -0
- package/src/lib/sqlite/sqlite-node.ts +83 -0
- package/src/lib/sqlite/sqlite-writer.ts +128 -0
- package/src/lib/testing/TRACE-TESTING.md +100 -0
- package/src/lib/testing/__tests__/bun-harness.test.ts +108 -0
- package/src/lib/testing/__tests__/extractFacts.test.ts +279 -0
- package/src/lib/testing/__tests__/facts.test.ts +324 -0
- package/src/lib/testing/__tests__/vitest-harness.test.ts +32 -0
- package/src/lib/testing/bun-harness.ts +990 -0
- package/src/lib/testing/extractFacts.ts +362 -0
- package/src/lib/testing/facts.ts +470 -0
- package/src/lib/testing/index.ts +141 -0
- package/src/lib/testing/queryable-span.ts +108 -0
- package/src/lib/testing/span-query.ts +65 -0
- package/src/lib/testing/stdio-replay.ts +50 -0
- package/src/lib/testing/trace-query.ts +329 -0
- package/src/lib/testing/vitest-harness.ts +691 -0
- package/src/lib/threadId.ts +135 -0
- package/src/lib/traceContext.ts +182 -0
- package/src/lib/traceId.ts +142 -0
- package/src/lib/traceRoot.es.ts +157 -0
- package/src/lib/traceRoot.node.ts +170 -0
- package/src/lib/traceRoot.ts +154 -0
- package/src/lib/traceRoot.universal.ts +22 -0
- package/src/lib/tracer.ts +896 -0
- package/src/lib/tracers/ArrayQueueTracer.ts +76 -0
- package/src/lib/tracers/CompositeTracer.ts +76 -0
- package/src/lib/tracers/NoOpTracer.ts +73 -0
- package/src/lib/tracers/SQLiteTracer.ts +115 -0
- package/src/lib/tracers/StdioTracer.ts +380 -0
- package/src/lib/tracers/TestTracer.ts +146 -0
- package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +184 -0
- package/src/lib/tracers/__tests__/NoOpTracer.test.ts +204 -0
- package/src/lib/tracers/__tests__/StdioTracer.test.ts +313 -0
- package/src/lib/tracers/__tests__/TestTracer.test.ts +200 -0
- package/src/lib/tracers/index.ts +12 -0
- package/src/lib/types.ts +498 -0
- package/src/lib/utf8Cache.ts +201 -0
- package/src/lib/wasm/WasmBufferStrategy.ts +219 -0
- package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +256 -0
- package/src/lib/wasm/__tests__/wasm-integration.test.ts +476 -0
- package/src/lib/wasm/__tests__/wasmAllocator.test.ts +699 -0
- package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +449 -0
- package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +390 -0
- package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +444 -0
- package/src/lib/wasm/allocator.zig +945 -0
- package/src/lib/wasm/wasmAllocator.ts +469 -0
- package/src/lib/wasm/wasmSpanBuffer.ts +1014 -0
- package/src/lib/wasm/wasmTraceRoot.ts +315 -0
- package/src/node.ts +10 -0
- package/src/testing.ts +18 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { OpContextBinding } from '../opContext/types.js';
|
|
2
|
+
import type { AsyncSQLiteDatabase, SyncSQLiteDatabase } from '../sqlite/sqlite-db.js';
|
|
3
|
+
import { Tracer, type TracerOptions } from '../tracer.js';
|
|
4
|
+
import type { SpanBuffer } from '../types.js';
|
|
5
|
+
export interface SQLiteTracerOptions<T extends import('../schema/LogSchema.js').LogSchema = import('../schema/LogSchema.js').LogSchema> extends TracerOptions<T> {
|
|
6
|
+
db: SyncSQLiteDatabase;
|
|
7
|
+
}
|
|
8
|
+
export interface SQLiteAsyncTracerOptions<T extends import('../schema/LogSchema.js').LogSchema = import('../schema/LogSchema.js').LogSchema> extends TracerOptions<T> {
|
|
9
|
+
db: AsyncSQLiteDatabase | Promise<AsyncSQLiteDatabase>;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Tracer that persists completed root traces to SQLite synchronously.
|
|
13
|
+
*/
|
|
14
|
+
export declare class SQLiteTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
|
|
15
|
+
private readonly writer;
|
|
16
|
+
constructor(binding: B, options: SQLiteTracerOptions<B['logBinding']['logSchema']>);
|
|
17
|
+
onTraceStart(_rootBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
18
|
+
onTraceEnd(rootBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
19
|
+
onSpanStart(_childBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
20
|
+
onSpanEnd(_childBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
21
|
+
onStatsWillResetFor(_buffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Tracer that persists completed root traces to SQLite asynchronously.
|
|
26
|
+
*
|
|
27
|
+
* onTraceEnd starts a background write pipeline; flush() awaits pipeline completion.
|
|
28
|
+
*/
|
|
29
|
+
export declare class SQLiteAsyncTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
|
|
30
|
+
private readonly writerPromise;
|
|
31
|
+
private pendingWrites;
|
|
32
|
+
private pendingErrors;
|
|
33
|
+
constructor(binding: B, options: SQLiteAsyncTracerOptions<B['logBinding']['logSchema']>);
|
|
34
|
+
onTraceStart(_rootBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
35
|
+
onTraceEnd(rootBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
36
|
+
onSpanStart(_childBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
37
|
+
onSpanEnd(_childBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
38
|
+
onStatsWillResetFor(_buffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
39
|
+
flush(): Promise<void>;
|
|
40
|
+
close(): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=SQLiteTracer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SQLiteTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/SQLiteTracer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,mBAAmB,CAClC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,EAAE,EAAE,kBAAkB,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB,CACvC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACxD;AAED;;GAEG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACxF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;gBAE/B,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC;IAKlF,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIzE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAItE,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIzE,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIvE,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAItE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;;;GAIG;AACH,qBAAa,iBAAiB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAC7F,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,aAAa,CAAiB;gBAE1B,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,wBAAwB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC;IAKvF,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIzE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAWtE,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIzE,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIvE,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAI7D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { SQLiteAsyncTraceWriter } from '../sqlite/sqlite-async-writer.js';
|
|
2
|
+
import { SQLiteTraceWriter } from '../sqlite/sqlite-writer.js';
|
|
3
|
+
import { Tracer } from '../tracer.js';
|
|
4
|
+
/**
|
|
5
|
+
* Tracer that persists completed root traces to SQLite synchronously.
|
|
6
|
+
*/
|
|
7
|
+
export class SQLiteTracer extends Tracer {
|
|
8
|
+
writer;
|
|
9
|
+
constructor(binding, options) {
|
|
10
|
+
super(binding, options);
|
|
11
|
+
this.writer = new SQLiteTraceWriter(options.db);
|
|
12
|
+
}
|
|
13
|
+
onTraceStart(_rootBuffer) {
|
|
14
|
+
// No-op
|
|
15
|
+
}
|
|
16
|
+
onTraceEnd(rootBuffer) {
|
|
17
|
+
this.writer.flush(rootBuffer);
|
|
18
|
+
}
|
|
19
|
+
onSpanStart(_childBuffer) {
|
|
20
|
+
// No-op
|
|
21
|
+
}
|
|
22
|
+
onSpanEnd(_childBuffer) {
|
|
23
|
+
// No-op
|
|
24
|
+
}
|
|
25
|
+
onStatsWillResetFor(_buffer) {
|
|
26
|
+
// No-op
|
|
27
|
+
}
|
|
28
|
+
async close() {
|
|
29
|
+
this.writer.close();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Tracer that persists completed root traces to SQLite asynchronously.
|
|
34
|
+
*
|
|
35
|
+
* onTraceEnd starts a background write pipeline; flush() awaits pipeline completion.
|
|
36
|
+
*/
|
|
37
|
+
export class SQLiteAsyncTracer extends Tracer {
|
|
38
|
+
writerPromise;
|
|
39
|
+
pendingWrites = Promise.resolve();
|
|
40
|
+
pendingErrors = [];
|
|
41
|
+
constructor(binding, options) {
|
|
42
|
+
super(binding, options);
|
|
43
|
+
this.writerPromise = Promise.resolve(options.db).then((db) => new SQLiteAsyncTraceWriter(db));
|
|
44
|
+
}
|
|
45
|
+
onTraceStart(_rootBuffer) {
|
|
46
|
+
// No-op
|
|
47
|
+
}
|
|
48
|
+
onTraceEnd(rootBuffer) {
|
|
49
|
+
this.pendingWrites = this.pendingWrites.then(async () => {
|
|
50
|
+
try {
|
|
51
|
+
const writer = await this.writerPromise;
|
|
52
|
+
await writer.flush(rootBuffer);
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
this.pendingErrors.push(error);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
onSpanStart(_childBuffer) {
|
|
60
|
+
// No-op
|
|
61
|
+
}
|
|
62
|
+
onSpanEnd(_childBuffer) {
|
|
63
|
+
// No-op
|
|
64
|
+
}
|
|
65
|
+
onStatsWillResetFor(_buffer) {
|
|
66
|
+
// No-op
|
|
67
|
+
}
|
|
68
|
+
async flush() {
|
|
69
|
+
await this.pendingWrites;
|
|
70
|
+
if (this.pendingErrors.length > 0) {
|
|
71
|
+
const errors = this.pendingErrors;
|
|
72
|
+
this.pendingErrors = [];
|
|
73
|
+
if (errors.length === 1) {
|
|
74
|
+
throw errors[0];
|
|
75
|
+
}
|
|
76
|
+
throw new AggregateError(errors, `SQLiteAsyncTracer flush failed for ${errors.length} trace writes`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
async close() {
|
|
80
|
+
await this.flush();
|
|
81
|
+
const writer = await this.writerPromise;
|
|
82
|
+
await writer.close();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StdioTracer - A tracer that prints spans to stdout/stderr
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Color-coded trace IDs based on trace_id for visual separation of concurrent traces
|
|
6
|
+
* - Per-trace indent tracking using Map<TraceId, number> for correct nesting
|
|
7
|
+
* - Human-readable timestamps (ISO 8601) and durations
|
|
8
|
+
* - Tree-style output with ├─ for start and └─ for end
|
|
9
|
+
* - Exceptions written to stderr
|
|
10
|
+
*
|
|
11
|
+
* Useful for development/debugging to see span execution in real-time.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { createTraceRoot } from '@smoothbricks/lmao/node';
|
|
16
|
+
* import { JsBufferStrategy } from '@smoothbricks/lmao';
|
|
17
|
+
*
|
|
18
|
+
* const ctx = defineOpContext({ logSchema: mySchema });
|
|
19
|
+
* const { trace } = new StdioTracer(ctx, {
|
|
20
|
+
* bufferStrategy: new JsBufferStrategy(),
|
|
21
|
+
* createTraceRoot,
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* await trace('fetch-user', fetchOp);
|
|
25
|
+
*
|
|
26
|
+
* // Output:
|
|
27
|
+
* // [2025-12-25T10:30:45.123Z] [123456] fetch-user
|
|
28
|
+
* // [2025-12-25T10:30:45.125Z] [123456] ├─ db-query
|
|
29
|
+
* // [2025-12-25T10:30:45.225Z] [123456] └─ db-query [OK] (100.00ms)
|
|
30
|
+
* // [2025-12-25T10:30:45.226Z] [123456] fetch-user (103.00ms) ========
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
import type { OpContextBinding } from '../opContext/types.js';
|
|
34
|
+
import type { TracerOptions } from '../tracer.js';
|
|
35
|
+
import { Tracer } from '../tracer.js';
|
|
36
|
+
import type { AnySpanBuffer, SpanBuffer } from '../types.js';
|
|
37
|
+
export interface StdioWritable {
|
|
38
|
+
write(chunk: string): boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Options for StdioTracer
|
|
42
|
+
*/
|
|
43
|
+
export interface StdioTracerOptions<T extends import('../schema/LogSchema.js').LogSchema = import('../schema/LogSchema.js').LogSchema> extends TracerOptions<T> {
|
|
44
|
+
/** Output stream (defaults to process.stdout) */
|
|
45
|
+
out?: StdioWritable;
|
|
46
|
+
/** Error stream (defaults to process.stderr) */
|
|
47
|
+
err?: StdioWritable;
|
|
48
|
+
/** Enable ANSI colors (defaults to true) */
|
|
49
|
+
colorEnabled?: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Tracer that prints spans to stdout/stderr with colored, indented output.
|
|
53
|
+
*
|
|
54
|
+
* Features:
|
|
55
|
+
* - Color-coded trace IDs for visual separation of concurrent traces
|
|
56
|
+
* - Per-trace indent tracking (concurrent-safe via Map)
|
|
57
|
+
* - Tree-style output (├─ for start, └─ for end)
|
|
58
|
+
* - Human-readable timestamps and durations
|
|
59
|
+
* - Exceptions go to stderr
|
|
60
|
+
*/
|
|
61
|
+
export declare class StdioTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
|
|
62
|
+
/**
|
|
63
|
+
* Per-trace indent levels for concurrent-safe nesting.
|
|
64
|
+
* Key is trace_id string representation, value is current indent level.
|
|
65
|
+
*/
|
|
66
|
+
private readonly indents;
|
|
67
|
+
private readonly out;
|
|
68
|
+
private readonly err;
|
|
69
|
+
private readonly colorEnabled;
|
|
70
|
+
constructor(binding: B, options: StdioTracerOptions<B['logBinding']['logSchema']>);
|
|
71
|
+
private getIndent;
|
|
72
|
+
private incrementIndent;
|
|
73
|
+
private decrementIndent;
|
|
74
|
+
private color;
|
|
75
|
+
private reset;
|
|
76
|
+
private printLogRows;
|
|
77
|
+
onTraceStart(rootBuffer: SpanBuffer<B['logBinding']['logSchema']> | AnySpanBuffer): void;
|
|
78
|
+
onTraceEnd(rootBuffer: SpanBuffer<B['logBinding']['logSchema']> | AnySpanBuffer): void;
|
|
79
|
+
onSpanStart(childBuffer: SpanBuffer<B['logBinding']['logSchema']> | AnySpanBuffer): void;
|
|
80
|
+
onSpanEnd(childBuffer: SpanBuffer<B['logBinding']['logSchema']> | AnySpanBuffer): void;
|
|
81
|
+
onStatsWillResetFor(_buffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=StdioTracer.d.ts.map
|
|
@@ -0,0 +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;AAY9D,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;AA+HD;;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;AACH,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;gBAE3B,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC;IAWjF,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;IASxF,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI;IAuBtF,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI;IAUxF,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI;IAwBtF,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;CAiB7E"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
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';
|
|
2
|
+
import { Tracer } from '../tracer.js';
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Formatting Helpers
|
|
5
|
+
// ============================================================================
|
|
6
|
+
/**
|
|
7
|
+
* Format nanosecond timestamp to ISO 8601 string with millisecond precision.
|
|
8
|
+
*/
|
|
9
|
+
function formatTimestamp(nanos) {
|
|
10
|
+
const millis = Number(nanos / 1000000n);
|
|
11
|
+
return new Date(millis).toISOString();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Format duration in nanoseconds to human-readable string.
|
|
15
|
+
*/
|
|
16
|
+
function formatDuration(nanos) {
|
|
17
|
+
const n = Number(nanos);
|
|
18
|
+
if (n >= 1_000_000_000) {
|
|
19
|
+
return `${(n / 1_000_000_000).toFixed(2)}s`;
|
|
20
|
+
}
|
|
21
|
+
if (n >= 1_000_000) {
|
|
22
|
+
return `${(n / 1_000_000).toFixed(2)}ms`;
|
|
23
|
+
}
|
|
24
|
+
if (n >= 1_000) {
|
|
25
|
+
return `${(n / 1_000).toFixed(2)}µs`;
|
|
26
|
+
}
|
|
27
|
+
return `${n}ns`;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* ANSI color codes for visual trace separation.
|
|
31
|
+
* Each trace gets a consistent color based on trace_id hash.
|
|
32
|
+
*/
|
|
33
|
+
const COLORS = [
|
|
34
|
+
'\u001b[31m', // Red
|
|
35
|
+
'\u001b[32m', // Green
|
|
36
|
+
'\u001b[33m', // Yellow
|
|
37
|
+
'\u001b[34m', // Blue
|
|
38
|
+
'\u001b[35m', // Magenta
|
|
39
|
+
'\u001b[36m', // Cyan
|
|
40
|
+
'\u001b[91m', // Bright Red
|
|
41
|
+
'\u001b[92m', // Bright Green
|
|
42
|
+
'\u001b[93m', // Bright Yellow
|
|
43
|
+
'\u001b[94m', // Bright Blue
|
|
44
|
+
'\u001b[95m', // Bright Magenta
|
|
45
|
+
'\u001b[96m', // Bright Cyan
|
|
46
|
+
];
|
|
47
|
+
const RESET = '\u001b[0m';
|
|
48
|
+
/**
|
|
49
|
+
* Get consistent color for a trace_id.
|
|
50
|
+
* Uses modulo arithmetic to map 128-bit trace_id to one of the colors.
|
|
51
|
+
*/
|
|
52
|
+
function getTraceColor(traceId) {
|
|
53
|
+
// Convert TraceId (string representation) to a number for coloring
|
|
54
|
+
// Use simple hash of the string to pick a color
|
|
55
|
+
let hash = 0;
|
|
56
|
+
const str = String(traceId);
|
|
57
|
+
for (let i = 0; i < str.length; i++) {
|
|
58
|
+
const char = str.charCodeAt(i);
|
|
59
|
+
// Simple hash function
|
|
60
|
+
hash = (hash << 5) - hash + char;
|
|
61
|
+
hash = hash & hash;
|
|
62
|
+
}
|
|
63
|
+
const index = Math.abs(hash) % COLORS.length;
|
|
64
|
+
return COLORS[index];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get status string from entry type.
|
|
68
|
+
*/
|
|
69
|
+
function getStatus(entryType) {
|
|
70
|
+
switch (entryType) {
|
|
71
|
+
case ENTRY_TYPE_SPAN_OK:
|
|
72
|
+
return 'OK';
|
|
73
|
+
case ENTRY_TYPE_SPAN_ERR:
|
|
74
|
+
return 'ERR';
|
|
75
|
+
case ENTRY_TYPE_SPAN_EXCEPTION:
|
|
76
|
+
return 'EXCEPTION';
|
|
77
|
+
default:
|
|
78
|
+
return 'UNKNOWN';
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function getLogLevel(entryType) {
|
|
82
|
+
switch (entryType) {
|
|
83
|
+
case ENTRY_TYPE_TRACE:
|
|
84
|
+
return 'TRACE';
|
|
85
|
+
case ENTRY_TYPE_DEBUG:
|
|
86
|
+
return 'DEBUG';
|
|
87
|
+
case ENTRY_TYPE_INFO:
|
|
88
|
+
return 'INFO';
|
|
89
|
+
case ENTRY_TYPE_WARN:
|
|
90
|
+
return 'WARN';
|
|
91
|
+
case ENTRY_TYPE_ERROR:
|
|
92
|
+
return 'ERROR';
|
|
93
|
+
default:
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function formatTemplateMessage(buffer, row, template) {
|
|
98
|
+
return template.replace(/\{\{([A-Za-z0-9_]+)\}\}/g, (_full, key) => {
|
|
99
|
+
const values = Reflect.get(buffer, `${key}_values`);
|
|
100
|
+
if (values == null)
|
|
101
|
+
return `{{${key}}}`;
|
|
102
|
+
if (Array.isArray(values)) {
|
|
103
|
+
const value = values[row];
|
|
104
|
+
return value === null || value === undefined ? `{{${key}}}` : String(value);
|
|
105
|
+
}
|
|
106
|
+
if (ArrayBuffer.isView(values)) {
|
|
107
|
+
const value = Reflect.get(values, row);
|
|
108
|
+
return value === null || value === undefined ? `{{${key}}}` : String(value);
|
|
109
|
+
}
|
|
110
|
+
return `{{${key}}}`;
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
// ============================================================================
|
|
114
|
+
// StdioTracer
|
|
115
|
+
// ============================================================================
|
|
116
|
+
/**
|
|
117
|
+
* Tracer that prints spans to stdout/stderr with colored, indented output.
|
|
118
|
+
*
|
|
119
|
+
* Features:
|
|
120
|
+
* - Color-coded trace IDs for visual separation of concurrent traces
|
|
121
|
+
* - Per-trace indent tracking (concurrent-safe via Map)
|
|
122
|
+
* - Tree-style output (├─ for start, └─ for end)
|
|
123
|
+
* - Human-readable timestamps and durations
|
|
124
|
+
* - Exceptions go to stderr
|
|
125
|
+
*/
|
|
126
|
+
export class StdioTracer extends Tracer {
|
|
127
|
+
/**
|
|
128
|
+
* Per-trace indent levels for concurrent-safe nesting.
|
|
129
|
+
* Key is trace_id string representation, value is current indent level.
|
|
130
|
+
*/
|
|
131
|
+
indents = new Map();
|
|
132
|
+
out;
|
|
133
|
+
err;
|
|
134
|
+
colorEnabled;
|
|
135
|
+
constructor(binding, options) {
|
|
136
|
+
super(binding, options);
|
|
137
|
+
this.out = options.out ?? process.stdout;
|
|
138
|
+
this.err = options.err ?? process.stderr;
|
|
139
|
+
this.colorEnabled = options.colorEnabled ?? true;
|
|
140
|
+
}
|
|
141
|
+
// --------------------------------------------------------------------------
|
|
142
|
+
// Indent Management
|
|
143
|
+
// --------------------------------------------------------------------------
|
|
144
|
+
getIndent(traceId) {
|
|
145
|
+
const key = String(traceId);
|
|
146
|
+
return this.indents.get(key) ?? 0;
|
|
147
|
+
}
|
|
148
|
+
incrementIndent(traceId) {
|
|
149
|
+
const key = String(traceId);
|
|
150
|
+
this.indents.set(key, this.getIndent(traceId) + 1);
|
|
151
|
+
}
|
|
152
|
+
decrementIndent(traceId) {
|
|
153
|
+
const key = String(traceId);
|
|
154
|
+
const current = this.getIndent(traceId);
|
|
155
|
+
if (current <= 1) {
|
|
156
|
+
this.indents.delete(key); // Cleanup when trace ends
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
this.indents.set(key, current - 1);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
// --------------------------------------------------------------------------
|
|
163
|
+
// Color Helpers
|
|
164
|
+
// --------------------------------------------------------------------------
|
|
165
|
+
color(traceId) {
|
|
166
|
+
return this.colorEnabled ? getTraceColor(traceId) : '';
|
|
167
|
+
}
|
|
168
|
+
reset() {
|
|
169
|
+
return this.colorEnabled ? RESET : '';
|
|
170
|
+
}
|
|
171
|
+
printLogRows(buffer, indent) {
|
|
172
|
+
let current = buffer;
|
|
173
|
+
let isRootSegment = true;
|
|
174
|
+
while (current) {
|
|
175
|
+
const start = isRootSegment ? 2 : 0;
|
|
176
|
+
const end = current._writeIndex;
|
|
177
|
+
for (let i = start; i < end; i++) {
|
|
178
|
+
const level = getLogLevel(current.entry_type[i]);
|
|
179
|
+
if (!level)
|
|
180
|
+
continue;
|
|
181
|
+
const template = current.message_values[i] ?? '';
|
|
182
|
+
const message = formatTemplateMessage(current, i, template);
|
|
183
|
+
const ts = formatTimestamp(current.timestamp[i]);
|
|
184
|
+
const traceId = current.trace_id;
|
|
185
|
+
const line = `[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ` +
|
|
186
|
+
`${' '.repeat(indent)}· ${level} ${message}\n`;
|
|
187
|
+
if (level === 'ERROR') {
|
|
188
|
+
this.err.write(line);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
this.out.write(line);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
current = current._overflow ?? null;
|
|
195
|
+
isRootSegment = false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// --------------------------------------------------------------------------
|
|
199
|
+
// Lifecycle Hooks
|
|
200
|
+
// --------------------------------------------------------------------------
|
|
201
|
+
onTraceStart(rootBuffer) {
|
|
202
|
+
const traceId = rootBuffer.trace_id;
|
|
203
|
+
const name = rootBuffer.message_values[0];
|
|
204
|
+
const ts = formatTimestamp(rootBuffer.timestamp[0]);
|
|
205
|
+
this.out.write(`[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${name}\n`);
|
|
206
|
+
this.incrementIndent(traceId);
|
|
207
|
+
}
|
|
208
|
+
onTraceEnd(rootBuffer) {
|
|
209
|
+
const traceId = rootBuffer.trace_id;
|
|
210
|
+
this.printLogRows(rootBuffer, 1);
|
|
211
|
+
this.decrementIndent(traceId);
|
|
212
|
+
const name = rootBuffer.message_values[0];
|
|
213
|
+
const startTs = rootBuffer.timestamp[0];
|
|
214
|
+
const endTs = rootBuffer.timestamp[1];
|
|
215
|
+
const duration = formatDuration(endTs - startTs);
|
|
216
|
+
const entryType = rootBuffer.entry_type[1];
|
|
217
|
+
const status = getStatus(entryType);
|
|
218
|
+
const ts = formatTimestamp(endTs);
|
|
219
|
+
const line = `[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${name} [${status}] (${duration}) ${'='.repeat(40)}\n`;
|
|
220
|
+
// Write exceptions to stderr
|
|
221
|
+
if (entryType === ENTRY_TYPE_SPAN_EXCEPTION) {
|
|
222
|
+
this.err.write(line);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
this.out.write(line);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
onSpanStart(childBuffer) {
|
|
229
|
+
const traceId = childBuffer.trace_id;
|
|
230
|
+
const indent = this.getIndent(traceId);
|
|
231
|
+
const name = childBuffer.message_values[0];
|
|
232
|
+
const ts = formatTimestamp(childBuffer.timestamp[0]);
|
|
233
|
+
this.out.write(`[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${' '.repeat(indent)}├─ ${name}\n`);
|
|
234
|
+
this.incrementIndent(traceId);
|
|
235
|
+
}
|
|
236
|
+
onSpanEnd(childBuffer) {
|
|
237
|
+
const traceId = childBuffer.trace_id;
|
|
238
|
+
this.decrementIndent(traceId);
|
|
239
|
+
const indent = this.getIndent(traceId);
|
|
240
|
+
this.printLogRows(childBuffer, indent + 1);
|
|
241
|
+
const name = childBuffer.message_values[0];
|
|
242
|
+
const startTs = childBuffer.timestamp[0];
|
|
243
|
+
const endTs = childBuffer.timestamp[1];
|
|
244
|
+
const duration = formatDuration(endTs - startTs);
|
|
245
|
+
const entryType = childBuffer.entry_type[1];
|
|
246
|
+
const status = getStatus(entryType);
|
|
247
|
+
const ts = formatTimestamp(endTs);
|
|
248
|
+
const line = `[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${' '.repeat(indent)}└─ ${name} [${status}] (${duration})\n`;
|
|
249
|
+
// Write exceptions to stderr
|
|
250
|
+
if (entryType === ENTRY_TYPE_SPAN_EXCEPTION) {
|
|
251
|
+
this.err.write(line);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
this.out.write(line);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
onStatsWillResetFor(_buffer) {
|
|
258
|
+
const stats = _buffer._stats;
|
|
259
|
+
// Compute utilization = totalWrites / (spansCreated * usableRowsPerSpan)
|
|
260
|
+
const usableRowsPerSpan = stats.capacity - 2;
|
|
261
|
+
const utilization = stats.spansCreated > 0
|
|
262
|
+
? ((stats.totalWrites / (stats.spansCreated * usableRowsPerSpan)) * 100).toFixed(1)
|
|
263
|
+
: '0.0';
|
|
264
|
+
const traceId = _buffer.trace_id;
|
|
265
|
+
const ts = formatTimestamp(_buffer.timestamp[0]);
|
|
266
|
+
this.out.write(`[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ` +
|
|
267
|
+
`[CAPACITY] writes=${stats.totalWrites} spans=${stats.spansCreated} utilization=${utilization}% ` +
|
|
268
|
+
`capacity=${stats.capacity}\n`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TestTracer - A tracer that accumulates completed root trace buffers for test inspection.
|
|
3
|
+
*
|
|
4
|
+
* Child spans are accessible via the buffer's `_children` tree - no need to track them separately.
|
|
5
|
+
* This is the primary tracer for tests that need to inspect trace output, convert to Arrow tables,
|
|
6
|
+
* or verify buffer contents.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import { createTraceRoot } from '@smoothbricks/lmao/node';
|
|
11
|
+
* import { JsBufferStrategy } from '@smoothbricks/lmao';
|
|
12
|
+
*
|
|
13
|
+
* const ctx = defineOpContext({ logSchema });
|
|
14
|
+
* const tracer = new TestTracer(ctx, {
|
|
15
|
+
* bufferStrategy: new JsBufferStrategy(),
|
|
16
|
+
* createTraceRoot,
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* await tracer.trace('my-op', myOp);
|
|
20
|
+
*
|
|
21
|
+
* // Inspect buffers
|
|
22
|
+
* expect(tracer.rootBuffers).toHaveLength(1);
|
|
23
|
+
*
|
|
24
|
+
* // Convert to Arrow using strategy
|
|
25
|
+
* const table = await tracer.bufferStrategy.toArrowTable(tracer.rootBuffers[0]);
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @module tracers/TestTracer
|
|
29
|
+
*/
|
|
30
|
+
import type { OpContextBinding } from '../opContext/types.js';
|
|
31
|
+
import type { LogSchema } from '../schema/LogSchema.js';
|
|
32
|
+
import { Tracer } from '../tracer.js';
|
|
33
|
+
import type { SpanBuffer } from '../types.js';
|
|
34
|
+
/**
|
|
35
|
+
* Snapshot of buffer stats captured before reset during capacity tuning.
|
|
36
|
+
*/
|
|
37
|
+
export interface StatsSnapshot<T extends LogSchema = LogSchema> {
|
|
38
|
+
buffer: SpanBuffer<T>;
|
|
39
|
+
totalWrites: number;
|
|
40
|
+
spansCreated: number;
|
|
41
|
+
capacity: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Test tracer that accumulates root buffers for inspection.
|
|
45
|
+
*
|
|
46
|
+
* Collects all completed root trace buffers in `rootBuffers` array.
|
|
47
|
+
* Child spans are accessible via the buffer's `_children` tree -
|
|
48
|
+
* no need to track them separately.
|
|
49
|
+
*
|
|
50
|
+
* Also tracks capacity tuning events via `statsSnapshots` to verify
|
|
51
|
+
* that `onStatsWillResetFor` is called before stats are reset.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* const ctx = defineOpContext({ logSchema });
|
|
56
|
+
* const tracer = new TestTracer(ctx);
|
|
57
|
+
* const { trace } = tracer;
|
|
58
|
+
*
|
|
59
|
+
* await trace('my-op', myOp);
|
|
60
|
+
*
|
|
61
|
+
* // Inspect buffer
|
|
62
|
+
* expect(tracer.rootBuffers).toHaveLength(1);
|
|
63
|
+
* expect(tracer.rootBuffers[0].message_values[0]).toBe('my-op');
|
|
64
|
+
*
|
|
65
|
+
* // Convert to Arrow for detailed inspection
|
|
66
|
+
* const table = convertSpanTreeToArrowTable(tracer.rootBuffers[0]);
|
|
67
|
+
* expect(table.numRows).toBe(2); // span-start + span-ok
|
|
68
|
+
*
|
|
69
|
+
* // Verify capacity tuning was captured
|
|
70
|
+
* expect(tracer.statsSnapshots.length).toBeGreaterThan(0);
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare class TestTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
|
|
74
|
+
/**
|
|
75
|
+
* All completed root trace buffers.
|
|
76
|
+
* Child spans are accessible via each buffer's `_children` tree.
|
|
77
|
+
*/
|
|
78
|
+
readonly rootBuffers: SpanBuffer<B['logBinding']['logSchema']>[];
|
|
79
|
+
/**
|
|
80
|
+
* Stats snapshots captured before reset during capacity tuning.
|
|
81
|
+
* Used to verify onStatsWillResetFor hook is called correctly.
|
|
82
|
+
*/
|
|
83
|
+
readonly statsSnapshots: StatsSnapshot<B['logBinding']['logSchema']>[];
|
|
84
|
+
onTraceStart(_rootBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
85
|
+
onTraceEnd(rootBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
86
|
+
onSpanStart(_childBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
87
|
+
onSpanEnd(_childBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
88
|
+
onStatsWillResetFor(buffer: SpanBuffer<B['logBinding']['logSchema']>): void;
|
|
89
|
+
/**
|
|
90
|
+
* Clear all collected buffers and stats snapshots.
|
|
91
|
+
* Useful for cleanup between tests.
|
|
92
|
+
*/
|
|
93
|
+
clear(): void;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=TestTracer.d.ts.map
|
|
@@ -0,0 +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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,UAAU,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACtF;;;OAGG;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;IAIzE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAKtE,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIzE,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIvE,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAe3E;;;OAGG;IACH,KAAK,IAAI,IAAI;CASd"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Tracer } from '../tracer.js';
|
|
2
|
+
function isResettableBufferStrategy(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null && typeof Reflect.get(value, 'reset') === 'function';
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Test tracer that accumulates root buffers for inspection.
|
|
7
|
+
*
|
|
8
|
+
* Collects all completed root trace buffers in `rootBuffers` array.
|
|
9
|
+
* Child spans are accessible via the buffer's `_children` tree -
|
|
10
|
+
* no need to track them separately.
|
|
11
|
+
*
|
|
12
|
+
* Also tracks capacity tuning events via `statsSnapshots` to verify
|
|
13
|
+
* that `onStatsWillResetFor` is called before stats are reset.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const ctx = defineOpContext({ logSchema });
|
|
18
|
+
* const tracer = new TestTracer(ctx);
|
|
19
|
+
* const { trace } = tracer;
|
|
20
|
+
*
|
|
21
|
+
* await trace('my-op', myOp);
|
|
22
|
+
*
|
|
23
|
+
* // Inspect buffer
|
|
24
|
+
* expect(tracer.rootBuffers).toHaveLength(1);
|
|
25
|
+
* expect(tracer.rootBuffers[0].message_values[0]).toBe('my-op');
|
|
26
|
+
*
|
|
27
|
+
* // Convert to Arrow for detailed inspection
|
|
28
|
+
* const table = convertSpanTreeToArrowTable(tracer.rootBuffers[0]);
|
|
29
|
+
* expect(table.numRows).toBe(2); // span-start + span-ok
|
|
30
|
+
*
|
|
31
|
+
* // Verify capacity tuning was captured
|
|
32
|
+
* expect(tracer.statsSnapshots.length).toBeGreaterThan(0);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export class TestTracer extends Tracer {
|
|
36
|
+
/**
|
|
37
|
+
* All completed root trace buffers.
|
|
38
|
+
* Child spans are accessible via each buffer's `_children` tree.
|
|
39
|
+
*/
|
|
40
|
+
rootBuffers = [];
|
|
41
|
+
/**
|
|
42
|
+
* Stats snapshots captured before reset during capacity tuning.
|
|
43
|
+
* Used to verify onStatsWillResetFor hook is called correctly.
|
|
44
|
+
*/
|
|
45
|
+
statsSnapshots = [];
|
|
46
|
+
// ===========================================================================
|
|
47
|
+
// Lifecycle hook implementations
|
|
48
|
+
// ===========================================================================
|
|
49
|
+
onTraceStart(_rootBuffer) {
|
|
50
|
+
// No-op - we collect on end, not start
|
|
51
|
+
}
|
|
52
|
+
onTraceEnd(rootBuffer) {
|
|
53
|
+
// Collect the root buffer when trace completes
|
|
54
|
+
this.rootBuffers.push(rootBuffer);
|
|
55
|
+
}
|
|
56
|
+
onSpanStart(_childBuffer) {
|
|
57
|
+
// No-op - children are in tree, accessed via rootBuffer._children
|
|
58
|
+
}
|
|
59
|
+
onSpanEnd(_childBuffer) {
|
|
60
|
+
// No-op - children are in tree, accessed via rootBuffer._children
|
|
61
|
+
}
|
|
62
|
+
onStatsWillResetFor(buffer) {
|
|
63
|
+
// Capture stats snapshot before they're reset
|
|
64
|
+
const stats = buffer._stats;
|
|
65
|
+
this.statsSnapshots.push({
|
|
66
|
+
buffer,
|
|
67
|
+
totalWrites: stats.totalWrites,
|
|
68
|
+
spansCreated: stats.spansCreated,
|
|
69
|
+
capacity: stats.capacity,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// ===========================================================================
|
|
73
|
+
// Test utilities
|
|
74
|
+
// ===========================================================================
|
|
75
|
+
/**
|
|
76
|
+
* Clear all collected buffers and stats snapshots.
|
|
77
|
+
* Useful for cleanup between tests.
|
|
78
|
+
*/
|
|
79
|
+
clear() {
|
|
80
|
+
this.rootBuffers.length = 0;
|
|
81
|
+
this.statsSnapshots.length = 0;
|
|
82
|
+
// Reset the buffer strategy if it supports it (e.g., WasmBufferStrategy)
|
|
83
|
+
if (isResettableBufferStrategy(this.bufferStrategy)) {
|
|
84
|
+
this.bufferStrategy.reset();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|