@dxos/observability 0.8.4-main.3eb6e50203 → 0.8.4-main.3fbcb4aa9b

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 (111) hide show
  1. package/README.md +14 -11
  2. package/dist/lib/browser/{chunk-K4VFBKST.mjs → chunk-3534PNWM.mjs} +1 -1
  3. package/dist/lib/browser/{chunk-K4VFBKST.mjs.map → chunk-3534PNWM.mjs.map} +2 -2
  4. package/dist/lib/browser/index.mjs +130 -256
  5. package/dist/lib/browser/index.mjs.map +4 -4
  6. package/dist/lib/browser/{log-processor-FDLTDQEM.mjs → log-processor-HPHWNBOK.mjs} +11 -18
  7. package/dist/lib/browser/log-processor-HPHWNBOK.mjs.map +7 -0
  8. package/dist/lib/browser/{logs-ATTRIUTL.mjs → logs-A2VDAHHD.mjs} +5 -3
  9. package/dist/lib/browser/{logs-ATTRIUTL.mjs.map → logs-A2VDAHHD.mjs.map} +3 -3
  10. package/dist/lib/browser/meta.json +1 -1
  11. package/dist/lib/browser/{metrics-PKTV6IGF.mjs → metrics-6OSN54ZV.mjs} +5 -20
  12. package/dist/lib/browser/{metrics-PKTV6IGF.mjs.map → metrics-6OSN54ZV.mjs.map} +2 -2
  13. package/dist/lib/browser/traces-browser-6MRGAKFC.mjs +151 -0
  14. package/dist/lib/browser/traces-browser-6MRGAKFC.mjs.map +7 -0
  15. package/dist/lib/node-esm/{chunk-FEVP3MK4.mjs → chunk-SYPJQI4L.mjs} +1 -1
  16. package/dist/lib/node-esm/{chunk-FEVP3MK4.mjs.map → chunk-SYPJQI4L.mjs.map} +2 -2
  17. package/dist/lib/node-esm/index.mjs +115 -223
  18. package/dist/lib/node-esm/index.mjs.map +4 -4
  19. package/dist/lib/node-esm/{log-processor-TKJVJJSJ.mjs → log-processor-ZODHERST.mjs} +11 -18
  20. package/dist/lib/node-esm/log-processor-ZODHERST.mjs.map +7 -0
  21. package/dist/lib/node-esm/{logs-7J45KLM7.mjs → logs-TA32MBMW.mjs} +5 -3
  22. package/dist/lib/node-esm/{logs-7J45KLM7.mjs.map → logs-TA32MBMW.mjs.map} +3 -3
  23. package/dist/lib/node-esm/meta.json +1 -1
  24. package/dist/lib/node-esm/{metrics-H7DDLYSG.mjs → metrics-C5IKPAWD.mjs} +5 -20
  25. package/dist/lib/node-esm/{metrics-H7DDLYSG.mjs.map → metrics-C5IKPAWD.mjs.map} +2 -2
  26. package/dist/lib/node-esm/traces-5LKHMVVG.mjs +122 -0
  27. package/dist/lib/node-esm/traces-5LKHMVVG.mjs.map +7 -0
  28. package/dist/types/src/cli-observability-secrets.json +2 -2
  29. package/dist/types/src/extensions/otel/extension.d.ts.map +1 -1
  30. package/dist/types/src/extensions/otel/extension.js +83 -6
  31. package/dist/types/src/extensions/otel/extension.js.map +1 -1
  32. package/dist/types/src/extensions/otel/logs.d.ts.map +1 -1
  33. package/dist/types/src/extensions/otel/logs.js +4 -1
  34. package/dist/types/src/extensions/otel/logs.js.map +1 -1
  35. package/dist/types/src/extensions/otel/metrics.d.ts.map +1 -1
  36. package/dist/types/src/extensions/otel/metrics.js.map +1 -1
  37. package/dist/types/src/extensions/otel/otel.d.ts.map +1 -1
  38. package/dist/types/src/extensions/otel/span-processors.d.ts +25 -0
  39. package/dist/types/src/extensions/otel/span-processors.d.ts.map +1 -0
  40. package/dist/types/src/extensions/otel/span-processors.js +41 -0
  41. package/dist/types/src/extensions/otel/span-processors.js.map +1 -0
  42. package/dist/types/src/extensions/otel/traces-browser.d.ts +17 -0
  43. package/dist/types/src/extensions/otel/traces-browser.d.ts.map +1 -1
  44. package/dist/types/src/extensions/otel/traces-browser.js +71 -11
  45. package/dist/types/src/extensions/otel/traces-browser.js.map +1 -1
  46. package/dist/types/src/extensions/otel/traces.d.ts +17 -0
  47. package/dist/types/src/extensions/otel/traces.d.ts.map +1 -1
  48. package/dist/types/src/extensions/otel/traces.js +57 -8
  49. package/dist/types/src/extensions/otel/traces.js.map +1 -1
  50. package/dist/types/src/extensions/posthog/extension.d.ts +7 -0
  51. package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -1
  52. package/dist/types/src/extensions/posthog/extension.js +16 -15
  53. package/dist/types/src/extensions/posthog/extension.js.map +1 -1
  54. package/dist/types/src/extensions/posthog/log-processor.d.ts.map +1 -1
  55. package/dist/types/src/extensions/posthog/log-processor.js +10 -19
  56. package/dist/types/src/extensions/posthog/log-processor.js.map +1 -1
  57. package/dist/types/src/extensions/posthog/log-processor.test.js +2 -2
  58. package/dist/types/src/extensions/posthog/log-processor.test.js.map +1 -1
  59. package/dist/types/src/index.d.ts +0 -1
  60. package/dist/types/src/index.d.ts.map +1 -1
  61. package/dist/types/src/index.js +0 -1
  62. package/dist/types/src/index.js.map +1 -1
  63. package/dist/types/src/observability.d.ts.map +1 -1
  64. package/dist/types/src/providers/client-observability.d.ts.map +1 -1
  65. package/dist/types/src/providers/client-observability.js +2 -0
  66. package/dist/types/src/providers/client-observability.js.map +1 -1
  67. package/dist/types/src/providers/ip-data.d.ts.map +1 -1
  68. package/dist/types/src/providers/ip-data.js +4 -2
  69. package/dist/types/src/providers/ip-data.js.map +1 -1
  70. package/dist/types/src/storage/browser.d.ts.map +1 -1
  71. package/dist/types/src/storage/browser.js +15 -4
  72. package/dist/types/src/storage/browser.js.map +1 -1
  73. package/dist/types/src/storage/node.d.ts.map +1 -1
  74. package/dist/types/src/storage/node.js +1 -1
  75. package/dist/types/src/storage/node.js.map +1 -1
  76. package/dist/types/src/storage/node.test.js +1 -1
  77. package/dist/types/src/storage/node.test.js.map +1 -1
  78. package/dist/types/tsconfig.tsbuildinfo +1 -1
  79. package/package.json +22 -18
  80. package/src/cli-observability-secrets.json +2 -2
  81. package/src/extensions/otel/extension.ts +87 -7
  82. package/src/extensions/otel/logs.ts +4 -1
  83. package/src/extensions/otel/span-processors.ts +45 -0
  84. package/src/extensions/otel/traces-browser.ts +93 -11
  85. package/src/extensions/otel/traces.ts +74 -10
  86. package/src/extensions/posthog/extension.ts +23 -14
  87. package/src/extensions/posthog/log-processor.test.ts +7 -6
  88. package/src/extensions/posthog/log-processor.ts +10 -21
  89. package/src/index.ts +0 -1
  90. package/src/providers/client-observability.ts +2 -0
  91. package/src/providers/ip-data.ts +5 -2
  92. package/src/storage/browser.ts +14 -4
  93. package/src/storage/node.test.ts +1 -2
  94. package/src/storage/node.ts +1 -2
  95. package/src/vite-import-meta.d.ts +14 -0
  96. package/dist/lib/browser/log-processor-FDLTDQEM.mjs.map +0 -7
  97. package/dist/lib/browser/traces-browser-XYXBF5ZX.mjs +0 -62
  98. package/dist/lib/browser/traces-browser-XYXBF5ZX.mjs.map +0 -7
  99. package/dist/lib/node-esm/log-processor-TKJVJJSJ.mjs.map +0 -7
  100. package/dist/lib/node-esm/traces-KMTHMYFX.mjs +0 -44
  101. package/dist/lib/node-esm/traces-KMTHMYFX.mjs.map +0 -7
  102. package/dist/types/src/log-buffer.d.ts +0 -34
  103. package/dist/types/src/log-buffer.d.ts.map +0 -1
  104. package/dist/types/src/log-buffer.js +0 -70
  105. package/dist/types/src/log-buffer.js.map +0 -1
  106. package/dist/types/src/log-buffer.test.d.ts +0 -2
  107. package/dist/types/src/log-buffer.test.d.ts.map +0 -1
  108. package/dist/types/src/log-buffer.test.js +0 -107
  109. package/dist/types/src/log-buffer.test.js.map +0 -1
  110. package/src/log-buffer.test.ts +0 -134
  111. 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
  /**
@@ -355,29 +253,13 @@ var make = () => Effect.succeed(new ObservabilityImpl());
355
253
  var addExtension = (_extension) => Effect.fn(function* (_observability) {
356
254
  const observability = yield* _observability;
357
255
  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
- });
256
+ invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 194, S: this, A: ["'_addExtension' in observability && typeof observability._addExtension === 'function'", ""] });
367
257
  observability._addExtension(extension);
368
258
  return observability;
369
259
  });
370
260
  var addDataProvider = (dataProvider) => Effect.fn(function* (_observability) {
371
261
  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
- });
262
+ invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 200, S: this, A: ["'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'", ""] });
381
263
  observability._addDataProvider(dataProvider);
382
264
  return observability;
383
265
  });
@@ -407,15 +289,16 @@ import * as Effect3 from "effect/Effect";
407
289
  import * as Match from "effect/Match";
408
290
  import * as Option from "effect/Option";
409
291
  import * as Ref from "effect/Ref";
410
- import { LogLevel as LogLevel2, log as log3 } from "@dxos/log";
292
+ import { resolveTelemetryTag } from "@dxos/config";
293
+ import { LogLevel, log as log3 } from "@dxos/log";
411
294
  import { isNode, isNonNullable } from "@dxos/util";
412
295
 
413
296
  // src/cli-observability-secrets.json
414
297
  var cli_observability_secrets_default = {
415
298
  POSTHOG_API_KEY: null,
416
299
  IPDATA_API_KEY: "73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786",
417
- OTEL_ENDPOINT: "https://ingest.eu.signoz.cloud:443",
418
- OTEL_HEADERS: "signoz-ingestion-key: 5300e0c9-a5e8-4a10-9c61-f473e539c0b7"
300
+ OTEL_ENDPOINT: "/api/otel",
301
+ OTEL_HEADERS: null
419
302
  };
420
303
 
421
304
  // src/extensions/stub.ts
@@ -446,31 +329,36 @@ var extensions = Effect3.fn(function* ({
446
329
  // - logs should be cached locally in a circular buffer
447
330
  // - logs should be flushed to the server if user opts to include them in a bug report
448
331
  logs: logsEnabled = false,
449
- logLevel = LogLevel2.INFO,
332
+ logLevel = LogLevel.INFO,
450
333
  metrics: metricsEnabled = false,
451
334
  traces: tracesEnabled = false
452
335
  }) {
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"));
336
+ const { OtelLogs } = yield* Effect3.promise(() => import("./logs-A2VDAHHD.mjs"));
337
+ const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-6OSN54ZV.mjs"));
338
+ const { OtelTraces } = yield* Effect3.promise(() => import("./traces-browser-6MRGAKFC.mjs"));
456
339
  const cachedDisabled = yield* Effect3.promise(() => isObservabilityDisabled(serviceName));
457
- const enabledRef = yield* Ref.make(!cachedDisabled);
340
+ const disabled = cachedDisabled || isObservabilityDisabledSync(serviceName);
341
+ const enabledRef = yield* Ref.make(!disabled);
458
342
  const tags = /* @__PURE__ */ new Map();
459
343
  const endpoint = isNode() ? process.env.DX_OTEL_ENDPOINT ?? _endpoint ?? cli_observability_secrets_default.OTEL_ENDPOINT : config.values.runtime?.app?.env?.DX_OTEL_ENDPOINT;
460
344
  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
345
  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
- });
346
+ log3.info("Missing OTEL_ENDPOINT or OTEL_HEADERS", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 31, S: this });
468
347
  return stubExtension;
469
348
  }
349
+ const clientTag = resolveTelemetryTag(config);
350
+ if (clientTag) {
351
+ tags.set("ctx.tag", clientTag);
352
+ }
470
353
  const resource = defaultResource().merge(resourceFromAttributes({
471
354
  [ATTR_SERVICE_NAME]: serviceName,
472
355
  [ATTR_SERVICE_VERSION]: serviceVersion,
473
- "deployment.environment": environment
356
+ "session.id": crypto.randomUUID(),
357
+ "deployment.environment": environment,
358
+ "dxos.process.type": detectProcessType(),
359
+ ...clientTag ? {
360
+ "ctx.tag": clientTag
361
+ } : {}
474
362
  }));
475
363
  const logs = logsEnabled ? new OtelLogs({
476
364
  endpoint,
@@ -491,8 +379,11 @@ var extensions = Effect3.fn(function* ({
491
379
  resource,
492
380
  getTags: () => Object.fromEntries(tags)
493
381
  }) : void 0;
494
- return {
382
+ const extension = {
495
383
  initialize: () => Effect3.sync(() => {
384
+ if (disabled) {
385
+ return;
386
+ }
496
387
  if (logs) {
497
388
  log3.runtimeConfig.processors.push(logs.logProcessor);
498
389
  }
@@ -509,12 +400,28 @@ var extensions = Effect3.fn(function* ({
509
400
  yield* Ref.update(enabledRef, () => false);
510
401
  }),
511
402
  close: () => Effect3.promise(async () => {
512
- await logs?.close();
513
- await metrics?.close();
403
+ const results = await Promise.allSettled([
404
+ logs?.close(),
405
+ metrics?.close()
406
+ ]);
407
+ for (const result of results) {
408
+ if (result.status === "rejected") {
409
+ log3.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 111, S: this });
410
+ }
411
+ }
412
+ await traces?.close();
514
413
  }),
515
414
  flush: () => Effect3.promise(async () => {
516
- await logs?.flush();
517
- await metrics?.flush();
415
+ const results = await Promise.allSettled([
416
+ logs?.flush(),
417
+ metrics?.flush()
418
+ ]);
419
+ for (const result of results) {
420
+ if (result.status === "rejected") {
421
+ log3.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 126, S: this });
422
+ }
423
+ }
424
+ await traces?.flush();
518
425
  }),
519
426
  setTags: (incomingTags) => {
520
427
  for (const [key, value2] of Object.entries(incomingTags)) {
@@ -542,7 +449,35 @@ var extensions = Effect3.fn(function* ({
542
449
  } : void 0
543
450
  ].filter(isNonNullable)
544
451
  };
452
+ return extension;
545
453
  });
454
+ var isObservabilityDisabledSync = (serviceName) => {
455
+ if (isNode()) {
456
+ return process.env.DX_DISABLE_OBSERVABILITY === "true";
457
+ }
458
+ try {
459
+ if (typeof localStorage !== "undefined") {
460
+ return localStorage.getItem(`${serviceName}/observability-disabled`) === "true";
461
+ }
462
+ } catch {
463
+ }
464
+ return false;
465
+ };
466
+ var detectProcessType = () => {
467
+ if (isNode()) {
468
+ return "node";
469
+ }
470
+ if (typeof window !== "undefined") {
471
+ return "browser";
472
+ }
473
+ if (typeof globalThis.ServiceWorkerGlobalScope !== "undefined") {
474
+ return "service-worker";
475
+ }
476
+ if (typeof globalThis.SharedWorkerGlobalScope !== "undefined") {
477
+ return "shared-worker";
478
+ }
479
+ return "dedicated-worker";
480
+ };
546
481
  var parseHeaders = (unparsedHeaders) => {
547
482
  return unparsedHeaders.split(";").reduce((acc, header) => {
548
483
  const [key, ...rest] = header.split(":");
@@ -575,12 +510,7 @@ var uploadLogs = async (body) => {
575
510
  if (!response.ok) {
576
511
  log4.warn("feedback log upload failed", {
577
512
  status: response.status
578
- }, {
579
- F: __dxlog_file4,
580
- L: 33,
581
- S: void 0,
582
- C: (f, a) => f(...a)
583
- });
513
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 17, S: void 0 });
584
514
  return void 0;
585
515
  }
586
516
  const { key } = await response.json();
@@ -588,41 +518,26 @@ var uploadLogs = async (body) => {
588
518
  } catch (err) {
589
519
  log4.warn("feedback log upload error", {
590
520
  error: err
591
- }, {
592
- F: __dxlog_file4,
593
- L: 39,
594
- S: void 0,
595
- C: (f, a) => f(...a)
596
- });
521
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 25, S: void 0 });
597
522
  return void 0;
598
523
  }
599
524
  };
600
- var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig }) {
525
+ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig, logStore }) {
601
526
  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
- });
527
+ log4("PostHog is being stubbed because it is running in a worker.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 33, S: this });
608
528
  return stubExtension;
609
529
  }
610
530
  const feedbackSurveyId = config.get("runtime.app.env.DX_POSTHOG_FEEDBACK_SURVEY_ID");
611
531
  const apiKey = config.get("runtime.app.env.DX_POSTHOG_API_KEY");
612
532
  const api_host = config.get("runtime.app.env.DX_POSTHOG_API_HOST");
613
533
  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
- });
534
+ log4.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 40, S: this });
620
535
  return stubExtension;
621
536
  }
622
537
  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();
538
+ const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-HPHWNBOK.mjs"));
625
539
  let feedbackSurveyAvailable = null;
540
+ let unregisterPosthogProcessors;
626
541
  const checkFeedbackSurveyAvailable = () => feedbackSurveyId ? Effect4.promise(() => {
627
542
  if (feedbackSurveyAvailable !== null) {
628
543
  return Promise.resolve(feedbackSurveyAvailable);
@@ -653,19 +568,15 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
653
568
  } : {}
654
569
  });
655
570
  }
656
- log4.runtimeConfig.processors.push(logProcessor);
657
- log4.runtimeConfig.processors.push(logBuffer.logProcessor);
571
+ unregisterPosthogProcessors?.();
572
+ const removePosthogLog = log4.addProcessor(logProcessor, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 79, S: this });
573
+ unregisterPosthogProcessors = () => {
574
+ removePosthogLog();
575
+ };
658
576
  }),
659
577
  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
- }
578
+ unregisterPosthogProcessors?.();
579
+ unregisterPosthogProcessors = void 0;
669
580
  }),
670
581
  enable: () => Effect4.sync(() => posthog.opt_in_capturing()),
671
582
  disable: () => Effect4.sync(() => posthog.opt_out_capturing()),
@@ -705,17 +616,15 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
705
616
  if (!survey || survey.questions.length === 0) {
706
617
  log4.error("Missing feedback survey or survey has no questions", {
707
618
  feedbackSurveyId
708
- }, {
709
- F: __dxlog_file4,
710
- L: 149,
711
- S: this,
712
- C: (f, a) => f(...a)
713
- });
619
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 124, S: this });
714
620
  return;
715
621
  }
716
- let debugLogDumpKey;
717
- if (form.includeLogs !== false && logBuffer.size > 0) {
718
- debugLogDumpKey = await uploadLogs(logBuffer.serialize());
622
+ let debugLogDumpKey = null;
623
+ if (form.includeLogs !== false && logStore !== void 0) {
624
+ const ndjson = await logStore.export();
625
+ if (ndjson.length > 0) {
626
+ debugLogDumpKey = await uploadLogs(ndjson) ?? "failed";
627
+ }
719
628
  }
720
629
  const question = survey.questions[0];
721
630
  posthog.capture("survey sent", {
@@ -727,9 +636,7 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
727
636
  }
728
637
  ],
729
638
  [`$survey_response_${question.id}`]: form.message,
730
- ...debugLogDumpKey ? {
731
- debug_log_dump_key: debugLogDumpKey
732
- } : {}
639
+ debug_log_dump_key: debugLogDumpKey
733
640
  });
734
641
  });
735
642
  },
@@ -795,19 +702,11 @@ var identityProvider = (clientServices) => Effect5.fn(function* (observability)
795
702
  });
796
703
  });
797
704
  var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
798
- const ctx = new Context(void 0, {
799
- F: __dxlog_file5,
800
- L: 61
801
- });
705
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 50 });
802
706
  let lastNetworkStatus;
803
707
  const updateSignalMetrics = new Event().debounce(NETWORK_METRICS_MIN_INTERVAL);
804
708
  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
- });
709
+ log5("send signal metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 55, S: this });
811
710
  lastNetworkStatus?.signaling?.forEach(({ server, state }) => {
812
711
  observability.metrics.gauge("dxos.client.network.signal.connectionState", state, {
813
712
  server
@@ -852,20 +751,11 @@ var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
852
751
  };
853
752
  });
854
753
  var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
855
- const ctx = new Context(void 0, {
856
- F: __dxlog_file5,
857
- L: 121
858
- });
754
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 100 });
755
+ log5("runtimeMetricsProvider: requesting platform from SystemService", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 101, S: this });
859
756
  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
- });
757
+ log5("runtimeMetricsProvider: platform received", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 103, S: this });
758
+ invariant2(platform, "platform is required", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 104, S: this, A: ["platform", "'platform is required'"] });
869
759
  observability.setTags({
870
760
  platformType: Platform.PLATFORM_TYPE[platform.type].toLowerCase(),
871
761
  platform: platform.platform,
@@ -889,33 +779,20 @@ var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
889
779
  }
890
780
  }).catch((error) => log5("platform error", {
891
781
  error
892
- }, {
893
- F: __dxlog_file5,
894
- L: 152,
895
- S: this,
896
- C: (f, a) => f(...a)
897
- }));
782
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 126, S: this }));
898
783
  }, RUNTIME_METRICS_MIN_INTERVAL);
899
784
  return async () => {
900
785
  await ctx.dispose();
901
786
  };
902
787
  });
903
788
  var spacesMetricsProvider = (client) => Effect5.fn(function* (observability) {
904
- const ctx = new Context(void 0, {
905
- F: __dxlog_file5,
906
- L: 165
907
- });
789
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 135 });
908
790
  const spaces = client.spaces.get();
909
791
  const subscriptions = /* @__PURE__ */ new Map();
910
792
  ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));
911
793
  const updateSpaceMetrics = new Event().debounce(SPACE_METRICS_MIN_INTERVAL);
912
794
  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
- });
795
+ log5("send space metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 142, S: this });
919
796
  for (const data of mapSpaces(spaces, {
920
797
  truncateKeys: true
921
798
  })) {
@@ -1006,13 +883,14 @@ var IPData = Schema.Struct({
1006
883
  });
1007
884
  var getIPData = Effect6.fn(function* (config) {
1008
885
  const httpClient = yield* HttpClient.HttpClient;
886
+ const httpClientNoTrace = httpClient.pipe(HttpClient.withTracerDisabledWhen(() => true));
1009
887
  const cachedData = yield* Effect6.promise(() => localForage2.getItem("dxos:observability:ipdata"));
1010
888
  if (cachedData && cachedData.timestamp > Date.now() - IP_DATA_CACHE_TIMEOUT) {
1011
889
  return cachedData.data;
1012
890
  }
1013
891
  const IPDATA_API_KEY = config.get("runtime.app.env.DX_IPDATA_API_KEY");
1014
892
  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)));
893
+ 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
894
  yield* Effect6.promise(() => localForage2.setItem("dxos:observability:ipdata", {
1017
895
  data,
1018
896
  timestamp: Date.now()
@@ -1033,12 +911,9 @@ var provider = (config) => (observability) => Effect6.gen(function* () {
1033
911
  longitude: ipData.longitude
1034
912
  });
1035
913
  }).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
- });
914
+ log6.verbose("ipdata fetch failed", {
915
+ err
916
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 54, S: void 0 });
1042
917
  })));
1043
918
 
1044
919
  // src/providers/storage.ts
@@ -1062,7 +937,6 @@ var provider2 = Effect7.fn(function* (observability) {
1062
937
  }
1063
938
  });
1064
939
  export {
1065
- LogBuffer,
1066
940
  observability_exports as Observability,
1067
941
  observability_extension_exports as ObservabilityExtension,
1068
942
  providers_exports as ObservabilityProvider