@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.
Files changed (304) hide show
  1. package/dist/browser/console-logging.js +7 -2
  2. package/dist/browser/console-logging.js.map +1 -1
  3. package/dist/browser/early-console-buffer.js +14 -12
  4. package/dist/browser/early-console-buffer.js.map +1 -1
  5. package/dist/browser/index.js +41 -12
  6. package/dist/browser/index.js.map +1 -1
  7. package/dist/browser/init.d.ts +1 -1
  8. package/dist/browser/init.d.ts.map +1 -1
  9. package/dist/browser/init.js +52 -42
  10. package/dist/browser/init.js.map +1 -1
  11. package/dist/browser/instrumentations.js +15 -11
  12. package/dist/browser/instrumentations.js.map +1 -1
  13. package/dist/browser/logs.d.ts +1 -1
  14. package/dist/browser/logs.d.ts.map +1 -1
  15. package/dist/browser/logs.js +18 -11
  16. package/dist/browser/logs.js.map +1 -1
  17. package/dist/browser/metrics.js +12 -9
  18. package/dist/browser/metrics.js.map +1 -1
  19. package/dist/browser/resilient-exporter.d.ts +1 -1
  20. package/dist/browser/resilient-exporter.d.ts.map +1 -1
  21. package/dist/browser/resilient-exporter.js +12 -8
  22. package/dist/browser/resilient-exporter.js.map +1 -1
  23. package/dist/browser/sanitizer.js +6 -2
  24. package/dist/browser/sanitizer.js.map +1 -1
  25. package/dist/browser/traced-socket.js +18 -14
  26. package/dist/browser/traced-socket.js.map +1 -1
  27. package/dist/common/contracts/tier2-traces.js +44 -33
  28. package/dist/common/contracts/tier2-traces.js.map +1 -1
  29. package/dist/common/deployment-type.js +8 -5
  30. package/dist/common/deployment-type.js.map +1 -1
  31. package/dist/common/guardrails.js +38 -26
  32. package/dist/common/guardrails.js.map +1 -1
  33. package/dist/common/index.js +24 -8
  34. package/dist/common/index.js.map +1 -1
  35. package/dist/common/log-sanitizer.js +55 -37
  36. package/dist/common/log-sanitizer.js.map +1 -1
  37. package/dist/common/policy-evaluator.d.ts +1 -1
  38. package/dist/common/policy-evaluator.d.ts.map +1 -1
  39. package/dist/common/policy-evaluator.js +9 -5
  40. package/dist/common/policy-evaluator.js.map +1 -1
  41. package/dist/common/resource.js +25 -18
  42. package/dist/common/resource.js.map +1 -1
  43. package/dist/common/tier-hints.js +22 -12
  44. package/dist/common/tier-hints.js.map +1 -1
  45. package/dist/common/trace-sanitizer.js +10 -6
  46. package/dist/common/trace-sanitizer.js.map +1 -1
  47. package/dist/common/traced-socket-types.js +2 -1
  48. package/dist/common/traced-socket-types.js.map +1 -1
  49. package/dist/index.js +38 -6
  50. package/dist/index.js.map +1 -1
  51. package/dist/lint/forbidden-attributes.js +24 -19
  52. package/dist/lint/forbidden-attributes.js.map +1 -1
  53. package/dist/lint/index.js +8 -1
  54. package/dist/lint/index.js.map +1 -1
  55. package/dist/llmobs/index.js +9 -2
  56. package/dist/llmobs/index.js.map +1 -1
  57. package/dist/llmobs/tier1-exporter.js +12 -6
  58. package/dist/llmobs/tier1-exporter.js.map +1 -1
  59. package/dist/llmobs/tier2-summarizer.js +5 -1
  60. package/dist/llmobs/tier2-summarizer.js.map +1 -1
  61. package/dist/node/dynamic-attribute-processor.js +7 -2
  62. package/dist/node/dynamic-attribute-processor.js.map +1 -1
  63. package/dist/node/exporters/resilient-exporter.d.ts +1 -1
  64. package/dist/node/exporters/resilient-exporter.d.ts.map +1 -1
  65. package/dist/node/exporters/resilient-exporter.js +12 -8
  66. package/dist/node/exporters/resilient-exporter.js.map +1 -1
  67. package/dist/node/index.js +26 -7
  68. package/dist/node/index.js.map +1 -1
  69. package/dist/node/init.d.ts +3 -3
  70. package/dist/node/init.d.ts.map +1 -1
  71. package/dist/node/init.js +72 -66
  72. package/dist/node/init.js.map +1 -1
  73. package/dist/node/local-obs-mode.js +4 -1
  74. package/dist/node/local-obs-mode.js.map +1 -1
  75. package/dist/node/log-processor.d.ts +1 -1
  76. package/dist/node/log-processor.d.ts.map +1 -1
  77. package/dist/node/log-processor.js +55 -47
  78. package/dist/node/log-processor.js.map +1 -1
  79. package/dist/node/metrics-client.js +5 -1
  80. package/dist/node/metrics-client.js.map +1 -1
  81. package/dist/node/safe-logger.js +12 -8
  82. package/dist/node/safe-logger.js.map +1 -1
  83. package/dist/node/sanitizing-processor.d.ts +2 -2
  84. package/dist/node/sanitizing-processor.d.ts.map +1 -1
  85. package/dist/node/sanitizing-processor.js +10 -6
  86. package/dist/node/sanitizing-processor.js.map +1 -1
  87. package/dist/node/service-tracers.js +10 -7
  88. package/dist/node/service-tracers.js.map +1 -1
  89. package/dist/node/traced-socket.d.ts +3 -3
  90. package/dist/node/traced-socket.d.ts.map +1 -1
  91. package/dist/node/traced-socket.js +52 -48
  92. package/dist/node/traced-socket.js.map +1 -1
  93. package/dist/npm-registry/emitter.js +47 -34
  94. package/dist/npm-registry/emitter.js.map +1 -1
  95. package/dist/npm-registry/index.js +19 -3
  96. package/dist/npm-registry/index.js.map +1 -1
  97. package/dist/npm-registry/sanitize.js +27 -16
  98. package/dist/npm-registry/sanitize.js.map +1 -1
  99. package/dist/npm-registry/spans.js +12 -7
  100. package/dist/npm-registry/spans.js.map +1 -1
  101. package/dist/testing/in-memory-exporter.d.ts +1 -1
  102. package/dist/testing/in-memory-exporter.d.ts.map +1 -1
  103. package/dist/testing/in-memory-exporter.js +12 -6
  104. package/dist/testing/in-memory-exporter.js.map +1 -1
  105. package/dist/testing/index.js +15 -3
  106. package/dist/testing/index.js.map +1 -1
  107. package/dist/testing/metrics-capture.js +15 -12
  108. package/dist/testing/metrics-capture.js.map +1 -1
  109. package/dist/testing/test-init.js +31 -24
  110. package/dist/testing/test-init.js.map +1 -1
  111. package/dist/types/index.js +17 -1
  112. package/dist/types/index.js.map +1 -1
  113. package/dist/types/policy.js +24 -21
  114. package/dist/types/policy.js.map +1 -1
  115. package/dist-esm/browser/console-logging.d.ts +18 -0
  116. package/dist-esm/browser/console-logging.d.ts.map +1 -0
  117. package/dist-esm/browser/console-logging.js +27 -0
  118. package/dist-esm/browser/console-logging.js.map +1 -0
  119. package/dist-esm/browser/early-console-buffer.d.ts +49 -0
  120. package/dist-esm/browser/early-console-buffer.d.ts.map +1 -0
  121. package/dist-esm/browser/early-console-buffer.js +181 -0
  122. package/dist-esm/browser/early-console-buffer.js.map +1 -0
  123. package/dist-esm/browser/index.d.ts +18 -0
  124. package/dist-esm/browser/index.d.ts.map +1 -0
  125. package/dist-esm/browser/index.js +23 -0
  126. package/dist-esm/browser/index.js.map +1 -0
  127. package/dist-esm/browser/init.d.ts +100 -0
  128. package/dist-esm/browser/init.d.ts.map +1 -0
  129. package/dist-esm/browser/init.js +317 -0
  130. package/dist-esm/browser/init.js.map +1 -0
  131. package/dist-esm/browser/instrumentations.d.ts +67 -0
  132. package/dist-esm/browser/instrumentations.d.ts.map +1 -0
  133. package/dist-esm/browser/instrumentations.js +79 -0
  134. package/dist-esm/browser/instrumentations.js.map +1 -0
  135. package/dist-esm/browser/logs.d.ts +57 -0
  136. package/dist-esm/browser/logs.d.ts.map +1 -0
  137. package/dist-esm/browser/logs.js +80 -0
  138. package/dist-esm/browser/logs.js.map +1 -0
  139. package/dist-esm/browser/metrics.d.ts +29 -0
  140. package/dist-esm/browser/metrics.d.ts.map +1 -0
  141. package/dist-esm/browser/metrics.js +46 -0
  142. package/dist-esm/browser/metrics.js.map +1 -0
  143. package/dist-esm/browser/resilient-exporter.d.ts +43 -0
  144. package/dist-esm/browser/resilient-exporter.d.ts.map +1 -0
  145. package/dist-esm/browser/resilient-exporter.js +84 -0
  146. package/dist-esm/browser/resilient-exporter.js.map +1 -0
  147. package/dist-esm/browser/sanitizer.d.ts +35 -0
  148. package/dist-esm/browser/sanitizer.d.ts.map +1 -0
  149. package/dist-esm/browser/sanitizer.js +207 -0
  150. package/dist-esm/browser/sanitizer.js.map +1 -0
  151. package/dist-esm/browser/traced-socket.d.ts +102 -0
  152. package/dist-esm/browser/traced-socket.d.ts.map +1 -0
  153. package/dist-esm/browser/traced-socket.js +199 -0
  154. package/dist-esm/browser/traced-socket.js.map +1 -0
  155. package/dist-esm/common/contracts/tier2-traces.d.ts +116 -0
  156. package/dist-esm/common/contracts/tier2-traces.d.ts.map +1 -0
  157. package/dist-esm/common/contracts/tier2-traces.js +725 -0
  158. package/dist-esm/common/contracts/tier2-traces.js.map +1 -0
  159. package/dist-esm/common/deployment-type.d.ts +18 -0
  160. package/dist-esm/common/deployment-type.d.ts.map +1 -0
  161. package/dist-esm/common/deployment-type.js +27 -0
  162. package/dist-esm/common/deployment-type.js.map +1 -0
  163. package/dist-esm/common/guardrails.d.ts +132 -0
  164. package/dist-esm/common/guardrails.d.ts.map +1 -0
  165. package/dist-esm/common/guardrails.js +230 -0
  166. package/dist-esm/common/guardrails.js.map +1 -0
  167. package/dist-esm/common/index.d.ts +17 -0
  168. package/dist-esm/common/index.d.ts.map +1 -0
  169. package/dist-esm/common/index.js +17 -0
  170. package/dist-esm/common/index.js.map +1 -0
  171. package/dist-esm/common/log-sanitizer.d.ts +163 -0
  172. package/dist-esm/common/log-sanitizer.d.ts.map +1 -0
  173. package/dist-esm/common/log-sanitizer.js +745 -0
  174. package/dist-esm/common/log-sanitizer.js.map +1 -0
  175. package/dist-esm/common/policy-evaluator.d.ts +103 -0
  176. package/dist-esm/common/policy-evaluator.d.ts.map +1 -0
  177. package/dist-esm/common/policy-evaluator.js +196 -0
  178. package/dist-esm/common/policy-evaluator.js.map +1 -0
  179. package/dist-esm/common/resource.d.ts +79 -0
  180. package/dist-esm/common/resource.d.ts.map +1 -0
  181. package/dist-esm/common/resource.js +121 -0
  182. package/dist-esm/common/resource.js.map +1 -0
  183. package/dist-esm/common/tier-hints.d.ts +182 -0
  184. package/dist-esm/common/tier-hints.d.ts.map +1 -0
  185. package/dist-esm/common/tier-hints.js +199 -0
  186. package/dist-esm/common/tier-hints.js.map +1 -0
  187. package/dist-esm/common/trace-sanitizer.d.ts +82 -0
  188. package/dist-esm/common/trace-sanitizer.d.ts.map +1 -0
  189. package/dist-esm/common/trace-sanitizer.js +230 -0
  190. package/dist-esm/common/trace-sanitizer.js.map +1 -0
  191. package/dist-esm/common/traced-socket-types.d.ts +43 -0
  192. package/dist-esm/common/traced-socket-types.d.ts.map +1 -0
  193. package/dist-esm/common/traced-socket-types.js +16 -0
  194. package/dist-esm/common/traced-socket-types.js.map +1 -0
  195. package/dist-esm/index.d.ts +45 -0
  196. package/dist-esm/index.d.ts.map +1 -0
  197. package/dist-esm/index.js +56 -0
  198. package/dist-esm/index.js.map +1 -0
  199. package/dist-esm/lint/forbidden-attributes.d.ts +149 -0
  200. package/dist-esm/lint/forbidden-attributes.d.ts.map +1 -0
  201. package/dist-esm/lint/forbidden-attributes.js +210 -0
  202. package/dist-esm/lint/forbidden-attributes.js.map +1 -0
  203. package/dist-esm/lint/index.d.ts +9 -0
  204. package/dist-esm/lint/index.d.ts.map +1 -0
  205. package/dist-esm/lint/index.js +9 -0
  206. package/dist-esm/lint/index.js.map +1 -0
  207. package/dist-esm/llmobs/index.d.ts +22 -0
  208. package/dist-esm/llmobs/index.d.ts.map +1 -0
  209. package/dist-esm/llmobs/index.js +22 -0
  210. package/dist-esm/llmobs/index.js.map +1 -0
  211. package/dist-esm/llmobs/tier1-exporter.d.ts +146 -0
  212. package/dist-esm/llmobs/tier1-exporter.d.ts.map +1 -0
  213. package/dist-esm/llmobs/tier1-exporter.js +193 -0
  214. package/dist-esm/llmobs/tier1-exporter.js.map +1 -0
  215. package/dist-esm/llmobs/tier2-summarizer.d.ts +268 -0
  216. package/dist-esm/llmobs/tier2-summarizer.d.ts.map +1 -0
  217. package/dist-esm/llmobs/tier2-summarizer.js +652 -0
  218. package/dist-esm/llmobs/tier2-summarizer.js.map +1 -0
  219. package/dist-esm/node/dynamic-attribute-processor.d.ts +43 -0
  220. package/dist-esm/node/dynamic-attribute-processor.d.ts.map +1 -0
  221. package/dist-esm/node/dynamic-attribute-processor.js +74 -0
  222. package/dist-esm/node/dynamic-attribute-processor.js.map +1 -0
  223. package/dist-esm/node/exporters/resilient-exporter.d.ts +91 -0
  224. package/dist-esm/node/exporters/resilient-exporter.d.ts.map +1 -0
  225. package/dist-esm/node/exporters/resilient-exporter.js +132 -0
  226. package/dist-esm/node/exporters/resilient-exporter.js.map +1 -0
  227. package/dist-esm/node/index.d.ts +13 -0
  228. package/dist-esm/node/index.d.ts.map +1 -0
  229. package/dist-esm/node/index.js +13 -0
  230. package/dist-esm/node/index.js.map +1 -0
  231. package/dist-esm/node/init.d.ts +97 -0
  232. package/dist-esm/node/init.d.ts.map +1 -0
  233. package/dist-esm/node/init.js +359 -0
  234. package/dist-esm/node/init.js.map +1 -0
  235. package/dist-esm/node/local-obs-mode.d.ts +17 -0
  236. package/dist-esm/node/local-obs-mode.d.ts.map +1 -0
  237. package/dist-esm/node/local-obs-mode.js +19 -0
  238. package/dist-esm/node/local-obs-mode.js.map +1 -0
  239. package/dist-esm/node/log-processor.d.ts +132 -0
  240. package/dist-esm/node/log-processor.d.ts.map +1 -0
  241. package/dist-esm/node/log-processor.js +389 -0
  242. package/dist-esm/node/log-processor.js.map +1 -0
  243. package/dist-esm/node/metrics-client.d.ts +88 -0
  244. package/dist-esm/node/metrics-client.d.ts.map +1 -0
  245. package/dist-esm/node/metrics-client.js +205 -0
  246. package/dist-esm/node/metrics-client.js.map +1 -0
  247. package/dist-esm/node/safe-logger.d.ts +55 -0
  248. package/dist-esm/node/safe-logger.d.ts.map +1 -0
  249. package/dist-esm/node/safe-logger.js +154 -0
  250. package/dist-esm/node/safe-logger.js.map +1 -0
  251. package/dist-esm/node/sanitizing-processor.d.ts +67 -0
  252. package/dist-esm/node/sanitizing-processor.d.ts.map +1 -0
  253. package/dist-esm/node/sanitizing-processor.js +163 -0
  254. package/dist-esm/node/sanitizing-processor.js.map +1 -0
  255. package/dist-esm/node/service-tracers.d.ts +52 -0
  256. package/dist-esm/node/service-tracers.d.ts.map +1 -0
  257. package/dist-esm/node/service-tracers.js +78 -0
  258. package/dist-esm/node/service-tracers.js.map +1 -0
  259. package/dist-esm/node/traced-socket.d.ts +120 -0
  260. package/dist-esm/node/traced-socket.d.ts.map +1 -0
  261. package/dist-esm/node/traced-socket.js +334 -0
  262. package/dist-esm/node/traced-socket.js.map +1 -0
  263. package/dist-esm/npm-registry/emitter.d.ts +330 -0
  264. package/dist-esm/npm-registry/emitter.d.ts.map +1 -0
  265. package/dist-esm/npm-registry/emitter.js +546 -0
  266. package/dist-esm/npm-registry/emitter.js.map +1 -0
  267. package/dist-esm/npm-registry/index.d.ts +12 -0
  268. package/dist-esm/npm-registry/index.d.ts.map +1 -0
  269. package/dist-esm/npm-registry/index.js +12 -0
  270. package/dist-esm/npm-registry/index.js.map +1 -0
  271. package/dist-esm/npm-registry/sanitize.d.ts +174 -0
  272. package/dist-esm/npm-registry/sanitize.d.ts.map +1 -0
  273. package/dist-esm/npm-registry/sanitize.js +331 -0
  274. package/dist-esm/npm-registry/sanitize.js.map +1 -0
  275. package/dist-esm/npm-registry/spans.d.ts +61 -0
  276. package/dist-esm/npm-registry/spans.d.ts.map +1 -0
  277. package/dist-esm/npm-registry/spans.js +86 -0
  278. package/dist-esm/npm-registry/spans.js.map +1 -0
  279. package/dist-esm/package.json +1 -0
  280. package/dist-esm/testing/in-memory-exporter.d.ts +179 -0
  281. package/dist-esm/testing/in-memory-exporter.d.ts.map +1 -0
  282. package/dist-esm/testing/in-memory-exporter.js +250 -0
  283. package/dist-esm/testing/in-memory-exporter.js.map +1 -0
  284. package/dist-esm/testing/index.d.ts +9 -0
  285. package/dist-esm/testing/index.d.ts.map +1 -0
  286. package/dist-esm/testing/index.js +9 -0
  287. package/dist-esm/testing/index.js.map +1 -0
  288. package/dist-esm/testing/metrics-capture.d.ts +29 -0
  289. package/dist-esm/testing/metrics-capture.d.ts.map +1 -0
  290. package/dist-esm/testing/metrics-capture.js +71 -0
  291. package/dist-esm/testing/metrics-capture.js.map +1 -0
  292. package/dist-esm/testing/test-init.d.ts +80 -0
  293. package/dist-esm/testing/test-init.d.ts.map +1 -0
  294. package/dist-esm/testing/test-init.js +137 -0
  295. package/dist-esm/testing/test-init.js.map +1 -0
  296. package/dist-esm/types/index.d.ts +84 -0
  297. package/dist-esm/types/index.d.ts.map +1 -0
  298. package/dist-esm/types/index.js +7 -0
  299. package/dist-esm/types/index.js.map +1 -0
  300. package/dist-esm/types/policy.d.ts +92 -0
  301. package/dist-esm/types/policy.d.ts.map +1 -0
  302. package/dist-esm/types/policy.js +122 -0
  303. package/dist-esm/types/policy.js.map +1 -0
  304. package/package.json +17 -11
@@ -0,0 +1,389 @@
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 { DeploymentTypeEnum } from "@superblocksteam/shared";
12
+ import { applyRedactPatterns, CLOUD_PREM_REDACT_PATTERNS, containsStackTrace, DEFAULT_SECRET_PATTERNS, DEFAULT_SENSITIVE_PATTERNS, EXPORT_FORBIDDEN_FIELDS_CLOUD_PREM, isSecretFieldFromPolicy, isStackAttributeKey, redactSensitivePatterns, redactStackTraceForExport, REDACTED_PLACEHOLDER, sanitizeLogObjectForExport, SECRET_FIELD_PATTERNS, SECRET_FIELDS, STACK_TRACE_REDACTED_PLACEHOLDER, TIER1_FORBIDDEN_LOG_FIELDS, } from "../common/log-sanitizer.js";
13
+ import { TelemetryPolicyEvaluator } from "../common/policy-evaluator.js";
14
+ import { TelemetryTier } from "../types/policy.js";
15
+ import { isLocalObsMode } from "./local-obs-mode.js";
16
+ // ============================================================================
17
+ // Log Export Mode
18
+ // ============================================================================
19
+ /**
20
+ * Controls what logs are exported via OTEL.
21
+ */
22
+ export var LogExportMode;
23
+ (function (LogExportMode) {
24
+ /** No log export - local stdout/stderr only */
25
+ LogExportMode["LOCAL_ONLY"] = "local_only";
26
+ /** Export WARN/ERROR/FATAL only (default for cloud-prem) */
27
+ LogExportMode["ERRORS_ONLY"] = "errors_only";
28
+ /** Export INFO and above (not recommended for cloud-prem) */
29
+ LogExportMode["INFO_AND_ABOVE"] = "info_and_above";
30
+ })(LogExportMode || (LogExportMode = {}));
31
+ /**
32
+ * Parse a string value into a LogExportMode, returning undefined if unrecognized.
33
+ * Used to validate SUPERBLOCKS_LOG_EXPORT_MODE env var values.
34
+ */
35
+ export function parseLogExportMode(value) {
36
+ if (!value)
37
+ return undefined;
38
+ const normalized = value.toLowerCase();
39
+ if (normalized === LogExportMode.INFO_AND_ABOVE)
40
+ return LogExportMode.INFO_AND_ABOVE;
41
+ if (normalized === LogExportMode.ERRORS_ONLY)
42
+ return LogExportMode.ERRORS_ONLY;
43
+ if (normalized === LogExportMode.LOCAL_ONLY)
44
+ return LogExportMode.LOCAL_ONLY;
45
+ return undefined;
46
+ }
47
+ /**
48
+ * Get logging policy based on telemetry policy.
49
+ *
50
+ * @param policy - Telemetry policy
51
+ * @param exportModeOverride - Optional override for the export mode. When set, overrides the
52
+ * deployment-type default (e.g. allows INFO_AND_ABOVE on a cloud-prem trial environment).
53
+ * Cloud-prem sanitization (redaction, forbidden fields) is still applied regardless of override.
54
+ * @returns Logging policy configuration
55
+ */
56
+ export function getLoggingPolicy(policy, exportModeOverride) {
57
+ const evaluator = new TelemetryPolicyEvaluator(policy);
58
+ // Check if Tier 2 export is allowed.
59
+ // ORDERING IS SECURITY-CRITICAL: this gate MUST come before the cloud-prem branch.
60
+ // exportModeOverride must never escalate a LOCAL_ONLY (Tier 2 disabled) deployment to
61
+ // INFO_AND_ABOVE. Do not move the cloud-prem branch above this check.
62
+ const canExportTier2 = evaluator.isExportEnabled(TelemetryTier.TIER_2_OPERATIONAL);
63
+ if (!canExportTier2) {
64
+ return {
65
+ exportMode: LogExportMode.LOCAL_ONLY,
66
+ localMaxLevel: "debug",
67
+ messageSecretPatterns: DEFAULT_SECRET_PATTERNS,
68
+ secretFieldNames: SECRET_FIELDS,
69
+ secretFieldPatterns: SECRET_FIELD_PATTERNS,
70
+ redactStackTraces: true,
71
+ redactPatterns: [],
72
+ sensitivePatterns: DEFAULT_SENSITIVE_PATTERNS,
73
+ forbiddenFields: TIER1_FORBIDDEN_LOG_FIELDS,
74
+ };
75
+ }
76
+ // Cloud-prem: export errors only by default, with full sanitization (secrets + sensitive patterns).
77
+ // exportModeOverride allows specific deployments (e.g. trial environments) to opt into INFO_AND_ABOVE
78
+ // for debugging. Sanitization is always applied on cloud-prem regardless of the override.
79
+ if (policy.deploymentType === DeploymentTypeEnum.CLOUD_PREM) {
80
+ return {
81
+ exportMode: exportModeOverride ?? LogExportMode.ERRORS_ONLY,
82
+ localMaxLevel: "debug",
83
+ messageSecretPatterns: DEFAULT_SECRET_PATTERNS,
84
+ secretFieldNames: SECRET_FIELDS,
85
+ secretFieldPatterns: SECRET_FIELD_PATTERNS,
86
+ redactStackTraces: true,
87
+ redactPatterns: CLOUD_PREM_REDACT_PATTERNS,
88
+ sensitivePatterns: DEFAULT_SENSITIVE_PATTERNS,
89
+ forbiddenFields: new Set([
90
+ ...TIER1_FORBIDDEN_LOG_FIELDS,
91
+ ...EXPORT_FORBIDDEN_FIELDS_CLOUD_PREM,
92
+ ]),
93
+ };
94
+ }
95
+ // Cloud: all sanitization off (logs sent as-is)
96
+ return {
97
+ exportMode: LogExportMode.INFO_AND_ABOVE,
98
+ localMaxLevel: "debug",
99
+ messageSecretPatterns: [],
100
+ secretFieldNames: new Set(),
101
+ secretFieldPatterns: [],
102
+ redactStackTraces: false,
103
+ redactPatterns: [],
104
+ sensitivePatterns: [],
105
+ forbiddenFields: new Set(),
106
+ };
107
+ }
108
+ /**
109
+ * Pino levels below WARN; when exportMode is ERRORS_ONLY we never write these to stdout.
110
+ */
111
+ const LEVELS_BELOW_WARN = new Set(["trace", "debug", "info"]);
112
+ /**
113
+ * Ordered from most verbose (index 0) to least verbose (index 5).
114
+ * Used to compare levels: "more restrictive" = higher index = fewer logs retained.
115
+ */
116
+ const PINO_LEVEL_ORDER = ["trace", "debug", "info", "warn", "error", "fatal"];
117
+ function levelOrderIndex(level) {
118
+ const normalized = level.toLowerCase();
119
+ const idx = PINO_LEVEL_ORDER.indexOf(normalized);
120
+ return idx >= 0 ? idx : PINO_LEVEL_ORDER.indexOf("info");
121
+ }
122
+ /**
123
+ * Returns the more restrictive of two levels (the one that retains fewer logs).
124
+ * E.g. moreRestrictiveLevel("trace", "debug") === "debug".
125
+ */
126
+ function moreRestrictiveLevel(a, b) {
127
+ const idxA = levelOrderIndex(a);
128
+ const idxB = levelOrderIndex(b);
129
+ return PINO_LEVEL_ORDER[Math.max(idxA, idxB)] ?? "info";
130
+ }
131
+ /**
132
+ * Returns the effective Pino log level from the current logging policy and env level.
133
+ * 1. Applies exportMode: when ERRORS_ONLY, never below warn so export paths never see INFO/DEBUG.
134
+ * 2. Applies localMaxLevel: caps local retention so we never set the logger more verbose than
135
+ * policy.localMaxLevel (e.g. localMaxLevel "debug" prevents trace from being written locally).
136
+ *
137
+ * Use when policy is available (e.g. after initNodeTelemetry) to sync logger level from policy.
138
+ *
139
+ * @param loggingPolicy - Logging policy (e.g. from getLoggingPolicy(telemetryPolicy))
140
+ * @param envLevel - Level from env (e.g. SUPERBLOCKS_SERVER_LOG_LEVEL)
141
+ * @returns Level to pass to Pino
142
+ */
143
+ export function getMinimumPinoLevelFromLoggingPolicy(loggingPolicy, envLevel) {
144
+ let level;
145
+ const envLevelNormalized = envLevel.toLowerCase();
146
+ // Under local-obs the OTLP log processor exports INFO+ (see the override in
147
+ // init.ts), so the Pino floor must also allow INFO. Without this, a cloud-prem
148
+ // deployment type keeps the ERRORS_ONLY 'warn' floor and INFO lines are dropped
149
+ // by Pino before they can reach the pino->OTel tee. See isLocalObsMode.
150
+ if (loggingPolicy.exportMode === LogExportMode.ERRORS_ONLY &&
151
+ !isLocalObsMode() &&
152
+ LEVELS_BELOW_WARN.has(envLevelNormalized)) {
153
+ level = "warn";
154
+ }
155
+ else {
156
+ level = envLevel;
157
+ }
158
+ return moreRestrictiveLevel(level, loggingPolicy.localMaxLevel);
159
+ }
160
+ /**
161
+ * Returns the effective Pino log level for a deployment given the env-configured level.
162
+ * Used at logger bootstrap when policy is not yet initialized (e.g. server logger module load).
163
+ * Delegates to getMinimumPinoLevelFromLoggingPolicy with a synthetic policy from deployment type
164
+ * so the exportMode → level rule lives in one place.
165
+ *
166
+ * @param envLevel - Level from env (e.g. SUPERBLOCKS_SERVER_LOG_LEVEL)
167
+ * @param deploymentType - Deployment type from env (e.g. SUPERBLOCKS_DEPLOYMENT_TYPE)
168
+ * @param exportModeOverride - Optional override from env (e.g. SUPERBLOCKS_LOG_EXPORT_MODE).
169
+ * When set to a valid LogExportMode, overrides the deployment-type default.
170
+ * NOTE: This function runs at bootstrap before the policy evaluator is initialized,
171
+ * so it cannot verify the Tier 2 export gate. The override only lowers the Pino
172
+ * stdout level; actual telemetry export is gated by getLoggingPolicy() after init,
173
+ * which always enforces !canExportTier2 before applying the override.
174
+ * @returns Level to pass to Pino (envLevel or 'warn' for cloud-prem when envLevel is below warn)
175
+ */
176
+ export function getMinimumPinoLevelForDeployment(envLevel, deploymentType, exportModeOverride) {
177
+ const isCloudPrem = deploymentType === DeploymentTypeEnum.CLOUD_PREM;
178
+ const deploymentDefault = isCloudPrem
179
+ ? LogExportMode.ERRORS_ONLY
180
+ : LogExportMode.INFO_AND_ABOVE;
181
+ // Only apply the override for cloud-prem; cloud always uses INFO_AND_ABOVE (mirrors getLoggingPolicy).
182
+ const exportMode = (isCloudPrem ? exportModeOverride : undefined) ?? deploymentDefault;
183
+ return getMinimumPinoLevelFromLoggingPolicy({
184
+ exportMode,
185
+ localMaxLevel: "debug",
186
+ messageSecretPatterns: [],
187
+ secretFieldNames: new Set(),
188
+ secretFieldPatterns: [],
189
+ redactStackTraces: false,
190
+ redactPatterns: [],
191
+ sensitivePatterns: [],
192
+ forbiddenFields: new Set(),
193
+ }, envLevel);
194
+ }
195
+ // ============================================================================
196
+ // Severity Level Utilities
197
+ // ============================================================================
198
+ /**
199
+ * OTEL severity numbers:
200
+ * 1-4: TRACE
201
+ * 5-8: DEBUG
202
+ * 9-12: INFO
203
+ * 13-16: WARN
204
+ * 17-20: ERROR
205
+ * 21-24: FATAL
206
+ */
207
+ function getSeverityName(severityNumber) {
208
+ if (!severityNumber)
209
+ return "info";
210
+ if (severityNumber <= 4)
211
+ return "trace";
212
+ if (severityNumber <= 8)
213
+ return "debug";
214
+ if (severityNumber <= 12)
215
+ return "info";
216
+ if (severityNumber <= 16)
217
+ return "warn";
218
+ if (severityNumber <= 20)
219
+ return "error";
220
+ return "fatal";
221
+ }
222
+ /**
223
+ * Check if a severity level should be exported based on export mode.
224
+ */
225
+ function shouldExportSeverity(severityNumber, mode) {
226
+ if (mode === LogExportMode.LOCAL_ONLY) {
227
+ return false;
228
+ }
229
+ const severity = getSeverityName(severityNumber);
230
+ if (mode === LogExportMode.ERRORS_ONLY) {
231
+ return severity === "warn" || severity === "error" || severity === "fatal";
232
+ }
233
+ // INFO_AND_ABOVE
234
+ return (severity === "info" ||
235
+ severity === "warn" ||
236
+ severity === "error" ||
237
+ severity === "fatal");
238
+ }
239
+ // ============================================================================
240
+ // Policy-Aware Log Processor
241
+ // ============================================================================
242
+ /**
243
+ * Log processor that filters and sanitizes logs based on policy.
244
+ *
245
+ * This processor:
246
+ * 1. Blocks all logs if exportMode is LOCAL_ONLY
247
+ * 2. Filters by severity level based on exportMode
248
+ * 3. Sanitizes log body and attributes before forwarding
249
+ */
250
+ export class PolicyAwareLogProcessor {
251
+ policy;
252
+ delegate;
253
+ constructor(policy, delegate) {
254
+ this.policy = policy;
255
+ this.delegate = delegate;
256
+ }
257
+ /**
258
+ * Called when a log record is emitted.
259
+ */
260
+ onEmit(logRecord, context) {
261
+ // Check if export mode allows this log
262
+ if (this.policy.exportMode === LogExportMode.LOCAL_ONLY) {
263
+ return; // Don't export anything
264
+ }
265
+ // Check if severity level should be exported
266
+ if (!shouldExportSeverity(logRecord.severityNumber, this.policy.exportMode)) {
267
+ return;
268
+ }
269
+ // Sanitize the log record in place before forwarding (policy-driven; empty config = passthrough)
270
+ this.sanitizeLogRecord(logRecord);
271
+ // Forward to delegate - cast is safe because logRecord is SdkLogRecord at runtime
272
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
273
+ this.delegate.onEmit(logRecord, context);
274
+ }
275
+ /** True when policy has no sanitization (cloud passthrough). */
276
+ isPassthroughPolicy() {
277
+ const p = this.policy;
278
+ return (p.messageSecretPatterns.length === 0 &&
279
+ p.secretFieldNames.size === 0 &&
280
+ p.secretFieldPatterns.length === 0 &&
281
+ !p.redactStackTraces &&
282
+ p.forbiddenFields.size === 0 &&
283
+ p.sensitivePatterns.length === 0 &&
284
+ p.redactPatterns.length === 0);
285
+ }
286
+ /**
287
+ * Sanitize a log record for export.
288
+ * Mutates the log record in place to preserve OTEL SDK internal state.
289
+ * All redaction is policy-driven; when config is empty/off, content is left as-is.
290
+ */
291
+ sanitizeLogRecord(logRecord) {
292
+ const p = this.policy;
293
+ // Sanitize body - mutate in place
294
+ if (typeof logRecord.body === "string") {
295
+ let body = p.messageSecretPatterns.length > 0
296
+ ? redactSensitivePatterns(logRecord.body, p.messageSecretPatterns)
297
+ : logRecord.body;
298
+ body = redactSensitivePatterns(body, p.sensitivePatterns);
299
+ body = applyRedactPatterns(body, p.redactPatterns);
300
+ if (p.redactStackTraces && containsStackTrace(body)) {
301
+ body = redactStackTraceForExport(body, p.sensitivePatterns, p.messageSecretPatterns);
302
+ }
303
+ logRecord.body = body;
304
+ }
305
+ else if (logRecord.body && typeof logRecord.body === "object") {
306
+ if (!this.isPassthroughPolicy()) {
307
+ logRecord.body =
308
+ sanitizeLogObjectForExport(logRecord.body, p.forbiddenFields, 0, p.sensitivePatterns);
309
+ }
310
+ }
311
+ // Sanitize attributes - mutate in place
312
+ const attrs = logRecord.attributes;
313
+ if (attrs) {
314
+ const sanitizedAttributes = this.sanitizeAttributes(attrs);
315
+ // Clear and repopulate attributes
316
+ for (const key of Object.keys(attrs)) {
317
+ delete attrs[key];
318
+ }
319
+ for (const [key, value] of Object.entries(sanitizedAttributes)) {
320
+ attrs[key] = value;
321
+ }
322
+ }
323
+ }
324
+ /**
325
+ * Sanitize log attributes.
326
+ */
327
+ sanitizeAttributes(attributes) {
328
+ if (!attributes) {
329
+ return {};
330
+ }
331
+ const p = this.policy;
332
+ const sanitized = {};
333
+ for (const [key, value] of Object.entries(attributes)) {
334
+ const lowerKey = key.toLowerCase();
335
+ if (isSecretFieldFromPolicy(key, p.secretFieldNames, p.secretFieldPatterns)) {
336
+ sanitized[key] = REDACTED_PLACEHOLDER;
337
+ continue;
338
+ }
339
+ if (p.forbiddenFields.has(lowerKey)) {
340
+ continue;
341
+ }
342
+ if (typeof value === "string") {
343
+ let str = p.messageSecretPatterns.length > 0
344
+ ? redactSensitivePatterns(value, p.messageSecretPatterns)
345
+ : value;
346
+ str = redactSensitivePatterns(str, p.sensitivePatterns);
347
+ str = applyRedactPatterns(str, p.redactPatterns);
348
+ if (p.redactStackTraces) {
349
+ if (isStackAttributeKey(key)) {
350
+ sanitized[key] = containsStackTrace(str)
351
+ ? redactStackTraceForExport(str, p.sensitivePatterns, p.messageSecretPatterns)
352
+ : STACK_TRACE_REDACTED_PLACEHOLDER;
353
+ }
354
+ else if (containsStackTrace(str)) {
355
+ sanitized[key] = redactStackTraceForExport(str, p.sensitivePatterns, p.messageSecretPatterns);
356
+ }
357
+ else {
358
+ sanitized[key] = str;
359
+ }
360
+ }
361
+ else {
362
+ sanitized[key] = str;
363
+ }
364
+ }
365
+ else if (value &&
366
+ typeof value === "object" &&
367
+ !this.isPassthroughPolicy()) {
368
+ sanitized[key] = sanitizeLogObjectForExport(value, p.forbiddenFields, 0, p.sensitivePatterns);
369
+ }
370
+ else {
371
+ sanitized[key] = value;
372
+ }
373
+ }
374
+ return sanitized;
375
+ }
376
+ /**
377
+ * Shutdown the processor.
378
+ */
379
+ async shutdown() {
380
+ return this.delegate.shutdown();
381
+ }
382
+ /**
383
+ * Force flush pending logs.
384
+ */
385
+ async forceFlush() {
386
+ return this.delegate.forceFlush();
387
+ }
388
+ }
389
+ //# sourceMappingURL=log-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-processor.js","sourceRoot":"","sources":["../../src/node/log-processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Metrics Client for Node.js Telemetry
3
+ *
4
+ * Provides a simple interface for recording metrics via OpenTelemetry.
5
+ * This is the recommended way to record metrics in services using the telemetry package.
6
+ */
7
+ import type { Meter } from "@opentelemetry/api";
8
+ /**
9
+ * Labels for metrics (key-value pairs).
10
+ */
11
+ export type Labels = Record<string, string | number>;
12
+ /**
13
+ * Handle for a counter metric.
14
+ */
15
+ export interface CounterHandle {
16
+ inc(labels?: Labels, value?: number): void;
17
+ }
18
+ /**
19
+ * Handle for a gauge metric.
20
+ */
21
+ export interface GaugeHandle {
22
+ set(labels: Labels, value: number): void;
23
+ }
24
+ /**
25
+ * Handle for a histogram metric.
26
+ */
27
+ export interface HistogramHandle {
28
+ observe(labels: Labels, value: number): void;
29
+ }
30
+ /**
31
+ * Options for counter creation. Only applied the first time a counter name is
32
+ * registered; later calls reuse the existing instrument.
33
+ */
34
+ export interface CounterOptions {
35
+ description?: string;
36
+ unit?: string;
37
+ }
38
+ /**
39
+ * Options for histogram creation. Only applied the first time a histogram
40
+ * name is registered; later calls reuse the existing instrument.
41
+ */
42
+ export interface HistogramOptions extends CounterOptions {
43
+ /**
44
+ * Explicit bucket boundaries advice for the OTEL SDK. Without this, the
45
+ * SDK's default boundaries top out at 10,000 — long-tail observations
46
+ * (e.g. multi-minute latencies in ms) all collapse into the +Inf bucket.
47
+ */
48
+ bucketBoundaries?: number[];
49
+ }
50
+ /**
51
+ * Metrics client that provides a unified interface for recording OTEL metrics.
52
+ */
53
+ export declare class MetricsClient {
54
+ private readonly meter;
55
+ private counters;
56
+ private histograms;
57
+ private gaugeValues;
58
+ constructor(meter: Meter);
59
+ /**
60
+ * Creates or retrieves a counter and returns a handle.
61
+ */
62
+ counter(name: string, options?: CounterOptions): CounterHandle;
63
+ /**
64
+ * Creates or retrieves a gauge and returns a handle.
65
+ * Note: OTEL gauges are async/observable, so we store the value and emit via callback.
66
+ * Values are automatically expired after 5 minutes to prevent unbounded memory growth.
67
+ */
68
+ gauge(name: string): GaugeHandle;
69
+ /**
70
+ * Creates or retrieves a histogram and returns a handle.
71
+ */
72
+ histogram(name: string, options?: HistogramOptions): HistogramHandle;
73
+ /**
74
+ * Increments a counter by name (creates if not exists). `options` is only
75
+ * applied on the instrument's first registration; see `counter`.
76
+ */
77
+ incCounter(name: string, labels?: Labels, value?: number, options?: CounterOptions): void;
78
+ /**
79
+ * Sets a gauge value by name (creates if not exists).
80
+ */
81
+ setGauge(name: string, labels: Labels, value: number): void;
82
+ /**
83
+ * Observes a histogram value by name (creates if not exists). `options` is
84
+ * only applied on the instrument's first registration; see `histogram`.
85
+ */
86
+ observeHistogram(name: string, labels: Labels, value: number, options?: HistogramOptions): void;
87
+ }
88
+ //# sourceMappingURL=metrics-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics-client.d.ts","sourceRoot":"","sources":["../../src/node/metrics-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAkC,MAAM,oBAAoB,CAAC;AAEhF;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;AAuHrD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5C;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9C;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,aAAa;IAMZ,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,UAAU,CAAgC;IAElD,OAAO,CAAC,WAAW,CAAkC;gBAExB,KAAK,EAAE,KAAK;IAEzC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa;IAa9D;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IA2BhC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,eAAe;IAiCpE;;;OAGG;IACH,UAAU,CACR,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,EACf,KAAK,GAAE,MAAU,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,IAAI;IAIP;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI3D;;;OAGG;IACH,gBAAgB,CACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACzB,IAAI;CAGR"}