@superblocksteam/telemetry 2.0.173-next.4 → 2.0.174
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/console-logging.js +7 -2
- package/dist/browser/console-logging.js.map +1 -1
- package/dist/browser/early-console-buffer.js +14 -12
- package/dist/browser/early-console-buffer.js.map +1 -1
- package/dist/browser/index.js +41 -12
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/init.d.ts +1 -1
- package/dist/browser/init.d.ts.map +1 -1
- package/dist/browser/init.js +52 -42
- package/dist/browser/init.js.map +1 -1
- package/dist/browser/instrumentations.js +15 -11
- package/dist/browser/instrumentations.js.map +1 -1
- package/dist/browser/logs.d.ts +1 -1
- package/dist/browser/logs.d.ts.map +1 -1
- package/dist/browser/logs.js +18 -11
- package/dist/browser/logs.js.map +1 -1
- package/dist/browser/metrics.js +12 -9
- package/dist/browser/metrics.js.map +1 -1
- package/dist/browser/resilient-exporter.d.ts +1 -1
- package/dist/browser/resilient-exporter.d.ts.map +1 -1
- package/dist/browser/resilient-exporter.js +12 -8
- package/dist/browser/resilient-exporter.js.map +1 -1
- package/dist/browser/sanitizer.js +6 -2
- package/dist/browser/sanitizer.js.map +1 -1
- package/dist/browser/traced-socket.js +18 -14
- package/dist/browser/traced-socket.js.map +1 -1
- package/dist/common/contracts/tier2-traces.js +44 -33
- package/dist/common/contracts/tier2-traces.js.map +1 -1
- package/dist/common/deployment-type.js +8 -5
- package/dist/common/deployment-type.js.map +1 -1
- package/dist/common/guardrails.js +38 -26
- package/dist/common/guardrails.js.map +1 -1
- package/dist/common/index.js +24 -8
- package/dist/common/index.js.map +1 -1
- package/dist/common/log-sanitizer.js +55 -37
- package/dist/common/log-sanitizer.js.map +1 -1
- package/dist/common/policy-evaluator.d.ts +1 -1
- package/dist/common/policy-evaluator.d.ts.map +1 -1
- package/dist/common/policy-evaluator.js +9 -5
- package/dist/common/policy-evaluator.js.map +1 -1
- package/dist/common/resource.js +25 -18
- package/dist/common/resource.js.map +1 -1
- package/dist/common/tier-hints.js +22 -12
- package/dist/common/tier-hints.js.map +1 -1
- package/dist/common/trace-sanitizer.js +10 -6
- package/dist/common/trace-sanitizer.js.map +1 -1
- package/dist/common/traced-socket-types.js +2 -1
- package/dist/common/traced-socket-types.js.map +1 -1
- package/dist/index.js +38 -6
- package/dist/index.js.map +1 -1
- package/dist/lint/forbidden-attributes.js +24 -19
- package/dist/lint/forbidden-attributes.js.map +1 -1
- package/dist/lint/index.js +8 -1
- package/dist/lint/index.js.map +1 -1
- package/dist/llmobs/index.js +9 -2
- package/dist/llmobs/index.js.map +1 -1
- package/dist/llmobs/tier1-exporter.js +12 -6
- package/dist/llmobs/tier1-exporter.js.map +1 -1
- package/dist/llmobs/tier2-summarizer.js +5 -1
- package/dist/llmobs/tier2-summarizer.js.map +1 -1
- package/dist/node/dynamic-attribute-processor.js +7 -2
- package/dist/node/dynamic-attribute-processor.js.map +1 -1
- package/dist/node/exporters/resilient-exporter.d.ts +1 -1
- package/dist/node/exporters/resilient-exporter.d.ts.map +1 -1
- package/dist/node/exporters/resilient-exporter.js +12 -8
- package/dist/node/exporters/resilient-exporter.js.map +1 -1
- package/dist/node/index.js +26 -7
- package/dist/node/index.js.map +1 -1
- package/dist/node/init.d.ts +3 -3
- package/dist/node/init.d.ts.map +1 -1
- package/dist/node/init.js +72 -66
- package/dist/node/init.js.map +1 -1
- package/dist/node/local-obs-mode.js +4 -1
- package/dist/node/local-obs-mode.js.map +1 -1
- package/dist/node/log-processor.d.ts +1 -1
- package/dist/node/log-processor.d.ts.map +1 -1
- package/dist/node/log-processor.js +55 -47
- package/dist/node/log-processor.js.map +1 -1
- package/dist/node/metrics-client.js +5 -1
- package/dist/node/metrics-client.js.map +1 -1
- package/dist/node/safe-logger.js +12 -8
- package/dist/node/safe-logger.js.map +1 -1
- package/dist/node/sanitizing-processor.d.ts +2 -2
- package/dist/node/sanitizing-processor.d.ts.map +1 -1
- package/dist/node/sanitizing-processor.js +10 -6
- package/dist/node/sanitizing-processor.js.map +1 -1
- package/dist/node/service-tracers.js +10 -7
- package/dist/node/service-tracers.js.map +1 -1
- package/dist/node/traced-socket.d.ts +3 -3
- package/dist/node/traced-socket.d.ts.map +1 -1
- package/dist/node/traced-socket.js +52 -48
- package/dist/node/traced-socket.js.map +1 -1
- package/dist/npm-registry/emitter.js +47 -34
- package/dist/npm-registry/emitter.js.map +1 -1
- package/dist/npm-registry/index.js +19 -3
- package/dist/npm-registry/index.js.map +1 -1
- package/dist/npm-registry/sanitize.js +27 -16
- package/dist/npm-registry/sanitize.js.map +1 -1
- package/dist/npm-registry/spans.js +12 -7
- package/dist/npm-registry/spans.js.map +1 -1
- package/dist/testing/in-memory-exporter.d.ts +1 -1
- package/dist/testing/in-memory-exporter.d.ts.map +1 -1
- package/dist/testing/in-memory-exporter.js +12 -6
- package/dist/testing/in-memory-exporter.js.map +1 -1
- package/dist/testing/index.js +15 -3
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/metrics-capture.js +15 -12
- package/dist/testing/metrics-capture.js.map +1 -1
- package/dist/testing/test-init.js +31 -24
- package/dist/testing/test-init.js.map +1 -1
- package/dist/types/index.js +17 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/policy.js +24 -21
- package/dist/types/policy.js.map +1 -1
- 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 +181 -0
- package/dist-esm/browser/early-console-buffer.js.map +1 -0
- package/dist-esm/browser/index.d.ts +18 -0
- package/dist-esm/browser/index.d.ts.map +1 -0
- package/dist-esm/browser/index.js +23 -0
- package/dist-esm/browser/index.js.map +1 -0
- package/dist-esm/browser/init.d.ts +100 -0
- package/dist-esm/browser/init.d.ts.map +1 -0
- package/dist-esm/browser/init.js +317 -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 +57 -0
- package/dist-esm/browser/logs.d.ts.map +1 -0
- package/dist-esm/browser/logs.js +80 -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 +132 -0
- package/dist-esm/common/guardrails.d.ts.map +1 -0
- package/dist-esm/common/guardrails.js +230 -0
- package/dist-esm/common/guardrails.js.map +1 -0
- package/dist-esm/common/index.d.ts +17 -0
- package/dist-esm/common/index.d.ts.map +1 -0
- package/dist-esm/common/index.js +17 -0
- package/dist-esm/common/index.js.map +1 -0
- package/dist-esm/common/log-sanitizer.d.ts +163 -0
- package/dist-esm/common/log-sanitizer.d.ts.map +1 -0
- package/dist-esm/common/log-sanitizer.js +745 -0
- package/dist-esm/common/log-sanitizer.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 +330 -0
- package/dist-esm/npm-registry/emitter.d.ts.map +1 -0
- package/dist-esm/npm-registry/emitter.js +546 -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 +17 -11
|
@@ -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,78 @@
|
|
|
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 { trace } from "@opentelemetry/api";
|
|
20
|
+
import { BasicTracerProvider, } from "@opentelemetry/sdk-trace-base";
|
|
21
|
+
import { withServiceName } from "../common/resource.js";
|
|
22
|
+
/**
|
|
23
|
+
* Create a service-scoped tracer factory.
|
|
24
|
+
*
|
|
25
|
+
* @param config - Factory configuration
|
|
26
|
+
* @param config.baseResource - The primary SDK resource to derive from
|
|
27
|
+
* @param config.defaultServiceName - The primary service name (uses the global provider)
|
|
28
|
+
* @param config.serviceVersion - Instrumentation version passed to getTracer
|
|
29
|
+
* @param config.spanProcessor - Span processor shared with secondary providers (omit to disable export)
|
|
30
|
+
*/
|
|
31
|
+
export function createServiceTracers(config) {
|
|
32
|
+
const { baseResource, defaultServiceName, serviceVersion, spanProcessor } = config;
|
|
33
|
+
// One secondary provider per non-default service name.
|
|
34
|
+
const providers = new Map();
|
|
35
|
+
let shutdownCalled = false;
|
|
36
|
+
return {
|
|
37
|
+
getTracer(name, serviceName) {
|
|
38
|
+
// Default service (or a blank name, which would yield an empty ml_app)
|
|
39
|
+
// uses the globally registered provider — the primary SDK's when traces
|
|
40
|
+
// are enabled, otherwise the API's no-op provider. After shutdown we also
|
|
41
|
+
// route here so a late call (e.g. an in-flight request during graceful
|
|
42
|
+
// shutdown) never resurrects a secondary provider on the closing pipeline.
|
|
43
|
+
if (shutdownCalled ||
|
|
44
|
+
!serviceName.trim() ||
|
|
45
|
+
serviceName === defaultServiceName) {
|
|
46
|
+
return trace.getTracer(name, serviceVersion);
|
|
47
|
+
}
|
|
48
|
+
let provider = providers.get(serviceName);
|
|
49
|
+
if (!provider) {
|
|
50
|
+
provider = new BasicTracerProvider({
|
|
51
|
+
resource: withServiceName(baseResource, serviceName),
|
|
52
|
+
// Share the primary span processor so sanitization + export are
|
|
53
|
+
// identical. The primary SDK owns its lifecycle (shutdown), so we
|
|
54
|
+
// never shut the shared processor down from here — see shutdown().
|
|
55
|
+
spanProcessors: spanProcessor ? [spanProcessor] : [],
|
|
56
|
+
});
|
|
57
|
+
providers.set(serviceName, provider);
|
|
58
|
+
}
|
|
59
|
+
return provider.getTracer(name, serviceVersion);
|
|
60
|
+
},
|
|
61
|
+
async shutdown() {
|
|
62
|
+
shutdownCalled = true;
|
|
63
|
+
// Every secondary provider shares the one primary span processor, so flush
|
|
64
|
+
// it once rather than N times through each provider. Flush only — the
|
|
65
|
+
// primary SDK owns the processor's shutdown; closing it here would
|
|
66
|
+
// double-close it. Swallow+log so a flush failure can't reject (which
|
|
67
|
+
// would block the caller's primary sdk.shutdown()) nor vanish silently.
|
|
68
|
+
try {
|
|
69
|
+
await spanProcessor?.forceFlush();
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.warn("[Telemetry] Secondary-service tracer flush failed during shutdown:", error);
|
|
73
|
+
}
|
|
74
|
+
providers.clear();
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# 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;AAEH,OAAO,EAAE,KAAK,EAAe,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,mBAAmB,GAEpB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAkBxD;;;;;;;;GAQG;AACH,MAAM,UAAU,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,KAAK,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,mBAAmB,CAAC;oBACjC,QAAQ,EAAE,eAAe,CAAC,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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"}
|
|
@@ -0,0 +1,334 @@
|
|
|
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 { ROOT_CONTEXT, SpanKind, SpanStatusCode, context as otelCtx, propagation, trace, } from "@opentelemetry/api";
|
|
8
|
+
import { SEMATTRS_MESSAGING_DESTINATION_KIND, SEMATTRS_MESSAGING_SYSTEM, } from "@opentelemetry/semantic-conventions";
|
|
9
|
+
import { ISocket, OBS_TAG_HTTP_ROUTE, OBS_TAG_APPLICATION_ID, OBS_TAG_BRANCH, OBS_TAG_API_ID, OBS_TAG_COMMIT_ID, OBS_TAG_HTTP_STATUS_CODE, OBS_SOCKET_STATUS_CODE, OBS_TAG_USER_EMAIL, OBS_TAG_ORG_ID, OBS_TAG_USER_TYPE, sanitizeError, } from "@superblocksteam/shared";
|
|
10
|
+
import { TelemetryTier } from "../types/policy.js";
|
|
11
|
+
/**
|
|
12
|
+
* Placeholder values for Tier 1 attributes (user email, user type) when omitted.
|
|
13
|
+
* The value indicates why they were redacted (policy said no vs no policy evaluator provided).
|
|
14
|
+
*/
|
|
15
|
+
const TIER1_OMITTED_BY_POLICY = "[redacted_by_policy]"; // Policy said no
|
|
16
|
+
const TIER1_OMITTED_NO_POLICY = "[redacted_no_policy]"; // No policy evaluator provided, safe default for PII
|
|
17
|
+
// Helper to cast ISocket's logger to pino-compatible logger
|
|
18
|
+
const asPinoLogger = (logger) => logger;
|
|
19
|
+
// Helper to check if a value is a Promise
|
|
20
|
+
const isPromise = (value) => {
|
|
21
|
+
return (value !== null &&
|
|
22
|
+
typeof value === "object" &&
|
|
23
|
+
"then" in value &&
|
|
24
|
+
typeof value.then === "function");
|
|
25
|
+
};
|
|
26
|
+
// End span with proper error handling
|
|
27
|
+
const endSpan = (traced, span, logger, setHttpStatusFromError) => {
|
|
28
|
+
try {
|
|
29
|
+
const result = traced();
|
|
30
|
+
if (isPromise(result)) {
|
|
31
|
+
return Promise.resolve(result)
|
|
32
|
+
.catch((err) => {
|
|
33
|
+
setHttpStatusFromError(span, typeof err === "string" ? new Error(err) : err, logger);
|
|
34
|
+
throw err;
|
|
35
|
+
})
|
|
36
|
+
.finally(() => span.end());
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
span.end();
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
setHttpStatusFromError(span, error, logger);
|
|
45
|
+
span.end();
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* TracedSocket extends ISocket to add OpenTelemetry tracing capabilities.
|
|
51
|
+
*
|
|
52
|
+
* We override decorateToSend so that outbound request messages carry W3C
|
|
53
|
+
* traceparent/tracestate, enabling trace continuity for both inbound and
|
|
54
|
+
* outbound use (server and vite-plugin-file-sync).
|
|
55
|
+
*/
|
|
56
|
+
export class TracedSocket extends ISocket {
|
|
57
|
+
activeSpanByRequestId = new Map();
|
|
58
|
+
middlewareSpanByReqId = new Map();
|
|
59
|
+
lastActiveSpan;
|
|
60
|
+
requestHeaders;
|
|
61
|
+
tracer;
|
|
62
|
+
policyEvaluator;
|
|
63
|
+
setHttpStatusFromError;
|
|
64
|
+
constructor(ws, requestHandlers, globalMiddlewares, config, options) {
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
66
|
+
super(ws, requestHandlers, globalMiddlewares, options);
|
|
67
|
+
this.requestHeaders = config.requestHeaders ?? {};
|
|
68
|
+
this.tracer = config.tracer ?? trace.getTracer("superblocks-ws", "0.0.0");
|
|
69
|
+
this.policyEvaluator = config.policyEvaluator;
|
|
70
|
+
// Create error handler function
|
|
71
|
+
this.setHttpStatusFromError = (span, error, logger) => {
|
|
72
|
+
let status = 500;
|
|
73
|
+
if (config.getResponseMetaByError) {
|
|
74
|
+
const respMeta = config.getResponseMetaByError(error, logger);
|
|
75
|
+
status = respMeta.status;
|
|
76
|
+
}
|
|
77
|
+
span.setAttribute(OBS_TAG_HTTP_STATUS_CODE, status);
|
|
78
|
+
span.recordException(sanitizeError(error));
|
|
79
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: error.message });
|
|
80
|
+
};
|
|
81
|
+
// Log WebSocket connection establishment (ws.host is "unknown" when no upgrade headers, e.g. vite-plugin-file-sync)
|
|
82
|
+
asPinoLogger(this.logger).info({
|
|
83
|
+
"ws.event": "connection_established",
|
|
84
|
+
"ws.host": this.requestHeaders["host"] ?? "unknown",
|
|
85
|
+
}, "WebSocket connection established");
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Injects W3C trace context (traceparent/tracestate) into outbound request messages
|
|
89
|
+
* so that receiver-side spans can be linked. Used for both response paths and
|
|
90
|
+
* outbound calls (e.g. vite-plugin callEditorClients/callLibraryClients, server-initiated socket.call.*).
|
|
91
|
+
*/
|
|
92
|
+
decorateToSend(message) {
|
|
93
|
+
if (!message.request) {
|
|
94
|
+
return message;
|
|
95
|
+
}
|
|
96
|
+
if (message.request.traceparent || message.request.tracestate) {
|
|
97
|
+
return message;
|
|
98
|
+
}
|
|
99
|
+
propagation.inject(otelCtx.active(), message.request);
|
|
100
|
+
return message;
|
|
101
|
+
}
|
|
102
|
+
async callHandler(handler, params, ctx, client, next) {
|
|
103
|
+
let currentContext = otelCtx.active();
|
|
104
|
+
const middleWareSpan = this.middlewareSpanByReqId.get(ctx.requestId);
|
|
105
|
+
const activeSpan = this.activeSpanByRequestId.get(ctx.requestId);
|
|
106
|
+
// End middleware span since callHandler is called recursively
|
|
107
|
+
if (middleWareSpan) {
|
|
108
|
+
middleWareSpan.end();
|
|
109
|
+
if (activeSpan) {
|
|
110
|
+
currentContext = trace.setSpan(otelCtx.active(), activeSpan);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// After first (authHandler) these values will be set
|
|
114
|
+
const src = ctx;
|
|
115
|
+
const user = src.user;
|
|
116
|
+
const organization = src.organization;
|
|
117
|
+
if (this.lastActiveSpan && (user || organization)) {
|
|
118
|
+
if (this.shouldAttachTier1Attributes()) {
|
|
119
|
+
this.lastActiveSpan.setAttribute(OBS_TAG_USER_EMAIL, user?.email ?? "");
|
|
120
|
+
this.lastActiveSpan.setAttribute(OBS_TAG_USER_TYPE, user?.getUserType?.() ?? "");
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const placeholder = this.getTier1OmittedPlaceholder();
|
|
124
|
+
this.lastActiveSpan.setAttribute(OBS_TAG_USER_EMAIL, placeholder);
|
|
125
|
+
this.lastActiveSpan.setAttribute(OBS_TAG_USER_TYPE, placeholder);
|
|
126
|
+
}
|
|
127
|
+
this.lastActiveSpan.setAttribute(OBS_TAG_ORG_ID, organization?.id ?? "");
|
|
128
|
+
}
|
|
129
|
+
let result;
|
|
130
|
+
const paramsObj = params;
|
|
131
|
+
await otelCtx.with(currentContext, async () => {
|
|
132
|
+
await this.tracer.startActiveSpan(`WS HANDLER ${handler.name === "" ? ctx.method : handler.name}`, {
|
|
133
|
+
attributes: (() => {
|
|
134
|
+
const attrs = {
|
|
135
|
+
[SEMATTRS_MESSAGING_SYSTEM]: "ws",
|
|
136
|
+
[SEMATTRS_MESSAGING_DESTINATION_KIND]: "websocket",
|
|
137
|
+
[OBS_TAG_ORG_ID]: src.organization?.id ?? "",
|
|
138
|
+
[OBS_TAG_APPLICATION_ID]: String(paramsObj?.["applicationId"] ?? src.jwtClaims?.app_id ?? ""),
|
|
139
|
+
[OBS_TAG_API_ID]: String(paramsObj?.["apiId"] ?? ""),
|
|
140
|
+
[OBS_TAG_BRANCH]: String(paramsObj?.["branch"] ?? paramsObj?.["branchName"] ?? ""),
|
|
141
|
+
[OBS_TAG_COMMIT_ID]: String(paramsObj?.["commitId"] ?? ""),
|
|
142
|
+
};
|
|
143
|
+
if (this.shouldAttachTier1Attributes()) {
|
|
144
|
+
attrs[OBS_TAG_USER_EMAIL] = user?.email ?? "";
|
|
145
|
+
attrs[OBS_TAG_USER_TYPE] = user?.getUserType?.() ?? "";
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
const placeholder = this.getTier1OmittedPlaceholder();
|
|
149
|
+
attrs[OBS_TAG_USER_EMAIL] = placeholder;
|
|
150
|
+
attrs[OBS_TAG_USER_TYPE] = placeholder;
|
|
151
|
+
}
|
|
152
|
+
return attrs;
|
|
153
|
+
})(),
|
|
154
|
+
kind: SpanKind.SERVER,
|
|
155
|
+
}, async (span) => {
|
|
156
|
+
this.middlewareSpanByReqId.set(ctx.requestId, span);
|
|
157
|
+
result = (await endSpan(() => super.callHandler(handler, params, ctx, client, next), span, asPinoLogger(this.logger), this.setHttpStatusFromError));
|
|
158
|
+
this.middlewareSpanByReqId.delete(ctx.requestId);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Extract parent trace context from HTTP upgrade request headers (W3C Trace Context).
|
|
165
|
+
* Enables trace continuity from HTTP → WebSocket per epic-c2-context-propagation.
|
|
166
|
+
*/
|
|
167
|
+
extractParentContext() {
|
|
168
|
+
return propagation.extract(ROOT_CONTEXT, this.requestHeaders);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Whether to attach Tier 1 attributes (e.g. user email) to spans.
|
|
172
|
+
* Attach PII when Tier 1 is exported (e.g. CLOUD: all tiers go to Superblocks-owned infra).
|
|
173
|
+
* Omit PII when Tier 1 is local-only (e.g. CLOUD_PREM: Tier 2 export must not contain PII).
|
|
174
|
+
* When there is no policy evaluator, do not attach Tier 1 (safe default for PII).
|
|
175
|
+
*/
|
|
176
|
+
shouldAttachTier1Attributes() {
|
|
177
|
+
if (!this.policyEvaluator) {
|
|
178
|
+
// It's opt-in to attach Tier 1 attributes, so default to false when no policy evaluator is provided.
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
const decision = this.policyEvaluator.evaluate(TelemetryTier.TIER_1_LOCAL);
|
|
182
|
+
return decision.export;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Placeholder for Tier 1 attributes when omitted. Call only when shouldAttachTier1Attributes() is false.
|
|
186
|
+
* Distinguishes: policy evaluator present but Tier 1 not allowed vs no policy evaluator provided.
|
|
187
|
+
*/
|
|
188
|
+
getTier1OmittedPlaceholder() {
|
|
189
|
+
return this.policyEvaluator
|
|
190
|
+
? TIER1_OMITTED_BY_POLICY
|
|
191
|
+
: TIER1_OMITTED_NO_POLICY;
|
|
192
|
+
}
|
|
193
|
+
async handleMessage(message) {
|
|
194
|
+
if (message.request) {
|
|
195
|
+
const spanName = message.request.method;
|
|
196
|
+
const requestId = message.request.id;
|
|
197
|
+
const payload = message.request.payload;
|
|
198
|
+
const logData = {
|
|
199
|
+
"ws.event": "request_received",
|
|
200
|
+
"ws.method": spanName,
|
|
201
|
+
"ws.request_id": requestId,
|
|
202
|
+
"ws.host": this.requestHeaders["host"] ?? "unknown",
|
|
203
|
+
};
|
|
204
|
+
if (payload?.["applicationId"]) {
|
|
205
|
+
logData[OBS_TAG_APPLICATION_ID] = String(payload["applicationId"]);
|
|
206
|
+
}
|
|
207
|
+
if (payload?.["apiId"]) {
|
|
208
|
+
logData[OBS_TAG_API_ID] = String(payload["apiId"]);
|
|
209
|
+
}
|
|
210
|
+
if (payload?.["branch"] || payload?.["branchName"]) {
|
|
211
|
+
logData[OBS_TAG_BRANCH] = String(payload["branch"] ?? payload["branchName"]);
|
|
212
|
+
}
|
|
213
|
+
if (payload?.["commitId"]) {
|
|
214
|
+
logData[OBS_TAG_COMMIT_ID] = String(payload["commitId"]);
|
|
215
|
+
}
|
|
216
|
+
asPinoLogger(this.logger).info(logData, `WebSocket request: ${spanName}`);
|
|
217
|
+
// W3C context: first from HTTP upgrade, then from message (so message traceparent can link)
|
|
218
|
+
const upgradeContext = this.extractParentContext();
|
|
219
|
+
const messageContext = propagation.extract(upgradeContext, message.request);
|
|
220
|
+
await otelCtx.with(messageContext, async () => await this.tracer.startActiveSpan(`WS SERVER ${spanName}`, {
|
|
221
|
+
attributes: (() => {
|
|
222
|
+
const attrs = {
|
|
223
|
+
[SEMATTRS_MESSAGING_SYSTEM]: "ws",
|
|
224
|
+
[SEMATTRS_MESSAGING_DESTINATION_KIND]: "websocket",
|
|
225
|
+
[OBS_TAG_HTTP_ROUTE]: spanName,
|
|
226
|
+
};
|
|
227
|
+
if (payload?.["applicationId"]) {
|
|
228
|
+
attrs[OBS_TAG_APPLICATION_ID] = String(payload["applicationId"]);
|
|
229
|
+
}
|
|
230
|
+
if (payload?.["apiId"]) {
|
|
231
|
+
attrs[OBS_TAG_API_ID] = String(payload["apiId"]);
|
|
232
|
+
}
|
|
233
|
+
if (payload?.["branch"] || payload?.["branchName"]) {
|
|
234
|
+
attrs[OBS_TAG_BRANCH] = String(payload["branch"] ?? payload["branchName"]);
|
|
235
|
+
}
|
|
236
|
+
if (payload?.["commitId"]) {
|
|
237
|
+
attrs[OBS_TAG_COMMIT_ID] = String(payload["commitId"]);
|
|
238
|
+
}
|
|
239
|
+
return attrs;
|
|
240
|
+
})(),
|
|
241
|
+
kind: SpanKind.SERVER,
|
|
242
|
+
}, async (span) => {
|
|
243
|
+
this.lastActiveSpan = span;
|
|
244
|
+
this.activeSpanByRequestId.set(requestId, span);
|
|
245
|
+
const result = await endSpan(() => super.handleMessage(message), span, asPinoLogger(this.logger), this.setHttpStatusFromError);
|
|
246
|
+
this.activeSpanByRequestId.delete(requestId);
|
|
247
|
+
return result;
|
|
248
|
+
}));
|
|
249
|
+
}
|
|
250
|
+
else if (message.response) {
|
|
251
|
+
this.addEvent("ws.received-response", {
|
|
252
|
+
["ws.response.id"]: message.response.id,
|
|
253
|
+
});
|
|
254
|
+
return await super.handleMessage(message);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
request(method, params, authorization) {
|
|
258
|
+
return this.tracer.startActiveSpan(`WS CLIENT ${method}`, (span) => {
|
|
259
|
+
this.addEvent("ws.send-request", {
|
|
260
|
+
["ws.request.method"]: method,
|
|
261
|
+
["ws.request.id"]: this.nxtRequestId,
|
|
262
|
+
});
|
|
263
|
+
const result = super.request(method, params, authorization);
|
|
264
|
+
span.end();
|
|
265
|
+
return result;
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
respond(requestId, result) {
|
|
269
|
+
this.addEvent("ws.send-response", { ["ws.response.id"]: requestId });
|
|
270
|
+
// Using http status codes so that our existing monitors can work with minimum change
|
|
271
|
+
const resultObj = result;
|
|
272
|
+
if (this.lastActiveSpan &&
|
|
273
|
+
resultObj["responseMeta"]?.status !== undefined) {
|
|
274
|
+
this.lastActiveSpan.setAttribute(OBS_TAG_HTTP_STATUS_CODE, resultObj["responseMeta"].status);
|
|
275
|
+
}
|
|
276
|
+
// Log successful WebSocket response
|
|
277
|
+
asPinoLogger(this.logger).info({
|
|
278
|
+
"ws.event": "response_sent",
|
|
279
|
+
"ws.request_id": requestId,
|
|
280
|
+
"ws.status": resultObj["responseMeta"]?.status || 200,
|
|
281
|
+
"ws.response_size": (() => {
|
|
282
|
+
try {
|
|
283
|
+
return JSON.stringify(result).length;
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
return -1;
|
|
287
|
+
}
|
|
288
|
+
})(),
|
|
289
|
+
"ws.host": this.requestHeaders["host"] || "unknown",
|
|
290
|
+
}, `WebSocket response sent for request ${requestId}`);
|
|
291
|
+
return super.respond(requestId, result);
|
|
292
|
+
}
|
|
293
|
+
respondError(requestId, error, exception) {
|
|
294
|
+
this.addEvent("ws.send-error", { ["ws.response.id"]: requestId });
|
|
295
|
+
if (this.lastActiveSpan) {
|
|
296
|
+
this.setHttpStatusFromError(this.lastActiveSpan, exception ?? new Error(error.message), asPinoLogger(this.logger));
|
|
297
|
+
this.lastActiveSpan.setAttribute(OBS_SOCKET_STATUS_CODE, error.code);
|
|
298
|
+
}
|
|
299
|
+
asPinoLogger(this.logger).error({
|
|
300
|
+
"ws.event": "error_response",
|
|
301
|
+
"ws.request_id": requestId,
|
|
302
|
+
"ws.error_code": error.code,
|
|
303
|
+
"ws.error_message": error.message,
|
|
304
|
+
"ws.exception_type": exception?.constructor.name,
|
|
305
|
+
"ws.exception_message": exception?.message,
|
|
306
|
+
"ws.host": this.requestHeaders["host"] || "unknown",
|
|
307
|
+
error: exception || error,
|
|
308
|
+
}, `WebSocket error for request ${requestId}: ${error.message}`);
|
|
309
|
+
return super.respondError(requestId, error, exception);
|
|
310
|
+
}
|
|
311
|
+
addEvent(eventName, attributes) {
|
|
312
|
+
if (this.lastActiveSpan) {
|
|
313
|
+
this.lastActiveSpan.addEvent(eventName, attributes, new Date());
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
close(reason) {
|
|
317
|
+
asPinoLogger(this.logger).info({
|
|
318
|
+
"ws.event": "connection_closed",
|
|
319
|
+
"ws.close_reason": reason || "normal",
|
|
320
|
+
"ws.host": this.requestHeaders["host"] || "unknown",
|
|
321
|
+
}, `WebSocket connection closed: ${reason || "normal"}`);
|
|
322
|
+
for (const span of this.middlewareSpanByReqId.values()) {
|
|
323
|
+
span.end();
|
|
324
|
+
}
|
|
325
|
+
this.middlewareSpanByReqId = new Map();
|
|
326
|
+
for (const span of this.activeSpanByRequestId.values()) {
|
|
327
|
+
span.end();
|
|
328
|
+
}
|
|
329
|
+
this.activeSpanByRequestId = new Map();
|
|
330
|
+
this.lastActiveSpan = undefined;
|
|
331
|
+
super.close(reason);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=traced-socket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traced-socket.js","sourceRoot":"","sources":["../../src/node/traced-socket.ts"],"names":[],"mappings":"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"}
|