@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,359 @@
|
|
|
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 { trace, metrics } from "@opentelemetry/api";
|
|
8
|
+
import { logs } from "@opentelemetry/api-logs";
|
|
9
|
+
import { AsyncLocalStorageContextManager } from "@opentelemetry/context-async-hooks";
|
|
10
|
+
import { W3CTraceContextPropagator } from "@opentelemetry/core";
|
|
11
|
+
import { OTLPLogExporter } from "@opentelemetry/exporter-logs-otlp-http";
|
|
12
|
+
import { OTLPMetricExporter } from "@opentelemetry/exporter-metrics-otlp-http";
|
|
13
|
+
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
|
|
14
|
+
import { BatchLogRecordProcessor, } from "@opentelemetry/sdk-logs";
|
|
15
|
+
import { AggregationTemporality, PeriodicExportingMetricReader, } from "@opentelemetry/sdk-metrics";
|
|
16
|
+
import { NodeSDK } from "@opentelemetry/sdk-node";
|
|
17
|
+
import { BatchSpanProcessor, } from "@opentelemetry/sdk-trace-base";
|
|
18
|
+
import { getTraceSanitizerAttributeSets } from "../common/contracts/tier2-traces.js";
|
|
19
|
+
import { TelemetryPolicyEvaluator } from "../common/policy-evaluator.js";
|
|
20
|
+
import { buildResource, validateResource } from "../common/resource.js";
|
|
21
|
+
import { TraceSanitizer } from "../common/trace-sanitizer.js";
|
|
22
|
+
import { TelemetryTier } from "../types/policy.js";
|
|
23
|
+
import { DynamicAttributeLogRecordProcessor, DynamicAttributeSpanProcessor, } from "./dynamic-attribute-processor.js";
|
|
24
|
+
import { ResilientExporter } from "./exporters/resilient-exporter.js";
|
|
25
|
+
import { isLocalObsMode } from "./local-obs-mode.js";
|
|
26
|
+
import { PolicyAwareLogProcessor, getLoggingPolicy, LogExportMode, } from "./log-processor.js";
|
|
27
|
+
import { MetricsClient } from "./metrics-client.js";
|
|
28
|
+
import { SanitizingSpanProcessor, noopSpanProcessor, } from "./sanitizing-processor.js";
|
|
29
|
+
import { createServiceTracers } from "./service-tracers.js";
|
|
30
|
+
function getInstance() {
|
|
31
|
+
return globalThis.__superblocksNodeTelemetryInstance;
|
|
32
|
+
}
|
|
33
|
+
function setInstance(next) {
|
|
34
|
+
globalThis.__superblocksNodeTelemetryInstance = next;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a no-op telemetry instance for CI environments.
|
|
38
|
+
*
|
|
39
|
+
* IMPORTANT: We intentionally do NOT use NodeSDK here. NodeSDK.start()
|
|
40
|
+
* auto-configures OTLP exporters for traces, metrics, and logs from
|
|
41
|
+
* environment defaults (localhost:4318). During shutdown, these exporters
|
|
42
|
+
* try to flush to the non-existent collector, causing ECONNREFUSED errors
|
|
43
|
+
* that fail test suites even when all tests pass.
|
|
44
|
+
*
|
|
45
|
+
* Instead, we return a lightweight instance that uses the global OTel API
|
|
46
|
+
* (which returns no-op tracers/meters/loggers when no provider is registered).
|
|
47
|
+
*/
|
|
48
|
+
function createNoOpInstance(config, policy) {
|
|
49
|
+
const policyEvaluator = new TelemetryPolicyEvaluator(policy);
|
|
50
|
+
// Use a no-op meter for the metrics client
|
|
51
|
+
const defaultMeter = metrics.getMeter(config.serviceName, config.serviceVersion);
|
|
52
|
+
return {
|
|
53
|
+
sdk: undefined,
|
|
54
|
+
policyEvaluator,
|
|
55
|
+
// No-op mode has no SDK/exporter, so secondary services collapse to the
|
|
56
|
+
// global (no-op) tracer — options.serviceName is accepted but inert.
|
|
57
|
+
getTracer: (name, _options) => trace.getTracer(name ?? config.serviceName, config.serviceVersion),
|
|
58
|
+
getMeter: (name) => metrics.getMeter(name ?? config.serviceName, config.serviceVersion),
|
|
59
|
+
getLogger: (name) => logs.getLogger(name ?? config.serviceName, config.serviceVersion),
|
|
60
|
+
metricsClient: new MetricsClient(defaultMeter),
|
|
61
|
+
shutdown: async () => {
|
|
62
|
+
// No-op: nothing to flush or shut down
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Fallback logger for SanitizingSpanProcessor when config.logger is not provided.
|
|
68
|
+
* Forwards to console so processor messages are still visible.
|
|
69
|
+
*/
|
|
70
|
+
function createConsoleFallbackLogger() {
|
|
71
|
+
const log = (level) => (a, b) => {
|
|
72
|
+
if (typeof a === "string") {
|
|
73
|
+
if (level === "warn")
|
|
74
|
+
console.warn(a);
|
|
75
|
+
else
|
|
76
|
+
console.error(a);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
if (level === "warn")
|
|
80
|
+
console.warn(b ?? "", a);
|
|
81
|
+
else
|
|
82
|
+
console.error(b ?? "", a);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
return {
|
|
86
|
+
error: log("error"),
|
|
87
|
+
warn: log("warn"),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Validate telemetry configuration.
|
|
92
|
+
*
|
|
93
|
+
* @param config - Configuration to validate
|
|
94
|
+
* @throws Error if configuration is invalid
|
|
95
|
+
*/
|
|
96
|
+
function validateNodeTelemetryConfig(config) {
|
|
97
|
+
if (!config.serviceName?.trim()) {
|
|
98
|
+
throw new Error("[Telemetry] serviceName is required and cannot be empty");
|
|
99
|
+
}
|
|
100
|
+
if (!config.serviceVersion?.trim()) {
|
|
101
|
+
throw new Error("[Telemetry] serviceVersion is required and cannot be empty");
|
|
102
|
+
}
|
|
103
|
+
if (!config.environment?.trim()) {
|
|
104
|
+
throw new Error("[Telemetry] environment is required and cannot be empty");
|
|
105
|
+
}
|
|
106
|
+
if (config.otlpUrl) {
|
|
107
|
+
try {
|
|
108
|
+
new URL(config.otlpUrl);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
throw new Error(`[Telemetry] Invalid otlpUrl: ${config.otlpUrl} (${error.message})`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Initialize Node.js telemetry with policy enforcement.
|
|
117
|
+
*
|
|
118
|
+
* This is the ONLY approved way to initialize telemetry in Node.js services.
|
|
119
|
+
* Direct NodeSDK usage outside this package is prohibited.
|
|
120
|
+
*
|
|
121
|
+
* @param config - Service configuration
|
|
122
|
+
* @param policy - Telemetry policy (REQUIRED)
|
|
123
|
+
* @returns Telemetry instance with SDK and utilities
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```typescript
|
|
127
|
+
* import { initNodeTelemetry } from '@superblocksteam/telemetry/node';
|
|
128
|
+
* import { getDefaultPolicy, DeploymentType } from '@superblocksteam/shared';
|
|
129
|
+
*
|
|
130
|
+
* const policy = getDefaultPolicy(DeploymentType.CLOUD_PREM);
|
|
131
|
+
* const telemetry = initNodeTelemetry({
|
|
132
|
+
* serviceName: 'my-service',
|
|
133
|
+
* serviceVersion: '1.0.0',
|
|
134
|
+
* environment: 'production',
|
|
135
|
+
* otlpUrl: 'http://localhost:4318',
|
|
136
|
+
* }, policy);
|
|
137
|
+
*
|
|
138
|
+
* const tracer = telemetry.getTracer();
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
export function initNodeTelemetry(config, policy) {
|
|
142
|
+
// Policy is required
|
|
143
|
+
if (!policy) {
|
|
144
|
+
throw new Error("[Telemetry] Policy is required. Cannot initialize telemetry without a policy.");
|
|
145
|
+
}
|
|
146
|
+
// Validate config
|
|
147
|
+
validateNodeTelemetryConfig(config);
|
|
148
|
+
// Return existing instance if already initialized
|
|
149
|
+
const existing = getInstance();
|
|
150
|
+
if (existing) {
|
|
151
|
+
// Warn if config differs from existing
|
|
152
|
+
const existingPolicy = existing.policyEvaluator.getPolicy();
|
|
153
|
+
if (existingPolicy.deploymentType !== policy.deploymentType) {
|
|
154
|
+
console.warn(`[Telemetry] Already initialized with different deployment type ` +
|
|
155
|
+
`(existing: ${existingPolicy.deploymentType}, requested: ${policy.deploymentType}). ` +
|
|
156
|
+
`Returning existing instance.`);
|
|
157
|
+
}
|
|
158
|
+
return existing;
|
|
159
|
+
}
|
|
160
|
+
// CI environment detection - use no-op telemetry
|
|
161
|
+
if (process.env.CI === "true") {
|
|
162
|
+
const ciMessage = "[Telemetry] CI environment detected, using no-op telemetry";
|
|
163
|
+
if (typeof config.logger?.info === "function") {
|
|
164
|
+
config.logger.info(ciMessage);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
console.debug(ciMessage);
|
|
168
|
+
}
|
|
169
|
+
const noOp = createNoOpInstance(config, policy);
|
|
170
|
+
setInstance(noOp);
|
|
171
|
+
return noOp;
|
|
172
|
+
}
|
|
173
|
+
const policyEvaluator = new TelemetryPolicyEvaluator(policy);
|
|
174
|
+
const resource = buildResource(config);
|
|
175
|
+
// Validate resource has required attributes
|
|
176
|
+
validateResource(resource);
|
|
177
|
+
// Track dropped spans for observability
|
|
178
|
+
let droppedSpans = 0;
|
|
179
|
+
const onDrop = (count, reason) => {
|
|
180
|
+
droppedSpans += count;
|
|
181
|
+
console.warn(`[Telemetry] Dropped ${count} spans (${reason}). Total dropped: ${droppedSpans}`);
|
|
182
|
+
};
|
|
183
|
+
// Create trace exporter if URL provided and Tier 2 export is enabled.
|
|
184
|
+
// Traces go through SanitizingSpanProcessor: only contract-compliant spans are exported.
|
|
185
|
+
// Use isExportEnabled (not canExport) - sampling applies at runtime, not initialization.
|
|
186
|
+
let spanProcessor;
|
|
187
|
+
if (config.otlpUrl &&
|
|
188
|
+
policyEvaluator.isExportEnabled(TelemetryTier.TIER_2_OPERATIONAL)) {
|
|
189
|
+
const tier2Exporter = new ResilientExporter({
|
|
190
|
+
delegate: new OTLPTraceExporter({
|
|
191
|
+
headers: config.otlpHeaders,
|
|
192
|
+
url: `${config.otlpUrl}/v1/traces`,
|
|
193
|
+
}),
|
|
194
|
+
onDrop,
|
|
195
|
+
logger: config.logger,
|
|
196
|
+
});
|
|
197
|
+
const hashConfig = config.traceSanitizerHashConfig ?? null;
|
|
198
|
+
const attributeSets = getTraceSanitizerAttributeSets(policy.deploymentType);
|
|
199
|
+
const traceSanitizer = new TraceSanitizer({
|
|
200
|
+
hashConfig,
|
|
201
|
+
...attributeSets,
|
|
202
|
+
});
|
|
203
|
+
const spanProcessorLogger = config.logger ?? createConsoleFallbackLogger();
|
|
204
|
+
spanProcessor = new SanitizingSpanProcessor(policyEvaluator, noopSpanProcessor, tier2Exporter, traceSanitizer, spanProcessorLogger);
|
|
205
|
+
// Local-obs override: bypass the sanitizer so the local LGTM stack sees
|
|
206
|
+
// every span (service graph, raw attrs). Same exporter as cloud — only the
|
|
207
|
+
// processor changes.
|
|
208
|
+
if (isLocalObsMode()) {
|
|
209
|
+
spanProcessor = new BatchSpanProcessor(tier2Exporter);
|
|
210
|
+
}
|
|
211
|
+
// Stamp late-known identity (e.g. a dev-server's app/user/org, resolved at
|
|
212
|
+
// connect) onto every span without re-initializing the SDK.
|
|
213
|
+
if (config.dynamicAttributes) {
|
|
214
|
+
spanProcessor = new DynamicAttributeSpanProcessor(spanProcessor, config.dynamicAttributes);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// Create metric exporter if enabled
|
|
218
|
+
// Use isExportEnabled (not canExport) - sampling applies at runtime, not initialization
|
|
219
|
+
let metricReader;
|
|
220
|
+
if (config.otlpUrl &&
|
|
221
|
+
config.metricsEnabled !== false &&
|
|
222
|
+
policyEvaluator.isExportEnabled(TelemetryTier.TIER_2_OPERATIONAL)) {
|
|
223
|
+
metricReader = new PeriodicExportingMetricReader({
|
|
224
|
+
exporter: new OTLPMetricExporter({
|
|
225
|
+
headers: config.otlpHeaders,
|
|
226
|
+
temporalityPreference: AggregationTemporality.DELTA,
|
|
227
|
+
url: `${config.otlpUrl}/v1/metrics`,
|
|
228
|
+
}),
|
|
229
|
+
exportIntervalMillis: 10000, // every 10 seconds
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
// Create log processor with policy-aware filtering and sanitization
|
|
233
|
+
// The PolicyAwareLogProcessor wraps the batch processor to:
|
|
234
|
+
// 1. Filter logs by severity level based on export mode (LOCAL_ONLY, ERRORS_ONLY, INFO_AND_ABOVE)
|
|
235
|
+
// 2. Sanitize log bodies and attributes to remove PII, file paths, stack traces
|
|
236
|
+
// 3. Remove forbidden fields that should never be exported
|
|
237
|
+
let logProcessor;
|
|
238
|
+
let loggingPolicy = getLoggingPolicy(policy);
|
|
239
|
+
// Local-obs override: ship info+ logs to the local LGTM stack regardless of
|
|
240
|
+
// the deployment policy's export mode (cloud-prem is ERRORS_ONLY). Mirrors the
|
|
241
|
+
// span sanitizer bypass above. See isLocalObsMode for why this is local-only.
|
|
242
|
+
if (isLocalObsMode()) {
|
|
243
|
+
loggingPolicy = {
|
|
244
|
+
...loggingPolicy,
|
|
245
|
+
exportMode: LogExportMode.INFO_AND_ABOVE,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
if (config.otlpUrl &&
|
|
249
|
+
config.logsEnabled !== false &&
|
|
250
|
+
policyEvaluator.isExportEnabled(TelemetryTier.TIER_2_OPERATIONAL) &&
|
|
251
|
+
loggingPolicy.exportMode !== LogExportMode.LOCAL_ONLY) {
|
|
252
|
+
const batchProcessor = new BatchLogRecordProcessor({
|
|
253
|
+
exporter: new OTLPLogExporter({
|
|
254
|
+
headers: config.otlpHeaders,
|
|
255
|
+
url: `${config.otlpUrl}/v1/logs`,
|
|
256
|
+
}),
|
|
257
|
+
});
|
|
258
|
+
logProcessor = new PolicyAwareLogProcessor(loggingPolicy, batchProcessor);
|
|
259
|
+
// Same late-known identity as spans: stamp before the policy processor so
|
|
260
|
+
// sanitization sees (and can redact) the identity attributes.
|
|
261
|
+
if (config.dynamicAttributes) {
|
|
262
|
+
logProcessor = new DynamicAttributeLogRecordProcessor(logProcessor, config.dynamicAttributes);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Create the SDK
|
|
266
|
+
// Note: instrumentations typed as unknown[] for flexibility with various OTEL instrumentation packages
|
|
267
|
+
const sdk = new NodeSDK({
|
|
268
|
+
resource,
|
|
269
|
+
spanProcessor,
|
|
270
|
+
metricReader,
|
|
271
|
+
logRecordProcessor: logProcessor,
|
|
272
|
+
contextManager: new AsyncLocalStorageContextManager(),
|
|
273
|
+
textMapPropagator: new W3CTraceContextPropagator(),
|
|
274
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- OTEL instrumentation types vary
|
|
275
|
+
instrumentations: (config.instrumentations ?? []),
|
|
276
|
+
});
|
|
277
|
+
sdk.start();
|
|
278
|
+
const tracesEnabled = spanProcessor
|
|
279
|
+
? "enabled (Tier 2 sanitized)"
|
|
280
|
+
: "disabled";
|
|
281
|
+
const metricsEnabled = metricReader ? "enabled" : "disabled";
|
|
282
|
+
const logsEnabled = logProcessor ? "enabled" : "disabled";
|
|
283
|
+
if (typeof config.logger?.info === "function") {
|
|
284
|
+
config.logger.info({
|
|
285
|
+
component: "telemetry",
|
|
286
|
+
deploymentType: policy.deploymentType,
|
|
287
|
+
logs: logsEnabled,
|
|
288
|
+
metrics: metricsEnabled,
|
|
289
|
+
serviceName: config.serviceName,
|
|
290
|
+
traces: tracesEnabled,
|
|
291
|
+
}, "Telemetry initialized");
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
console.info(`[Telemetry] Initialized for ${config.serviceName} (${policy.deploymentType})` +
|
|
295
|
+
` | Traces: ${tracesEnabled} | Metrics: ${metricsEnabled} | Logs: ${logsEnabled}`);
|
|
296
|
+
}
|
|
297
|
+
const defaultMeter = metrics.getMeter(config.serviceName, config.serviceVersion);
|
|
298
|
+
// Secondary-service tracers (e.g. server LLM-Obs spans under
|
|
299
|
+
// `superblocks-ai-code-gen`). They reuse the SAME span processor so
|
|
300
|
+
// sanitization + export are identical; the SDK owns its lifecycle.
|
|
301
|
+
const serviceTracers = createServiceTracers({
|
|
302
|
+
baseResource: resource,
|
|
303
|
+
defaultServiceName: config.serviceName,
|
|
304
|
+
serviceVersion: config.serviceVersion,
|
|
305
|
+
spanProcessor,
|
|
306
|
+
});
|
|
307
|
+
const created = {
|
|
308
|
+
sdk,
|
|
309
|
+
policyEvaluator,
|
|
310
|
+
getTracer: (name, options) => serviceTracers.getTracer(name ?? config.serviceName, options?.serviceName ?? config.serviceName),
|
|
311
|
+
getMeter: (name) => metrics.getMeter(name ?? config.serviceName, config.serviceVersion),
|
|
312
|
+
getLogger: (name) => logs.getLogger(name ?? config.serviceName, config.serviceVersion),
|
|
313
|
+
metricsClient: new MetricsClient(defaultMeter),
|
|
314
|
+
shutdown: async () => {
|
|
315
|
+
try {
|
|
316
|
+
// Best-effort flush of secondary providers; never let it block the
|
|
317
|
+
// primary SDK teardown (which owns the shared span processor).
|
|
318
|
+
try {
|
|
319
|
+
await serviceTracers.shutdown();
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
console.warn("[Telemetry] serviceTracers shutdown failed:", error);
|
|
323
|
+
}
|
|
324
|
+
await sdk.shutdown();
|
|
325
|
+
}
|
|
326
|
+
finally {
|
|
327
|
+
setInstance(undefined);
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
setInstance(created);
|
|
332
|
+
return created;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Get the current telemetry instance.
|
|
336
|
+
*
|
|
337
|
+
* @throws Error if not initialized
|
|
338
|
+
*/
|
|
339
|
+
export function getTelemetryInstance() {
|
|
340
|
+
const current = getInstance();
|
|
341
|
+
if (!current) {
|
|
342
|
+
throw new Error("[Telemetry] Not initialized. Call initNodeTelemetry() first.");
|
|
343
|
+
}
|
|
344
|
+
return current;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Check if telemetry is initialized.
|
|
348
|
+
*/
|
|
349
|
+
export function isTelemetryInitialized() {
|
|
350
|
+
return getInstance() !== undefined;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Reset telemetry (for testing only).
|
|
354
|
+
* @internal
|
|
355
|
+
*/
|
|
356
|
+
export function resetTelemetry() {
|
|
357
|
+
setInstance(undefined);
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/node/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAU,OAAO,EAAS,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAU,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EACL,uBAAuB,GAExB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EACL,kBAAkB,GAEnB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,EAAmB,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EACL,kCAAkC,EAClC,6BAA6B,GAC9B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAqD5D,SAAS,WAAW;IAClB,OAAO,UAAU,CAAC,kCAAkC,CAAC;AACvD,CAAC;AAED,SAAS,WAAW,CAAC,IAAuC;IAC1D,UAAU,CAAC,kCAAkC,GAAG,IAAI,CAAC;AACvD,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,kBAAkB,CACzB,MAA2B,EAC3B,MAAuB;IAEvB,MAAM,eAAe,GAAG,IAAI,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAE7D,2CAA2C;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CACnC,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,cAAc,CACtB,CAAC;IAEF,OAAO;QACL,GAAG,EAAE,SAAS;QACd,eAAe;QACf,wEAAwE;QACxE,qEAAqE;QACrE,SAAS,EAAE,CAAC,IAAa,EAAE,QAA2B,EAAE,EAAE,CACxD,KAAK,CAAC,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC;QACpE,QAAQ,EAAE,CAAC,IAAa,EAAE,EAAE,CAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC;QACrE,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE,CAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC;QACnE,aAAa,EAAE,IAAI,aAAa,CAAC,YAAY,CAAC;QAC9C,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,uCAAuC;QACzC,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,2BAA2B;IAIlC,MAAM,GAAG,GACP,CAAC,KAAuB,EAAE,EAAE,CAC5B,CAAC,CAAkB,EAAE,CAAU,EAAQ,EAAE;QACvC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,IAAI,KAAK,KAAK,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;gBACjC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,KAAK,KAAK,MAAM;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;;gBAC1C,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC;IACJ,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC;QACnB,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC;KAClB,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,2BAA2B,CAAC,MAA2B;IAC9D,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,gCAAgC,MAAM,CAAC,OAAO,KAAM,KAAe,CAAC,OAAO,GAAG,CAC/E,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA2B,EAC3B,MAAuB;IAEvB,qBAAqB;IACrB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,CAAC;IAED,kBAAkB;IAClB,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAEpC,kDAAkD;IAClD,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAI,QAAQ,EAAE,CAAC;QACb,uCAAuC;QACvC,MAAM,cAAc,GAAG,QAAQ,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;QAC5D,IAAI,cAAc,CAAC,cAAc,KAAK,MAAM,CAAC,cAAc,EAAE,CAAC;YAC5D,OAAO,CAAC,IAAI,CACV,iEAAiE;gBAC/D,cAAc,cAAc,CAAC,cAAc,gBAAgB,MAAM,CAAC,cAAc,KAAK;gBACrF,8BAA8B,CACjC,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,iDAAiD;IACjD,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;QAC9B,MAAM,SAAS,GACb,4DAA4D,CAAC;QAC/D,IAAI,OAAO,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChD,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAEvC,4CAA4C;IAC5C,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAE3B,wCAAwC;IACxC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,MAAc,EAAE,EAAE;QAC/C,YAAY,IAAI,KAAK,CAAC;QACtB,OAAO,CAAC,IAAI,CACV,uBAAuB,KAAK,WAAW,MAAM,qBAAqB,YAAY,EAAE,CACjF,CAAC;IACJ,CAAC,CAAC;IAEF,sEAAsE;IACtE,yFAAyF;IACzF,yFAAyF;IACzF,IAAI,aAAwC,CAAC;IAC7C,IACE,MAAM,CAAC,OAAO;QACd,eAAe,CAAC,eAAe,CAAC,aAAa,CAAC,kBAAkB,CAAC,EACjE,CAAC;QACD,MAAM,aAAa,GAAG,IAAI,iBAAiB,CAAC;YAC1C,QAAQ,EAAE,IAAI,iBAAiB,CAAC;gBAC9B,OAAO,EAAE,MAAM,CAAC,WAAW;gBAC3B,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,YAAY;aACnC,CAAC;YACF,MAAM;YACN,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,IAAI,IAAI,CAAC;QAC3D,MAAM,aAAa,GAAG,8BAA8B,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC5E,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;YACxC,UAAU;YACV,GAAG,aAAa;SACjB,CAAC,CAAC;QACH,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,IAAI,2BAA2B,EAAE,CAAC;QAC3E,aAAa,GAAG,IAAI,uBAAuB,CACzC,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,mBAAmB,CACpB,CAAC;QACF,wEAAwE;QACxE,2EAA2E;QAC3E,qBAAqB;QACrB,IAAI,cAAc,EAAE,EAAE,CAAC;YACrB,aAAa,GAAG,IAAI,kBAAkB,CAAC,aAAa,CAAC,CAAC;QACxD,CAAC;QACD,2EAA2E;QAC3E,4DAA4D;QAC5D,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7B,aAAa,GAAG,IAAI,6BAA6B,CAC/C,aAAa,EACb,MAAM,CAAC,iBAAiB,CACzB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oCAAoC;IACpC,wFAAwF;IACxF,IAAI,YAAuD,CAAC;IAC5D,IACE,MAAM,CAAC,OAAO;QACd,MAAM,CAAC,cAAc,KAAK,KAAK;QAC/B,eAAe,CAAC,eAAe,CAAC,aAAa,CAAC,kBAAkB,CAAC,EACjE,CAAC;QACD,YAAY,GAAG,IAAI,6BAA6B,CAAC;YAC/C,QAAQ,EAAE,IAAI,kBAAkB,CAAC;gBAC/B,OAAO,EAAE,MAAM,CAAC,WAAW;gBAC3B,qBAAqB,EAAE,sBAAsB,CAAC,KAAK;gBACnD,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,aAAa;aACpC,CAAC;YACF,oBAAoB,EAAE,KAAK,EAAE,mBAAmB;SACjD,CAAC,CAAC;IACL,CAAC;IAED,oEAAoE;IACpE,4DAA4D;IAC5D,kGAAkG;IAClG,gFAAgF;IAChF,2DAA2D;IAC3D,IAAI,YAA4C,CAAC;IACjD,IAAI,aAAa,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAE7C,4EAA4E;IAC5E,+EAA+E;IAC/E,8EAA8E;IAC9E,IAAI,cAAc,EAAE,EAAE,CAAC;QACrB,aAAa,GAAG;YACd,GAAG,aAAa;YAChB,UAAU,EAAE,aAAa,CAAC,cAAc;SACzC,CAAC;IACJ,CAAC;IAED,IACE,MAAM,CAAC,OAAO;QACd,MAAM,CAAC,WAAW,KAAK,KAAK;QAC5B,eAAe,CAAC,eAAe,CAAC,aAAa,CAAC,kBAAkB,CAAC;QACjE,aAAa,CAAC,UAAU,KAAK,aAAa,CAAC,UAAU,EACrD,CAAC;QACD,MAAM,cAAc,GAAG,IAAI,uBAAuB,CAAC;YACjD,QAAQ,EAAE,IAAI,eAAe,CAAC;gBAC5B,OAAO,EAAE,MAAM,CAAC,WAAW;gBAC3B,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,UAAU;aACjC,CAAC;SACH,CAAC,CAAC;QACH,YAAY,GAAG,IAAI,uBAAuB,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAC1E,0EAA0E;QAC1E,8DAA8D;QAC9D,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7B,YAAY,GAAG,IAAI,kCAAkC,CACnD,YAAY,EACZ,MAAM,CAAC,iBAAiB,CACzB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,uGAAuG;IACvG,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC;QACtB,QAAQ;QACR,aAAa;QACb,YAAY;QACZ,kBAAkB,EAAE,YAAY;QAChC,cAAc,EAAE,IAAI,+BAA+B,EAAE;QACrD,iBAAiB,EAAE,IAAI,yBAAyB,EAAE;QAClD,iGAAiG;QACjG,gBAAgB,EAAE,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAQ;KACzD,CAAC,CAAC;IAEH,GAAG,CAAC,KAAK,EAAE,CAAC;IAEZ,MAAM,aAAa,GAAG,aAAa;QACjC,CAAC,CAAC,4BAA4B;QAC9B,CAAC,CAAC,UAAU,CAAC;IACf,MAAM,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IAC7D,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IAC1D,IAAI,OAAO,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAChB;YACE,SAAS,EAAE,WAAW;YACtB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,cAAc;YACvB,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,MAAM,EAAE,aAAa;SACtB,EACD,uBAAuB,CACxB,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CACV,+BAA+B,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,cAAc,GAAG;YAC5E,cAAc,aAAa,eAAe,cAAc,YAAY,WAAW,EAAE,CACpF,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CACnC,MAAM,CAAC,WAAW,EAClB,MAAM,CAAC,cAAc,CACtB,CAAC;IAEF,6DAA6D;IAC7D,oEAAoE;IACpE,mEAAmE;IACnE,MAAM,cAAc,GAAG,oBAAoB,CAAC;QAC1C,YAAY,EAAE,QAAQ;QACtB,kBAAkB,EAAE,MAAM,CAAC,WAAW;QACtC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,aAAa;KACd,CAAC,CAAC;IAEH,MAAM,OAAO,GAA0B;QACrC,GAAG;QACH,eAAe;QACf,SAAS,EAAE,CAAC,IAAa,EAAE,OAA0B,EAAE,EAAE,CACvD,cAAc,CAAC,SAAS,CACtB,IAAI,IAAI,MAAM,CAAC,WAAW,EAC1B,OAAO,EAAE,WAAW,IAAI,MAAM,CAAC,WAAW,CAC3C;QACH,QAAQ,EAAE,CAAC,IAAa,EAAE,EAAE,CAC1B,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC;QACrE,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE,CAC3B,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,cAAc,CAAC;QACnE,aAAa,EAAE,IAAI,aAAa,CAAC,YAAY,CAAC;QAC9C,QAAQ,EAAE,KAAK,IAAI,EAAE;YACnB,IAAI,CAAC;gBACH,mEAAmE;gBACnE,+DAA+D;gBAC/D,IAAI,CAAC;oBACH,MAAM,cAAc,CAAC,QAAQ,EAAE,CAAC;gBAClC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;gBACrE,CAAC;gBACD,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC;YACvB,CAAC;oBAAS,CAAC;gBACT,WAAW,CAAC,SAAS,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;KACF,CAAC;IAEF,WAAW,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,WAAW,EAAE,KAAK,SAAS,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC5B,WAAW,CAAC,SAAS,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local-observability mode toggle for the Node telemetry pipeline.
|
|
3
|
+
*
|
|
4
|
+
* `SUPERBLOCKS_LOCAL_OBS=true` is set ONLY by local dev tooling (the workspace
|
|
5
|
+
* Tilt profiles and `pnpm start:all`) and NEVER in any deployed environment —
|
|
6
|
+
* it appears in no helm chart, terraform config, or CI workflow. Code gated on
|
|
7
|
+
* this can therefore change export behavior for local development without
|
|
8
|
+
* affecting ee/staging/prod.
|
|
9
|
+
*
|
|
10
|
+
* This is the single source of truth for that gate so the checks can't drift:
|
|
11
|
+
* it must match EXACTLY the string "true" (not truthy, not "1"/"TRUE"), which is
|
|
12
|
+
* what guarantees the local-only log paths (the server's pino->OTLP bridge and
|
|
13
|
+
* the info-level log-export override) never activate in a deployed environment
|
|
14
|
+
* and therefore never duplicate log volume into Datadog.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isLocalObsMode(env?: NodeJS.ProcessEnv): boolean;
|
|
17
|
+
//# sourceMappingURL=local-obs-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-obs-mode.d.ts","sourceRoot":"","sources":["../../src/node/local-obs-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAE5E"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local-observability mode toggle for the Node telemetry pipeline.
|
|
3
|
+
*
|
|
4
|
+
* `SUPERBLOCKS_LOCAL_OBS=true` is set ONLY by local dev tooling (the workspace
|
|
5
|
+
* Tilt profiles and `pnpm start:all`) and NEVER in any deployed environment —
|
|
6
|
+
* it appears in no helm chart, terraform config, or CI workflow. Code gated on
|
|
7
|
+
* this can therefore change export behavior for local development without
|
|
8
|
+
* affecting ee/staging/prod.
|
|
9
|
+
*
|
|
10
|
+
* This is the single source of truth for that gate so the checks can't drift:
|
|
11
|
+
* it must match EXACTLY the string "true" (not truthy, not "1"/"TRUE"), which is
|
|
12
|
+
* what guarantees the local-only log paths (the server's pino->OTLP bridge and
|
|
13
|
+
* the info-level log-export override) never activate in a deployed environment
|
|
14
|
+
* and therefore never duplicate log volume into Datadog.
|
|
15
|
+
*/
|
|
16
|
+
export function isLocalObsMode(env = process.env) {
|
|
17
|
+
return env.SUPERBLOCKS_LOCAL_OBS === "true";
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=local-obs-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-obs-mode.js","sourceRoot":"","sources":["../../src/node/local-obs-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,cAAc,CAAC,MAAyB,OAAO,CAAC,GAAG;IACjE,OAAO,GAAG,CAAC,qBAAqB,KAAK,MAAM,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy-Aware Log Processor
|
|
3
|
+
*
|
|
4
|
+
* Wraps a delegate LogRecordProcessor to provide:
|
|
5
|
+
* 1. Export mode filtering (LOCAL_ONLY, ERRORS_ONLY, INFO_AND_ABOVE)
|
|
6
|
+
* 2. Severity level filtering
|
|
7
|
+
* 3. Log body and attribute sanitization
|
|
8
|
+
*
|
|
9
|
+
* @see https://github.com/superblocksteam/engineering/blob/main/projects/o11y-refactor/epics/epic-c4-logging-strategy.md
|
|
10
|
+
*/
|
|
11
|
+
import type { Context } from "@opentelemetry/api";
|
|
12
|
+
import type { LogRecordProcessor, ReadableLogRecord } from "@opentelemetry/sdk-logs";
|
|
13
|
+
import type { SensitivePattern } from "../common/log-sanitizer.js";
|
|
14
|
+
import { TelemetryPolicy } from "../types/policy.js";
|
|
15
|
+
/**
|
|
16
|
+
* Controls what logs are exported via OTEL.
|
|
17
|
+
*/
|
|
18
|
+
export declare enum LogExportMode {
|
|
19
|
+
/** No log export - local stdout/stderr only */
|
|
20
|
+
LOCAL_ONLY = "local_only",
|
|
21
|
+
/** Export WARN/ERROR/FATAL only (default for cloud-prem) */
|
|
22
|
+
ERRORS_ONLY = "errors_only",
|
|
23
|
+
/** Export INFO and above (not recommended for cloud-prem) */
|
|
24
|
+
INFO_AND_ABOVE = "info_and_above"
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Logging-specific policy configuration.
|
|
28
|
+
* All sanitization is driven by these fields; when they are empty/off, no redaction is applied.
|
|
29
|
+
*/
|
|
30
|
+
export interface LoggingPolicyConfig {
|
|
31
|
+
/** What logs to export */
|
|
32
|
+
exportMode: LogExportMode;
|
|
33
|
+
/** Maximum log level for local retention */
|
|
34
|
+
localMaxLevel: "trace" | "debug" | "info" | "warn" | "error" | "fatal";
|
|
35
|
+
/** Patterns to redact from message/body and string values (e.g. JWT, API keys). When empty, no secret redaction. */
|
|
36
|
+
messageSecretPatterns: SensitivePattern[];
|
|
37
|
+
/** Attribute keys (lowercase) that trigger value → [REDACTED]. When empty, no key-based secret redaction. */
|
|
38
|
+
secretFieldNames: Set<string>;
|
|
39
|
+
/** Regex patterns for attribute key names that trigger value → [REDACTED]. When empty, only secretFieldNames apply. */
|
|
40
|
+
secretFieldPatterns: RegExp[];
|
|
41
|
+
/** When true, stack traces in body/attributes are replaced with placeholder. When false, left as-is. */
|
|
42
|
+
redactStackTraces: boolean;
|
|
43
|
+
/** Regex patterns to redact from log content (replaced with [REDACTED]). */
|
|
44
|
+
redactPatterns: RegExp[];
|
|
45
|
+
/** Pattern+replacement rules for sensitive values (path, email). */
|
|
46
|
+
sensitivePatterns: SensitivePattern[];
|
|
47
|
+
/** Fields to exclude from exported logs (key and value omitted). */
|
|
48
|
+
forbiddenFields: Set<string>;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Parse a string value into a LogExportMode, returning undefined if unrecognized.
|
|
52
|
+
* Used to validate SUPERBLOCKS_LOG_EXPORT_MODE env var values.
|
|
53
|
+
*/
|
|
54
|
+
export declare function parseLogExportMode(value: string | undefined): LogExportMode | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* Get logging policy based on telemetry policy.
|
|
57
|
+
*
|
|
58
|
+
* @param policy - Telemetry policy
|
|
59
|
+
* @param exportModeOverride - Optional override for the export mode. When set, overrides the
|
|
60
|
+
* deployment-type default (e.g. allows INFO_AND_ABOVE on a cloud-prem trial environment).
|
|
61
|
+
* Cloud-prem sanitization (redaction, forbidden fields) is still applied regardless of override.
|
|
62
|
+
* @returns Logging policy configuration
|
|
63
|
+
*/
|
|
64
|
+
export declare function getLoggingPolicy(policy: TelemetryPolicy, exportModeOverride?: LogExportMode): LoggingPolicyConfig;
|
|
65
|
+
/**
|
|
66
|
+
* Returns the effective Pino log level from the current logging policy and env level.
|
|
67
|
+
* 1. Applies exportMode: when ERRORS_ONLY, never below warn so export paths never see INFO/DEBUG.
|
|
68
|
+
* 2. Applies localMaxLevel: caps local retention so we never set the logger more verbose than
|
|
69
|
+
* policy.localMaxLevel (e.g. localMaxLevel "debug" prevents trace from being written locally).
|
|
70
|
+
*
|
|
71
|
+
* Use when policy is available (e.g. after initNodeTelemetry) to sync logger level from policy.
|
|
72
|
+
*
|
|
73
|
+
* @param loggingPolicy - Logging policy (e.g. from getLoggingPolicy(telemetryPolicy))
|
|
74
|
+
* @param envLevel - Level from env (e.g. SUPERBLOCKS_SERVER_LOG_LEVEL)
|
|
75
|
+
* @returns Level to pass to Pino
|
|
76
|
+
*/
|
|
77
|
+
export declare function getMinimumPinoLevelFromLoggingPolicy(loggingPolicy: LoggingPolicyConfig, envLevel: string): string;
|
|
78
|
+
/**
|
|
79
|
+
* Returns the effective Pino log level for a deployment given the env-configured level.
|
|
80
|
+
* Used at logger bootstrap when policy is not yet initialized (e.g. server logger module load).
|
|
81
|
+
* Delegates to getMinimumPinoLevelFromLoggingPolicy with a synthetic policy from deployment type
|
|
82
|
+
* so the exportMode → level rule lives in one place.
|
|
83
|
+
*
|
|
84
|
+
* @param envLevel - Level from env (e.g. SUPERBLOCKS_SERVER_LOG_LEVEL)
|
|
85
|
+
* @param deploymentType - Deployment type from env (e.g. SUPERBLOCKS_DEPLOYMENT_TYPE)
|
|
86
|
+
* @param exportModeOverride - Optional override from env (e.g. SUPERBLOCKS_LOG_EXPORT_MODE).
|
|
87
|
+
* When set to a valid LogExportMode, overrides the deployment-type default.
|
|
88
|
+
* NOTE: This function runs at bootstrap before the policy evaluator is initialized,
|
|
89
|
+
* so it cannot verify the Tier 2 export gate. The override only lowers the Pino
|
|
90
|
+
* stdout level; actual telemetry export is gated by getLoggingPolicy() after init,
|
|
91
|
+
* which always enforces !canExportTier2 before applying the override.
|
|
92
|
+
* @returns Level to pass to Pino (envLevel or 'warn' for cloud-prem when envLevel is below warn)
|
|
93
|
+
*/
|
|
94
|
+
export declare function getMinimumPinoLevelForDeployment(envLevel: string, deploymentType: string, exportModeOverride?: LogExportMode): string;
|
|
95
|
+
/**
|
|
96
|
+
* Log processor that filters and sanitizes logs based on policy.
|
|
97
|
+
*
|
|
98
|
+
* This processor:
|
|
99
|
+
* 1. Blocks all logs if exportMode is LOCAL_ONLY
|
|
100
|
+
* 2. Filters by severity level based on exportMode
|
|
101
|
+
* 3. Sanitizes log body and attributes before forwarding
|
|
102
|
+
*/
|
|
103
|
+
export declare class PolicyAwareLogProcessor implements LogRecordProcessor {
|
|
104
|
+
private readonly policy;
|
|
105
|
+
private readonly delegate;
|
|
106
|
+
constructor(policy: LoggingPolicyConfig, delegate: LogRecordProcessor);
|
|
107
|
+
/**
|
|
108
|
+
* Called when a log record is emitted.
|
|
109
|
+
*/
|
|
110
|
+
onEmit(logRecord: ReadableLogRecord, context?: Context): void;
|
|
111
|
+
/** True when policy has no sanitization (cloud passthrough). */
|
|
112
|
+
private isPassthroughPolicy;
|
|
113
|
+
/**
|
|
114
|
+
* Sanitize a log record for export.
|
|
115
|
+
* Mutates the log record in place to preserve OTEL SDK internal state.
|
|
116
|
+
* All redaction is policy-driven; when config is empty/off, content is left as-is.
|
|
117
|
+
*/
|
|
118
|
+
private sanitizeLogRecord;
|
|
119
|
+
/**
|
|
120
|
+
* Sanitize log attributes.
|
|
121
|
+
*/
|
|
122
|
+
private sanitizeAttributes;
|
|
123
|
+
/**
|
|
124
|
+
* Shutdown the processor.
|
|
125
|
+
*/
|
|
126
|
+
shutdown(): Promise<void>;
|
|
127
|
+
/**
|
|
128
|
+
* Force flush pending logs.
|
|
129
|
+
*/
|
|
130
|
+
forceFlush(): Promise<void>;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=log-processor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log-processor.d.ts","sourceRoot":"","sources":["../../src/node/log-processor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAoBnE,OAAO,EAAE,eAAe,EAAiB,MAAM,oBAAoB,CAAC;AAOpE;;GAEG;AACH,oBAAY,aAAa;IACvB,+CAA+C;IAC/C,UAAU,eAAe;IACzB,4DAA4D;IAC5D,WAAW,gBAAgB;IAC3B,6DAA6D;IAC7D,cAAc,mBAAmB;CAClC;AAMD;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,0BAA0B;IAC1B,UAAU,EAAE,aAAa,CAAC;IAC1B,4CAA4C;IAC5C,aAAa,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;IACvE,oHAAoH;IACpH,qBAAqB,EAAE,gBAAgB,EAAE,CAAC;IAC1C,6GAA6G;IAC7G,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,uHAAuH;IACvH,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,wGAAwG;IACxG,iBAAiB,EAAE,OAAO,CAAC;IAC3B,4EAA4E;IAC5E,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oEAAoE;IACpE,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,oEAAoE;IACpE,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,aAAa,GAAG,SAAS,CAS3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,eAAe,EACvB,kBAAkB,CAAC,EAAE,aAAa,GACjC,mBAAmB,CAyDrB;AAiCD;;;;;;;;;;;GAWG;AACH,wBAAgB,oCAAoC,CAClD,aAAa,EAAE,mBAAmB,EAClC,QAAQ,EAAE,MAAM,GACf,MAAM,CAiBR;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,kBAAkB,CAAC,EAAE,aAAa,GACjC,MAAM,CAsBR;AAuDD;;;;;;;GAOG;AACH,qBAAa,uBAAwB,YAAW,kBAAkB;IAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;gBAElC,MAAM,EAAE,mBAAmB,EAAE,QAAQ,EAAE,kBAAkB;IAKrE;;OAEG;IACH,MAAM,CAAC,SAAS,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI;IAqB7D,gEAAgE;IAChE,OAAO,CAAC,mBAAmB;IAa3B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IA6CzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAuE1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
|