@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,43 @@
|
|
|
1
|
+
import type { Context } from "@opentelemetry/api";
|
|
2
|
+
import type { LogRecordProcessor, SdkLogRecord } from "@opentelemetry/sdk-logs";
|
|
3
|
+
import type { ReadableSpan, Span, SpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
4
|
+
/**
|
|
5
|
+
* Wraps a span processor and stamps caller-provided attributes onto every span
|
|
6
|
+
* at start.
|
|
7
|
+
*
|
|
8
|
+
* This exists for attributes that are only known AFTER the SDK is initialized —
|
|
9
|
+
* e.g. the application/user/org identity a dev-server learns at connect time,
|
|
10
|
+
* when the SDK must already be running to instrument startup. Rather than
|
|
11
|
+
* re-initializing the SDK (which would churn instrumentation), the caller passes
|
|
12
|
+
* a getter that returns the current identity, and each span picks it up on start.
|
|
13
|
+
*
|
|
14
|
+
* Override semantics: `onStart` runs after creation-time attributes are applied,
|
|
15
|
+
* so a dynamic attribute overwrites any same-key attribute passed to `startSpan`.
|
|
16
|
+
* Attributes set on the span after creation still overwrite the dynamic value.
|
|
17
|
+
*/
|
|
18
|
+
export declare class DynamicAttributeSpanProcessor implements SpanProcessor {
|
|
19
|
+
private readonly inner;
|
|
20
|
+
private readonly attributes;
|
|
21
|
+
constructor(inner: SpanProcessor, attributes: () => Record<string, string>);
|
|
22
|
+
onStart(span: Span, parentContext: Context): void;
|
|
23
|
+
onEnd(span: ReadableSpan): void;
|
|
24
|
+
forceFlush(): Promise<void>;
|
|
25
|
+
shutdown(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Log-record twin of {@link DynamicAttributeSpanProcessor}: stamps the same
|
|
29
|
+
* late-known identity onto every exported log record. Without it, a service
|
|
30
|
+
* whose SDK started before identity was known (the dev-server preload) would
|
|
31
|
+
* export logs missing the application/user/org attributes that spans carry.
|
|
32
|
+
* Same override semantics as the span twin: dynamic attributes win over
|
|
33
|
+
* same-key attributes already on the record at emit time.
|
|
34
|
+
*/
|
|
35
|
+
export declare class DynamicAttributeLogRecordProcessor implements LogRecordProcessor {
|
|
36
|
+
private readonly inner;
|
|
37
|
+
private readonly attributes;
|
|
38
|
+
constructor(inner: LogRecordProcessor, attributes: () => Record<string, string>);
|
|
39
|
+
onEmit(logRecord: SdkLogRecord, context?: Context): void;
|
|
40
|
+
forceFlush(): Promise<void>;
|
|
41
|
+
shutdown(): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=dynamic-attribute-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-attribute-processor.d.ts","sourceRoot":"","sources":["../../src/node/dynamic-attribute-processor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,KAAK,EACV,YAAY,EACZ,IAAI,EACJ,aAAa,EACd,MAAM,+BAA+B,CAAC;AAEvC;;;;;;;;;;;;;GAaG;AACH,qBAAa,6BAA8B,YAAW,aAAa;IAE/D,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAG3D,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI;IAUjD,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAI/B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAG1B;AAED;;;;;;;GAOG;AACH,qBAAa,kCAAmC,YAAW,kBAAkB;IAEzE,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,KAAK,EAAE,kBAAkB,EACzB,UAAU,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAG3D,MAAM,CAAC,SAAS,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI;IAUxD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAG1B"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps a span processor and stamps caller-provided attributes onto every span
|
|
3
|
+
* at start.
|
|
4
|
+
*
|
|
5
|
+
* This exists for attributes that are only known AFTER the SDK is initialized —
|
|
6
|
+
* e.g. the application/user/org identity a dev-server learns at connect time,
|
|
7
|
+
* when the SDK must already be running to instrument startup. Rather than
|
|
8
|
+
* re-initializing the SDK (which would churn instrumentation), the caller passes
|
|
9
|
+
* a getter that returns the current identity, and each span picks it up on start.
|
|
10
|
+
*
|
|
11
|
+
* Override semantics: `onStart` runs after creation-time attributes are applied,
|
|
12
|
+
* so a dynamic attribute overwrites any same-key attribute passed to `startSpan`.
|
|
13
|
+
* Attributes set on the span after creation still overwrite the dynamic value.
|
|
14
|
+
*/
|
|
15
|
+
export class DynamicAttributeSpanProcessor {
|
|
16
|
+
inner;
|
|
17
|
+
attributes;
|
|
18
|
+
constructor(inner, attributes) {
|
|
19
|
+
this.inner = inner;
|
|
20
|
+
this.attributes = attributes;
|
|
21
|
+
}
|
|
22
|
+
onStart(span, parentContext) {
|
|
23
|
+
// Telemetry must never break span creation; a bad getter is swallowed.
|
|
24
|
+
try {
|
|
25
|
+
span.setAttributes(this.attributes());
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// ignore
|
|
29
|
+
}
|
|
30
|
+
this.inner.onStart(span, parentContext);
|
|
31
|
+
}
|
|
32
|
+
onEnd(span) {
|
|
33
|
+
this.inner.onEnd(span);
|
|
34
|
+
}
|
|
35
|
+
forceFlush() {
|
|
36
|
+
return this.inner.forceFlush();
|
|
37
|
+
}
|
|
38
|
+
shutdown() {
|
|
39
|
+
return this.inner.shutdown();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Log-record twin of {@link DynamicAttributeSpanProcessor}: stamps the same
|
|
44
|
+
* late-known identity onto every exported log record. Without it, a service
|
|
45
|
+
* whose SDK started before identity was known (the dev-server preload) would
|
|
46
|
+
* export logs missing the application/user/org attributes that spans carry.
|
|
47
|
+
* Same override semantics as the span twin: dynamic attributes win over
|
|
48
|
+
* same-key attributes already on the record at emit time.
|
|
49
|
+
*/
|
|
50
|
+
export class DynamicAttributeLogRecordProcessor {
|
|
51
|
+
inner;
|
|
52
|
+
attributes;
|
|
53
|
+
constructor(inner, attributes) {
|
|
54
|
+
this.inner = inner;
|
|
55
|
+
this.attributes = attributes;
|
|
56
|
+
}
|
|
57
|
+
onEmit(logRecord, context) {
|
|
58
|
+
// Telemetry must never break log emission; a bad getter is swallowed.
|
|
59
|
+
try {
|
|
60
|
+
logRecord.setAttributes(this.attributes());
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// ignore
|
|
64
|
+
}
|
|
65
|
+
this.inner.onEmit(logRecord, context);
|
|
66
|
+
}
|
|
67
|
+
forceFlush() {
|
|
68
|
+
return this.inner.forceFlush();
|
|
69
|
+
}
|
|
70
|
+
shutdown() {
|
|
71
|
+
return this.inner.shutdown();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=dynamic-attribute-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic-attribute-processor.js","sourceRoot":"","sources":["../../src/node/dynamic-attribute-processor.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,6BAA6B;IAErB;IACA;IAFnB,YACmB,KAAoB,EACpB,UAAwC;QADxC,UAAK,GAAL,KAAK,CAAe;QACpB,eAAU,GAAV,UAAU,CAA8B;IACxD,CAAC;IAEJ,OAAO,CAAC,IAAU,EAAE,aAAsB;QACxC,uEAAuE;QACvE,IAAI,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAkB;QACtB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IACjC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,kCAAkC;IAE1B;IACA;IAFnB,YACmB,KAAyB,EACzB,UAAwC;QADxC,UAAK,GAAL,KAAK,CAAoB;QACzB,eAAU,GAAV,UAAU,CAA8B;IACxD,CAAC;IAEJ,MAAM,CAAC,SAAuB,EAAE,OAAiB;QAC/C,sEAAsE;QACtE,IAAI,CAAC;YACH,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IACjC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resilient Exporter
|
|
3
|
+
*
|
|
4
|
+
* Wrapper that ensures Tier 2/3 export failures never block core request paths.
|
|
5
|
+
* Export failures are observable via metrics, not via blocking or exceptions.
|
|
6
|
+
*/
|
|
7
|
+
import { ExportResult } from "@opentelemetry/core";
|
|
8
|
+
import type { SpanExporter, ReadableSpan } from "@opentelemetry/sdk-trace-base";
|
|
9
|
+
/**
|
|
10
|
+
* Minimal logger interface for structured export-failure logs (e.g. Pino/SafeLogger).
|
|
11
|
+
* When provided, export failures are logged so they can be ingested into Datadog.
|
|
12
|
+
*/
|
|
13
|
+
export interface TelemetryExportLogger {
|
|
14
|
+
warn(obj: object, msg?: string): void;
|
|
15
|
+
warn(msg: string): void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Configuration for the resilient exporter.
|
|
19
|
+
*/
|
|
20
|
+
export interface ResilientExporterConfig {
|
|
21
|
+
/** Underlying exporter to wrap */
|
|
22
|
+
delegate: SpanExporter;
|
|
23
|
+
/** Max items to buffer before dropping (default: 2048) */
|
|
24
|
+
maxQueueSize?: number;
|
|
25
|
+
/** Export timeout in ms (default: 30000) */
|
|
26
|
+
exportTimeoutMs?: number;
|
|
27
|
+
/** Callback when items are dropped due to backpressure */
|
|
28
|
+
onDrop?: (count: number, reason: "queue_full" | "export_failed" | "timeout") => void;
|
|
29
|
+
/**
|
|
30
|
+
* Optional structured logger for export failures (e.g. safe logger).
|
|
31
|
+
* When set, export errors are logged here so they are ingested into Datadog.
|
|
32
|
+
*/
|
|
33
|
+
logger?: TelemetryExportLogger;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Metrics exposed by the resilient exporter.
|
|
37
|
+
*/
|
|
38
|
+
export interface ResilientExporterMetrics {
|
|
39
|
+
/** Total spans dropped due to backpressure or failure */
|
|
40
|
+
dropped: number;
|
|
41
|
+
/** Current queue size */
|
|
42
|
+
queued: number;
|
|
43
|
+
/** Total export failures */
|
|
44
|
+
failures: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resilient exporter wrapper that:
|
|
48
|
+
* - Drops spans when queue is full (never blocks)
|
|
49
|
+
* - Catches export failures and emits metrics
|
|
50
|
+
* - Times out stalled exports
|
|
51
|
+
*
|
|
52
|
+
* CRITICAL: Telemetry export must be fire-and-forget from the application's perspective.
|
|
53
|
+
* Export failures should be observable via metrics, not via blocking or exceptions.
|
|
54
|
+
*/
|
|
55
|
+
export declare class ResilientExporter implements SpanExporter {
|
|
56
|
+
private readonly delegate;
|
|
57
|
+
private readonly maxQueueSize;
|
|
58
|
+
private readonly exportTimeoutMs;
|
|
59
|
+
private readonly onDrop;
|
|
60
|
+
private readonly logger;
|
|
61
|
+
private queuedCount;
|
|
62
|
+
private droppedCount;
|
|
63
|
+
private exportFailures;
|
|
64
|
+
private shuttingDown;
|
|
65
|
+
constructor(config: ResilientExporterConfig);
|
|
66
|
+
/**
|
|
67
|
+
* Export spans with resilient error handling.
|
|
68
|
+
*
|
|
69
|
+
* IMPORTANT: Always returns SUCCESS to caller - export failures are
|
|
70
|
+
* observable via metrics, not via the result callback.
|
|
71
|
+
*/
|
|
72
|
+
export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void;
|
|
73
|
+
/**
|
|
74
|
+
* Shutdown the underlying exporter.
|
|
75
|
+
* Marks exporter as shutting down to reject new exports.
|
|
76
|
+
*/
|
|
77
|
+
shutdown(): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Force flush the underlying exporter.
|
|
80
|
+
*/
|
|
81
|
+
forceFlush(): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Get current metrics for observability.
|
|
84
|
+
*/
|
|
85
|
+
getMetrics(): ResilientExporterMetrics;
|
|
86
|
+
/**
|
|
87
|
+
* Reset metrics (for testing).
|
|
88
|
+
*/
|
|
89
|
+
resetMetrics(): void;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=resilient-exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resilient-exporter.d.ts","sourceRoot":"","sources":["../../../src/node/exporters/resilient-exporter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAoB,MAAM,qBAAqB,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAEhF;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,kCAAkC;IAClC,QAAQ,EAAE,YAAY,CAAC;IACvB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,CACP,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,YAAY,GAAG,eAAe,GAAG,SAAS,KAC/C,IAAI,CAAC;IACV;;;OAGG;IACH,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGb;IACV,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAE3D,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,uBAAuB;IAQ3C;;;;;OAKG;IACH,MAAM,CACJ,KAAK,EAAE,YAAY,EAAE,EACrB,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAC7C,IAAI;IAiEP;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;OAEG;IACH,UAAU,IAAI,wBAAwB;IAQtC;;OAEG;IACH,YAAY,IAAI,IAAI;CAIrB"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resilient Exporter
|
|
3
|
+
*
|
|
4
|
+
* Wrapper that ensures Tier 2/3 export failures never block core request paths.
|
|
5
|
+
* Export failures are observable via metrics, not via blocking or exceptions.
|
|
6
|
+
*/
|
|
7
|
+
import { ExportResultCode } from "@opentelemetry/core";
|
|
8
|
+
/**
|
|
9
|
+
* Resilient exporter wrapper that:
|
|
10
|
+
* - Drops spans when queue is full (never blocks)
|
|
11
|
+
* - Catches export failures and emits metrics
|
|
12
|
+
* - Times out stalled exports
|
|
13
|
+
*
|
|
14
|
+
* CRITICAL: Telemetry export must be fire-and-forget from the application's perspective.
|
|
15
|
+
* Export failures should be observable via metrics, not via blocking or exceptions.
|
|
16
|
+
*/
|
|
17
|
+
export class ResilientExporter {
|
|
18
|
+
delegate;
|
|
19
|
+
maxQueueSize;
|
|
20
|
+
exportTimeoutMs;
|
|
21
|
+
onDrop;
|
|
22
|
+
logger;
|
|
23
|
+
queuedCount = 0;
|
|
24
|
+
droppedCount = 0;
|
|
25
|
+
exportFailures = 0;
|
|
26
|
+
shuttingDown = false;
|
|
27
|
+
constructor(config) {
|
|
28
|
+
this.delegate = config.delegate;
|
|
29
|
+
this.maxQueueSize = config.maxQueueSize ?? 2048;
|
|
30
|
+
this.exportTimeoutMs = config.exportTimeoutMs ?? 30000;
|
|
31
|
+
this.onDrop = config.onDrop ?? (() => { });
|
|
32
|
+
this.logger = config.logger;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Export spans with resilient error handling.
|
|
36
|
+
*
|
|
37
|
+
* IMPORTANT: Always returns SUCCESS to caller - export failures are
|
|
38
|
+
* observable via metrics, not via the result callback.
|
|
39
|
+
*/
|
|
40
|
+
export(spans, resultCallback) {
|
|
41
|
+
// Don't accept new exports during shutdown
|
|
42
|
+
if (this.shuttingDown) {
|
|
43
|
+
resultCallback({ code: ExportResultCode.SUCCESS });
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// Check backpressure - drop if queue is full
|
|
47
|
+
if (this.queuedCount + spans.length > this.maxQueueSize) {
|
|
48
|
+
this.droppedCount += spans.length;
|
|
49
|
+
this.onDrop(spans.length, "queue_full");
|
|
50
|
+
// Still return success - don't block the caller
|
|
51
|
+
resultCallback({ code: ExportResultCode.SUCCESS });
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
this.queuedCount += spans.length;
|
|
55
|
+
let completed = false;
|
|
56
|
+
// Wrap with timeout
|
|
57
|
+
const timeoutId = setTimeout(() => {
|
|
58
|
+
if (completed)
|
|
59
|
+
return;
|
|
60
|
+
completed = true;
|
|
61
|
+
this.queuedCount -= spans.length;
|
|
62
|
+
this.droppedCount += spans.length;
|
|
63
|
+
this.onDrop(spans.length, "timeout");
|
|
64
|
+
resultCallback({ code: ExportResultCode.SUCCESS }); // Don't propagate failure
|
|
65
|
+
}, this.exportTimeoutMs);
|
|
66
|
+
try {
|
|
67
|
+
this.delegate.export(spans, (result) => {
|
|
68
|
+
if (completed)
|
|
69
|
+
return;
|
|
70
|
+
completed = true;
|
|
71
|
+
clearTimeout(timeoutId);
|
|
72
|
+
this.queuedCount -= spans.length;
|
|
73
|
+
if (result.code !== ExportResultCode.SUCCESS) {
|
|
74
|
+
this.exportFailures++;
|
|
75
|
+
this.droppedCount += spans.length;
|
|
76
|
+
this.onDrop(spans.length, "export_failed");
|
|
77
|
+
}
|
|
78
|
+
// Always return success to caller - export failures are observable via metrics
|
|
79
|
+
resultCallback({ code: ExportResultCode.SUCCESS });
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (completed)
|
|
84
|
+
return;
|
|
85
|
+
completed = true;
|
|
86
|
+
clearTimeout(timeoutId);
|
|
87
|
+
this.queuedCount -= spans.length;
|
|
88
|
+
this.exportFailures++;
|
|
89
|
+
this.droppedCount += spans.length;
|
|
90
|
+
this.onDrop(spans.length, "export_failed");
|
|
91
|
+
if (this.logger) {
|
|
92
|
+
this.logger.warn({ err: error, spanCount: spans.length, reason: "export_failed" }, "[Telemetry] Span export threw");
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
console.warn("[Telemetry] Span export threw:", error);
|
|
96
|
+
}
|
|
97
|
+
resultCallback({ code: ExportResultCode.SUCCESS }); // Don't propagate failure
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Shutdown the underlying exporter.
|
|
102
|
+
* Marks exporter as shutting down to reject new exports.
|
|
103
|
+
*/
|
|
104
|
+
async shutdown() {
|
|
105
|
+
this.shuttingDown = true;
|
|
106
|
+
return this.delegate.shutdown();
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Force flush the underlying exporter.
|
|
110
|
+
*/
|
|
111
|
+
async forceFlush() {
|
|
112
|
+
return this.delegate.forceFlush?.() ?? Promise.resolve();
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get current metrics for observability.
|
|
116
|
+
*/
|
|
117
|
+
getMetrics() {
|
|
118
|
+
return {
|
|
119
|
+
dropped: this.droppedCount,
|
|
120
|
+
queued: this.queuedCount,
|
|
121
|
+
failures: this.exportFailures,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Reset metrics (for testing).
|
|
126
|
+
*/
|
|
127
|
+
resetMetrics() {
|
|
128
|
+
this.droppedCount = 0;
|
|
129
|
+
this.exportFailures = 0;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=resilient-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resilient-exporter.js","sourceRoot":"","sources":["../../../src/node/exporters/resilient-exporter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAgB,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AA8CrE;;;;;;;;GAQG;AACH,MAAM,OAAO,iBAAiB;IACX,QAAQ,CAAe;IACvB,YAAY,CAAS;IACrB,eAAe,CAAS;IACxB,MAAM,CAGb;IACO,MAAM,CAAoC;IAEnD,WAAW,GAAG,CAAC,CAAC;IAChB,YAAY,GAAG,CAAC,CAAC;IACjB,cAAc,GAAG,CAAC,CAAC;IACnB,YAAY,GAAG,KAAK,CAAC;IAE7B,YAAY,MAA+B;QACzC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC;QAChD,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,IAAI,KAAK,CAAC;QACvD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED;;;;;OAKG;IACH,MAAM,CACJ,KAAqB,EACrB,cAA8C;QAE9C,2CAA2C;QAC3C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,cAAc,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,6CAA6C;QAC7C,IAAI,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACxD,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YACxC,gDAAgD;YAChD,cAAc,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;QACjC,IAAI,SAAS,GAAG,KAAK,CAAC;QAEtB,oBAAoB;QACpB,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;YACjC,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACrC,cAAc,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,0BAA0B;QAChF,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAEzB,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE;gBACrC,IAAI,SAAS;oBAAE,OAAO;gBACtB,SAAS,GAAG,IAAI,CAAC;gBACjB,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;gBAEjC,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,CAAC,OAAO,EAAE,CAAC;oBAC7C,IAAI,CAAC,cAAc,EAAE,CAAC;oBACtB,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC;oBAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;gBAC7C,CAAC;gBAED,+EAA+E;gBAC/E,cAAc,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,SAAS;gBAAE,OAAO;YACtB,SAAS,GAAG,IAAI,CAAC;YACjB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;YACjC,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,EAChE,+BAA+B,CAChC,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACxD,CAAC;YACD,cAAc,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,0BAA0B;QAChF,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,YAAY;YAC1B,MAAM,EAAE,IAAI,CAAC,WAAW;YACxB,QAAQ,EAAE,IAAI,CAAC,cAAc;SAC9B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;IAC1B,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js Telemetry Bootstrap
|
|
3
|
+
*
|
|
4
|
+
* This is the ONLY approved way to initialize telemetry in Node.js services.
|
|
5
|
+
*/
|
|
6
|
+
export { initNodeTelemetry, getTelemetryInstance, isTelemetryInitialized, resetTelemetry, type GetTracerOptions, type NodeTelemetryInstance, } from "./init.js";
|
|
7
|
+
export { isLocalObsMode } from "./local-obs-mode.js";
|
|
8
|
+
export { MetricsClient, type Labels, type CounterHandle, type CounterOptions, type GaugeHandle, type HistogramHandle, type HistogramOptions, } from "./metrics-client.js";
|
|
9
|
+
export { TracedSocket, type TracedSocketConfig, type TracedSocketOptions, } from "./traced-socket.js";
|
|
10
|
+
export { ResilientExporter, type ResilientExporterConfig, type ResilientExporterMetrics, } from "./exporters/resilient-exporter.js";
|
|
11
|
+
export { LogExportMode, PolicyAwareLogProcessor, getLoggingPolicy, getMinimumPinoLevelForDeployment, getMinimumPinoLevelFromLoggingPolicy, parseLogExportMode, type LoggingPolicyConfig, } from "./log-processor.js";
|
|
12
|
+
export { createSafeLogger, redactForbiddenFields, type SafeLoggerLike, } from "./safe-logger.js";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,GAC3B,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EACL,aAAa,EACb,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,GACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,EACZ,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,GACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,iBAAiB,EACjB,KAAK,uBAAuB,EAC5B,KAAK,wBAAwB,GAC9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,gBAAgB,EAChB,gCAAgC,EAChC,oCAAoC,EACpC,kBAAkB,EAClB,KAAK,mBAAmB,GACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js Telemetry Bootstrap
|
|
3
|
+
*
|
|
4
|
+
* This is the ONLY approved way to initialize telemetry in Node.js services.
|
|
5
|
+
*/
|
|
6
|
+
export { initNodeTelemetry, getTelemetryInstance, isTelemetryInitialized, resetTelemetry, } from "./init.js";
|
|
7
|
+
export { isLocalObsMode } from "./local-obs-mode.js";
|
|
8
|
+
export { MetricsClient, } from "./metrics-client.js";
|
|
9
|
+
export { TracedSocket, } from "./traced-socket.js";
|
|
10
|
+
export { ResilientExporter, } from "./exporters/resilient-exporter.js";
|
|
11
|
+
export { LogExportMode, PolicyAwareLogProcessor, getLoggingPolicy, getMinimumPinoLevelForDeployment, getMinimumPinoLevelFromLoggingPolicy, parseLogExportMode, } from "./log-processor.js";
|
|
12
|
+
export { createSafeLogger, redactForbiddenFields, } from "./safe-logger.js";
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,cAAc,GAGf,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EACL,aAAa,GAOd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,YAAY,GAGb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,iBAAiB,GAGlB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,gBAAgB,EAChB,gCAAgC,EAChC,oCAAoC,EACpC,kBAAkB,GAEnB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,gBAAgB,EAChB,qBAAqB,GAEtB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js Telemetry Bootstrap
|
|
3
|
+
*
|
|
4
|
+
* This is the ONLY approved way to initialize telemetry in Node.js services.
|
|
5
|
+
* Direct NodeSDK usage outside this package is prohibited.
|
|
6
|
+
*/
|
|
7
|
+
import { Tracer, Meter } from "@opentelemetry/api";
|
|
8
|
+
import { Logger } from "@opentelemetry/api-logs";
|
|
9
|
+
import { NodeSDK } from "@opentelemetry/sdk-node";
|
|
10
|
+
import { TelemetryPolicyEvaluator } from "../common/policy-evaluator.js";
|
|
11
|
+
import type { NodeTelemetryConfig } from "../types/index.js";
|
|
12
|
+
import { TelemetryPolicy } from "../types/policy.js";
|
|
13
|
+
import { MetricsClient } from "./metrics-client.js";
|
|
14
|
+
/**
|
|
15
|
+
* Options for {@link NodeTelemetryInstance.getTracer}.
|
|
16
|
+
*/
|
|
17
|
+
export interface GetTracerOptions {
|
|
18
|
+
/**
|
|
19
|
+
* Emit the tracer's spans under this service identity (its resource
|
|
20
|
+
* `service.name`, which Datadog maps to LLM-Obs `ml_app`). Omit for the
|
|
21
|
+
* primary service.
|
|
22
|
+
*/
|
|
23
|
+
serviceName?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Telemetry instance returned by initNodeTelemetry.
|
|
27
|
+
*/
|
|
28
|
+
export interface NodeTelemetryInstance {
|
|
29
|
+
/** The underlying NodeSDK instance (undefined in CI/no-op mode) */
|
|
30
|
+
sdk?: NodeSDK;
|
|
31
|
+
/** Policy evaluator for runtime decisions */
|
|
32
|
+
policyEvaluator: TelemetryPolicyEvaluator;
|
|
33
|
+
/**
|
|
34
|
+
* Get a tracer for the service.
|
|
35
|
+
*
|
|
36
|
+
* Pass `options.serviceName` to emit the tracer's spans under a secondary
|
|
37
|
+
* service identity (its resource `service.name`, which Datadog maps to LLM-Obs
|
|
38
|
+
* `ml_app`) while sharing this SDK's sanitization + export pipeline. Omit it
|
|
39
|
+
* for the primary service. The `options` argument is additive and optional —
|
|
40
|
+
* existing single-argument callers are unaffected. See APPS-5082.
|
|
41
|
+
*/
|
|
42
|
+
getTracer: (name?: string, options?: GetTracerOptions) => Tracer;
|
|
43
|
+
/** Get a meter for the service */
|
|
44
|
+
getMeter: (name?: string) => Meter;
|
|
45
|
+
/** Get a logger for the service */
|
|
46
|
+
getLogger: (name?: string) => Logger;
|
|
47
|
+
/** Metrics client for recording counters, gauges, and histograms */
|
|
48
|
+
metricsClient: MetricsClient;
|
|
49
|
+
/** Graceful shutdown */
|
|
50
|
+
shutdown: () => Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
declare global {
|
|
53
|
+
var __superblocksNodeTelemetryInstance: NodeTelemetryInstance | undefined;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Initialize Node.js telemetry with policy enforcement.
|
|
57
|
+
*
|
|
58
|
+
* This is the ONLY approved way to initialize telemetry in Node.js services.
|
|
59
|
+
* Direct NodeSDK usage outside this package is prohibited.
|
|
60
|
+
*
|
|
61
|
+
* @param config - Service configuration
|
|
62
|
+
* @param policy - Telemetry policy (REQUIRED)
|
|
63
|
+
* @returns Telemetry instance with SDK and utilities
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* import { initNodeTelemetry } from '@superblocksteam/telemetry/node';
|
|
68
|
+
* import { getDefaultPolicy, DeploymentType } from '@superblocksteam/shared';
|
|
69
|
+
*
|
|
70
|
+
* const policy = getDefaultPolicy(DeploymentType.CLOUD_PREM);
|
|
71
|
+
* const telemetry = initNodeTelemetry({
|
|
72
|
+
* serviceName: 'my-service',
|
|
73
|
+
* serviceVersion: '1.0.0',
|
|
74
|
+
* environment: 'production',
|
|
75
|
+
* otlpUrl: 'http://localhost:4318',
|
|
76
|
+
* }, policy);
|
|
77
|
+
*
|
|
78
|
+
* const tracer = telemetry.getTracer();
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export declare function initNodeTelemetry(config: NodeTelemetryConfig, policy: TelemetryPolicy): NodeTelemetryInstance;
|
|
82
|
+
/**
|
|
83
|
+
* Get the current telemetry instance.
|
|
84
|
+
*
|
|
85
|
+
* @throws Error if not initialized
|
|
86
|
+
*/
|
|
87
|
+
export declare function getTelemetryInstance(): NodeTelemetryInstance;
|
|
88
|
+
/**
|
|
89
|
+
* Check if telemetry is initialized.
|
|
90
|
+
*/
|
|
91
|
+
export declare function isTelemetryInitialized(): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Reset telemetry (for testing only).
|
|
94
|
+
* @internal
|
|
95
|
+
*/
|
|
96
|
+
export declare function resetTelemetry(): void;
|
|
97
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/node/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAS,MAAM,EAAW,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAQ,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAcvD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAOlD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAGzE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAiB,MAAM,oBAAoB,CAAC;AAYpE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOpD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,mEAAmE;IACnE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,6CAA6C;IAC7C,eAAe,EAAE,wBAAwB,CAAC;IAC1C;;;;;;;;OAQG;IACH,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK,MAAM,CAAC;IACjE,kCAAkC;IAClC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC;IACnC,mCAAmC;IACnC,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,oEAAoE;IACpE,aAAa,EAAE,aAAa,CAAC;IAC7B,wBAAwB;IACxB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AASD,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,kCAAkC,EAAE,qBAAqB,GAAG,SAAS,CAAC;CAC3E;AA0GD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,eAAe,GACtB,qBAAqB,CAqPvB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,qBAAqB,CAQ5D;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
|