@superblocksteam/telemetry 2.0.105 → 2.0.106-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 (99) hide show
  1. package/dist/browser/console-logging.d.ts +18 -0
  2. package/dist/browser/console-logging.d.ts.map +1 -0
  3. package/dist/browser/console-logging.js +32 -0
  4. package/dist/browser/console-logging.js.map +1 -0
  5. package/dist/browser/early-console-buffer.d.ts +39 -0
  6. package/dist/browser/early-console-buffer.d.ts.map +1 -0
  7. package/dist/browser/early-console-buffer.js +157 -0
  8. package/dist/browser/early-console-buffer.js.map +1 -0
  9. package/dist/browser/index.d.ts +7 -0
  10. package/dist/browser/index.d.ts.map +1 -1
  11. package/dist/browser/index.js +22 -1
  12. package/dist/browser/index.js.map +1 -1
  13. package/dist/browser/init.d.ts +27 -3
  14. package/dist/browser/init.d.ts.map +1 -1
  15. package/dist/browser/init.js +159 -14
  16. package/dist/browser/init.js.map +1 -1
  17. package/dist/browser/instrumentations.d.ts +61 -0
  18. package/dist/browser/instrumentations.d.ts.map +1 -0
  19. package/dist/browser/instrumentations.js +84 -0
  20. package/dist/browser/instrumentations.js.map +1 -0
  21. package/dist/browser/logs.d.ts +52 -0
  22. package/dist/browser/logs.d.ts.map +1 -0
  23. package/dist/browser/logs.js +85 -0
  24. package/dist/browser/logs.js.map +1 -0
  25. package/dist/browser/metrics.d.ts +25 -0
  26. package/dist/browser/metrics.d.ts.map +1 -0
  27. package/dist/browser/metrics.js +37 -0
  28. package/dist/browser/metrics.js.map +1 -0
  29. package/dist/browser/sanitizer.d.ts +35 -0
  30. package/dist/browser/sanitizer.d.ts.map +1 -0
  31. package/dist/browser/sanitizer.js +211 -0
  32. package/dist/browser/sanitizer.js.map +1 -0
  33. package/dist/browser/traced-socket.d.ts +102 -0
  34. package/dist/browser/traced-socket.d.ts.map +1 -0
  35. package/dist/browser/traced-socket.js +186 -0
  36. package/dist/browser/traced-socket.js.map +1 -0
  37. package/dist/common/index.d.ts +1 -0
  38. package/dist/common/index.d.ts.map +1 -1
  39. package/dist/common/index.js +1 -0
  40. package/dist/common/index.js.map +1 -1
  41. package/dist/common/trace-sanitizer.d.ts.map +1 -1
  42. package/dist/common/trace-sanitizer.js +5 -2
  43. package/dist/common/trace-sanitizer.js.map +1 -1
  44. package/dist/common/traced-socket-types.d.ts +43 -0
  45. package/dist/common/traced-socket-types.d.ts.map +1 -0
  46. package/dist/common/traced-socket-types.js +17 -0
  47. package/dist/common/traced-socket-types.js.map +1 -0
  48. package/dist/types/index.d.ts +5 -1
  49. package/dist/types/index.d.ts.map +1 -1
  50. package/dist-esm/browser/console-logging.d.ts +18 -0
  51. package/dist-esm/browser/console-logging.d.ts.map +1 -0
  52. package/dist-esm/browser/console-logging.js +27 -0
  53. package/dist-esm/browser/console-logging.js.map +1 -0
  54. package/dist-esm/browser/early-console-buffer.d.ts +39 -0
  55. package/dist-esm/browser/early-console-buffer.d.ts.map +1 -0
  56. package/dist-esm/browser/early-console-buffer.js +155 -0
  57. package/dist-esm/browser/early-console-buffer.js.map +1 -0
  58. package/dist-esm/browser/index.d.ts +7 -0
  59. package/dist-esm/browser/index.d.ts.map +1 -1
  60. package/dist-esm/browser/index.js +7 -0
  61. package/dist-esm/browser/index.js.map +1 -1
  62. package/dist-esm/browser/init.d.ts +27 -3
  63. package/dist-esm/browser/init.d.ts.map +1 -1
  64. package/dist-esm/browser/init.js +161 -16
  65. package/dist-esm/browser/init.js.map +1 -1
  66. package/dist-esm/browser/instrumentations.d.ts +61 -0
  67. package/dist-esm/browser/instrumentations.d.ts.map +1 -0
  68. package/dist-esm/browser/instrumentations.js +80 -0
  69. package/dist-esm/browser/instrumentations.js.map +1 -0
  70. package/dist-esm/browser/logs.d.ts +52 -0
  71. package/dist-esm/browser/logs.d.ts.map +1 -0
  72. package/dist-esm/browser/logs.js +78 -0
  73. package/dist-esm/browser/logs.js.map +1 -0
  74. package/dist-esm/browser/metrics.d.ts +25 -0
  75. package/dist-esm/browser/metrics.d.ts.map +1 -0
  76. package/dist-esm/browser/metrics.js +34 -0
  77. package/dist-esm/browser/metrics.js.map +1 -0
  78. package/dist-esm/browser/sanitizer.d.ts +35 -0
  79. package/dist-esm/browser/sanitizer.d.ts.map +1 -0
  80. package/dist-esm/browser/sanitizer.js +207 -0
  81. package/dist-esm/browser/sanitizer.js.map +1 -0
  82. package/dist-esm/browser/traced-socket.d.ts +102 -0
  83. package/dist-esm/browser/traced-socket.d.ts.map +1 -0
  84. package/dist-esm/browser/traced-socket.js +182 -0
  85. package/dist-esm/browser/traced-socket.js.map +1 -0
  86. package/dist-esm/common/index.d.ts +1 -0
  87. package/dist-esm/common/index.d.ts.map +1 -1
  88. package/dist-esm/common/index.js +1 -0
  89. package/dist-esm/common/index.js.map +1 -1
  90. package/dist-esm/common/trace-sanitizer.d.ts.map +1 -1
  91. package/dist-esm/common/trace-sanitizer.js +5 -2
  92. package/dist-esm/common/trace-sanitizer.js.map +1 -1
  93. package/dist-esm/common/traced-socket-types.d.ts +43 -0
  94. package/dist-esm/common/traced-socket-types.d.ts.map +1 -0
  95. package/dist-esm/common/traced-socket-types.js +16 -0
  96. package/dist-esm/common/traced-socket-types.js.map +1 -0
  97. package/dist-esm/types/index.d.ts +5 -1
  98. package/dist-esm/types/index.d.ts.map +1 -1
  99. package/package.json +5 -3
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Console Log Attributes
3
+ *
4
+ * Used to attach structured key-value metadata to console.* calls so the
5
+ * EarlyConsoleBuffer (and the live OTel patch) can forward them as OTEL log
6
+ * record attributes.
7
+ *
8
+ * Usage:
9
+ * import { consoleLogAttributes } from '@superblocksteam/telemetry/browser';
10
+ * console.info("user loaded", consoleLogAttributes({ userId: "abc123" }));
11
+ */
12
+ export declare class ConsoleLogAttributes {
13
+ readonly attributes: Record<string, unknown>;
14
+ constructor(attributes: Record<string, unknown>);
15
+ static create(attrs: Record<string, unknown>): ConsoleLogAttributes;
16
+ }
17
+ export declare const consoleLogAttributes: (attrs: Record<string, unknown>) => ConsoleLogAttributes;
18
+ //# sourceMappingURL=console-logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-logging.d.ts","sourceRoot":"","sources":["../../src/browser/console-logging.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,qBAAa,oBAAoB;aACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAAnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE/D,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,oBAAoB;CAGpE;AAGD,eAAO,MAAM,oBAAoB,GAC/B,OAAO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,oBAEF,CAAC"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /**
3
+ * Console Log Attributes
4
+ *
5
+ * Used to attach structured key-value metadata to console.* calls so the
6
+ * EarlyConsoleBuffer (and the live OTel patch) can forward them as OTEL log
7
+ * record attributes.
8
+ *
9
+ * Usage:
10
+ * import { consoleLogAttributes } from '@superblocksteam/telemetry/browser';
11
+ * console.info("user loaded", consoleLogAttributes({ userId: "abc123" }));
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.consoleLogAttributes = exports.ConsoleLogAttributes = void 0;
15
+ // The attributes that should be passed to OTEL logs as part of the message context.
16
+ // To use, create an instance of this class and pass it as an argument to console.* methods.
17
+ class ConsoleLogAttributes {
18
+ attributes;
19
+ constructor(attributes) {
20
+ this.attributes = attributes;
21
+ }
22
+ static create(attrs) {
23
+ return new ConsoleLogAttributes(attrs);
24
+ }
25
+ }
26
+ exports.ConsoleLogAttributes = ConsoleLogAttributes;
27
+ // Convenience factory
28
+ const consoleLogAttributes = (attrs) => {
29
+ return new ConsoleLogAttributes(attrs);
30
+ };
31
+ exports.consoleLogAttributes = consoleLogAttributes;
32
+ //# sourceMappingURL=console-logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"console-logging.js","sourceRoot":"","sources":["../../src/browser/console-logging.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAEH,oFAAoF;AACpF,4FAA4F;AAC5F,MAAa,oBAAoB;IACH;IAA5B,YAA4B,UAAmC;QAAnC,eAAU,GAAV,UAAU,CAAyB;IAAG,CAAC;IAEnE,MAAM,CAAC,MAAM,CAAC,KAA8B;QAC1C,OAAO,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;CACF;AAND,oDAMC;AAED,sBAAsB;AACf,MAAM,oBAAoB,GAAG,CAClC,KAA8B,EACR,EAAE;IACxB,OAAO,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC,CAAC;AAJW,QAAA,oBAAoB,wBAI/B"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Early Console Buffer
3
+ *
4
+ * Patches console.log/info/debug/warn/error as early as possible (before OTel
5
+ * initialises) to capture logs in a ring buffer. On OTel init, the buffer is
6
+ * flushed to the OTel Logger and all subsequent console calls are forwarded
7
+ * directly.
8
+ *
9
+ * IMPORTANT: Each patched method ALWAYS calls through to the original console
10
+ * method first, so downstream patchers (Datadog RUM, PostHog, etc.) that wrap
11
+ * console after us continue to receive every call.
12
+ */
13
+ import { type Logger } from "@opentelemetry/api-logs";
14
+ declare class EarlyConsoleBuffer {
15
+ private static instance;
16
+ private buffer;
17
+ private maxBufferSize;
18
+ private originalMethods;
19
+ private otelLogger;
20
+ private isPatched;
21
+ static getInstance(): EarlyConsoleBuffer;
22
+ /**
23
+ * Patch console methods immediately with buffering.
24
+ * Safe to call multiple times — subsequent calls are no-ops.
25
+ */
26
+ patchEarly(): void;
27
+ private patchMethod;
28
+ private bufferLog;
29
+ /**
30
+ * Called once OTel is ready. Flushes buffered entries then routes all future
31
+ * console calls directly to the OTel logger.
32
+ */
33
+ enableOpenTelemetry(otelLogger: Logger): void;
34
+ private flushBuffer;
35
+ private sendToOpenTelemetry;
36
+ private formatConsoleArgs;
37
+ }
38
+ export default EarlyConsoleBuffer;
39
+ //# sourceMappingURL=early-console-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"early-console-buffer.d.ts","sourceRoot":"","sources":["../../src/browser/early-console-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAkB,MAAM,yBAAyB,CAAC;AAuBtE,cAAM,kBAAkB;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqB;IAE5C,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,aAAa,CAAQ;IAE7B,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,UAAU,CAAiC;IACnD,OAAO,CAAC,SAAS,CAAS;IAE1B,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAOxC;;;OAGG;IACH,UAAU,IAAI,IAAI;IA4BlB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,SAAS;IAOjB;;;OAGG;IACH,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAM7C,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,CAAC,iBAAiB;CAkB1B;AAED,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ /**
3
+ * Early Console Buffer
4
+ *
5
+ * Patches console.log/info/debug/warn/error as early as possible (before OTel
6
+ * initialises) to capture logs in a ring buffer. On OTel init, the buffer is
7
+ * flushed to the OTel Logger and all subsequent console calls are forwarded
8
+ * directly.
9
+ *
10
+ * IMPORTANT: Each patched method ALWAYS calls through to the original console
11
+ * method first, so downstream patchers (Datadog RUM, PostHog, etc.) that wrap
12
+ * console after us continue to receive every call.
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const api_logs_1 = require("@opentelemetry/api-logs");
16
+ const console_logging_js_1 = require("./console-logging.js");
17
+ function mergeAllConsoleLogAttributes(args) {
18
+ if (args.length === 0)
19
+ return undefined;
20
+ return args.reduce((merged, arg) => {
21
+ if (arg instanceof console_logging_js_1.ConsoleLogAttributes) {
22
+ return { ...merged, ...arg.attributes };
23
+ }
24
+ return merged;
25
+ }, {});
26
+ }
27
+ class EarlyConsoleBuffer {
28
+ static instance;
29
+ buffer = [];
30
+ maxBufferSize = 1000;
31
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
32
+ originalMethods = {};
33
+ otelLogger = undefined;
34
+ isPatched = false;
35
+ static getInstance() {
36
+ if (!EarlyConsoleBuffer.instance) {
37
+ EarlyConsoleBuffer.instance = new EarlyConsoleBuffer();
38
+ }
39
+ return EarlyConsoleBuffer.instance;
40
+ }
41
+ /**
42
+ * Patch console methods immediately with buffering.
43
+ * Safe to call multiple times — subsequent calls are no-ops.
44
+ */
45
+ patchEarly() {
46
+ if (this.isPatched)
47
+ return;
48
+ // Capture current console methods (which may already be patched by Datadog
49
+ // RUM or PostHog). We keep calling through to whatever was here at the time
50
+ // patchEarly() was invoked.
51
+ // eslint-disable-next-line no-console
52
+ this.originalMethods.log = console.log.bind(console);
53
+ this.originalMethods.info = console.info.bind(console);
54
+ this.originalMethods.debug = console.debug.bind(console);
55
+ this.originalMethods.warn = console.warn.bind(console);
56
+ this.originalMethods.error = console.error.bind(console);
57
+ this.patchMethod("log");
58
+ this.patchMethod("info");
59
+ this.patchMethod("debug");
60
+ this.patchMethod("warn");
61
+ this.patchMethod("error");
62
+ this.isPatched = true;
63
+ // Announce via original info to avoid touching the newly patched method
64
+ // (which would buffer this diagnostic message unnecessarily).
65
+ this.originalMethods.info("[EarlyConsoleBuffer] Console patching enabled — buffering logs until OpenTelemetry initializes");
66
+ }
67
+ patchMethod(level) {
68
+ const originalMethod = this.originalMethods[level];
69
+ console[level] = (...args) => {
70
+ // ALWAYS call through to the original first so downstream patchers work.
71
+ originalMethod(...args);
72
+ // Route to OTel or buffer depending on initialization state.
73
+ if (this.otelLogger) {
74
+ this.sendToOpenTelemetry(level, args);
75
+ }
76
+ else {
77
+ this.bufferLog(level, args);
78
+ }
79
+ };
80
+ }
81
+ bufferLog(level, args) {
82
+ if (this.buffer.length >= this.maxBufferSize) {
83
+ this.buffer.shift(); // drop oldest entry
84
+ }
85
+ this.buffer.push({ level, args, timestamp: Date.now() });
86
+ }
87
+ /**
88
+ * Called once OTel is ready. Flushes buffered entries then routes all future
89
+ * console calls directly to the OTel logger.
90
+ */
91
+ enableOpenTelemetry(otelLogger) {
92
+ console.info("[EarlyConsoleBuffer] Enabling OpenTelemetry integration");
93
+ this.otelLogger = otelLogger;
94
+ this.flushBuffer();
95
+ }
96
+ flushBuffer() {
97
+ if (!this.otelLogger)
98
+ return;
99
+ const count = this.buffer.length;
100
+ if (count === 0) {
101
+ console.info("[EarlyConsoleBuffer] No buffered logs to flush");
102
+ return;
103
+ }
104
+ console.info(`[EarlyConsoleBuffer] Flushing ${count} buffered logs to OpenTelemetry`);
105
+ for (const entry of this.buffer) {
106
+ this.sendToOpenTelemetry(entry.level, entry.args, entry.timestamp, true);
107
+ }
108
+ this.buffer = [];
109
+ console.info(`[EarlyConsoleBuffer] Successfully sent ${count} buffered logs to OpenTelemetry logger`);
110
+ }
111
+ sendToOpenTelemetry(level, args, timestamp, fromBuffer) {
112
+ if (!this.otelLogger)
113
+ return;
114
+ const severityMap = {
115
+ debug: api_logs_1.SeverityNumber.DEBUG,
116
+ log: api_logs_1.SeverityNumber.INFO,
117
+ info: api_logs_1.SeverityNumber.INFO,
118
+ warn: api_logs_1.SeverityNumber.WARN,
119
+ error: api_logs_1.SeverityNumber.ERROR,
120
+ };
121
+ const attributes = {
122
+ ...(fromBuffer ? { source: "early-console-buffer" } : {}),
123
+ ...mergeAllConsoleLogAttributes(args),
124
+ };
125
+ this.otelLogger.emit({
126
+ severityNumber: severityMap[level],
127
+ severityText: level,
128
+ body: this.formatConsoleArgs(args),
129
+ timestamp,
130
+ attributes: attributes,
131
+ });
132
+ }
133
+ formatConsoleArgs(args) {
134
+ return args
135
+ .filter((arg) => !(arg instanceof console_logging_js_1.ConsoleLogAttributes))
136
+ .map((arg) => {
137
+ if (typeof arg === "string")
138
+ return arg;
139
+ if (arg === null)
140
+ return "null";
141
+ if (arg === undefined)
142
+ return "undefined";
143
+ if (typeof arg === "object") {
144
+ try {
145
+ return JSON.stringify(arg, null, 2);
146
+ }
147
+ catch {
148
+ return "[object Object]";
149
+ }
150
+ }
151
+ return String(arg);
152
+ })
153
+ .join(" ");
154
+ }
155
+ }
156
+ exports.default = EarlyConsoleBuffer;
157
+ //# sourceMappingURL=early-console-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"early-console-buffer.js","sourceRoot":"","sources":["../../src/browser/early-console-buffer.ts"],"names":[],"mappings":"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"}
@@ -4,5 +4,12 @@
4
4
  * This is the ONLY approved way to initialize telemetry in browser contexts.
5
5
  */
6
6
  export { initBrowserTelemetry, getBrowserTelemetryInstance, isBrowserTelemetryInitialized, resetBrowserTelemetry, getEnvironmentFromHostname, type BrowserTelemetryInstance, } from "./init.js";
7
+ export { initBrowserLogs, resetBrowserLogs, type BrowserLogsConfig, type BrowserLogsInstance, } from "./logs.js";
8
+ export { initBrowserMetrics, type BrowserMetricsConfig, type BrowserMetricsInstance, } from "./metrics.js";
9
+ export { createSanitizingSpanProcessor, createSanitizingLogProcessor, type SanitizingConfig, } from "./sanitizer.js";
10
+ export { createBrowserInstrumentations, registerBrowserContextManager, type BrowserInstrumentationConfig, } from "./instrumentations.js";
11
+ export { ConsoleLogAttributes, consoleLogAttributes, } from "./console-logging.js";
12
+ export { default as EarlyConsoleBuffer } from "./early-console-buffer.js";
7
13
  export { getDefaultPolicy, DeploymentType } from "../types/policy.js";
14
+ export { BrowserTracedSocket, type BrowserTracedSocketConfig, type WebSocketLike, } from "./traced-socket.js";
8
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,6BAA6B,EAC7B,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,wBAAwB,GAC9B,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,oBAAoB,EACpB,2BAA2B,EAC3B,6BAA6B,EAC7B,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,wBAAwB,GAC9B,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GACzB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,GAC5B,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,KAAK,gBAAgB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,EAC7B,KAAK,4BAA4B,GAClC,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG1E,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEtE,OAAO,EACL,mBAAmB,EACnB,KAAK,yBAAyB,EAC9B,KAAK,aAAa,GACnB,MAAM,oBAAoB,CAAC"}
@@ -4,16 +4,37 @@
4
4
  *
5
5
  * This is the ONLY approved way to initialize telemetry in browser contexts.
6
6
  */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
7
10
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.DeploymentType = exports.getDefaultPolicy = exports.getEnvironmentFromHostname = exports.resetBrowserTelemetry = exports.isBrowserTelemetryInitialized = exports.getBrowserTelemetryInstance = exports.initBrowserTelemetry = void 0;
11
+ exports.BrowserTracedSocket = exports.DeploymentType = exports.getDefaultPolicy = exports.EarlyConsoleBuffer = exports.consoleLogAttributes = exports.ConsoleLogAttributes = exports.registerBrowserContextManager = exports.createBrowserInstrumentations = exports.createSanitizingLogProcessor = exports.createSanitizingSpanProcessor = exports.initBrowserMetrics = exports.resetBrowserLogs = exports.initBrowserLogs = exports.getEnvironmentFromHostname = exports.resetBrowserTelemetry = exports.isBrowserTelemetryInitialized = exports.getBrowserTelemetryInstance = exports.initBrowserTelemetry = void 0;
9
12
  var init_js_1 = require("./init.js");
10
13
  Object.defineProperty(exports, "initBrowserTelemetry", { enumerable: true, get: function () { return init_js_1.initBrowserTelemetry; } });
11
14
  Object.defineProperty(exports, "getBrowserTelemetryInstance", { enumerable: true, get: function () { return init_js_1.getBrowserTelemetryInstance; } });
12
15
  Object.defineProperty(exports, "isBrowserTelemetryInitialized", { enumerable: true, get: function () { return init_js_1.isBrowserTelemetryInitialized; } });
13
16
  Object.defineProperty(exports, "resetBrowserTelemetry", { enumerable: true, get: function () { return init_js_1.resetBrowserTelemetry; } });
14
17
  Object.defineProperty(exports, "getEnvironmentFromHostname", { enumerable: true, get: function () { return init_js_1.getEnvironmentFromHostname; } });
18
+ var logs_js_1 = require("./logs.js");
19
+ Object.defineProperty(exports, "initBrowserLogs", { enumerable: true, get: function () { return logs_js_1.initBrowserLogs; } });
20
+ Object.defineProperty(exports, "resetBrowserLogs", { enumerable: true, get: function () { return logs_js_1.resetBrowserLogs; } });
21
+ var metrics_js_1 = require("./metrics.js");
22
+ Object.defineProperty(exports, "initBrowserMetrics", { enumerable: true, get: function () { return metrics_js_1.initBrowserMetrics; } });
23
+ var sanitizer_js_1 = require("./sanitizer.js");
24
+ Object.defineProperty(exports, "createSanitizingSpanProcessor", { enumerable: true, get: function () { return sanitizer_js_1.createSanitizingSpanProcessor; } });
25
+ Object.defineProperty(exports, "createSanitizingLogProcessor", { enumerable: true, get: function () { return sanitizer_js_1.createSanitizingLogProcessor; } });
26
+ var instrumentations_js_1 = require("./instrumentations.js");
27
+ Object.defineProperty(exports, "createBrowserInstrumentations", { enumerable: true, get: function () { return instrumentations_js_1.createBrowserInstrumentations; } });
28
+ Object.defineProperty(exports, "registerBrowserContextManager", { enumerable: true, get: function () { return instrumentations_js_1.registerBrowserContextManager; } });
29
+ var console_logging_js_1 = require("./console-logging.js");
30
+ Object.defineProperty(exports, "ConsoleLogAttributes", { enumerable: true, get: function () { return console_logging_js_1.ConsoleLogAttributes; } });
31
+ Object.defineProperty(exports, "consoleLogAttributes", { enumerable: true, get: function () { return console_logging_js_1.consoleLogAttributes; } });
32
+ var early_console_buffer_js_1 = require("./early-console-buffer.js");
33
+ Object.defineProperty(exports, "EarlyConsoleBuffer", { enumerable: true, get: function () { return __importDefault(early_console_buffer_js_1).default; } });
15
34
  // Re-export policy utilities for convenience
16
35
  var policy_js_1 = require("../types/policy.js");
17
36
  Object.defineProperty(exports, "getDefaultPolicy", { enumerable: true, get: function () { return policy_js_1.getDefaultPolicy; } });
18
37
  Object.defineProperty(exports, "DeploymentType", { enumerable: true, get: function () { return policy_js_1.DeploymentType; } });
38
+ var traced_socket_js_1 = require("./traced-socket.js");
39
+ Object.defineProperty(exports, "BrowserTracedSocket", { enumerable: true, get: function () { return traced_socket_js_1.BrowserTracedSocket; } });
19
40
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,qCAOmB;AANjB,+GAAA,oBAAoB,OAAA;AACpB,sHAAA,2BAA2B,OAAA;AAC3B,wHAAA,6BAA6B,OAAA;AAC7B,gHAAA,qBAAqB,OAAA;AACrB,qHAAA,0BAA0B,OAAA;AAI5B,6CAA6C;AAC7C,gDAAsE;AAA7D,6GAAA,gBAAgB,OAAA;AAAE,2GAAA,cAAc,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;AAEH,qCAOmB;AANjB,+GAAA,oBAAoB,OAAA;AACpB,sHAAA,2BAA2B,OAAA;AAC3B,wHAAA,6BAA6B,OAAA;AAC7B,gHAAA,qBAAqB,OAAA;AACrB,qHAAA,0BAA0B,OAAA;AAI5B,qCAKmB;AAJjB,0GAAA,eAAe,OAAA;AACf,2GAAA,gBAAgB,OAAA;AAKlB,2CAIsB;AAHpB,gHAAA,kBAAkB,OAAA;AAKpB,+CAIwB;AAHtB,6HAAA,6BAA6B,OAAA;AAC7B,4HAAA,4BAA4B,OAAA;AAI9B,6DAI+B;AAH7B,oIAAA,6BAA6B,OAAA;AAC7B,oIAAA,6BAA6B,OAAA;AAI/B,2DAG8B;AAF5B,0HAAA,oBAAoB,OAAA;AACpB,0HAAA,oBAAoB,OAAA;AAGtB,qEAA0E;AAAjE,8IAAA,OAAO,OAAsB;AAEtC,6CAA6C;AAC7C,gDAAsE;AAA7D,6GAAA,gBAAgB,OAAA;AAAE,2GAAA,cAAc,OAAA;AAEzC,uDAI4B;AAH1B,uHAAA,mBAAmB,OAAA"}
@@ -3,8 +3,14 @@
3
3
  *
4
4
  * This is the ONLY approved way to initialize telemetry in browser contexts.
5
5
  * Direct WebTracerProvider usage outside this package is prohibited.
6
+ *
7
+ * Composes all browser signals: traces, metrics, logs, sanitizers, and
8
+ * auto-instrumentations into a single init call.
6
9
  */
7
- import { Tracer } from "@opentelemetry/api";
10
+ import { type Tracer } from "@opentelemetry/api";
11
+ import type { Meter } from "@opentelemetry/api";
12
+ import type { Logger } from "@opentelemetry/api-logs";
13
+ import { type SpanProcessor } from "@opentelemetry/sdk-trace-base";
8
14
  import { WebTracerProvider } from "@opentelemetry/sdk-trace-web";
9
15
  import { TelemetryPolicyEvaluator } from "../common/policy-evaluator.js";
10
16
  import type { BrowserTelemetryConfig } from "../types/index.js";
@@ -19,6 +25,14 @@ export interface BrowserTelemetryInstance {
19
25
  policyEvaluator: TelemetryPolicyEvaluator;
20
26
  /** Get a tracer */
21
27
  getTracer: (name?: string) => Tracer;
28
+ /** Get a meter for recording metrics */
29
+ getMeter: (name?: string) => Meter;
30
+ /** Get a logger for emitting log records */
31
+ getLogger: (name?: string) => Logger;
32
+ /** Set attributes that are injected into every new span (dynamic context like org, user) */
33
+ setGlobalSpanAttributes: (attrs: Record<string, string>) => void;
34
+ /** Register an additional SpanProcessor on the provider (e.g. LocalStorageExporter) */
35
+ addSpanProcessor: (processor: SpanProcessor) => void;
22
36
  /** Graceful shutdown */
23
37
  shutdown: () => Promise<void>;
24
38
  }
@@ -28,7 +42,15 @@ export interface BrowserTelemetryInstance {
28
42
  * Browser telemetry is always sanitized (Tier 2) since it runs in untrusted context.
29
43
  * Full fidelity Tier 1 data should never be emitted from the browser.
30
44
  *
31
- * @param config - Browser configuration
45
+ * Composes:
46
+ * - Traces: WebTracerProvider with sanitizing + batch processors
47
+ * - Metrics: MeterProvider via initBrowserMetrics
48
+ * - Logs: LoggerProvider via initBrowserLogs (with EarlyConsoleBuffer)
49
+ * - Sanitizers: PII redaction for spans and logs
50
+ * - Instrumentations: XHR + Fetch auto-instrumentation
51
+ * - Context: StackContextManager for async context propagation
52
+ *
53
+ * @param config - Browser configuration (otlpUrl is treated as base URL)
32
54
  * @param policy - Telemetry policy (REQUIRED)
33
55
  * @returns Browser telemetry instance
34
56
  *
@@ -42,10 +64,12 @@ export interface BrowserTelemetryInstance {
42
64
  * serviceName: 'superblocks-ui',
43
65
  * serviceVersion: '1.0.0',
44
66
  * environment: 'production',
45
- * otlpUrl: 'https://app.superblocks.com/api/v1/traces',
67
+ * otlpUrl: 'https://app.superblocks.com/api',
46
68
  * }, policy);
47
69
  *
48
70
  * const tracer = telemetry.getTracer();
71
+ * const meter = telemetry.getMeter();
72
+ * const logger = telemetry.getLogger();
49
73
  * ```
50
74
  */
51
75
  export declare function initBrowserTelemetry(config: BrowserTelemetryConfig, policy: TelemetryPolicy): BrowserTelemetryInstance;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/browser/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAS,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAQnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAiB,MAAM,oBAAoB,CAAC;AAGpE;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,uCAAuC;IACvC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,6CAA6C;IAC7C,eAAe,EAAE,wBAAwB,CAAC;IAC1C,mBAAmB;IACnB,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,wBAAwB;IACxB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAmCD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,eAAe,GACtB,wBAAwB,CAkE1B;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,wBAAwB,CAOtE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAEvD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWnE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/browser/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAA2B,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAQtD,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAiB,MAAM,oBAAoB,CAAC;AAUpE;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,uCAAuC;IACvC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,6CAA6C;IAC7C,eAAe,EAAE,wBAAwB,CAAC;IAC1C,mBAAmB;IACnB,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,wCAAwC;IACxC,QAAQ,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC;IACnC,4CAA4C;IAC5C,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,4FAA4F;IAC5F,uBAAuB,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IACjE,uFAAuF;IACvF,gBAAgB,EAAE,CAAC,SAAS,EAAE,aAAa,KAAK,IAAI,CAAC;IACrD,wBAAwB;IACxB,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AA2GD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,sBAAsB,EAC9B,MAAM,EAAE,eAAe,GACtB,wBAAwB,CA4I1B;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,IAAI,wBAAwB,CAOtE;AAED;;GAEG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAEvD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWnE"}
@@ -4,6 +4,9 @@
4
4
  *
5
5
  * This is the ONLY approved way to initialize telemetry in browser contexts.
6
6
  * Direct WebTracerProvider usage outside this package is prohibited.
7
+ *
8
+ * Composes all browser signals: traces, metrics, logs, sanitizers, and
9
+ * auto-instrumentations into a single init call.
7
10
  */
8
11
  Object.defineProperty(exports, "__esModule", { value: true });
9
12
  exports.initBrowserTelemetry = initBrowserTelemetry;
@@ -14,12 +17,17 @@ exports.getEnvironmentFromHostname = getEnvironmentFromHostname;
14
17
  const api_1 = require("@opentelemetry/api");
15
18
  const core_1 = require("@opentelemetry/core");
16
19
  const exporter_trace_otlp_http_1 = require("@opentelemetry/exporter-trace-otlp-http");
20
+ const instrumentation_1 = require("@opentelemetry/instrumentation");
17
21
  const sdk_trace_base_1 = require("@opentelemetry/sdk-trace-base");
18
22
  const sdk_trace_web_1 = require("@opentelemetry/sdk-trace-web");
19
23
  const policy_evaluator_js_1 = require("../common/policy-evaluator.js");
20
24
  const resource_js_1 = require("../common/resource.js");
21
25
  const policy_js_1 = require("../types/policy.js");
26
+ const instrumentations_js_1 = require("./instrumentations.js");
27
+ const logs_js_1 = require("./logs.js");
28
+ const metrics_js_1 = require("./metrics.js");
22
29
  const resilient_exporter_js_1 = require("./resilient-exporter.js");
30
+ const sanitizer_js_1 = require("./sanitizer.js");
23
31
  // Singleton instance
24
32
  let instance;
25
33
  /**
@@ -48,13 +56,84 @@ function validateBrowserTelemetryConfig(config) {
48
56
  throw new Error(`[Telemetry] Invalid otlpUrl: ${config.otlpUrl} (${error.message})`);
49
57
  }
50
58
  }
59
+ /**
60
+ * Strips trailing slash from a URL string.
61
+ */
62
+ function normalizeBaseUrl(url) {
63
+ return url.replace(/\/+$/, "");
64
+ }
65
+ /**
66
+ * SpanProcessor that injects mutable global attributes into every span on start.
67
+ * Since OTel Resource is immutable, dynamic context (org ID, user ID, app ID)
68
+ * must be applied at the span level.
69
+ */
70
+ class GlobalAttributeSpanProcessor {
71
+ attrs = {};
72
+ setAttributes(attrs) {
73
+ this.attrs = { ...attrs };
74
+ }
75
+ onStart(span, _parentContext) {
76
+ for (const [key, value] of Object.entries(this.attrs)) {
77
+ span.setAttribute(key, value);
78
+ }
79
+ }
80
+ onEnd(_span) { }
81
+ async shutdown() { }
82
+ async forceFlush() { }
83
+ }
84
+ /**
85
+ * Composite SpanProcessor that delegates to a mutable list of inner processors.
86
+ * In OTel SDK v2.x, `addSpanProcessor` was removed from BasicTracerProvider,
87
+ * so we wrap the processor list ourselves to support runtime additions
88
+ * (e.g. UI's LocalStorageExporter).
89
+ */
90
+ class DynamicCompositeSpanProcessor {
91
+ processors = [];
92
+ add(processor) {
93
+ this.processors.push(processor);
94
+ }
95
+ onStart(span, parentContext) {
96
+ for (const p of this.processors) {
97
+ try {
98
+ p.onStart(span, parentContext);
99
+ }
100
+ catch (err) {
101
+ console.error("[Telemetry] SpanProcessor.onStart failed", err);
102
+ }
103
+ }
104
+ }
105
+ onEnd(span) {
106
+ for (const p of this.processors) {
107
+ try {
108
+ p.onEnd(span);
109
+ }
110
+ catch (err) {
111
+ console.error("[Telemetry] SpanProcessor.onEnd failed", err);
112
+ }
113
+ }
114
+ }
115
+ async shutdown() {
116
+ await Promise.all(this.processors.map((p) => p.shutdown()));
117
+ }
118
+ async forceFlush() {
119
+ await Promise.all(this.processors.map((p) => p.forceFlush()));
120
+ }
121
+ }
51
122
  /**
52
123
  * Initialize browser telemetry with policy enforcement.
53
124
  *
54
125
  * Browser telemetry is always sanitized (Tier 2) since it runs in untrusted context.
55
126
  * Full fidelity Tier 1 data should never be emitted from the browser.
56
127
  *
57
- * @param config - Browser configuration
128
+ * Composes:
129
+ * - Traces: WebTracerProvider with sanitizing + batch processors
130
+ * - Metrics: MeterProvider via initBrowserMetrics
131
+ * - Logs: LoggerProvider via initBrowserLogs (with EarlyConsoleBuffer)
132
+ * - Sanitizers: PII redaction for spans and logs
133
+ * - Instrumentations: XHR + Fetch auto-instrumentation
134
+ * - Context: StackContextManager for async context propagation
135
+ *
136
+ * @param config - Browser configuration (otlpUrl is treated as base URL)
58
137
  * @param policy - Telemetry policy (REQUIRED)
59
138
  * @returns Browser telemetry instance
60
139
  *
@@ -68,10 +147,12 @@ function validateBrowserTelemetryConfig(config) {
68
147
  * serviceName: 'superblocks-ui',
69
148
  * serviceVersion: '1.0.0',
70
149
  * environment: 'production',
71
- * otlpUrl: 'https://app.superblocks.com/api/v1/traces',
150
+ * otlpUrl: 'https://app.superblocks.com/api',
72
151
  * }, policy);
73
152
  *
74
153
  * const tracer = telemetry.getTracer();
154
+ * const meter = telemetry.getMeter();
155
+ * const logger = telemetry.getLogger();
75
156
  * ```
76
157
  */
77
158
  function initBrowserTelemetry(config, policy) {
@@ -86,21 +167,31 @@ function initBrowserTelemetry(config, policy) {
86
167
  console.warn("[Telemetry] Browser provider already initialized");
87
168
  return instance;
88
169
  }
170
+ const baseUrl = normalizeBaseUrl(config.otlpUrl);
171
+ // 1. Register StackContextManager for async context propagation
172
+ (0, instrumentations_js_1.registerBrowserContextManager)();
89
173
  const policyEvaluator = new policy_evaluator_js_1.TelemetryPolicyEvaluator(policy);
90
174
  const resource = (0, resource_js_1.buildResource)(config);
91
- // Build span processors based on policy
92
- // Use isExportEnabled (not canExport) - sampling applies at runtime, not initialization
93
- const spanProcessors = policyEvaluator.isExportEnabled(policy_js_1.TelemetryTier.TIER_2_OPERATIONAL)
94
- ? [
95
- new sdk_trace_base_1.BatchSpanProcessor(new resilient_exporter_js_1.BrowserResilientExporter({
96
- delegate: new exporter_trace_otlp_http_1.OTLPTraceExporter({ url: config.otlpUrl }),
97
- })),
98
- ]
99
- : [];
100
- // Create provider with span processors in constructor (OTEL v2.x API)
175
+ // 2. Build span processors: global attrs -> sanitizer -> batch exporter
176
+ // Wrapped in a DynamicCompositeSpanProcessor so addSpanProcessor() works
177
+ // at runtime (OTel SDK v2.x removed addSpanProcessor from the provider).
178
+ const globalAttrProcessor = new GlobalAttributeSpanProcessor();
179
+ const compositeProcessor = new DynamicCompositeSpanProcessor();
180
+ compositeProcessor.add(globalAttrProcessor);
181
+ // Add sanitizing processor (always on in browser)
182
+ compositeProcessor.add((0, sanitizer_js_1.createSanitizingSpanProcessor)());
183
+ // Add batch exporter if policy allows export
184
+ if (policyEvaluator.isExportEnabled(policy_js_1.TelemetryTier.TIER_2_OPERATIONAL)) {
185
+ compositeProcessor.add(new sdk_trace_base_1.BatchSpanProcessor(new resilient_exporter_js_1.BrowserResilientExporter({
186
+ delegate: new exporter_trace_otlp_http_1.OTLPTraceExporter({
187
+ url: `${baseUrl}/v1/traces`,
188
+ }),
189
+ })));
190
+ }
191
+ // Create provider with the composite processor (OTEL v2.x API)
101
192
  const provider = new sdk_trace_web_1.WebTracerProvider({
102
193
  resource,
103
- spanProcessors,
194
+ spanProcessors: [compositeProcessor],
104
195
  });
105
196
  // Register with composite propagator for W3C TraceContext and Baggage
106
197
  provider.register({
@@ -111,13 +202,66 @@ function initBrowserTelemetry(config, policy) {
111
202
  ],
112
203
  }),
113
204
  });
114
- console.debug(`[Telemetry] Browser tracing initialized for ${config.serviceName} (${policy.deploymentType})`);
205
+ // 3. Create auto-instrumentations (XHR + fetch)
206
+ const instrumentations = (0, instrumentations_js_1.createBrowserInstrumentations)({
207
+ propagateTraceUrls: config.propagateTraceUrls,
208
+ ignoreUrls: config.ignoreUrls,
209
+ });
210
+ (0, instrumentation_1.registerInstrumentations)({
211
+ instrumentations,
212
+ tracerProvider: provider,
213
+ });
214
+ // 4. Initialize metrics
215
+ let metricsInstance;
216
+ if (policyEvaluator.isExportEnabled(policy_js_1.TelemetryTier.TIER_2_OPERATIONAL)) {
217
+ metricsInstance = (0, metrics_js_1.initBrowserMetrics)({
218
+ otlpUrl: `${baseUrl}/v1/metrics`,
219
+ serviceName: config.serviceName,
220
+ });
221
+ }
222
+ // 5. Initialize logs (with EarlyConsoleBuffer flush)
223
+ const logsInstance = policyEvaluator.isExportEnabled(policy_js_1.TelemetryTier.TIER_2_OPERATIONAL)
224
+ ? (0, logs_js_1.initBrowserLogs)({
225
+ otlpUrl: `${baseUrl}/v1/logs`,
226
+ serviceName: config.serviceName,
227
+ })
228
+ : undefined;
229
+ console.debug(`[Telemetry] Browser telemetry initialized for ${config.serviceName} (${policy.deploymentType}) — traces, metrics, logs`);
115
230
  instance = {
116
231
  provider,
117
232
  policyEvaluator,
118
233
  getTracer: (name) => api_1.trace.getTracer(name ?? config.serviceName, config.serviceVersion),
234
+ getMeter: (name) => {
235
+ if (metricsInstance) {
236
+ return metricsInstance.getMeter(name);
237
+ }
238
+ // Return a no-op meter from the global API when metrics are disabled
239
+ return api_1.metrics.getMeter(name ?? config.serviceName);
240
+ },
241
+ getLogger: (name) => {
242
+ if (logsInstance) {
243
+ return logsInstance.getLogger(name);
244
+ }
245
+ // Return a no-op logger when logs are disabled
246
+ return {
247
+ emit: () => { },
248
+ };
249
+ },
250
+ setGlobalSpanAttributes: (attrs) => {
251
+ globalAttrProcessor.setAttributes(attrs);
252
+ },
253
+ addSpanProcessor: (processor) => {
254
+ compositeProcessor.add(processor);
255
+ },
119
256
  shutdown: async () => {
120
257
  await provider.shutdown();
258
+ if (metricsInstance) {
259
+ await metricsInstance.shutdown();
260
+ }
261
+ if (logsInstance) {
262
+ await logsInstance.shutdown();
263
+ }
264
+ api_1.context.disable();
121
265
  instance = undefined;
122
266
  },
123
267
  };
@@ -146,6 +290,7 @@ function isBrowserTelemetryInitialized() {
146
290
  */
147
291
  function resetBrowserTelemetry() {
148
292
  instance = undefined;
293
+ (0, logs_js_1.resetBrowserLogs)();
149
294
  }
150
295
  /**
151
296
  * Derive environment from hostname.