@superblocksteam/telemetry 2.0.0-SNAPSHOT.329be19cb7ca892b
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/LICENSE.txt +87 -0
- package/README.md +298 -0
- package/dist/browser/console-logging.d.ts +18 -0
- package/dist/browser/console-logging.d.ts.map +1 -0
- package/dist/browser/console-logging.js +32 -0
- package/dist/browser/console-logging.js.map +1 -0
- package/dist/browser/early-console-buffer.d.ts +49 -0
- package/dist/browser/early-console-buffer.d.ts.map +1 -0
- package/dist/browser/early-console-buffer.js +182 -0
- package/dist/browser/early-console-buffer.js.map +1 -0
- package/dist/browser/index.d.ts +17 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +50 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/init.d.ts +101 -0
- package/dist/browser/init.d.ts.map +1 -0
- package/dist/browser/init.js +329 -0
- package/dist/browser/init.js.map +1 -0
- package/dist/browser/instrumentations.d.ts +67 -0
- package/dist/browser/instrumentations.d.ts.map +1 -0
- package/dist/browser/instrumentations.js +83 -0
- package/dist/browser/instrumentations.js.map +1 -0
- package/dist/browser/logs.d.ts +55 -0
- package/dist/browser/logs.d.ts.map +1 -0
- package/dist/browser/logs.js +86 -0
- package/dist/browser/logs.js.map +1 -0
- package/dist/browser/metrics.d.ts +29 -0
- package/dist/browser/metrics.d.ts.map +1 -0
- package/dist/browser/metrics.js +49 -0
- package/dist/browser/metrics.js.map +1 -0
- package/dist/browser/resilient-exporter.d.ts +43 -0
- package/dist/browser/resilient-exporter.d.ts.map +1 -0
- package/dist/browser/resilient-exporter.js +88 -0
- package/dist/browser/resilient-exporter.js.map +1 -0
- package/dist/browser/sanitizer.d.ts +35 -0
- package/dist/browser/sanitizer.d.ts.map +1 -0
- package/dist/browser/sanitizer.js +211 -0
- package/dist/browser/sanitizer.js.map +1 -0
- package/dist/browser/traced-socket.d.ts +102 -0
- package/dist/browser/traced-socket.d.ts.map +1 -0
- package/dist/browser/traced-socket.js +203 -0
- package/dist/browser/traced-socket.js.map +1 -0
- package/dist/common/contracts/tier2-traces.d.ts +116 -0
- package/dist/common/contracts/tier2-traces.d.ts.map +1 -0
- package/dist/common/contracts/tier2-traces.js +736 -0
- package/dist/common/contracts/tier2-traces.js.map +1 -0
- package/dist/common/deployment-type.d.ts +18 -0
- package/dist/common/deployment-type.d.ts.map +1 -0
- package/dist/common/deployment-type.js +30 -0
- package/dist/common/deployment-type.js.map +1 -0
- package/dist/common/guardrails.d.ts +116 -0
- package/dist/common/guardrails.d.ts.map +1 -0
- package/dist/common/guardrails.js +189 -0
- package/dist/common/guardrails.js.map +1 -0
- package/dist/common/index.d.ts +18 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +34 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/log-sanitizer.d.ts +170 -0
- package/dist/common/log-sanitizer.d.ts.map +1 -0
- package/dist/common/log-sanitizer.js +690 -0
- package/dist/common/log-sanitizer.js.map +1 -0
- package/dist/common/normalize-metric-path.d.ts +2 -0
- package/dist/common/normalize-metric-path.d.ts.map +1 -0
- package/dist/common/normalize-metric-path.js +22 -0
- package/dist/common/normalize-metric-path.js.map +1 -0
- package/dist/common/policy-evaluator.d.ts +103 -0
- package/dist/common/policy-evaluator.d.ts.map +1 -0
- package/dist/common/policy-evaluator.js +200 -0
- package/dist/common/policy-evaluator.js.map +1 -0
- package/dist/common/resource.d.ts +79 -0
- package/dist/common/resource.d.ts.map +1 -0
- package/dist/common/resource.js +128 -0
- package/dist/common/resource.js.map +1 -0
- package/dist/common/tier-hints.d.ts +182 -0
- package/dist/common/tier-hints.d.ts.map +1 -0
- package/dist/common/tier-hints.js +209 -0
- package/dist/common/tier-hints.js.map +1 -0
- package/dist/common/trace-sanitizer.d.ts +82 -0
- package/dist/common/trace-sanitizer.d.ts.map +1 -0
- package/dist/common/trace-sanitizer.js +234 -0
- package/dist/common/trace-sanitizer.js.map +1 -0
- package/dist/common/traced-socket-types.d.ts +43 -0
- package/dist/common/traced-socket-types.d.ts.map +1 -0
- package/dist/common/traced-socket-types.js +17 -0
- package/dist/common/traced-socket-types.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/lint/forbidden-attributes.d.ts +149 -0
- package/dist/lint/forbidden-attributes.d.ts.map +1 -0
- package/dist/lint/forbidden-attributes.js +215 -0
- package/dist/lint/forbidden-attributes.js.map +1 -0
- package/dist/lint/index.d.ts +9 -0
- package/dist/lint/index.d.ts.map +1 -0
- package/dist/lint/index.js +16 -0
- package/dist/lint/index.js.map +1 -0
- package/dist/llmobs/index.d.ts +22 -0
- package/dist/llmobs/index.d.ts.map +1 -0
- package/dist/llmobs/index.js +29 -0
- package/dist/llmobs/index.js.map +1 -0
- package/dist/llmobs/tier1-exporter.d.ts +146 -0
- package/dist/llmobs/tier1-exporter.d.ts.map +1 -0
- package/dist/llmobs/tier1-exporter.js +199 -0
- package/dist/llmobs/tier1-exporter.js.map +1 -0
- package/dist/llmobs/tier2-summarizer.d.ts +268 -0
- package/dist/llmobs/tier2-summarizer.d.ts.map +1 -0
- package/dist/llmobs/tier2-summarizer.js +656 -0
- package/dist/llmobs/tier2-summarizer.js.map +1 -0
- package/dist/node/dynamic-attribute-processor.d.ts +43 -0
- package/dist/node/dynamic-attribute-processor.d.ts.map +1 -0
- package/dist/node/dynamic-attribute-processor.js +79 -0
- package/dist/node/dynamic-attribute-processor.js.map +1 -0
- package/dist/node/exporters/resilient-exporter.d.ts +91 -0
- package/dist/node/exporters/resilient-exporter.d.ts.map +1 -0
- package/dist/node/exporters/resilient-exporter.js +136 -0
- package/dist/node/exporters/resilient-exporter.js.map +1 -0
- package/dist/node/index.d.ts +13 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +32 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/init.d.ts +97 -0
- package/dist/node/init.d.ts.map +1 -0
- package/dist/node/init.js +365 -0
- package/dist/node/init.js.map +1 -0
- package/dist/node/local-obs-mode.d.ts +17 -0
- package/dist/node/local-obs-mode.d.ts.map +1 -0
- package/dist/node/local-obs-mode.js +22 -0
- package/dist/node/local-obs-mode.js.map +1 -0
- package/dist/node/log-processor.d.ts +132 -0
- package/dist/node/log-processor.d.ts.map +1 -0
- package/dist/node/log-processor.js +397 -0
- package/dist/node/log-processor.js.map +1 -0
- package/dist/node/metrics-client.d.ts +88 -0
- package/dist/node/metrics-client.d.ts.map +1 -0
- package/dist/node/metrics-client.js +209 -0
- package/dist/node/metrics-client.js.map +1 -0
- package/dist/node/safe-logger.d.ts +55 -0
- package/dist/node/safe-logger.d.ts.map +1 -0
- package/dist/node/safe-logger.js +158 -0
- package/dist/node/safe-logger.js.map +1 -0
- package/dist/node/sanitizing-processor.d.ts +67 -0
- package/dist/node/sanitizing-processor.d.ts.map +1 -0
- package/dist/node/sanitizing-processor.js +167 -0
- package/dist/node/sanitizing-processor.js.map +1 -0
- package/dist/node/service-tracers.d.ts +52 -0
- package/dist/node/service-tracers.d.ts.map +1 -0
- package/dist/node/service-tracers.js +81 -0
- package/dist/node/service-tracers.js.map +1 -0
- package/dist/node/traced-socket.d.ts +120 -0
- package/dist/node/traced-socket.d.ts.map +1 -0
- package/dist/node/traced-socket.js +338 -0
- package/dist/node/traced-socket.js.map +1 -0
- package/dist/npm-registry/emitter.d.ts +310 -0
- package/dist/npm-registry/emitter.d.ts.map +1 -0
- package/dist/npm-registry/emitter.js +537 -0
- package/dist/npm-registry/emitter.js.map +1 -0
- package/dist/npm-registry/index.d.ts +12 -0
- package/dist/npm-registry/index.d.ts.map +1 -0
- package/dist/npm-registry/index.js +28 -0
- package/dist/npm-registry/index.js.map +1 -0
- package/dist/npm-registry/sanitize.d.ts +174 -0
- package/dist/npm-registry/sanitize.d.ts.map +1 -0
- package/dist/npm-registry/sanitize.js +342 -0
- package/dist/npm-registry/sanitize.js.map +1 -0
- package/dist/npm-registry/spans.d.ts +61 -0
- package/dist/npm-registry/spans.d.ts.map +1 -0
- package/dist/npm-registry/spans.js +91 -0
- package/dist/npm-registry/spans.js.map +1 -0
- package/dist/testing/in-memory-exporter.d.ts +179 -0
- package/dist/testing/in-memory-exporter.d.ts.map +1 -0
- package/dist/testing/in-memory-exporter.js +256 -0
- package/dist/testing/in-memory-exporter.js.map +1 -0
- package/dist/testing/index.d.ts +9 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +21 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/metrics-capture.d.ts +29 -0
- package/dist/testing/metrics-capture.d.ts.map +1 -0
- package/dist/testing/metrics-capture.js +74 -0
- package/dist/testing/metrics-capture.js.map +1 -0
- package/dist/testing/test-init.d.ts +80 -0
- package/dist/testing/test-init.d.ts.map +1 -0
- package/dist/testing/test-init.js +144 -0
- package/dist/testing/test-init.js.map +1 -0
- package/dist/types/index.d.ts +84 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/policy.d.ts +92 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/policy.js +125 -0
- package/dist/types/policy.js.map +1 -0
- package/dist-esm/browser/console-logging.d.ts +18 -0
- package/dist-esm/browser/console-logging.d.ts.map +1 -0
- package/dist-esm/browser/console-logging.js +27 -0
- package/dist-esm/browser/console-logging.js.map +1 -0
- package/dist-esm/browser/early-console-buffer.d.ts +49 -0
- package/dist-esm/browser/early-console-buffer.d.ts.map +1 -0
- package/dist-esm/browser/early-console-buffer.js +180 -0
- package/dist-esm/browser/early-console-buffer.js.map +1 -0
- package/dist-esm/browser/index.d.ts +17 -0
- package/dist-esm/browser/index.d.ts.map +1 -0
- package/dist-esm/browser/index.js +22 -0
- package/dist-esm/browser/index.js.map +1 -0
- package/dist-esm/browser/init.d.ts +101 -0
- package/dist-esm/browser/init.d.ts.map +1 -0
- package/dist-esm/browser/init.js +319 -0
- package/dist-esm/browser/init.js.map +1 -0
- package/dist-esm/browser/instrumentations.d.ts +67 -0
- package/dist-esm/browser/instrumentations.d.ts.map +1 -0
- package/dist-esm/browser/instrumentations.js +79 -0
- package/dist-esm/browser/instrumentations.js.map +1 -0
- package/dist-esm/browser/logs.d.ts +55 -0
- package/dist-esm/browser/logs.d.ts.map +1 -0
- package/dist-esm/browser/logs.js +79 -0
- package/dist-esm/browser/logs.js.map +1 -0
- package/dist-esm/browser/metrics.d.ts +29 -0
- package/dist-esm/browser/metrics.d.ts.map +1 -0
- package/dist-esm/browser/metrics.js +46 -0
- package/dist-esm/browser/metrics.js.map +1 -0
- package/dist-esm/browser/resilient-exporter.d.ts +43 -0
- package/dist-esm/browser/resilient-exporter.d.ts.map +1 -0
- package/dist-esm/browser/resilient-exporter.js +84 -0
- package/dist-esm/browser/resilient-exporter.js.map +1 -0
- package/dist-esm/browser/sanitizer.d.ts +35 -0
- package/dist-esm/browser/sanitizer.d.ts.map +1 -0
- package/dist-esm/browser/sanitizer.js +207 -0
- package/dist-esm/browser/sanitizer.js.map +1 -0
- package/dist-esm/browser/traced-socket.d.ts +102 -0
- package/dist-esm/browser/traced-socket.d.ts.map +1 -0
- package/dist-esm/browser/traced-socket.js +199 -0
- package/dist-esm/browser/traced-socket.js.map +1 -0
- package/dist-esm/common/contracts/tier2-traces.d.ts +116 -0
- package/dist-esm/common/contracts/tier2-traces.d.ts.map +1 -0
- package/dist-esm/common/contracts/tier2-traces.js +725 -0
- package/dist-esm/common/contracts/tier2-traces.js.map +1 -0
- package/dist-esm/common/deployment-type.d.ts +18 -0
- package/dist-esm/common/deployment-type.d.ts.map +1 -0
- package/dist-esm/common/deployment-type.js +27 -0
- package/dist-esm/common/deployment-type.js.map +1 -0
- package/dist-esm/common/guardrails.d.ts +116 -0
- package/dist-esm/common/guardrails.d.ts.map +1 -0
- package/dist-esm/common/guardrails.js +179 -0
- package/dist-esm/common/guardrails.js.map +1 -0
- package/dist-esm/common/index.d.ts +18 -0
- package/dist-esm/common/index.d.ts.map +1 -0
- package/dist-esm/common/index.js +18 -0
- package/dist-esm/common/index.js.map +1 -0
- package/dist-esm/common/log-sanitizer.d.ts +170 -0
- package/dist-esm/common/log-sanitizer.d.ts.map +1 -0
- package/dist-esm/common/log-sanitizer.js +672 -0
- package/dist-esm/common/log-sanitizer.js.map +1 -0
- package/dist-esm/common/normalize-metric-path.d.ts +2 -0
- package/dist-esm/common/normalize-metric-path.d.ts.map +1 -0
- package/dist-esm/common/normalize-metric-path.js +19 -0
- package/dist-esm/common/normalize-metric-path.js.map +1 -0
- package/dist-esm/common/policy-evaluator.d.ts +103 -0
- package/dist-esm/common/policy-evaluator.d.ts.map +1 -0
- package/dist-esm/common/policy-evaluator.js +196 -0
- package/dist-esm/common/policy-evaluator.js.map +1 -0
- package/dist-esm/common/resource.d.ts +79 -0
- package/dist-esm/common/resource.d.ts.map +1 -0
- package/dist-esm/common/resource.js +121 -0
- package/dist-esm/common/resource.js.map +1 -0
- package/dist-esm/common/tier-hints.d.ts +182 -0
- package/dist-esm/common/tier-hints.d.ts.map +1 -0
- package/dist-esm/common/tier-hints.js +199 -0
- package/dist-esm/common/tier-hints.js.map +1 -0
- package/dist-esm/common/trace-sanitizer.d.ts +82 -0
- package/dist-esm/common/trace-sanitizer.d.ts.map +1 -0
- package/dist-esm/common/trace-sanitizer.js +230 -0
- package/dist-esm/common/trace-sanitizer.js.map +1 -0
- package/dist-esm/common/traced-socket-types.d.ts +43 -0
- package/dist-esm/common/traced-socket-types.d.ts.map +1 -0
- package/dist-esm/common/traced-socket-types.js +16 -0
- package/dist-esm/common/traced-socket-types.js.map +1 -0
- package/dist-esm/index.d.ts +45 -0
- package/dist-esm/index.d.ts.map +1 -0
- package/dist-esm/index.js +56 -0
- package/dist-esm/index.js.map +1 -0
- package/dist-esm/lint/forbidden-attributes.d.ts +149 -0
- package/dist-esm/lint/forbidden-attributes.d.ts.map +1 -0
- package/dist-esm/lint/forbidden-attributes.js +210 -0
- package/dist-esm/lint/forbidden-attributes.js.map +1 -0
- package/dist-esm/lint/index.d.ts +9 -0
- package/dist-esm/lint/index.d.ts.map +1 -0
- package/dist-esm/lint/index.js +9 -0
- package/dist-esm/lint/index.js.map +1 -0
- package/dist-esm/llmobs/index.d.ts +22 -0
- package/dist-esm/llmobs/index.d.ts.map +1 -0
- package/dist-esm/llmobs/index.js +22 -0
- package/dist-esm/llmobs/index.js.map +1 -0
- package/dist-esm/llmobs/tier1-exporter.d.ts +146 -0
- package/dist-esm/llmobs/tier1-exporter.d.ts.map +1 -0
- package/dist-esm/llmobs/tier1-exporter.js +193 -0
- package/dist-esm/llmobs/tier1-exporter.js.map +1 -0
- package/dist-esm/llmobs/tier2-summarizer.d.ts +268 -0
- package/dist-esm/llmobs/tier2-summarizer.d.ts.map +1 -0
- package/dist-esm/llmobs/tier2-summarizer.js +652 -0
- package/dist-esm/llmobs/tier2-summarizer.js.map +1 -0
- package/dist-esm/node/dynamic-attribute-processor.d.ts +43 -0
- package/dist-esm/node/dynamic-attribute-processor.d.ts.map +1 -0
- package/dist-esm/node/dynamic-attribute-processor.js +74 -0
- package/dist-esm/node/dynamic-attribute-processor.js.map +1 -0
- package/dist-esm/node/exporters/resilient-exporter.d.ts +91 -0
- package/dist-esm/node/exporters/resilient-exporter.d.ts.map +1 -0
- package/dist-esm/node/exporters/resilient-exporter.js +132 -0
- package/dist-esm/node/exporters/resilient-exporter.js.map +1 -0
- package/dist-esm/node/index.d.ts +13 -0
- package/dist-esm/node/index.d.ts.map +1 -0
- package/dist-esm/node/index.js +13 -0
- package/dist-esm/node/index.js.map +1 -0
- package/dist-esm/node/init.d.ts +97 -0
- package/dist-esm/node/init.d.ts.map +1 -0
- package/dist-esm/node/init.js +359 -0
- package/dist-esm/node/init.js.map +1 -0
- package/dist-esm/node/local-obs-mode.d.ts +17 -0
- package/dist-esm/node/local-obs-mode.d.ts.map +1 -0
- package/dist-esm/node/local-obs-mode.js +19 -0
- package/dist-esm/node/local-obs-mode.js.map +1 -0
- package/dist-esm/node/log-processor.d.ts +132 -0
- package/dist-esm/node/log-processor.d.ts.map +1 -0
- package/dist-esm/node/log-processor.js +389 -0
- package/dist-esm/node/log-processor.js.map +1 -0
- package/dist-esm/node/metrics-client.d.ts +88 -0
- package/dist-esm/node/metrics-client.d.ts.map +1 -0
- package/dist-esm/node/metrics-client.js +205 -0
- package/dist-esm/node/metrics-client.js.map +1 -0
- package/dist-esm/node/safe-logger.d.ts +55 -0
- package/dist-esm/node/safe-logger.d.ts.map +1 -0
- package/dist-esm/node/safe-logger.js +154 -0
- package/dist-esm/node/safe-logger.js.map +1 -0
- package/dist-esm/node/sanitizing-processor.d.ts +67 -0
- package/dist-esm/node/sanitizing-processor.d.ts.map +1 -0
- package/dist-esm/node/sanitizing-processor.js +163 -0
- package/dist-esm/node/sanitizing-processor.js.map +1 -0
- package/dist-esm/node/service-tracers.d.ts +52 -0
- package/dist-esm/node/service-tracers.d.ts.map +1 -0
- package/dist-esm/node/service-tracers.js +78 -0
- package/dist-esm/node/service-tracers.js.map +1 -0
- package/dist-esm/node/traced-socket.d.ts +120 -0
- package/dist-esm/node/traced-socket.d.ts.map +1 -0
- package/dist-esm/node/traced-socket.js +334 -0
- package/dist-esm/node/traced-socket.js.map +1 -0
- package/dist-esm/npm-registry/emitter.d.ts +310 -0
- package/dist-esm/npm-registry/emitter.d.ts.map +1 -0
- package/dist-esm/npm-registry/emitter.js +525 -0
- package/dist-esm/npm-registry/emitter.js.map +1 -0
- package/dist-esm/npm-registry/index.d.ts +12 -0
- package/dist-esm/npm-registry/index.d.ts.map +1 -0
- package/dist-esm/npm-registry/index.js +12 -0
- package/dist-esm/npm-registry/index.js.map +1 -0
- package/dist-esm/npm-registry/sanitize.d.ts +174 -0
- package/dist-esm/npm-registry/sanitize.d.ts.map +1 -0
- package/dist-esm/npm-registry/sanitize.js +331 -0
- package/dist-esm/npm-registry/sanitize.js.map +1 -0
- package/dist-esm/npm-registry/spans.d.ts +61 -0
- package/dist-esm/npm-registry/spans.d.ts.map +1 -0
- package/dist-esm/npm-registry/spans.js +86 -0
- package/dist-esm/npm-registry/spans.js.map +1 -0
- package/dist-esm/package.json +1 -0
- package/dist-esm/testing/in-memory-exporter.d.ts +179 -0
- package/dist-esm/testing/in-memory-exporter.d.ts.map +1 -0
- package/dist-esm/testing/in-memory-exporter.js +250 -0
- package/dist-esm/testing/in-memory-exporter.js.map +1 -0
- package/dist-esm/testing/index.d.ts +9 -0
- package/dist-esm/testing/index.d.ts.map +1 -0
- package/dist-esm/testing/index.js +9 -0
- package/dist-esm/testing/index.js.map +1 -0
- package/dist-esm/testing/metrics-capture.d.ts +29 -0
- package/dist-esm/testing/metrics-capture.d.ts.map +1 -0
- package/dist-esm/testing/metrics-capture.js +71 -0
- package/dist-esm/testing/metrics-capture.js.map +1 -0
- package/dist-esm/testing/test-init.d.ts +80 -0
- package/dist-esm/testing/test-init.d.ts.map +1 -0
- package/dist-esm/testing/test-init.js +137 -0
- package/dist-esm/testing/test-init.js.map +1 -0
- package/dist-esm/types/index.d.ts +84 -0
- package/dist-esm/types/index.d.ts.map +1 -0
- package/dist-esm/types/index.js +7 -0
- package/dist-esm/types/index.js.map +1 -0
- package/dist-esm/types/policy.d.ts +92 -0
- package/dist-esm/types/policy.d.ts.map +1 -0
- package/dist-esm/types/policy.js +122 -0
- package/dist-esm/types/policy.js.map +1 -0
- package/package.json +102 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Sanitizing Span Processor (Tier 2)
|
|
4
|
+
*
|
|
5
|
+
* Sanitizes spans before export per epic-a3-sanitized-traces.
|
|
6
|
+
* - All spans are passed to localProcessor (full fidelity for local/on-prem retention).
|
|
7
|
+
* - Only contract-compliant, sanitized spans are exported to Tier 2.
|
|
8
|
+
* - Fail-closed: when Tier 2 export is disabled, no exporter is attached.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.SanitizingSpanProcessor = exports.noopSpanProcessor = void 0;
|
|
12
|
+
const core_1 = require("@opentelemetry/core");
|
|
13
|
+
const policy_js_1 = require("../types/policy.js");
|
|
14
|
+
const BATCH_SIZE = 512;
|
|
15
|
+
/** Max pending spans before dropping. Aligns with BatchSpanProcessor / resilient-exporter queue limits. */
|
|
16
|
+
const MAX_PENDING_EXPORTS = 2048;
|
|
17
|
+
/** No-op span processor for the "local" path when only Tier 2 export is used. */
|
|
18
|
+
class NoopSpanProcessor {
|
|
19
|
+
onStart() { }
|
|
20
|
+
onEnd() { }
|
|
21
|
+
async shutdown() { }
|
|
22
|
+
async forceFlush() { }
|
|
23
|
+
}
|
|
24
|
+
exports.noopSpanProcessor = new NoopSpanProcessor();
|
|
25
|
+
const EXPORT_INTERVAL_MS = 5000;
|
|
26
|
+
/**
|
|
27
|
+
* Span processor that sanitizes spans before Tier 2 export.
|
|
28
|
+
*
|
|
29
|
+
* CRITICAL: This processor owns the export path. The exporter is internal.
|
|
30
|
+
* For Tier 1: All spans passed to localProcessor (e.g. no-op or local collector).
|
|
31
|
+
* For Tier 2: Only contract-compliant spans, sanitized, then batched and exported.
|
|
32
|
+
*
|
|
33
|
+
* NOTE: The wrapped tier2Exporter must tolerate concurrent export() calls.
|
|
34
|
+
* The periodic timer and the batch-size trigger can both fire flushExports()
|
|
35
|
+
* in the same tick. OTLPTraceExporter is safe; custom exporters should verify.
|
|
36
|
+
*/
|
|
37
|
+
class SanitizingSpanProcessor {
|
|
38
|
+
exportTimeoutMs;
|
|
39
|
+
sanitizer;
|
|
40
|
+
localProcessor;
|
|
41
|
+
tier2Exporter;
|
|
42
|
+
logger;
|
|
43
|
+
pendingExports = [];
|
|
44
|
+
exportTimer = null;
|
|
45
|
+
droppedQueueFull = false;
|
|
46
|
+
/** Tracks in-flight fire-and-forget flushes so shutdown/forceFlush can await them. */
|
|
47
|
+
inflight = new Set();
|
|
48
|
+
constructor(policyEvaluator, localProcessor, tier2Exporter, traceSanitizer, logger, exportTimeoutMs = 5000) {
|
|
49
|
+
this.exportTimeoutMs = exportTimeoutMs;
|
|
50
|
+
this.sanitizer = traceSanitizer;
|
|
51
|
+
this.localProcessor = localProcessor;
|
|
52
|
+
this.logger = logger;
|
|
53
|
+
this.tier2Exporter = policyEvaluator.isExportEnabled(policy_js_1.TelemetryTier.TIER_2_OPERATIONAL)
|
|
54
|
+
? tier2Exporter
|
|
55
|
+
: null;
|
|
56
|
+
if (this.tier2Exporter) {
|
|
57
|
+
this.exportTimer = setInterval(() => this.flushExports("periodic"), EXPORT_INTERVAL_MS);
|
|
58
|
+
this.exportTimer.unref();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
onStart(span, parentContext) {
|
|
62
|
+
this.localProcessor.onStart(span, parentContext);
|
|
63
|
+
}
|
|
64
|
+
onEnd(span) {
|
|
65
|
+
this.localProcessor.onEnd(span);
|
|
66
|
+
if (this.tier2Exporter) {
|
|
67
|
+
const sanitized = this.sanitizer.sanitize(span);
|
|
68
|
+
if (sanitized) {
|
|
69
|
+
if (this.pendingExports.length >= MAX_PENDING_EXPORTS) {
|
|
70
|
+
if (!this.droppedQueueFull) {
|
|
71
|
+
this.droppedQueueFull = true;
|
|
72
|
+
const msg = "Tier 2 pending queue full, dropping new spans until next flush";
|
|
73
|
+
const log = this.logger.error ?? this.logger.warn;
|
|
74
|
+
log({
|
|
75
|
+
component: "SanitizingSpanProcessor",
|
|
76
|
+
maxPendingExports: MAX_PENDING_EXPORTS,
|
|
77
|
+
}, msg);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
this.pendingExports.push(sanitized);
|
|
82
|
+
if (this.pendingExports.length >= BATCH_SIZE) {
|
|
83
|
+
this.flushExports("batch");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/** Fire-and-forget batch flush — tracks the in-flight promise so shutdown/forceFlush can await it. */
|
|
90
|
+
flushExports(phase) {
|
|
91
|
+
const p = this.flushExportsAsync(phase).finally(() => this.inflight.delete(p));
|
|
92
|
+
this.inflight.add(p);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Awaitable batch flush for drain paths (shutdown, forceFlush).
|
|
96
|
+
* Always resolves — times out after exportTimeoutMs if the exporter
|
|
97
|
+
* never calls its callback (e.g. broken socket, hung downstream).
|
|
98
|
+
*/
|
|
99
|
+
flushExportsAsync(phase) {
|
|
100
|
+
if (!this.tier2Exporter || this.pendingExports.length === 0) {
|
|
101
|
+
return Promise.resolve();
|
|
102
|
+
}
|
|
103
|
+
if (this.pendingExports.length < MAX_PENDING_EXPORTS) {
|
|
104
|
+
this.droppedQueueFull = false;
|
|
105
|
+
}
|
|
106
|
+
const batch = this.pendingExports.splice(0, BATCH_SIZE);
|
|
107
|
+
return new Promise((resolve) => {
|
|
108
|
+
const timer = setTimeout(() => {
|
|
109
|
+
this.logger.warn({
|
|
110
|
+
component: "SanitizingSpanProcessor",
|
|
111
|
+
batchSize: batch.length,
|
|
112
|
+
exportTimeoutMs: this.exportTimeoutMs,
|
|
113
|
+
phase,
|
|
114
|
+
}, "Tier 2 span export timed out");
|
|
115
|
+
resolve();
|
|
116
|
+
}, this.exportTimeoutMs).unref();
|
|
117
|
+
try {
|
|
118
|
+
this.tier2Exporter.export(batch, (result) => {
|
|
119
|
+
clearTimeout(timer);
|
|
120
|
+
if (result.code !== core_1.ExportResultCode.SUCCESS) {
|
|
121
|
+
this.logger.warn({
|
|
122
|
+
component: "SanitizingSpanProcessor",
|
|
123
|
+
err: result.error,
|
|
124
|
+
batchSize: batch.length,
|
|
125
|
+
}, "Tier 2 span export failed");
|
|
126
|
+
}
|
|
127
|
+
resolve();
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
clearTimeout(timer);
|
|
132
|
+
this.logger.warn({
|
|
133
|
+
component: "SanitizingSpanProcessor",
|
|
134
|
+
err,
|
|
135
|
+
batchSize: batch.length,
|
|
136
|
+
}, "Tier 2 span export threw synchronously");
|
|
137
|
+
resolve();
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
async shutdown() {
|
|
142
|
+
if (this.exportTimer) {
|
|
143
|
+
clearInterval(this.exportTimer);
|
|
144
|
+
this.exportTimer = null;
|
|
145
|
+
}
|
|
146
|
+
while (this.pendingExports.length > 0) {
|
|
147
|
+
await this.flushExportsAsync("shutdown");
|
|
148
|
+
}
|
|
149
|
+
await Promise.allSettled([...this.inflight]);
|
|
150
|
+
await this.localProcessor.shutdown();
|
|
151
|
+
if (this.tier2Exporter) {
|
|
152
|
+
await this.tier2Exporter.shutdown();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
async forceFlush() {
|
|
156
|
+
while (this.pendingExports.length > 0) {
|
|
157
|
+
await this.flushExportsAsync("forceFlush");
|
|
158
|
+
}
|
|
159
|
+
await Promise.allSettled([...this.inflight]);
|
|
160
|
+
await this.localProcessor.forceFlush();
|
|
161
|
+
if (this.tier2Exporter?.forceFlush) {
|
|
162
|
+
await this.tier2Exporter.forceFlush();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
exports.SanitizingSpanProcessor = SanitizingSpanProcessor;
|
|
167
|
+
//# sourceMappingURL=sanitizing-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitizing-processor.js","sourceRoot":"","sources":["../../src/node/sanitizing-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service-scoped tracer factory.
|
|
3
|
+
*
|
|
4
|
+
* `service.name` lives on the OTel Resource, and a process has exactly one
|
|
5
|
+
* primary Resource (set at SDK init). Datadog maps that resource `service.name`
|
|
6
|
+
* to LLM-Obs `ml_app`, so emitting a subset of spans under a different `ml_app`
|
|
7
|
+
* requires a provider with a different Resource — not a span attribute (which is
|
|
8
|
+
* forbidden) nor a second SDK (also forbidden outside this package).
|
|
9
|
+
*
|
|
10
|
+
* This factory lazily creates one additional `BasicTracerProvider` per
|
|
11
|
+
* non-default service name, each carrying a Resource derived from the base via
|
|
12
|
+
* {@link withServiceName} and sharing the SAME span processor (and therefore the
|
|
13
|
+
* same sanitization + export pipeline) as the primary SDK. See APPS-5082.
|
|
14
|
+
*
|
|
15
|
+
* Side effect: `service.name` also drives the Datadog APM `service`, so spans
|
|
16
|
+
* emitted under a secondary name surface as a separate APM service entity (not
|
|
17
|
+
* just a separate LLM-Obs `ml_app`).
|
|
18
|
+
*/
|
|
19
|
+
import { type Tracer } from "@opentelemetry/api";
|
|
20
|
+
import type { Resource } from "@opentelemetry/resources";
|
|
21
|
+
import { type SpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
22
|
+
/**
|
|
23
|
+
* A factory for tracers bound to a specific `service.name`.
|
|
24
|
+
*/
|
|
25
|
+
export interface ServiceTracers {
|
|
26
|
+
/**
|
|
27
|
+
* Get a tracer that emits spans under `serviceName`. When `serviceName` equals
|
|
28
|
+
* the default service, the primary (globally registered) provider is used.
|
|
29
|
+
*
|
|
30
|
+
* @param name - Instrumentation scope name
|
|
31
|
+
* @param serviceName - Service identity for emitted spans' resource
|
|
32
|
+
*/
|
|
33
|
+
getTracer(name: string, serviceName: string): Tracer;
|
|
34
|
+
/** Flush spans buffered by any secondary providers. */
|
|
35
|
+
shutdown(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a service-scoped tracer factory.
|
|
39
|
+
*
|
|
40
|
+
* @param config - Factory configuration
|
|
41
|
+
* @param config.baseResource - The primary SDK resource to derive from
|
|
42
|
+
* @param config.defaultServiceName - The primary service name (uses the global provider)
|
|
43
|
+
* @param config.serviceVersion - Instrumentation version passed to getTracer
|
|
44
|
+
* @param config.spanProcessor - Span processor shared with secondary providers (omit to disable export)
|
|
45
|
+
*/
|
|
46
|
+
export declare function createServiceTracers(config: {
|
|
47
|
+
baseResource: Resource;
|
|
48
|
+
defaultServiceName: string;
|
|
49
|
+
serviceVersion: string;
|
|
50
|
+
spanProcessor?: SpanProcessor;
|
|
51
|
+
}): ServiceTracers;
|
|
52
|
+
//# sourceMappingURL=service-tracers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-tracers.d.ts","sourceRoot":"","sources":["../../src/node/service-tracers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAS,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,+BAA+B,CAAC;AAIvC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;;;OAMG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IACrD,uDAAuD;IACvD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAC3C,YAAY,EAAE,QAAQ,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B,GAAG,cAAc,CAsDjB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Service-scoped tracer factory.
|
|
4
|
+
*
|
|
5
|
+
* `service.name` lives on the OTel Resource, and a process has exactly one
|
|
6
|
+
* primary Resource (set at SDK init). Datadog maps that resource `service.name`
|
|
7
|
+
* to LLM-Obs `ml_app`, so emitting a subset of spans under a different `ml_app`
|
|
8
|
+
* requires a provider with a different Resource — not a span attribute (which is
|
|
9
|
+
* forbidden) nor a second SDK (also forbidden outside this package).
|
|
10
|
+
*
|
|
11
|
+
* This factory lazily creates one additional `BasicTracerProvider` per
|
|
12
|
+
* non-default service name, each carrying a Resource derived from the base via
|
|
13
|
+
* {@link withServiceName} and sharing the SAME span processor (and therefore the
|
|
14
|
+
* same sanitization + export pipeline) as the primary SDK. See APPS-5082.
|
|
15
|
+
*
|
|
16
|
+
* Side effect: `service.name` also drives the Datadog APM `service`, so spans
|
|
17
|
+
* emitted under a secondary name surface as a separate APM service entity (not
|
|
18
|
+
* just a separate LLM-Obs `ml_app`).
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.createServiceTracers = createServiceTracers;
|
|
22
|
+
const api_1 = require("@opentelemetry/api");
|
|
23
|
+
const sdk_trace_base_1 = require("@opentelemetry/sdk-trace-base");
|
|
24
|
+
const resource_js_1 = require("../common/resource.js");
|
|
25
|
+
/**
|
|
26
|
+
* Create a service-scoped tracer factory.
|
|
27
|
+
*
|
|
28
|
+
* @param config - Factory configuration
|
|
29
|
+
* @param config.baseResource - The primary SDK resource to derive from
|
|
30
|
+
* @param config.defaultServiceName - The primary service name (uses the global provider)
|
|
31
|
+
* @param config.serviceVersion - Instrumentation version passed to getTracer
|
|
32
|
+
* @param config.spanProcessor - Span processor shared with secondary providers (omit to disable export)
|
|
33
|
+
*/
|
|
34
|
+
function createServiceTracers(config) {
|
|
35
|
+
const { baseResource, defaultServiceName, serviceVersion, spanProcessor } = config;
|
|
36
|
+
// One secondary provider per non-default service name.
|
|
37
|
+
const providers = new Map();
|
|
38
|
+
let shutdownCalled = false;
|
|
39
|
+
return {
|
|
40
|
+
getTracer(name, serviceName) {
|
|
41
|
+
// Default service (or a blank name, which would yield an empty ml_app)
|
|
42
|
+
// uses the globally registered provider — the primary SDK's when traces
|
|
43
|
+
// are enabled, otherwise the API's no-op provider. After shutdown we also
|
|
44
|
+
// route here so a late call (e.g. an in-flight request during graceful
|
|
45
|
+
// shutdown) never resurrects a secondary provider on the closing pipeline.
|
|
46
|
+
if (shutdownCalled ||
|
|
47
|
+
!serviceName.trim() ||
|
|
48
|
+
serviceName === defaultServiceName) {
|
|
49
|
+
return api_1.trace.getTracer(name, serviceVersion);
|
|
50
|
+
}
|
|
51
|
+
let provider = providers.get(serviceName);
|
|
52
|
+
if (!provider) {
|
|
53
|
+
provider = new sdk_trace_base_1.BasicTracerProvider({
|
|
54
|
+
resource: (0, resource_js_1.withServiceName)(baseResource, serviceName),
|
|
55
|
+
// Share the primary span processor so sanitization + export are
|
|
56
|
+
// identical. The primary SDK owns its lifecycle (shutdown), so we
|
|
57
|
+
// never shut the shared processor down from here — see shutdown().
|
|
58
|
+
spanProcessors: spanProcessor ? [spanProcessor] : [],
|
|
59
|
+
});
|
|
60
|
+
providers.set(serviceName, provider);
|
|
61
|
+
}
|
|
62
|
+
return provider.getTracer(name, serviceVersion);
|
|
63
|
+
},
|
|
64
|
+
async shutdown() {
|
|
65
|
+
shutdownCalled = true;
|
|
66
|
+
// Every secondary provider shares the one primary span processor, so flush
|
|
67
|
+
// it once rather than N times through each provider. Flush only — the
|
|
68
|
+
// primary SDK owns the processor's shutdown; closing it here would
|
|
69
|
+
// double-close it. Swallow+log so a flush failure can't reject (which
|
|
70
|
+
// would block the caller's primary sdk.shutdown()) nor vanish silently.
|
|
71
|
+
try {
|
|
72
|
+
await spanProcessor?.forceFlush();
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.warn("[Telemetry] Secondary-service tracer flush failed during shutdown:", error);
|
|
76
|
+
}
|
|
77
|
+
providers.clear();
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=service-tracers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-tracers.js","sourceRoot":"","sources":["../../src/node/service-tracers.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AAoCH,oDA2DC;AA7FD,4CAAwD;AAExD,kEAGuC;AAEvC,uDAAwD;AAkBxD;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAAC,MAKpC;IACC,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,GACvE,MAAM,CAAC;IACT,uDAAuD;IACvD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA+B,CAAC;IACzD,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,OAAO;QACL,SAAS,CAAC,IAAY,EAAE,WAAmB;YACzC,uEAAuE;YACvE,wEAAwE;YACxE,0EAA0E;YAC1E,uEAAuE;YACvE,2EAA2E;YAC3E,IACE,cAAc;gBACd,CAAC,WAAW,CAAC,IAAI,EAAE;gBACnB,WAAW,KAAK,kBAAkB,EAClC,CAAC;gBACD,OAAO,WAAK,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,QAAQ,GAAG,IAAI,oCAAmB,CAAC;oBACjC,QAAQ,EAAE,IAAA,6BAAe,EAAC,YAAY,EAAE,WAAW,CAAC;oBACpD,gEAAgE;oBAChE,kEAAkE;oBAClE,mEAAmE;oBACnE,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE;iBACrD,CAAC,CAAC;gBACH,SAAS,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAClD,CAAC;QAED,KAAK,CAAC,QAAQ;YACZ,cAAc,GAAG,IAAI,CAAC;YACtB,2EAA2E;YAC3E,sEAAsE;YACtE,mEAAmE;YACnE,sEAAsE;YACtE,wEAAwE;YACxE,IAAI,CAAC;gBACH,MAAM,aAAa,EAAE,UAAU,EAAE,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CACV,oEAAoE,EACpE,KAAK,CACN,CAAC;YACJ,CAAC;YACD,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TracedSocket for WebSocket connections with OpenTelemetry tracing.
|
|
3
|
+
*
|
|
4
|
+
* This is a generic implementation that can be used across services.
|
|
5
|
+
* Server-specific behavior (like error handling) is injected via callbacks.
|
|
6
|
+
*/
|
|
7
|
+
import { IncomingHttpHeaders } from "http";
|
|
8
|
+
import { Tracer } from "@opentelemetry/api";
|
|
9
|
+
import { ISocket, ISocketClient, MethodHandler, RequestContextBase, SocketMessage, SocketError, MethodHandlers, GenericMiddleware, SocketTimeouts } from "@superblocksteam/shared";
|
|
10
|
+
import { TelemetryTier } from "../types/policy.js";
|
|
11
|
+
/**
|
|
12
|
+
* PinoLogger interface compatible with pino.
|
|
13
|
+
*/
|
|
14
|
+
interface PinoLogger {
|
|
15
|
+
error: (obj: object, msg?: string) => void;
|
|
16
|
+
info: (obj: object, msg?: string) => void;
|
|
17
|
+
warn: (obj: object, msg?: string) => void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* WebSocket interface (subset of isomorphic-ws).
|
|
21
|
+
*/
|
|
22
|
+
interface WebSocketLike {
|
|
23
|
+
readonly readyState: number;
|
|
24
|
+
close(code?: number, reason?: string): void;
|
|
25
|
+
send(data: string | ArrayBuffer): void;
|
|
26
|
+
addEventListener(type: string, listener: (event: unknown) => void): void;
|
|
27
|
+
removeEventListener(type: string, listener: (event: unknown) => void): void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Policy evaluator type (avoids circular dependency on full init).
|
|
31
|
+
* Use TelemetryPolicyEvaluator from @superblocksteam/telemetry for policy-aware attribute filtering.
|
|
32
|
+
*/
|
|
33
|
+
export type TracedSocketPolicyEvaluator = {
|
|
34
|
+
evaluate: (tier: TelemetryTier) => {
|
|
35
|
+
export: boolean;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Configuration options for TracedSocket.
|
|
40
|
+
*
|
|
41
|
+
* Supports both server (HTTP upgrade with requestHeaders) and client/dev (tracer-only) use cases
|
|
42
|
+
* for a single consolidated implementation per W3C context propagation epic.
|
|
43
|
+
*/
|
|
44
|
+
export interface TracedSocketConfig {
|
|
45
|
+
/** Request headers from the WebSocket upgrade request (for W3C trace context extraction). Defaults to {}. */
|
|
46
|
+
requestHeaders?: IncomingHttpHeaders;
|
|
47
|
+
/** Tracer instance. Defaults to trace.getTracer("superblocks-ws", "0.0.0"). */
|
|
48
|
+
tracer?: Tracer;
|
|
49
|
+
/** Policy evaluator for tier-aware attribute filtering (e.g. from getTelemetryInstance()). */
|
|
50
|
+
policyEvaluator?: TracedSocketPolicyEvaluator;
|
|
51
|
+
/** Optional error handler to get HTTP status from errors */
|
|
52
|
+
getResponseMetaByError?: (error: Error, logger: PinoLogger) => {
|
|
53
|
+
status: number;
|
|
54
|
+
message: string;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Socket options passed to ISocket.
|
|
59
|
+
*/
|
|
60
|
+
export interface TracedSocketOptions {
|
|
61
|
+
onClose: (event: {
|
|
62
|
+
code: number;
|
|
63
|
+
reason: string;
|
|
64
|
+
}) => void;
|
|
65
|
+
timeouts?: SocketTimeouts;
|
|
66
|
+
logger?: {
|
|
67
|
+
error: (message?: string) => void;
|
|
68
|
+
info: (message?: string) => void;
|
|
69
|
+
warn: (message?: string) => void;
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* TracedSocket extends ISocket to add OpenTelemetry tracing capabilities.
|
|
74
|
+
*
|
|
75
|
+
* We override decorateToSend so that outbound request messages carry W3C
|
|
76
|
+
* traceparent/tracestate, enabling trace continuity for both inbound and
|
|
77
|
+
* outbound use (server and vite-plugin-file-sync).
|
|
78
|
+
*/
|
|
79
|
+
export declare class TracedSocket<ImplementedMethods, CallableMethods, RequestContext extends RequestContextBase> extends ISocket<ImplementedMethods, CallableMethods, RequestContext> {
|
|
80
|
+
private activeSpanByRequestId;
|
|
81
|
+
private middlewareSpanByReqId;
|
|
82
|
+
private lastActiveSpan;
|
|
83
|
+
private readonly requestHeaders;
|
|
84
|
+
private readonly tracer;
|
|
85
|
+
private readonly policyEvaluator?;
|
|
86
|
+
private readonly setHttpStatusFromError;
|
|
87
|
+
constructor(ws: WebSocketLike, requestHandlers: MethodHandlers<ImplementedMethods, CallableMethods, RequestContext>, globalMiddlewares: GenericMiddleware<CallableMethods, RequestContext>[], config: TracedSocketConfig, options: TracedSocketOptions);
|
|
88
|
+
/**
|
|
89
|
+
* Injects W3C trace context (traceparent/tracestate) into outbound request messages
|
|
90
|
+
* so that receiver-side spans can be linked. Used for both response paths and
|
|
91
|
+
* outbound calls (e.g. vite-plugin callEditorClients/callLibraryClients, server-initiated socket.call.*).
|
|
92
|
+
*/
|
|
93
|
+
protected decorateToSend(message: SocketMessage): SocketMessage;
|
|
94
|
+
protected callHandler<Params, Result, CallableMethodsInner, RequestContextInner extends RequestContextBase>(handler: MethodHandler<Params, Result, CallableMethodsInner, RequestContextInner>, params: Params, ctx: RequestContextInner, client: ISocketClient<CallableMethodsInner>, next: () => Promise<Result>): Promise<Result>;
|
|
95
|
+
/**
|
|
96
|
+
* Extract parent trace context from HTTP upgrade request headers (W3C Trace Context).
|
|
97
|
+
* Enables trace continuity from HTTP → WebSocket per epic-c2-context-propagation.
|
|
98
|
+
*/
|
|
99
|
+
private extractParentContext;
|
|
100
|
+
/**
|
|
101
|
+
* Whether to attach Tier 1 attributes (e.g. user email) to spans.
|
|
102
|
+
* Attach PII when Tier 1 is exported (e.g. CLOUD: all tiers go to Superblocks-owned infra).
|
|
103
|
+
* Omit PII when Tier 1 is local-only (e.g. CLOUD_PREM: Tier 2 export must not contain PII).
|
|
104
|
+
* When there is no policy evaluator, do not attach Tier 1 (safe default for PII).
|
|
105
|
+
*/
|
|
106
|
+
private shouldAttachTier1Attributes;
|
|
107
|
+
/**
|
|
108
|
+
* Placeholder for Tier 1 attributes when omitted. Call only when shouldAttachTier1Attributes() is false.
|
|
109
|
+
* Distinguishes: policy evaluator present but Tier 1 not allowed vs no policy evaluator provided.
|
|
110
|
+
*/
|
|
111
|
+
private getTier1OmittedPlaceholder;
|
|
112
|
+
protected handleMessage(message: SocketMessage): Promise<void>;
|
|
113
|
+
request<Params, Result>(method: string, params: Params, authorization?: string): Promise<Result>;
|
|
114
|
+
protected respond<Result>(requestId: number, result: Result): void;
|
|
115
|
+
protected respondError(requestId: number, error: SocketError, exception?: Error): void;
|
|
116
|
+
private addEvent;
|
|
117
|
+
close(reason?: string): void;
|
|
118
|
+
}
|
|
119
|
+
export {};
|
|
120
|
+
//# sourceMappingURL=traced-socket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traced-socket.d.ts","sourceRoot":"","sources":["../../src/node/traced-socket.ts"],"names":[],"mappings":"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"}
|