@superblocksteam/telemetry 2.0.93 → 2.0.94-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/README.md +59 -44
  2. package/dist/browser/index.d.ts +2 -2
  3. package/dist/browser/resilient-exporter.d.ts.map +1 -1
  4. package/dist/browser/resilient-exporter.js.map +1 -1
  5. package/dist/common/contracts/tier2-traces.d.ts +62 -50
  6. package/dist/common/contracts/tier2-traces.d.ts.map +1 -1
  7. package/dist/common/contracts/tier2-traces.js +484 -138
  8. package/dist/common/contracts/tier2-traces.js.map +1 -1
  9. package/dist/common/guardrails.d.ts +2 -2
  10. package/dist/common/guardrails.d.ts.map +1 -1
  11. package/dist/common/guardrails.js +7 -7
  12. package/dist/common/guardrails.js.map +1 -1
  13. package/dist/common/log-sanitizer.d.ts +88 -0
  14. package/dist/common/log-sanitizer.d.ts.map +1 -1
  15. package/dist/common/log-sanitizer.js +304 -6
  16. package/dist/common/log-sanitizer.js.map +1 -1
  17. package/dist/common/resource.d.ts +4 -1
  18. package/dist/common/resource.d.ts.map +1 -1
  19. package/dist/common/resource.js +4 -2
  20. package/dist/common/resource.js.map +1 -1
  21. package/dist/common/trace-sanitizer.d.ts +82 -0
  22. package/dist/common/trace-sanitizer.d.ts.map +1 -0
  23. package/dist/common/trace-sanitizer.js +230 -0
  24. package/dist/common/trace-sanitizer.js.map +1 -0
  25. package/dist/index.d.ts +2 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +16 -8
  28. package/dist/index.js.map +1 -1
  29. package/dist/lint/forbidden-attributes.d.ts +2 -2
  30. package/dist/lint/forbidden-attributes.d.ts.map +1 -1
  31. package/dist/lint/forbidden-attributes.js +41 -40
  32. package/dist/lint/forbidden-attributes.js.map +1 -1
  33. package/dist/lint/index.d.ts +1 -1
  34. package/dist/llmobs/index.d.ts +2 -2
  35. package/dist/llmobs/tier1-exporter.d.ts +2 -2
  36. package/dist/llmobs/tier1-exporter.d.ts.map +1 -1
  37. package/dist/llmobs/tier1-exporter.js +17 -14
  38. package/dist/llmobs/tier1-exporter.js.map +1 -1
  39. package/dist/llmobs/tier2-summarizer.d.ts.map +1 -1
  40. package/dist/llmobs/tier2-summarizer.js +10 -4
  41. package/dist/llmobs/tier2-summarizer.js.map +1 -1
  42. package/dist/node/exporters/resilient-exporter.d.ts +14 -0
  43. package/dist/node/exporters/resilient-exporter.d.ts.map +1 -1
  44. package/dist/node/exporters/resilient-exporter.js +8 -1
  45. package/dist/node/exporters/resilient-exporter.js.map +1 -1
  46. package/dist/node/index.d.ts +2 -1
  47. package/dist/node/index.d.ts.map +1 -1
  48. package/dist/node/index.js +7 -2
  49. package/dist/node/index.js.map +1 -1
  50. package/dist/node/init.d.ts.map +1 -1
  51. package/dist/node/init.js +61 -12
  52. package/dist/node/init.js.map +1 -1
  53. package/dist/node/log-processor.d.ts +41 -6
  54. package/dist/node/log-processor.d.ts.map +1 -1
  55. package/dist/node/log-processor.js +152 -61
  56. package/dist/node/log-processor.js.map +1 -1
  57. package/dist/node/metrics-client.d.ts.map +1 -1
  58. package/dist/node/metrics-client.js.map +1 -1
  59. package/dist/node/safe-logger.d.ts +55 -0
  60. package/dist/node/safe-logger.d.ts.map +1 -0
  61. package/dist/node/safe-logger.js +158 -0
  62. package/dist/node/safe-logger.js.map +1 -0
  63. package/dist/node/sanitizing-processor.d.ts +56 -0
  64. package/dist/node/sanitizing-processor.d.ts.map +1 -0
  65. package/dist/node/sanitizing-processor.js +124 -0
  66. package/dist/node/sanitizing-processor.js.map +1 -0
  67. package/dist/node/traced-socket.d.ts +47 -3
  68. package/dist/node/traced-socket.d.ts.map +1 -1
  69. package/dist/node/traced-socket.js +96 -19
  70. package/dist/node/traced-socket.js.map +1 -1
  71. package/dist/testing/in-memory-exporter.d.ts +3 -3
  72. package/dist/testing/in-memory-exporter.d.ts.map +1 -1
  73. package/dist/testing/in-memory-exporter.js +3 -1
  74. package/dist/testing/in-memory-exporter.js.map +1 -1
  75. package/dist/testing/index.d.ts +2 -2
  76. package/dist/types/index.d.ts +28 -1
  77. package/dist/types/index.d.ts.map +1 -1
  78. package/dist-esm/browser/index.d.ts +2 -2
  79. package/dist-esm/browser/index.js +2 -2
  80. package/dist-esm/browser/resilient-exporter.d.ts.map +1 -1
  81. package/dist-esm/browser/resilient-exporter.js.map +1 -1
  82. package/dist-esm/common/contracts/tier2-traces.d.ts +62 -50
  83. package/dist-esm/common/contracts/tier2-traces.d.ts.map +1 -1
  84. package/dist-esm/common/contracts/tier2-traces.js +480 -137
  85. package/dist-esm/common/contracts/tier2-traces.js.map +1 -1
  86. package/dist-esm/common/guardrails.d.ts +2 -2
  87. package/dist-esm/common/guardrails.d.ts.map +1 -1
  88. package/dist-esm/common/guardrails.js +9 -9
  89. package/dist-esm/common/guardrails.js.map +1 -1
  90. package/dist-esm/common/log-sanitizer.d.ts +88 -0
  91. package/dist-esm/common/log-sanitizer.d.ts.map +1 -1
  92. package/dist-esm/common/log-sanitizer.js +294 -5
  93. package/dist-esm/common/log-sanitizer.js.map +1 -1
  94. package/dist-esm/common/resource.d.ts +4 -1
  95. package/dist-esm/common/resource.d.ts.map +1 -1
  96. package/dist-esm/common/resource.js +3 -1
  97. package/dist-esm/common/resource.js.map +1 -1
  98. package/dist-esm/common/trace-sanitizer.d.ts +82 -0
  99. package/dist-esm/common/trace-sanitizer.d.ts.map +1 -0
  100. package/dist-esm/common/trace-sanitizer.js +226 -0
  101. package/dist-esm/common/trace-sanitizer.js.map +1 -0
  102. package/dist-esm/index.d.ts +2 -1
  103. package/dist-esm/index.d.ts.map +1 -1
  104. package/dist-esm/index.js +2 -1
  105. package/dist-esm/index.js.map +1 -1
  106. package/dist-esm/lint/forbidden-attributes.d.ts +2 -2
  107. package/dist-esm/lint/forbidden-attributes.d.ts.map +1 -1
  108. package/dist-esm/lint/forbidden-attributes.js +43 -42
  109. package/dist-esm/lint/forbidden-attributes.js.map +1 -1
  110. package/dist-esm/lint/index.d.ts +1 -1
  111. package/dist-esm/lint/index.js +1 -1
  112. package/dist-esm/llmobs/index.d.ts +2 -2
  113. package/dist-esm/llmobs/index.js +2 -2
  114. package/dist-esm/llmobs/tier1-exporter.d.ts +2 -2
  115. package/dist-esm/llmobs/tier1-exporter.d.ts.map +1 -1
  116. package/dist-esm/llmobs/tier1-exporter.js +18 -15
  117. package/dist-esm/llmobs/tier1-exporter.js.map +1 -1
  118. package/dist-esm/llmobs/tier2-summarizer.d.ts.map +1 -1
  119. package/dist-esm/llmobs/tier2-summarizer.js +10 -4
  120. package/dist-esm/llmobs/tier2-summarizer.js.map +1 -1
  121. package/dist-esm/node/exporters/resilient-exporter.d.ts +14 -0
  122. package/dist-esm/node/exporters/resilient-exporter.d.ts.map +1 -1
  123. package/dist-esm/node/exporters/resilient-exporter.js +8 -1
  124. package/dist-esm/node/exporters/resilient-exporter.js.map +1 -1
  125. package/dist-esm/node/index.d.ts +2 -1
  126. package/dist-esm/node/index.d.ts.map +1 -1
  127. package/dist-esm/node/index.js +2 -1
  128. package/dist-esm/node/index.js.map +1 -1
  129. package/dist-esm/node/init.d.ts.map +1 -1
  130. package/dist-esm/node/init.js +61 -12
  131. package/dist-esm/node/init.js.map +1 -1
  132. package/dist-esm/node/log-processor.d.ts +41 -6
  133. package/dist-esm/node/log-processor.d.ts.map +1 -1
  134. package/dist-esm/node/log-processor.js +151 -62
  135. package/dist-esm/node/log-processor.js.map +1 -1
  136. package/dist-esm/node/metrics-client.d.ts.map +1 -1
  137. package/dist-esm/node/metrics-client.js.map +1 -1
  138. package/dist-esm/node/safe-logger.d.ts +55 -0
  139. package/dist-esm/node/safe-logger.d.ts.map +1 -0
  140. package/dist-esm/node/safe-logger.js +154 -0
  141. package/dist-esm/node/safe-logger.js.map +1 -0
  142. package/dist-esm/node/sanitizing-processor.d.ts +56 -0
  143. package/dist-esm/node/sanitizing-processor.d.ts.map +1 -0
  144. package/dist-esm/node/sanitizing-processor.js +120 -0
  145. package/dist-esm/node/sanitizing-processor.js.map +1 -0
  146. package/dist-esm/node/traced-socket.d.ts +47 -3
  147. package/dist-esm/node/traced-socket.d.ts.map +1 -1
  148. package/dist-esm/node/traced-socket.js +96 -19
  149. package/dist-esm/node/traced-socket.js.map +1 -1
  150. package/dist-esm/testing/in-memory-exporter.d.ts +3 -3
  151. package/dist-esm/testing/in-memory-exporter.d.ts.map +1 -1
  152. package/dist-esm/testing/in-memory-exporter.js +4 -2
  153. package/dist-esm/testing/in-memory-exporter.js.map +1 -1
  154. package/dist-esm/testing/index.d.ts +2 -2
  155. package/dist-esm/testing/index.js +2 -2
  156. package/dist-esm/types/index.d.ts +28 -1
  157. package/dist-esm/types/index.d.ts.map +1 -1
  158. package/dist-esm/types/index.js +1 -1
  159. package/package.json +17 -18
package/README.md CHANGED
@@ -6,33 +6,38 @@ Canonical telemetry bootstrap package for all Superblocks services. This package
6
6
 
7
7
  This is the **ONLY approved way** to initialize OpenTelemetry in Superblocks services. Direct usage of `NodeSDK` or `WebTracerProvider` outside this package is prohibited.
8
8
 
9
+ - **Logging**: Policy-aware log export (severity filtering, sanitization). See [docs/LOGGING.md](docs/LOGGING.md) for what to log at each level and forbidden fields.
10
+
9
11
  ## Tiered Telemetry Model
10
12
 
11
- | Tier | Description | Egress |
12
- |------|-------------|--------|
13
- | **Tier 1** | Full fidelity debugging (code, prompts, stack traces) | Local only (cloud-prem) |
14
- | **Tier 2** | Sanitized operational telemetry (latency, errors, token usage) | Exported by default |
15
- | **Tier 3** | AI experience telemetry (prompts, responses, quality signals) | Exported by default |
13
+ | Tier | Description | Egress |
14
+ | ---------- | -------------------------------------------------------------- | ----------------------- |
15
+ | **Tier 1** | Full fidelity debugging (code, prompts, stack traces) | Local only (cloud-prem) |
16
+ | **Tier 2** | Sanitized operational telemetry (latency, errors, token usage) | Exported by default |
17
+ | **Tier 3** | AI experience telemetry (prompts, responses, quality signals) | Exported by default |
16
18
 
17
19
  ## Usage
18
20
 
19
21
  ### Node.js Services
20
22
 
21
23
  ```typescript
22
- import { initNodeTelemetry } from '@superblocksteam/telemetry/node';
23
- import { getDefaultPolicy, DeploymentType } from '@superblocksteam/shared';
24
+ import { initNodeTelemetry } from "@superblocksteam/telemetry/node";
25
+ import { getDefaultPolicy, DeploymentType } from "@superblocksteam/shared";
24
26
 
25
27
  const policy = getDefaultPolicy(DeploymentType.CLOUD_PREM);
26
28
 
27
- const telemetry = initNodeTelemetry({
28
- serviceName: 'my-service',
29
- serviceVersion: '1.0.0',
30
- environment: process.env.NODE_ENV ?? 'development',
31
- otlpUrl: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
32
- }, policy);
29
+ const telemetry = initNodeTelemetry(
30
+ {
31
+ serviceName: "my-service",
32
+ serviceVersion: "1.0.0",
33
+ environment: process.env.NODE_ENV ?? "development",
34
+ otlpUrl: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
35
+ },
36
+ policy,
37
+ );
33
38
 
34
39
  // Graceful shutdown
35
- process.on('SIGTERM', async () => {
40
+ process.on("SIGTERM", async () => {
36
41
  await telemetry.shutdown();
37
42
  });
38
43
  ```
@@ -40,42 +45,45 @@ process.on('SIGTERM', async () => {
40
45
  ### Browser
41
46
 
42
47
  ```typescript
43
- import { initBrowserTelemetry } from '@superblocksteam/telemetry/browser';
44
- import { getDefaultPolicy, DeploymentType } from '@superblocksteam/shared';
48
+ import { initBrowserTelemetry } from "@superblocksteam/telemetry/browser";
49
+ import { getDefaultPolicy, DeploymentType } from "@superblocksteam/shared";
45
50
 
46
51
  const policy = getDefaultPolicy(DeploymentType.CLOUD);
47
52
 
48
- initBrowserTelemetry({
49
- serviceName: 'superblocks-ui',
50
- serviceVersion: '1.0.0',
51
- environment: 'production',
52
- otlpUrl: 'https://app.superblocks.com/api/v1/traces',
53
- }, policy);
53
+ initBrowserTelemetry(
54
+ {
55
+ serviceName: "superblocks-ui",
56
+ serviceVersion: "1.0.0",
57
+ environment: "production",
58
+ otlpUrl: "https://app.superblocks.com/api/v1/traces",
59
+ },
60
+ policy,
61
+ );
54
62
  ```
55
63
 
56
64
  ### Testing
57
65
 
58
66
  ```typescript
59
- import { initTestTelemetry } from '@superblocksteam/telemetry/testing';
67
+ import { initTestTelemetry } from "@superblocksteam/telemetry/testing";
60
68
 
61
- describe('MyService', () => {
69
+ describe("MyService", () => {
62
70
  const { spanExporter, reset } = initTestTelemetry();
63
71
 
64
72
  beforeEach(() => reset());
65
73
 
66
- it('creates expected spans', async () => {
74
+ it("creates expected spans", async () => {
67
75
  await myService.doSomething();
68
76
 
69
77
  const spans = spanExporter.getSpans();
70
78
  expect(spans).toHaveLength(1);
71
- expect(spans[0].name).toBe('doSomething');
79
+ expect(spans[0].name).toBe("doSomething");
72
80
  });
73
81
 
74
- it('does not leak Tier 1 data', async () => {
82
+ it("does not leak Tier 1 data", async () => {
75
83
  await myService.processWithSensitiveData();
76
84
 
77
- spanExporter.assertNoAttribute('prompt', /.*/);
78
- spanExporter.assertNoAttribute('code', /.*/);
85
+ spanExporter.assertNoAttribute("prompt", /.*/);
86
+ spanExporter.assertNoAttribute("code", /.*/);
79
87
  });
80
88
  });
81
89
  ```
@@ -85,30 +93,34 @@ describe('MyService', () => {
85
93
  Use tier policy hints to inform the Collector how to route specific spans. This is useful when the SDK knows something the Collector can't infer from attributes alone.
86
94
 
87
95
  ```typescript
88
- import { trace } from '@opentelemetry/api';
89
- import { markSensitive, markForAIAnalysis, markDebugOnly } from '@superblocksteam/telemetry';
96
+ import { trace } from "@opentelemetry/api";
97
+ import {
98
+ markSensitive,
99
+ markForAIAnalysis,
100
+ markDebugOnly,
101
+ } from "@superblocksteam/telemetry";
90
102
 
91
- const tracer = trace.getTracer('my-service');
103
+ const tracer = trace.getTracer("my-service");
92
104
 
93
105
  // Span containing secrets — Tier 1 only, never exported
94
- tracer.startActiveSpan('decrypt_customer_secret', (span) => {
106
+ tracer.startActiveSpan("decrypt_customer_secret", (span) => {
95
107
  markSensitive(span);
96
108
  // ... decrypt operation
97
109
  span.end();
98
110
  });
99
111
 
100
112
  // GenAI span for quality analysis — include in Tier 3
101
- tracer.startActiveSpan('gen_ai.chat', (span) => {
113
+ tracer.startActiveSpan("gen_ai.chat", (span) => {
102
114
  markForAIAnalysis(span);
103
- span.setAttribute('gen_ai.system', 'anthropic');
115
+ span.setAttribute("gen_ai.system", "anthropic");
104
116
  // ... LLM call
105
117
  span.end();
106
118
  });
107
119
 
108
120
  // High-cardinality debug span — skip export (cost control)
109
- tracer.startActiveSpan('debug.cache_lookup', (span) => {
121
+ tracer.startActiveSpan("debug.cache_lookup", (span) => {
110
122
  markDebugOnly(span);
111
- span.setAttribute('cache.key', cacheKey);
123
+ span.setAttribute("cache.key", cacheKey);
112
124
  // ... lookup
113
125
  span.end();
114
126
  });
@@ -116,16 +128,19 @@ tracer.startActiveSpan('debug.cache_lookup', (span) => {
116
128
 
117
129
  ### Available Hints
118
130
 
119
- | Helper | Hint Value | Effect |
120
- |--------|------------|--------|
121
- | `markSensitive(span)` | `tier1_only` | Tier 1 only, skip Tier 2/3 |
131
+ | Helper | Hint Value | Effect |
132
+ | ------------------------- | --------------- | -------------------------------- |
133
+ | `markSensitive(span)` | `tier1_only` | Tier 1 only, skip Tier 2/3 |
122
134
  | `markForAIAnalysis(span)` | `include_tier3` | Include in Tier 3 (AI analytics) |
123
- | `markDebugOnly(span)` | `skip_export` | Tier 1 only, skip all export |
135
+ | `markDebugOnly(span)` | `skip_export` | Tier 1 only, skip all export |
124
136
 
125
137
  You can also set hints directly:
126
138
 
127
139
  ```typescript
128
- import { TIER_HINT_ATTRIBUTE, TierPolicyHint } from '@superblocksteam/telemetry';
140
+ import {
141
+ TIER_HINT_ATTRIBUTE,
142
+ TierPolicyHint,
143
+ } from "@superblocksteam/telemetry";
129
144
 
130
145
  span.setAttribute(TIER_HINT_ATTRIBUTE, TierPolicyHint.TIER1_ONLY);
131
146
  ```
@@ -143,7 +158,7 @@ span.setAttribute(TIER_HINT_ATTRIBUTE, TierPolicyHint.TIER1_ONLY);
143
158
  ```
144
159
  @superblocksteam/telemetry
145
160
  ├── /node # Node.js bootstrap (initNodeTelemetry)
146
- ├── /browser # Browser bootstrap (initBrowserTelemetry)
161
+ ├── /browser # Browser bootstrap (initBrowserTelemetry)
147
162
  ├── /testing # Test utilities (in-memory exporters)
148
163
  └── /common # Shared utilities (resource, router, sanitizer)
149
164
  ```
@@ -152,4 +167,4 @@ span.setAttribute(TIER_HINT_ATTRIBUTE, TierPolicyHint.TIER1_ONLY);
152
167
 
153
168
  - [O11y Refactor Project](../../engineering/projects/o11y-refactor/README.md)
154
169
  - [Telemetry Policy Schema](../../engineering/projects/o11y-refactor/epics/epic-a1-telemetry-policy.md)
155
- - [Tier 2 Traces Contract](https://github.com/superblocksteam/engineering/blob/main/projects/o11y-refactor/contracts/tier2-traces.v0.3.0.json)
170
+ - [Tier 2 Traces Contract](https://github.com/superblocksteam/engineering/blob/main/projects/o11y-refactor/contracts/tier2-traces.v0.2.0.json)
@@ -3,6 +3,6 @@
3
3
  *
4
4
  * This is the ONLY approved way to initialize telemetry in browser contexts.
5
5
  */
6
- export { initBrowserTelemetry, getBrowserTelemetryInstance, isBrowserTelemetryInitialized, resetBrowserTelemetry, getEnvironmentFromHostname, type BrowserTelemetryInstance, } from './init.js';
7
- export { getDefaultPolicy, DeploymentType } from '../types/policy.js';
6
+ export { initBrowserTelemetry, getBrowserTelemetryInstance, isBrowserTelemetryInitialized, resetBrowserTelemetry, getEnvironmentFromHostname, type BrowserTelemetryInstance, } from "./init.js";
7
+ export { getDefaultPolicy, DeploymentType } from "../types/policy.js";
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resilient-exporter.d.ts","sourceRoot":"","sources":["../../src/browser/resilient-exporter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,YAAY,EAAoB,MAAM,qBAAqB,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,kCAAkC;IAClC,QAAQ,EAAE,YAAY,CAAC;IACvB,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sCAAsC;IACtC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,eAAe,GAAG,SAAS,KAAK,IAAI,CAAC;CACtF;AAED;;;;;GAKG;AACH,qBAAa,wBAAyB,YAAW,YAAY;IAC3D,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;IAEV,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,8BAA8B;IAOlD;;OAEG;IACH,MAAM,CACJ,KAAK,EAAE,YAAY,EAAE,EACrB,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAC7C,IAAI;IAiDD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
1
+ {"version":3,"file":"resilient-exporter.d.ts","sourceRoot":"","sources":["../../src/browser/resilient-exporter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,YAAY,EAAoB,MAAM,qBAAqB,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,kCAAkC;IAClC,QAAQ,EAAE,YAAY,CAAC;IACvB,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,sCAAsC;IACtC,MAAM,CAAC,EAAE,CACP,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,YAAY,GAAG,eAAe,GAAG,SAAS,KAC/C,IAAI,CAAC;CACX;AAED;;;;;GAKG;AACH,qBAAa,wBAAyB,YAAW,YAAY;IAC3D,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;IAEV,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAS;gBAEjB,MAAM,EAAE,8BAA8B;IAOlD;;OAEG;IACH,MAAM,CACJ,KAAK,EAAE,YAAY,EAAE,EACrB,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAC7C,IAAI;IAiDD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
@@ -1 +1 @@
1
- {"version":3,"file":"resilient-exporter.js","sourceRoot":"","sources":["../../src/browser/resilient-exporter.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAGH,8CAAqE;AAgBrE;;;;;GAKG;AACH,MAAa,wBAAwB;IAClB,QAAQ,CAAe;IACvB,YAAY,CAAS;IACrB,eAAe,CAAS;IACxB,MAAM,CAGb;IAEF,WAAW,GAAG,CAAC,CAAC;IAChB,YAAY,GAAG,KAAK,CAAC;IAE7B,YAAY,MAAsC;QAChD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,GAAG,CAAC;QAC/C,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;IAC5C,CAAC;IAED;;OAEG;IACH,MAAM,CACJ,KAAqB,EACrB,cAA8C;QAE9C,yBAAyB;QACzB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,cAAc,CAAC,EAAE,IAAI,EAAE,uBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,qBAAqB;QACrB,IAAI,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YACxC,cAAc,CAAC,EAAE,IAAI,EAAE,uBAAgB,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,kBAAkB;QAClB,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,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACrC,cAAc,CAAC,EAAE,IAAI,EAAE,uBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,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,uBAAgB,CAAC,OAAO,EAAE,CAAC;oBAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;gBAC7C,CAAC;gBAED,cAAc,CAAC,EAAE,IAAI,EAAE,uBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,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,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YAC3C,cAAc,CAAC,EAAE,IAAI,EAAE,uBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3D,CAAC;CACF;AAlFD,4DAkFC"}
1
+ {"version":3,"file":"resilient-exporter.js","sourceRoot":"","sources":["../../src/browser/resilient-exporter.ts"],"names":[],"mappings":"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"}
@@ -1,75 +1,87 @@
1
1
  /**
2
- * Tier 2 Traces Contract
2
+ * Tier 2 Traces Contract (v0.2.0)
3
3
  *
4
- * This file defines the Tier 2 telemetry contract:
5
- * - Forbidden attributes (removed by Collector)
6
- * - Hashed attributes (pseudonymized by Collector)
7
- * - Dropped attributes (removed by Collector)
8
- * - Forbidden value patterns (for lint-time detection)
4
+ * Single source of truth for Tier 2 sanitized trace telemetry.
5
+ * Mirrors: engineering/projects/o11y-refactor/contracts/tier2-traces.v0.2.0.json
9
6
  *
10
- * ENFORCEMENT: The OTEL Collector handles runtime enforcement.
11
- * These definitions are used for:
12
- * - ESLint rules (static analysis at CI time)
13
- * - Development warnings (guardrails.ts)
7
+ * Used by:
8
+ * - trace-sanitizer (SDK: which spans/attributes to export)
9
+ * - lint/forbidden-attributes (ESLint)
10
+ * - guardrails (dev-time warnings)
14
11
  * - Collector config generation
15
12
  *
16
- * See: obs/otel-collector/config-tiered.yaml
17
- * Source of truth: engineering/projects/o11y-refactor/contracts/tier2-traces.v0.3.0.json
13
+ * "request handler *" is a local extension for Express instrumentation (not in JSON).
18
14
  */
15
+ import { DeploymentTypeEnum } from "@superblocksteam/shared";
16
+ export interface AttributeDefinition {
17
+ name: string;
18
+ allowedValues?: string[];
19
+ maxCardinality?: number;
20
+ type?: "string" | "number" | "boolean";
21
+ }
22
+ export type AllowedAttribute = string | AttributeDefinition;
23
+ export interface SpanDefinition {
24
+ name: string;
25
+ description?: string;
26
+ allowedAttributes: AllowedAttribute[];
27
+ alwaysSample?: boolean;
28
+ }
29
+ export declare function getAttributeName(attr: AllowedAttribute): string;
19
30
  /**
20
- * Attributes that are FORBIDDEN in Tier 2 telemetry.
21
- * These contain sensitive data that should never leave the customer's environment.
22
- * The Collector strips these entirely (not hashed, not present in Tier 2).
31
+ * Span patterns from tier2-traces.v0.2.0.json.
32
+ * Suffix wildcard only: "HTTP POST *" matches "HTTP POST /api/..." or "POST /api/...".
23
33
  */
24
- export declare const TIER2_FORBIDDEN_ATTRIBUTES: Set<string>;
34
+ export declare const TIER_2_TRACE_CONTRACT: SpanDefinition[];
25
35
  /**
26
- * Attributes that should be HASHED (pseudonymized) in Tier 2 telemetry.
27
- * The Collector replaces these with SHA256 hashes for privacy.
28
- * Hashes enable aggregate analysis without exposing plaintext identifiers.
29
- *
30
- * Mapping:
31
- * user-email, user.email, etc. → user.hash
32
- * organization-id, organization_id → organization.hash
33
- * application-id, application_id → application.hash
34
- * session.id → session.hash
35
- * enduser.id → enduser.pseudo.id
36
+ * Cloud trace contract: match-all span name ("*") so no spans are dropped by name.
37
+ * Attribute allowlist is not used when attributeAllowlistPassthrough is true.
36
38
  */
37
- export declare const TIER2_HASHED_ATTRIBUTES: Set<string>;
39
+ export declare const CLOUD_TRACE_CONTRACT: SpanDefinition[];
38
40
  /**
39
- * Attributes that should be DROPPED entirely in Tier 2.
40
- * These are correlation IDs that don't provide operational value.
41
+ * Returns the trace contract (span definitions) for the given deployment type.
42
+ * Cloud: match-all so no traces are dropped by span name.
43
+ * Cloud-prem: Tier 2 contract (named spans only).
41
44
  */
45
+ export declare function getTraceContract(deploymentType: DeploymentTypeEnum): SpanDefinition[];
46
+ /** Forbidden in Tier 2 (forbiddenAttributes in contract). Collector strips these entirely. */
47
+ export declare const FORBIDDEN_TIER_2_SPAN_ATTRIBUTES: string[];
48
+ /** Hashed (keyed HMAC) for Tier 2 (hashedAttributes in contract). */
49
+ export declare const HASHED_TIER_2_SPAN_ATTRIBUTES: string[];
50
+ /** Dropped — high cardinality, no hash value (droppedAttributes in contract). */
51
+ export declare const DROPPED_HIGH_CARDINALITY_ATTRIBUTES: string[];
52
+ export declare const TIER2_FORBIDDEN_ATTRIBUTES: Set<string>;
53
+ export declare const TIER2_HASHED_ATTRIBUTES: Set<string>;
42
54
  export declare const TIER2_DROPPED_ATTRIBUTES: Set<string>;
43
55
  /**
44
- * Spans that should ALWAYS be sampled (never dropped by rate limiting).
56
+ * Attribute sets and contract options used by TraceSanitizer.
57
+ * Allows different rules per deployment type (e.g. cloud vs cloud-prem).
45
58
  */
46
- export declare const ALWAYS_SAMPLE_SPANS: Set<string>;
59
+ export interface TraceSanitizerAttributeSets {
60
+ forbiddenAttributes: Set<string>;
61
+ droppedAttributes: Set<string>;
62
+ hashedAttributes: Set<string>;
63
+ /** Span definitions for name matching; cloud uses match-all ("*"). */
64
+ spanDefinitions: SpanDefinition[];
65
+ /** When true, span attributes are not filtered by allowedAttributes (pass-through). */
66
+ attributeAllowlistPassthrough: boolean;
67
+ }
47
68
  /**
48
- * Patterns that indicate forbidden content in attribute values.
49
- * Used for secondary filtering when attribute names aren't explicit.
50
- *
51
- * IMPORTANT: Patterns should NOT use ^ and $ anchors so they match
52
- * secrets embedded anywhere in a string (e.g., in query params, headers).
69
+ * Returns the Tier 2 trace attribute sets and contract options for the given deployment type.
70
+ * Cloud: relaxed policy (no attributes dropped/hashed), match-all span names, pass-through attributes.
71
+ * Cloud-prem: full Tier 2 contract (forbidden/dropped/hashed), named spans only, pass-through attributes.
53
72
  */
54
- export declare const FORBIDDEN_VALUE_PATTERNS: RegExp[];
73
+ export declare function getTraceSanitizerAttributeSets(deploymentType: DeploymentTypeEnum): TraceSanitizerAttributeSets;
74
+ /** Spans that should ALWAYS be sampled (samplingPolicy.alwaysSampleSpans in contract). */
75
+ export declare const ALWAYS_SAMPLE_SPANS: Set<string>;
55
76
  /**
56
- * Check if an attribute name is forbidden in Tier 2.
77
+ * Patterns that indicate forbidden content in attribute values (e.g. secrets in strings).
78
+ * No ^/$ anchors so they match secrets embedded anywhere.
79
+ * It's not used by TraceSanitizer, only in guardrails.
57
80
  */
81
+ export declare const FORBIDDEN_VALUE_PATTERNS: RegExp[];
58
82
  export declare function isForbiddenAttribute(name: string): boolean;
59
- /**
60
- * Check if an attribute should be hashed in Tier 2.
61
- */
62
83
  export declare function isHashedAttribute(name: string): boolean;
63
- /**
64
- * Check if an attribute should be dropped in Tier 2.
65
- */
66
84
  export declare function isDroppedAttribute(name: string): boolean;
67
- /**
68
- * Check if a value contains forbidden patterns (like tokens, keys).
69
- */
70
85
  export declare function containsForbiddenPattern(value: unknown): boolean;
71
- /**
72
- * Check if a span should always be sampled.
73
- */
74
86
  export declare function shouldAlwaysSample(spanName: string): boolean;
75
87
  //# sourceMappingURL=tier2-traces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tier2-traces.d.ts","sourceRoot":"","sources":["../../../src/common/contracts/tier2-traces.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,aAsDrC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,aAmBlC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,wBAAwB,aAQnC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB,aAE9B,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,UAuBpC,CAAC;AAEF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGhE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE5D"}
1
+ {"version":3,"file":"tier2-traces.d.ts","sourceRoot":"","sources":["../../../src/common/contracts/tier2-traces.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAM7D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,mBAAmB,CAAC;AAE5D,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAE/D;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAAc,EAkWjD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,cAAc,EAEhD,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,kBAAkB,GACjC,cAAc,EAAE,CAQlB;AAMD,8FAA8F;AAC9F,eAAO,MAAM,gCAAgC,EAAE,MAAM,EAmCpD,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,6BAA6B,EAAE,MAAM,EAAO,CAAC;AAE1D,iFAAiF;AACjF,eAAO,MAAM,mCAAmC,EAAE,MAAM,EAAqB,CAAC;AAM9E,eAAO,MAAM,0BAA0B,aAEtC,CAAC;AACF,eAAO,MAAM,uBAAuB,aAAyC,CAAC;AAC9E,eAAO,MAAM,wBAAwB,aAEpC,CAAC;AASF;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/B,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,sEAAsE;IACtE,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,uFAAuF;IACvF,6BAA6B,EAAE,OAAO,CAAC;CACxC;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAC5C,cAAc,EAAE,kBAAkB,GACjC,2BAA2B,CAsB7B;AAMD,0FAA0F;AAC1F,eAAO,MAAM,mBAAmB,aAA2B,CAAC;AAE5D;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,UAQpC,CAAC;AAMF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGhE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE5D"}