@dxos/observability 0.8.4-main.ef1bc66f44 → 0.8.4-main.f466a3d56e

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 (133) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +14 -11
  3. package/dist/lib/browser/{chunk-K4VFBKST.mjs → chunk-PSFTIG54.mjs} +9 -2
  4. package/dist/lib/browser/chunk-PSFTIG54.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +181 -283
  6. package/dist/lib/browser/index.mjs.map +4 -4
  7. package/dist/lib/browser/{log-processor-FDLTDQEM.mjs → log-processor-HPHWNBOK.mjs} +11 -18
  8. package/dist/lib/browser/log-processor-HPHWNBOK.mjs.map +7 -0
  9. package/dist/lib/browser/{logs-ATTRIUTL.mjs → logs-UTNIFYHF.mjs} +7 -4
  10. package/dist/lib/browser/logs-UTNIFYHF.mjs.map +7 -0
  11. package/dist/lib/browser/meta.json +1 -1
  12. package/dist/lib/browser/{metrics-PKTV6IGF.mjs → metrics-PRGSYAZJ.mjs} +7 -21
  13. package/dist/lib/browser/metrics-PRGSYAZJ.mjs.map +7 -0
  14. package/dist/lib/browser/traces-browser-XRINKQUA.mjs +154 -0
  15. package/dist/lib/browser/traces-browser-XRINKQUA.mjs.map +7 -0
  16. package/dist/lib/node-esm/{chunk-FEVP3MK4.mjs → chunk-EDDZWPYV.mjs} +9 -2
  17. package/dist/lib/node-esm/chunk-EDDZWPYV.mjs.map +7 -0
  18. package/dist/lib/node-esm/index.mjs +166 -250
  19. package/dist/lib/node-esm/index.mjs.map +4 -4
  20. package/dist/lib/node-esm/{log-processor-TKJVJJSJ.mjs → log-processor-ZODHERST.mjs} +11 -18
  21. package/dist/lib/node-esm/log-processor-ZODHERST.mjs.map +7 -0
  22. package/dist/lib/node-esm/{logs-7J45KLM7.mjs → logs-ARJUVN3T.mjs} +7 -4
  23. package/dist/lib/node-esm/logs-ARJUVN3T.mjs.map +7 -0
  24. package/dist/lib/node-esm/meta.json +1 -1
  25. package/dist/lib/node-esm/{metrics-H7DDLYSG.mjs → metrics-DREJOOAC.mjs} +7 -21
  26. package/dist/lib/node-esm/metrics-DREJOOAC.mjs.map +7 -0
  27. package/dist/lib/node-esm/traces-74F7JUKF.mjs +125 -0
  28. package/dist/lib/node-esm/traces-74F7JUKF.mjs.map +7 -0
  29. package/dist/types/src/cli-observability-secrets.json +2 -2
  30. package/dist/types/src/extensions/otel/extension.d.ts.map +1 -1
  31. package/dist/types/src/extensions/otel/extension.js +112 -16
  32. package/dist/types/src/extensions/otel/extension.js.map +1 -1
  33. package/dist/types/src/extensions/otel/logs.d.ts.map +1 -1
  34. package/dist/types/src/extensions/otel/logs.js +6 -3
  35. package/dist/types/src/extensions/otel/logs.js.map +1 -1
  36. package/dist/types/src/extensions/otel/metrics.d.ts.map +1 -1
  37. package/dist/types/src/extensions/otel/metrics.js +2 -2
  38. package/dist/types/src/extensions/otel/metrics.js.map +1 -1
  39. package/dist/types/src/extensions/otel/otel.d.ts +7 -0
  40. package/dist/types/src/extensions/otel/otel.d.ts.map +1 -1
  41. package/dist/types/src/extensions/otel/otel.js +12 -0
  42. package/dist/types/src/extensions/otel/otel.js.map +1 -1
  43. package/dist/types/src/extensions/otel/span-processors.d.ts +25 -0
  44. package/dist/types/src/extensions/otel/span-processors.d.ts.map +1 -0
  45. package/dist/types/src/extensions/otel/span-processors.js +41 -0
  46. package/dist/types/src/extensions/otel/span-processors.js.map +1 -0
  47. package/dist/types/src/extensions/otel/traces-browser.d.ts +17 -0
  48. package/dist/types/src/extensions/otel/traces-browser.d.ts.map +1 -1
  49. package/dist/types/src/extensions/otel/traces-browser.js +73 -12
  50. package/dist/types/src/extensions/otel/traces-browser.js.map +1 -1
  51. package/dist/types/src/extensions/otel/traces.d.ts +17 -0
  52. package/dist/types/src/extensions/otel/traces.d.ts.map +1 -1
  53. package/dist/types/src/extensions/otel/traces.js +59 -9
  54. package/dist/types/src/extensions/otel/traces.js.map +1 -1
  55. package/dist/types/src/extensions/posthog/extension.d.ts +13 -0
  56. package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -1
  57. package/dist/types/src/extensions/posthog/extension.js +41 -28
  58. package/dist/types/src/extensions/posthog/extension.js.map +1 -1
  59. package/dist/types/src/extensions/posthog/log-processor.d.ts.map +1 -1
  60. package/dist/types/src/extensions/posthog/log-processor.js +10 -19
  61. package/dist/types/src/extensions/posthog/log-processor.js.map +1 -1
  62. package/dist/types/src/extensions/posthog/log-processor.test.js +2 -2
  63. package/dist/types/src/extensions/posthog/log-processor.test.js.map +1 -1
  64. package/dist/types/src/index.d.ts +0 -1
  65. package/dist/types/src/index.d.ts.map +1 -1
  66. package/dist/types/src/index.js +0 -1
  67. package/dist/types/src/index.js.map +1 -1
  68. package/dist/types/src/observability-extension.d.ts +1 -1
  69. package/dist/types/src/observability-extension.d.ts.map +1 -1
  70. package/dist/types/src/observability.d.ts.map +1 -1
  71. package/dist/types/src/observability.js +4 -2
  72. package/dist/types/src/observability.js.map +1 -1
  73. package/dist/types/src/observability.test.js +1 -1
  74. package/dist/types/src/observability.test.js.map +1 -1
  75. package/dist/types/src/providers/client-observability.d.ts.map +1 -1
  76. package/dist/types/src/providers/client-observability.js +2 -0
  77. package/dist/types/src/providers/client-observability.js.map +1 -1
  78. package/dist/types/src/providers/ip-data.d.ts.map +1 -1
  79. package/dist/types/src/providers/ip-data.js +4 -2
  80. package/dist/types/src/providers/ip-data.js.map +1 -1
  81. package/dist/types/src/storage/browser.d.ts.map +1 -1
  82. package/dist/types/src/storage/browser.js +15 -4
  83. package/dist/types/src/storage/browser.js.map +1 -1
  84. package/dist/types/src/storage/node.d.ts.map +1 -1
  85. package/dist/types/src/storage/node.js +1 -1
  86. package/dist/types/src/storage/node.js.map +1 -1
  87. package/dist/types/src/storage/node.test.js +1 -1
  88. package/dist/types/src/storage/node.test.js.map +1 -1
  89. package/dist/types/tsconfig.tsbuildinfo +1 -1
  90. package/package.json +36 -32
  91. package/src/cli-observability-secrets.json +2 -2
  92. package/src/extensions/otel/extension.ts +118 -17
  93. package/src/extensions/otel/logs.ts +6 -3
  94. package/src/extensions/otel/metrics.ts +2 -2
  95. package/src/extensions/otel/otel.ts +13 -0
  96. package/src/extensions/otel/span-processors.ts +45 -0
  97. package/src/extensions/otel/traces-browser.ts +95 -13
  98. package/src/extensions/otel/traces.ts +76 -12
  99. package/src/extensions/posthog/extension.ts +54 -27
  100. package/src/extensions/posthog/log-processor.test.ts +7 -6
  101. package/src/extensions/posthog/log-processor.ts +10 -21
  102. package/src/index.ts +0 -1
  103. package/src/observability-extension.ts +1 -1
  104. package/src/observability.test.ts +1 -1
  105. package/src/observability.ts +4 -2
  106. package/src/providers/client-observability.ts +2 -0
  107. package/src/providers/ip-data.ts +5 -2
  108. package/src/storage/browser.ts +14 -4
  109. package/src/storage/node.test.ts +1 -2
  110. package/src/storage/node.ts +1 -2
  111. package/src/vite-import-meta.d.ts +14 -0
  112. package/dist/lib/browser/chunk-K4VFBKST.mjs.map +0 -7
  113. package/dist/lib/browser/log-processor-FDLTDQEM.mjs.map +0 -7
  114. package/dist/lib/browser/logs-ATTRIUTL.mjs.map +0 -7
  115. package/dist/lib/browser/metrics-PKTV6IGF.mjs.map +0 -7
  116. package/dist/lib/browser/traces-browser-XYXBF5ZX.mjs +0 -62
  117. package/dist/lib/browser/traces-browser-XYXBF5ZX.mjs.map +0 -7
  118. package/dist/lib/node-esm/chunk-FEVP3MK4.mjs.map +0 -7
  119. package/dist/lib/node-esm/log-processor-TKJVJJSJ.mjs.map +0 -7
  120. package/dist/lib/node-esm/logs-7J45KLM7.mjs.map +0 -7
  121. package/dist/lib/node-esm/metrics-H7DDLYSG.mjs.map +0 -7
  122. package/dist/lib/node-esm/traces-KMTHMYFX.mjs +0 -44
  123. package/dist/lib/node-esm/traces-KMTHMYFX.mjs.map +0 -7
  124. package/dist/types/src/log-buffer.d.ts +0 -34
  125. package/dist/types/src/log-buffer.d.ts.map +0 -1
  126. package/dist/types/src/log-buffer.js +0 -70
  127. package/dist/types/src/log-buffer.js.map +0 -1
  128. package/dist/types/src/log-buffer.test.d.ts +0 -2
  129. package/dist/types/src/log-buffer.test.d.ts.map +0 -1
  130. package/dist/types/src/log-buffer.test.js +0 -107
  131. package/dist/types/src/log-buffer.test.js.map +0 -1
  132. package/src/log-buffer.test.ts +0 -134
  133. package/src/log-buffer.ts +0 -101
@@ -2,69 +2,6 @@ import {
2
2
  __export
3
3
  } from "./chunk-J5LGTIGS.mjs";
4
4
 
5
- // src/log-buffer.ts
6
- import { LogLevel, shortLevelName } from "@dxos/log";
7
- import { CircularBuffer } from "@dxos/util";
8
- var DEFAULT_BUFFER_SIZE = 2e3;
9
- var MAX_CONTEXT_LENGTH = 500;
10
- var LogBuffer = class {
11
- _buffer;
12
- constructor(size = DEFAULT_BUFFER_SIZE) {
13
- this._buffer = new CircularBuffer(size);
14
- }
15
- /** Log processor that can be registered with `log.runtimeConfig.processors`. */
16
- logProcessor = (_config, entry) => {
17
- if (entry.level <= LogLevel.TRACE) {
18
- return;
19
- }
20
- const record = {
21
- t: (/* @__PURE__ */ new Date()).toISOString(),
22
- l: shortLevelName[entry.level] ?? "?",
23
- m: entry.message ?? ""
24
- };
25
- if (entry.meta) {
26
- record.f = getRelativeFilename(entry.meta.F);
27
- record.n = entry.meta.L;
28
- }
29
- if (entry.error) {
30
- record.e = entry.error.stack ?? entry.error.message;
31
- }
32
- if (entry.context != null) {
33
- try {
34
- const ctx = typeof entry.context === "function" ? entry.context() : entry.context;
35
- if (ctx != null && !(ctx instanceof Error)) {
36
- let json = JSON.stringify(ctx);
37
- if (json.length > MAX_CONTEXT_LENGTH) {
38
- json = json.slice(0, MAX_CONTEXT_LENGTH);
39
- }
40
- record.c = json;
41
- }
42
- } catch {
43
- }
44
- }
45
- this._buffer.push(record);
46
- };
47
- /** Number of entries currently in the buffer. */
48
- get size() {
49
- return this._buffer.elementCount;
50
- }
51
- /** Serialize buffer contents as NDJSON (newline-delimited JSON). */
52
- serialize() {
53
- const lines = [];
54
- for (const record of this._buffer) {
55
- lines.push(JSON.stringify(record));
56
- }
57
- return lines.join("\n");
58
- }
59
- };
60
- var getRelativeFilename = (filename) => {
61
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
62
- if (match) {
63
- return match[1];
64
- }
65
- return filename;
66
- };
67
-
68
5
  // src/observability.ts
69
6
  var observability_exports = {};
70
7
  __export(observability_exports, {
@@ -88,64 +25,46 @@ import { log as log2 } from "@dxos/log";
88
25
  // src/storage/browser.ts
89
26
  import * as localForage from "localforage";
90
27
  import { log } from "@dxos/log";
28
+ import { compositeKey } from "@dxos/util";
91
29
  var __dxlog_file = "/__w/dxos/dxos/packages/sdk/observability/src/storage/browser.ts";
92
30
  var OBSERVABILITY_DISABLED_KEY = "observability-disabled";
93
31
  var OBSERVABILITY_GROUP_KEY = "observability-group";
94
32
  var showObservabilityBanner = () => {
95
- log.warn("showObservabilityBanner is not supported in browser contexts.", void 0, {
96
- F: __dxlog_file,
97
- L: 15,
98
- S: void 0,
99
- C: (f, a) => f(...a)
100
- });
33
+ log.warn("showObservabilityBanner is not supported in browser contexts.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 11, S: void 0 });
101
34
  };
102
35
  var isObservabilityDisabled = async (namespace) => {
103
36
  try {
104
- return await localForage.getItem(`${namespace}:${OBSERVABILITY_DISABLED_KEY}`) === "true";
37
+ return await localForage.getItem(compositeKey(namespace, OBSERVABILITY_DISABLED_KEY)) === "true";
105
38
  } catch (err) {
106
- log.catch("Failed to check if observability is disabled, assuming it is", err, {
107
- F: __dxlog_file,
108
- L: 25,
109
- S: void 0,
110
- C: (f, a) => f(...a)
111
- });
39
+ log.catch("Failed to check if observability is disabled, assuming it is", err, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 19, S: void 0 });
112
40
  return true;
113
41
  }
114
42
  };
115
43
  var storeObservabilityDisabled = async (namespace, value2) => {
116
44
  try {
117
- await localForage.setItem(`${namespace}:${OBSERVABILITY_DISABLED_KEY}`, String(value2));
45
+ await localForage.setItem(compositeKey(namespace, OBSERVABILITY_DISABLED_KEY), String(value2));
118
46
  } catch (err) {
119
- log.catch("Failed to store observability disabled", err, {
120
- F: __dxlog_file,
121
- L: 37,
122
- S: void 0,
123
- C: (f, a) => f(...a)
124
- });
47
+ log.catch("Failed to store observability disabled", err, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 29, S: void 0 });
48
+ }
49
+ try {
50
+ if (typeof localStorage !== "undefined") {
51
+ localStorage.setItem(`${namespace}/${OBSERVABILITY_DISABLED_KEY}`, String(value2));
52
+ }
53
+ } catch {
125
54
  }
126
55
  };
127
56
  var getObservabilityGroup = async (namespace) => {
128
57
  try {
129
- return await localForage.getItem(`${namespace}:${OBSERVABILITY_GROUP_KEY}`) ?? void 0;
58
+ return await localForage.getItem(compositeKey(namespace, OBSERVABILITY_GROUP_KEY)) ?? void 0;
130
59
  } catch (err) {
131
- log.catch("Failed to get observability group", err, {
132
- F: __dxlog_file,
133
- L: 48,
134
- S: void 0,
135
- C: (f, a) => f(...a)
136
- });
60
+ log.catch("Failed to get observability group", err, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 47, S: void 0 });
137
61
  }
138
62
  };
139
63
  var storeObservabilityGroup = async (namespace, value2) => {
140
64
  try {
141
- await localForage.setItem(`${namespace}:${OBSERVABILITY_GROUP_KEY}`, value2);
65
+ await localForage.setItem(compositeKey(namespace, OBSERVABILITY_GROUP_KEY), value2);
142
66
  } catch (err) {
143
- log.catch("Failed to store observability group", err, {
144
- F: __dxlog_file,
145
- L: 59,
146
- S: void 0,
147
- C: (f, a) => f(...a)
148
- });
67
+ log.catch("Failed to store observability group", err, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 56, S: void 0 });
149
68
  }
150
69
  };
151
70
 
@@ -172,12 +91,7 @@ var ObservabilityImpl = class {
172
91
  this._subscriptions.add(...cleanups.filter((cleanup) => cleanup !== void 0));
173
92
  this._initialized = true;
174
93
  }).pipe(Effect.catchAll((error) => Effect.gen(this, function* () {
175
- log2.catch(error, void 0, {
176
- F: __dxlog_file2,
177
- L: 85,
178
- S: this,
179
- C: (f, a) => f(...a)
180
- });
94
+ log2.catch(error, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 32, S: this });
181
95
  for (const extension of initializedExtensions) {
182
96
  if (extension.close) {
183
97
  yield* extension.close().pipe(Effect.catchAll(() => Effect.succeed(void 0)));
@@ -226,27 +140,11 @@ var ObservabilityImpl = class {
226
140
  });
227
141
  }
228
142
  _addExtension(extension) {
229
- invariant(!this._initialized, "Observability is already initialized", {
230
- F: __dxlog_file2,
231
- L: 142,
232
- S: this,
233
- A: [
234
- "!this._initialized",
235
- "'Observability is already initialized'"
236
- ]
237
- });
143
+ invariant(!this._initialized, "Observability is already initialized", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 82, S: this, A: ["!this._initialized", "'Observability is already initialized'"] });
238
144
  this._extensions.push(extension);
239
145
  }
240
146
  _addDataProvider(dataProvider) {
241
- invariant(!this._initialized, "Observability is already initialized", {
242
- F: __dxlog_file2,
243
- L: 147,
244
- S: this,
245
- A: [
246
- "!this._initialized",
247
- "'Observability is already initialized'"
248
- ]
249
- });
147
+ invariant(!this._initialized, "Observability is already initialized", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 86, S: this, A: ["!this._initialized", "'Observability is already initialized'"] });
250
148
  this._dataProviders.push(dataProvider);
251
149
  }
252
150
  /**
@@ -306,10 +204,12 @@ var ObservabilityImpl = class {
306
204
  }
307
205
  get feedback() {
308
206
  return {
309
- captureUserFeedback: (form) => {
207
+ captureUserFeedback: async (form) => {
208
+ let eventUuid;
310
209
  for (const extension of this._getExtensions("feedback")) {
311
- extension.captureUserFeedback(form);
210
+ eventUuid = await extension.captureUserFeedback(form) ?? eventUuid;
312
211
  }
212
+ return eventUuid;
313
213
  }
314
214
  };
315
215
  }
@@ -355,29 +255,13 @@ var make = () => Effect.succeed(new ObservabilityImpl());
355
255
  var addExtension = (_extension) => Effect.fn(function* (_observability) {
356
256
  const observability = yield* _observability;
357
257
  const extension = yield* _extension;
358
- invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, {
359
- F: __dxlog_file2,
360
- L: 276,
361
- S: this,
362
- A: [
363
- "'_addExtension' in observability && typeof observability._addExtension === 'function'",
364
- ""
365
- ]
366
- });
258
+ invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 196, S: this, A: ["'_addExtension' in observability && typeof observability._addExtension === 'function'", ""] });
367
259
  observability._addExtension(extension);
368
260
  return observability;
369
261
  });
370
262
  var addDataProvider = (dataProvider) => Effect.fn(function* (_observability) {
371
263
  const observability = yield* _observability;
372
- invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, {
373
- F: __dxlog_file2,
374
- L: 284,
375
- S: this,
376
- A: [
377
- "'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'",
378
- ""
379
- ]
380
- });
264
+ invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 202, S: this, A: ["'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'", ""] });
381
265
  observability._addDataProvider(dataProvider);
382
266
  return observability;
383
267
  });
@@ -407,15 +291,16 @@ import * as Effect3 from "effect/Effect";
407
291
  import * as Match from "effect/Match";
408
292
  import * as Option from "effect/Option";
409
293
  import * as Ref from "effect/Ref";
410
- import { LogLevel as LogLevel2, log as log3 } from "@dxos/log";
294
+ import { resolveTelemetryTag } from "@dxos/config";
295
+ import { LogLevel, log as log3 } from "@dxos/log";
411
296
  import { isNode, isNonNullable } from "@dxos/util";
412
297
 
413
298
  // src/cli-observability-secrets.json
414
299
  var cli_observability_secrets_default = {
415
300
  POSTHOG_API_KEY: null,
416
301
  IPDATA_API_KEY: "73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786",
417
- OTEL_ENDPOINT: "https://ingest.eu.signoz.cloud:443",
418
- OTEL_HEADERS: "signoz-ingestion-key: 5300e0c9-a5e8-4a10-9c61-f473e539c0b7"
302
+ OTEL_ENDPOINT: "/api/otel",
303
+ OTEL_HEADERS: null
419
304
  };
420
305
 
421
306
  // src/extensions/stub.ts
@@ -446,53 +331,64 @@ var extensions = Effect3.fn(function* ({
446
331
  // - logs should be cached locally in a circular buffer
447
332
  // - logs should be flushed to the server if user opts to include them in a bug report
448
333
  logs: logsEnabled = false,
449
- logLevel = LogLevel2.INFO,
334
+ logLevel = LogLevel.INFO,
450
335
  metrics: metricsEnabled = false,
451
336
  traces: tracesEnabled = false
452
337
  }) {
453
- const { OtelLogs } = yield* Effect3.promise(() => import("./logs-ATTRIUTL.mjs"));
454
- const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-PKTV6IGF.mjs"));
455
- const { OtelTraces } = yield* Effect3.promise(() => import("./traces-browser-XYXBF5ZX.mjs"));
338
+ const { OtelLogs } = yield* Effect3.promise(() => import("./logs-UTNIFYHF.mjs"));
339
+ const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-PRGSYAZJ.mjs"));
340
+ const { OtelTraces } = yield* Effect3.promise(() => import("./traces-browser-XRINKQUA.mjs"));
456
341
  const cachedDisabled = yield* Effect3.promise(() => isObservabilityDisabled(serviceName));
457
- const enabledRef = yield* Ref.make(!cachedDisabled);
342
+ const disabled = cachedDisabled || isObservabilityDisabledSync(serviceName);
343
+ const enabledRef = yield* Ref.make(!disabled);
458
344
  const tags = /* @__PURE__ */ new Map();
459
- const endpoint = isNode() ? process.env.DX_OTEL_ENDPOINT ?? _endpoint ?? cli_observability_secrets_default.OTEL_ENDPOINT : config.values.runtime?.app?.env?.DX_OTEL_ENDPOINT;
345
+ const rawEndpoint = isNode() ? process.env.DX_OTEL_ENDPOINT ?? _endpoint ?? cli_observability_secrets_default.OTEL_ENDPOINT : config.values.runtime?.app?.env?.DX_OTEL_ENDPOINT ?? _endpoint;
346
+ const endpoint = !isNode() && rawEndpoint?.startsWith("/") ? resolveRelativeEndpoint(rawEndpoint) : rawEndpoint;
460
347
  const headers = _headers ?? Match.value(isNode()).pipe(Match.when(true, () => Option.fromNullable(process.env.DX_OTEL_HEADERS ?? cli_observability_secrets_default.OTEL_HEADERS)), Match.when(false, () => Option.fromNullable(config.values.runtime?.app?.env?.DX_OTEL_HEADERS)), Match.exhaustive, Option.map((raw) => parseHeaders(raw)), Option.getOrElse(() => void 0));
461
- if (!endpoint || !headers) {
462
- log3.info("Missing OTEL_ENDPOINT or OTEL_HEADERS", void 0, {
463
- F: __dxlog_file3,
464
- L: 77,
465
- S: this,
466
- C: (f, a) => f(...a)
467
- });
348
+ if (!endpoint) {
349
+ log3.info("Missing OTEL_ENDPOINT", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 35, S: this });
468
350
  return stubExtension;
469
351
  }
352
+ const resolvedHeaders = headers ?? {};
353
+ const resolvedEndpoint = !isNode() && endpoint.startsWith("/") ? `${globalThis.location.origin}${endpoint}` : endpoint;
354
+ const clientTag = resolveTelemetryTag(config);
355
+ if (clientTag) {
356
+ tags.set("ctx.tag", clientTag);
357
+ }
470
358
  const resource = defaultResource().merge(resourceFromAttributes({
471
359
  [ATTR_SERVICE_NAME]: serviceName,
472
360
  [ATTR_SERVICE_VERSION]: serviceVersion,
473
- "deployment.environment": environment
361
+ "session.id": crypto.randomUUID(),
362
+ "deployment.environment": environment,
363
+ "dxos.process.type": detectProcessType(),
364
+ ...clientTag ? {
365
+ "ctx.tag": clientTag
366
+ } : {}
474
367
  }));
475
368
  const logs = logsEnabled ? new OtelLogs({
476
- endpoint,
477
- headers,
369
+ endpoint: resolvedEndpoint,
370
+ headers: resolvedHeaders,
478
371
  resource,
479
372
  getTags: () => Object.fromEntries(tags),
480
373
  logLevel
481
374
  }) : void 0;
482
375
  const metrics = metricsEnabled ? new OtelMetrics({
483
- endpoint,
484
- headers,
376
+ endpoint: resolvedEndpoint,
377
+ headers: resolvedHeaders,
485
378
  resource,
486
379
  getTags: () => Object.fromEntries(tags)
487
380
  }) : void 0;
488
381
  const traces = tracesEnabled ? new OtelTraces({
489
- endpoint,
490
- headers,
382
+ endpoint: resolvedEndpoint,
383
+ headers: resolvedHeaders,
491
384
  resource,
492
385
  getTags: () => Object.fromEntries(tags)
493
386
  }) : void 0;
494
- return {
387
+ const extension = {
495
388
  initialize: () => Effect3.sync(() => {
389
+ if (disabled) {
390
+ return;
391
+ }
496
392
  if (logs) {
497
393
  log3.runtimeConfig.processors.push(logs.logProcessor);
498
394
  }
@@ -509,12 +405,28 @@ var extensions = Effect3.fn(function* ({
509
405
  yield* Ref.update(enabledRef, () => false);
510
406
  }),
511
407
  close: () => Effect3.promise(async () => {
512
- await logs?.close();
513
- await metrics?.close();
408
+ const results = await Promise.allSettled([
409
+ logs?.close(),
410
+ metrics?.close()
411
+ ]);
412
+ for (const result of results) {
413
+ if (result.status === "rejected") {
414
+ log3.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 120, S: this });
415
+ }
416
+ }
417
+ await traces?.close();
514
418
  }),
515
419
  flush: () => Effect3.promise(async () => {
516
- await logs?.flush();
517
- await metrics?.flush();
420
+ const results = await Promise.allSettled([
421
+ logs?.flush(),
422
+ metrics?.flush()
423
+ ]);
424
+ for (const result of results) {
425
+ if (result.status === "rejected") {
426
+ log3.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 135, S: this });
427
+ }
428
+ }
429
+ await traces?.flush();
518
430
  }),
519
431
  setTags: (incomingTags) => {
520
432
  for (const [key, value2] of Object.entries(incomingTags)) {
@@ -542,7 +454,39 @@ var extensions = Effect3.fn(function* ({
542
454
  } : void 0
543
455
  ].filter(isNonNullable)
544
456
  };
457
+ return extension;
545
458
  });
459
+ var isObservabilityDisabledSync = (serviceName) => {
460
+ if (isNode()) {
461
+ return process.env.DX_DISABLE_OBSERVABILITY === "true";
462
+ }
463
+ try {
464
+ if (typeof localStorage !== "undefined") {
465
+ return localStorage.getItem(`${serviceName}/observability-disabled`) === "true";
466
+ }
467
+ } catch {
468
+ }
469
+ return false;
470
+ };
471
+ var detectProcessType = () => {
472
+ if (isNode()) {
473
+ return "node";
474
+ }
475
+ if (typeof window !== "undefined") {
476
+ return "browser";
477
+ }
478
+ if (typeof globalThis.ServiceWorkerGlobalScope !== "undefined") {
479
+ return "service-worker";
480
+ }
481
+ if (typeof globalThis.SharedWorkerGlobalScope !== "undefined") {
482
+ return "shared-worker";
483
+ }
484
+ return "dedicated-worker";
485
+ };
486
+ var resolveRelativeEndpoint = (path) => {
487
+ const origin = globalThis.location?.origin;
488
+ return origin ? `${origin}${path}` : path;
489
+ };
546
490
  var parseHeaders = (unparsedHeaders) => {
547
491
  return unparsedHeaders.split(";").reduce((acc, header) => {
548
492
  const [key, ...rest] = header.split(":");
@@ -575,12 +519,7 @@ var uploadLogs = async (body) => {
575
519
  if (!response.ok) {
576
520
  log4.warn("feedback log upload failed", {
577
521
  status: response.status
578
- }, {
579
- F: __dxlog_file4,
580
- L: 33,
581
- S: void 0,
582
- C: (f, a) => f(...a)
583
- });
522
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 17, S: void 0 });
584
523
  return void 0;
585
524
  }
586
525
  const { key } = await response.json();
@@ -588,41 +527,26 @@ var uploadLogs = async (body) => {
588
527
  } catch (err) {
589
528
  log4.warn("feedback log upload error", {
590
529
  error: err
591
- }, {
592
- F: __dxlog_file4,
593
- L: 39,
594
- S: void 0,
595
- C: (f, a) => f(...a)
596
- });
530
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 25, S: void 0 });
597
531
  return void 0;
598
532
  }
599
533
  };
600
- var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig }) {
534
+ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig, logStore, feedbackLogMaxSize }) {
601
535
  if (typeof window === "undefined") {
602
- log4("PostHog is being stubbed because it is running in a worker.", void 0, {
603
- F: __dxlog_file4,
604
- L: 52,
605
- S: this,
606
- C: (f, a) => f(...a)
607
- });
536
+ log4("PostHog is being stubbed because it is running in a worker.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 33, S: this });
608
537
  return stubExtension;
609
538
  }
610
539
  const feedbackSurveyId = config.get("runtime.app.env.DX_POSTHOG_FEEDBACK_SURVEY_ID");
611
540
  const apiKey = config.get("runtime.app.env.DX_POSTHOG_API_KEY");
612
541
  const api_host = config.get("runtime.app.env.DX_POSTHOG_API_HOST");
613
542
  if (!apiKey || !api_host) {
614
- log4.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, {
615
- F: __dxlog_file4,
616
- L: 60,
617
- S: this,
618
- C: (f, a) => f(...a)
619
- });
543
+ log4.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 40, S: this });
620
544
  return stubExtension;
621
545
  }
622
546
  const { default: posthog } = yield* Effect4.promise(() => import("posthog-js"));
623
- const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-FDLTDQEM.mjs"));
624
- const logBuffer = new LogBuffer();
547
+ const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-HPHWNBOK.mjs"));
625
548
  let feedbackSurveyAvailable = null;
549
+ let unregisterPosthogProcessors;
626
550
  const checkFeedbackSurveyAvailable = () => feedbackSurveyId ? Effect4.promise(() => {
627
551
  if (feedbackSurveyAvailable !== null) {
628
552
  return Promise.resolve(feedbackSurveyAvailable);
@@ -653,19 +577,15 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
653
577
  } : {}
654
578
  });
655
579
  }
656
- log4.runtimeConfig.processors.push(logProcessor);
657
- log4.runtimeConfig.processors.push(logBuffer.logProcessor);
580
+ unregisterPosthogProcessors?.();
581
+ const removePosthogLog = log4.addProcessor(logProcessor, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 79, S: this });
582
+ unregisterPosthogProcessors = () => {
583
+ removePosthogLog();
584
+ };
658
585
  }),
659
586
  close: () => Effect4.sync(() => {
660
- for (const processor of [
661
- logProcessor,
662
- logBuffer.logProcessor
663
- ]) {
664
- const index = log4.runtimeConfig.processors.indexOf(processor);
665
- if (index !== -1) {
666
- log4.runtimeConfig.processors.splice(index, 1);
667
- }
668
- }
587
+ unregisterPosthogProcessors?.();
588
+ unregisterPosthogProcessors = void 0;
669
589
  }),
670
590
  enable: () => Effect4.sync(() => posthog.opt_in_capturing()),
671
591
  disable: () => Effect4.sync(() => posthog.opt_out_capturing()),
@@ -700,36 +620,47 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
700
620
  kind: "feedback",
701
621
  // TODO(wittjosiah): Support custom surveys.
702
622
  captureUserFeedback: (form) => {
703
- posthog.getSurveys(async (surveys) => {
704
- const survey = surveys.find((survey2) => survey2.id === feedbackSurveyId);
705
- if (!survey || survey.questions.length === 0) {
706
- log4.error("Missing feedback survey or survey has no questions", {
707
- feedbackSurveyId
708
- }, {
709
- F: __dxlog_file4,
710
- L: 149,
711
- S: this,
712
- C: (f, a) => f(...a)
713
- });
714
- return;
715
- }
716
- let debugLogDumpKey;
717
- if (form.includeLogs !== false && logBuffer.size > 0) {
718
- debugLogDumpKey = await uploadLogs(logBuffer.serialize());
719
- }
720
- const question = survey.questions[0];
721
- posthog.capture("survey sent", {
722
- $survey_id: survey.id,
723
- $survey_questions: [
724
- {
725
- id: question.id,
726
- question: question.question
623
+ return new Promise((resolve, reject) => {
624
+ posthog.getSurveys((surveys) => {
625
+ void (async () => {
626
+ try {
627
+ const survey = surveys.find((survey2) => survey2.id === feedbackSurveyId);
628
+ if (!survey || survey.questions.length === 0) {
629
+ log4.error("Missing feedback survey or survey has no questions", {
630
+ feedbackSurveyId
631
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 127, S: this });
632
+ resolve(void 0);
633
+ return;
634
+ }
635
+ let debugLogDumpKey = null;
636
+ if (form.includeLogs !== false && logStore !== void 0) {
637
+ const ndjson = await logStore.export({
638
+ maxSize: feedbackLogMaxSize
639
+ });
640
+ if (ndjson.length > 0) {
641
+ debugLogDumpKey = await uploadLogs(ndjson) ?? "failed";
642
+ }
643
+ }
644
+ const question = survey.questions[0];
645
+ const result = posthog.capture("survey sent", {
646
+ $survey_id: survey.id,
647
+ $survey_questions: [
648
+ {
649
+ id: question.id,
650
+ question: question.question
651
+ }
652
+ ],
653
+ [`$survey_response_${question.id}`]: form.message,
654
+ debug_log_dump_key: debugLogDumpKey
655
+ });
656
+ resolve(result?.uuid);
657
+ } catch (err) {
658
+ log4.error("Failed to capture user feedback", {
659
+ err
660
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 157, S: this });
661
+ reject(err);
727
662
  }
728
- ],
729
- [`$survey_response_${question.id}`]: form.message,
730
- ...debugLogDumpKey ? {
731
- debug_log_dump_key: debugLogDumpKey
732
- } : {}
663
+ })();
733
664
  });
734
665
  });
735
666
  },
@@ -795,19 +726,11 @@ var identityProvider = (clientServices) => Effect5.fn(function* (observability)
795
726
  });
796
727
  });
797
728
  var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
798
- const ctx = new Context(void 0, {
799
- F: __dxlog_file5,
800
- L: 61
801
- });
729
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 50 });
802
730
  let lastNetworkStatus;
803
731
  const updateSignalMetrics = new Event().debounce(NETWORK_METRICS_MIN_INTERVAL);
804
732
  updateSignalMetrics.on(ctx, async () => {
805
- log5("send signal metrics", void 0, {
806
- F: __dxlog_file5,
807
- L: 67,
808
- S: this,
809
- C: (f, a) => f(...a)
810
- });
733
+ log5("send signal metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 55, S: this });
811
734
  lastNetworkStatus?.signaling?.forEach(({ server, state }) => {
812
735
  observability.metrics.gauge("dxos.client.network.signal.connectionState", state, {
813
736
  server
@@ -852,20 +775,11 @@ var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
852
775
  };
853
776
  });
854
777
  var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
855
- const ctx = new Context(void 0, {
856
- F: __dxlog_file5,
857
- L: 121
858
- });
778
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 100 });
779
+ log5("runtimeMetricsProvider: requesting platform from SystemService", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 101, S: this });
859
780
  const platform = yield* Effect5.promise(() => clientServices.SystemService.getPlatform());
860
- invariant2(platform, "platform is required", {
861
- F: __dxlog_file5,
862
- L: 123,
863
- S: this,
864
- A: [
865
- "platform",
866
- "'platform is required'"
867
- ]
868
- });
781
+ log5("runtimeMetricsProvider: platform received", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 103, S: this });
782
+ invariant2(platform, "platform is required", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 104, S: this, A: ["platform", "'platform is required'"] });
869
783
  observability.setTags({
870
784
  platformType: Platform.PLATFORM_TYPE[platform.type].toLowerCase(),
871
785
  platform: platform.platform,
@@ -889,33 +803,20 @@ var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
889
803
  }
890
804
  }).catch((error) => log5("platform error", {
891
805
  error
892
- }, {
893
- F: __dxlog_file5,
894
- L: 152,
895
- S: this,
896
- C: (f, a) => f(...a)
897
- }));
806
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 126, S: this }));
898
807
  }, RUNTIME_METRICS_MIN_INTERVAL);
899
808
  return async () => {
900
809
  await ctx.dispose();
901
810
  };
902
811
  });
903
812
  var spacesMetricsProvider = (client) => Effect5.fn(function* (observability) {
904
- const ctx = new Context(void 0, {
905
- F: __dxlog_file5,
906
- L: 165
907
- });
813
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 135 });
908
814
  const spaces = client.spaces.get();
909
815
  const subscriptions = /* @__PURE__ */ new Map();
910
816
  ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));
911
817
  const updateSpaceMetrics = new Event().debounce(SPACE_METRICS_MIN_INTERVAL);
912
818
  updateSpaceMetrics.on(ctx, async () => {
913
- log5("send space metrics", void 0, {
914
- F: __dxlog_file5,
915
- L: 173,
916
- S: this,
917
- C: (f, a) => f(...a)
918
- });
819
+ log5("send space metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 142, S: this });
919
820
  for (const data of mapSpaces(spaces, {
920
821
  truncateKeys: true
921
822
  })) {
@@ -1006,13 +907,14 @@ var IPData = Schema.Struct({
1006
907
  });
1007
908
  var getIPData = Effect6.fn(function* (config) {
1008
909
  const httpClient = yield* HttpClient.HttpClient;
910
+ const httpClientNoTrace = httpClient.pipe(HttpClient.withTracerDisabledWhen(() => true));
1009
911
  const cachedData = yield* Effect6.promise(() => localForage2.getItem("dxos:observability:ipdata"));
1010
912
  if (cachedData && cachedData.timestamp > Date.now() - IP_DATA_CACHE_TIMEOUT) {
1011
913
  return cachedData.data;
1012
914
  }
1013
915
  const IPDATA_API_KEY = config.get("runtime.app.env.DX_IPDATA_API_KEY");
1014
916
  if (IPDATA_API_KEY) {
1015
- const data = yield* HttpClientRequest.get(`https://api.ipdata.co?api-key=${IPDATA_API_KEY}`).pipe(httpClient.execute, Effect6.flatMap((res) => res.json), Effect6.flatMap(Schema.decodeUnknown(IPData)));
917
+ const data = yield* HttpClientRequest.get(`https://api.ipdata.co?api-key=${IPDATA_API_KEY}`).pipe(httpClientNoTrace.execute, Effect6.flatMap((res) => res.json), Effect6.flatMap(Schema.decodeUnknown(IPData)));
1016
918
  yield* Effect6.promise(() => localForage2.setItem("dxos:observability:ipdata", {
1017
919
  data,
1018
920
  timestamp: Date.now()
@@ -1033,12 +935,9 @@ var provider = (config) => (observability) => Effect6.gen(function* () {
1033
935
  longitude: ipData.longitude
1034
936
  });
1035
937
  }).pipe(Effect6.provide(FetchHttpClient.layer), Effect6.catchAll((err) => Effect6.sync(() => {
1036
- log6.catch(err, void 0, {
1037
- F: __dxlog_file6,
1038
- L: 85,
1039
- S: void 0,
1040
- C: (f, a) => f(...a)
1041
- });
938
+ log6.verbose("ipdata fetch failed", {
939
+ err
940
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 54, S: void 0 });
1042
941
  })));
1043
942
 
1044
943
  // src/providers/storage.ts
@@ -1062,7 +961,6 @@ var provider2 = Effect7.fn(function* (observability) {
1062
961
  }
1063
962
  });
1064
963
  export {
1065
- LogBuffer,
1066
964
  observability_exports as Observability,
1067
965
  observability_extension_exports as ObservabilityExtension,
1068
966
  providers_exports as ObservabilityProvider