@dxos/observability 0.8.4-main.8360d9e660 → 0.8.4-main.8baae0fced

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 (114) hide show
  1. package/LICENSE +102 -5
  2. package/dist/lib/browser/{chunk-K4VFBKST.mjs → chunk-PSFTIG54.mjs} +9 -2
  3. package/dist/lib/browser/chunk-PSFTIG54.mjs.map +7 -0
  4. package/dist/lib/browser/index.mjs +176 -217
  5. package/dist/lib/browser/index.mjs.map +3 -3
  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-UTNIFYHF.mjs} +7 -4
  9. package/dist/lib/browser/logs-UTNIFYHF.mjs.map +7 -0
  10. package/dist/lib/browser/meta.json +1 -1
  11. package/dist/lib/browser/{metrics-PKTV6IGF.mjs → metrics-PRGSYAZJ.mjs} +7 -21
  12. package/dist/lib/browser/metrics-PRGSYAZJ.mjs.map +7 -0
  13. package/dist/lib/browser/traces-browser-XRINKQUA.mjs +154 -0
  14. package/dist/lib/browser/traces-browser-XRINKQUA.mjs.map +7 -0
  15. package/dist/lib/node-esm/{chunk-FEVP3MK4.mjs → chunk-EDDZWPYV.mjs} +9 -2
  16. package/dist/lib/node-esm/chunk-EDDZWPYV.mjs.map +7 -0
  17. package/dist/lib/node-esm/index.mjs +161 -184
  18. package/dist/lib/node-esm/index.mjs.map +3 -3
  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-ARJUVN3T.mjs} +7 -4
  22. package/dist/lib/node-esm/logs-ARJUVN3T.mjs.map +7 -0
  23. package/dist/lib/node-esm/meta.json +1 -1
  24. package/dist/lib/node-esm/{metrics-H7DDLYSG.mjs → metrics-DREJOOAC.mjs} +7 -21
  25. package/dist/lib/node-esm/metrics-DREJOOAC.mjs.map +7 -0
  26. package/dist/lib/node-esm/traces-74F7JUKF.mjs +125 -0
  27. package/dist/lib/node-esm/traces-74F7JUKF.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 +112 -16
  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 +6 -3
  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 +2 -2
  37. package/dist/types/src/extensions/otel/metrics.js.map +1 -1
  38. package/dist/types/src/extensions/otel/otel.d.ts +7 -0
  39. package/dist/types/src/extensions/otel/otel.d.ts.map +1 -1
  40. package/dist/types/src/extensions/otel/otel.js +12 -0
  41. package/dist/types/src/extensions/otel/otel.js.map +1 -1
  42. package/dist/types/src/extensions/otel/span-processors.d.ts +25 -0
  43. package/dist/types/src/extensions/otel/span-processors.d.ts.map +1 -0
  44. package/dist/types/src/extensions/otel/span-processors.js +41 -0
  45. package/dist/types/src/extensions/otel/span-processors.js.map +1 -0
  46. package/dist/types/src/extensions/otel/traces-browser.d.ts +17 -0
  47. package/dist/types/src/extensions/otel/traces-browser.d.ts.map +1 -1
  48. package/dist/types/src/extensions/otel/traces-browser.js +69 -14
  49. package/dist/types/src/extensions/otel/traces-browser.js.map +1 -1
  50. package/dist/types/src/extensions/otel/traces.d.ts +17 -0
  51. package/dist/types/src/extensions/otel/traces.d.ts.map +1 -1
  52. package/dist/types/src/extensions/otel/traces.js +59 -9
  53. package/dist/types/src/extensions/otel/traces.js.map +1 -1
  54. package/dist/types/src/extensions/posthog/extension.d.ts +13 -3
  55. package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -1
  56. package/dist/types/src/extensions/posthog/extension.js +42 -28
  57. package/dist/types/src/extensions/posthog/extension.js.map +1 -1
  58. package/dist/types/src/extensions/posthog/log-processor.d.ts.map +1 -1
  59. package/dist/types/src/extensions/posthog/log-processor.js +10 -19
  60. package/dist/types/src/extensions/posthog/log-processor.js.map +1 -1
  61. package/dist/types/src/extensions/posthog/log-processor.test.js +2 -2
  62. package/dist/types/src/extensions/posthog/log-processor.test.js.map +1 -1
  63. package/dist/types/src/observability-extension.d.ts +1 -1
  64. package/dist/types/src/observability-extension.d.ts.map +1 -1
  65. package/dist/types/src/observability.d.ts.map +1 -1
  66. package/dist/types/src/observability.js +4 -2
  67. package/dist/types/src/observability.js.map +1 -1
  68. package/dist/types/src/observability.test.js +1 -1
  69. package/dist/types/src/observability.test.js.map +1 -1
  70. package/dist/types/src/providers/client-observability.d.ts.map +1 -1
  71. package/dist/types/src/providers/client-observability.js +2 -0
  72. package/dist/types/src/providers/client-observability.js.map +1 -1
  73. package/dist/types/src/providers/ip-data.d.ts.map +1 -1
  74. package/dist/types/src/storage/browser.d.ts.map +1 -1
  75. package/dist/types/src/storage/browser.js +15 -4
  76. package/dist/types/src/storage/browser.js.map +1 -1
  77. package/dist/types/src/storage/node.d.ts.map +1 -1
  78. package/dist/types/src/storage/node.js +1 -1
  79. package/dist/types/src/storage/node.js.map +1 -1
  80. package/dist/types/src/storage/node.test.js +1 -1
  81. package/dist/types/src/storage/node.test.js.map +1 -1
  82. package/dist/types/tsconfig.tsbuildinfo +1 -1
  83. package/package.json +35 -31
  84. package/src/cli-observability-secrets.json +2 -2
  85. package/src/extensions/otel/extension.ts +118 -17
  86. package/src/extensions/otel/logs.ts +6 -3
  87. package/src/extensions/otel/metrics.ts +2 -2
  88. package/src/extensions/otel/otel.ts +13 -0
  89. package/src/extensions/otel/span-processors.ts +45 -0
  90. package/src/extensions/otel/traces-browser.ts +91 -15
  91. package/src/extensions/otel/traces.ts +76 -12
  92. package/src/extensions/posthog/extension.ts +55 -30
  93. package/src/extensions/posthog/log-processor.test.ts +7 -6
  94. package/src/extensions/posthog/log-processor.ts +10 -21
  95. package/src/observability-extension.ts +1 -1
  96. package/src/observability.test.ts +1 -1
  97. package/src/observability.ts +4 -2
  98. package/src/providers/client-observability.ts +2 -0
  99. package/src/storage/browser.ts +14 -4
  100. package/src/storage/node.test.ts +1 -2
  101. package/src/storage/node.ts +1 -2
  102. package/src/vite-import-meta.d.ts +14 -0
  103. package/dist/lib/browser/chunk-K4VFBKST.mjs.map +0 -7
  104. package/dist/lib/browser/log-processor-FDLTDQEM.mjs.map +0 -7
  105. package/dist/lib/browser/logs-ATTRIUTL.mjs.map +0 -7
  106. package/dist/lib/browser/metrics-PKTV6IGF.mjs.map +0 -7
  107. package/dist/lib/browser/traces-browser-5DQUYGQ7.mjs +0 -68
  108. package/dist/lib/browser/traces-browser-5DQUYGQ7.mjs.map +0 -7
  109. package/dist/lib/node-esm/chunk-FEVP3MK4.mjs.map +0 -7
  110. package/dist/lib/node-esm/log-processor-TKJVJJSJ.mjs.map +0 -7
  111. package/dist/lib/node-esm/logs-7J45KLM7.mjs.map +0 -7
  112. package/dist/lib/node-esm/metrics-H7DDLYSG.mjs.map +0 -7
  113. package/dist/lib/node-esm/traces-KMTHMYFX.mjs +0 -44
  114. package/dist/lib/node-esm/traces-KMTHMYFX.mjs.map +0 -7
@@ -25,64 +25,46 @@ import { log as log2 } from "@dxos/log";
25
25
  // src/storage/browser.ts
26
26
  import * as localForage from "localforage";
27
27
  import { log } from "@dxos/log";
28
+ import { compositeKey } from "@dxos/util";
28
29
  var __dxlog_file = "/__w/dxos/dxos/packages/sdk/observability/src/storage/browser.ts";
29
30
  var OBSERVABILITY_DISABLED_KEY = "observability-disabled";
30
31
  var OBSERVABILITY_GROUP_KEY = "observability-group";
31
32
  var showObservabilityBanner = () => {
32
- log.warn("showObservabilityBanner is not supported in browser contexts.", void 0, {
33
- F: __dxlog_file,
34
- L: 15,
35
- S: void 0,
36
- C: (f, a) => f(...a)
37
- });
33
+ log.warn("showObservabilityBanner is not supported in browser contexts.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 11, S: void 0 });
38
34
  };
39
35
  var isObservabilityDisabled = async (namespace) => {
40
36
  try {
41
- return await localForage.getItem(`${namespace}:${OBSERVABILITY_DISABLED_KEY}`) === "true";
37
+ return await localForage.getItem(compositeKey(namespace, OBSERVABILITY_DISABLED_KEY)) === "true";
42
38
  } catch (err) {
43
- log.catch("Failed to check if observability is disabled, assuming it is", err, {
44
- F: __dxlog_file,
45
- L: 25,
46
- S: void 0,
47
- C: (f, a) => f(...a)
48
- });
39
+ log.catch("Failed to check if observability is disabled, assuming it is", err, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 19, S: void 0 });
49
40
  return true;
50
41
  }
51
42
  };
52
43
  var storeObservabilityDisabled = async (namespace, value2) => {
53
44
  try {
54
- await localForage.setItem(`${namespace}:${OBSERVABILITY_DISABLED_KEY}`, String(value2));
45
+ await localForage.setItem(compositeKey(namespace, OBSERVABILITY_DISABLED_KEY), String(value2));
55
46
  } catch (err) {
56
- log.catch("Failed to store observability disabled", err, {
57
- F: __dxlog_file,
58
- L: 37,
59
- S: void 0,
60
- C: (f, a) => f(...a)
61
- });
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 {
62
54
  }
63
55
  };
64
56
  var getObservabilityGroup = async (namespace) => {
65
57
  try {
66
- return await localForage.getItem(`${namespace}:${OBSERVABILITY_GROUP_KEY}`) ?? void 0;
58
+ return await localForage.getItem(compositeKey(namespace, OBSERVABILITY_GROUP_KEY)) ?? void 0;
67
59
  } catch (err) {
68
- log.catch("Failed to get observability group", err, {
69
- F: __dxlog_file,
70
- L: 48,
71
- S: void 0,
72
- C: (f, a) => f(...a)
73
- });
60
+ log.catch("Failed to get observability group", err, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 47, S: void 0 });
74
61
  }
75
62
  };
76
63
  var storeObservabilityGroup = async (namespace, value2) => {
77
64
  try {
78
- await localForage.setItem(`${namespace}:${OBSERVABILITY_GROUP_KEY}`, value2);
65
+ await localForage.setItem(compositeKey(namespace, OBSERVABILITY_GROUP_KEY), value2);
79
66
  } catch (err) {
80
- log.catch("Failed to store observability group", err, {
81
- F: __dxlog_file,
82
- L: 59,
83
- S: void 0,
84
- C: (f, a) => f(...a)
85
- });
67
+ log.catch("Failed to store observability group", err, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 56, S: void 0 });
86
68
  }
87
69
  };
88
70
 
@@ -109,12 +91,7 @@ var ObservabilityImpl = class {
109
91
  this._subscriptions.add(...cleanups.filter((cleanup) => cleanup !== void 0));
110
92
  this._initialized = true;
111
93
  }).pipe(Effect.catchAll((error) => Effect.gen(this, function* () {
112
- log2.catch(error, void 0, {
113
- F: __dxlog_file2,
114
- L: 85,
115
- S: this,
116
- C: (f, a) => f(...a)
117
- });
94
+ log2.catch(error, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 32, S: this });
118
95
  for (const extension of initializedExtensions) {
119
96
  if (extension.close) {
120
97
  yield* extension.close().pipe(Effect.catchAll(() => Effect.succeed(void 0)));
@@ -163,27 +140,11 @@ var ObservabilityImpl = class {
163
140
  });
164
141
  }
165
142
  _addExtension(extension) {
166
- invariant(!this._initialized, "Observability is already initialized", {
167
- F: __dxlog_file2,
168
- L: 142,
169
- S: this,
170
- A: [
171
- "!this._initialized",
172
- "'Observability is already initialized'"
173
- ]
174
- });
143
+ invariant(!this._initialized, "Observability is already initialized", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 82, S: this, A: ["!this._initialized", "'Observability is already initialized'"] });
175
144
  this._extensions.push(extension);
176
145
  }
177
146
  _addDataProvider(dataProvider) {
178
- invariant(!this._initialized, "Observability is already initialized", {
179
- F: __dxlog_file2,
180
- L: 147,
181
- S: this,
182
- A: [
183
- "!this._initialized",
184
- "'Observability is already initialized'"
185
- ]
186
- });
147
+ invariant(!this._initialized, "Observability is already initialized", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 86, S: this, A: ["!this._initialized", "'Observability is already initialized'"] });
187
148
  this._dataProviders.push(dataProvider);
188
149
  }
189
150
  /**
@@ -243,10 +204,12 @@ var ObservabilityImpl = class {
243
204
  }
244
205
  get feedback() {
245
206
  return {
246
- captureUserFeedback: (form) => {
207
+ captureUserFeedback: async (form) => {
208
+ let eventUuid;
247
209
  for (const extension of this._getExtensions("feedback")) {
248
- extension.captureUserFeedback(form);
210
+ eventUuid = await extension.captureUserFeedback(form) ?? eventUuid;
249
211
  }
212
+ return eventUuid;
250
213
  }
251
214
  };
252
215
  }
@@ -292,29 +255,13 @@ var make = () => Effect.succeed(new ObservabilityImpl());
292
255
  var addExtension = (_extension) => Effect.fn(function* (_observability) {
293
256
  const observability = yield* _observability;
294
257
  const extension = yield* _extension;
295
- invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, {
296
- F: __dxlog_file2,
297
- L: 276,
298
- S: this,
299
- A: [
300
- "'_addExtension' in observability && typeof observability._addExtension === 'function'",
301
- ""
302
- ]
303
- });
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'", ""] });
304
259
  observability._addExtension(extension);
305
260
  return observability;
306
261
  });
307
262
  var addDataProvider = (dataProvider) => Effect.fn(function* (_observability) {
308
263
  const observability = yield* _observability;
309
- invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, {
310
- F: __dxlog_file2,
311
- L: 284,
312
- S: this,
313
- A: [
314
- "'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'",
315
- ""
316
- ]
317
- });
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'", ""] });
318
265
  observability._addDataProvider(dataProvider);
319
266
  return observability;
320
267
  });
@@ -344,6 +291,7 @@ import * as Effect3 from "effect/Effect";
344
291
  import * as Match from "effect/Match";
345
292
  import * as Option from "effect/Option";
346
293
  import * as Ref from "effect/Ref";
294
+ import { resolveTelemetryTag } from "@dxos/config";
347
295
  import { LogLevel, log as log3 } from "@dxos/log";
348
296
  import { isNode, isNonNullable } from "@dxos/util";
349
297
 
@@ -351,8 +299,8 @@ import { isNode, isNonNullable } from "@dxos/util";
351
299
  var cli_observability_secrets_default = {
352
300
  POSTHOG_API_KEY: null,
353
301
  IPDATA_API_KEY: "73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786",
354
- OTEL_ENDPOINT: "https://ingest.eu.signoz.cloud:443",
355
- OTEL_HEADERS: "signoz-ingestion-key: 5300e0c9-a5e8-4a10-9c61-f473e539c0b7"
302
+ OTEL_ENDPOINT: "/api/otel",
303
+ OTEL_HEADERS: null
356
304
  };
357
305
 
358
306
  // src/extensions/stub.ts
@@ -387,49 +335,60 @@ var extensions = Effect3.fn(function* ({
387
335
  metrics: metricsEnabled = false,
388
336
  traces: tracesEnabled = false
389
337
  }) {
390
- const { OtelLogs } = yield* Effect3.promise(() => import("./logs-ATTRIUTL.mjs"));
391
- const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-PKTV6IGF.mjs"));
392
- const { OtelTraces } = yield* Effect3.promise(() => import("./traces-browser-5DQUYGQ7.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"));
393
341
  const cachedDisabled = yield* Effect3.promise(() => isObservabilityDisabled(serviceName));
394
- const enabledRef = yield* Ref.make(!cachedDisabled);
342
+ const disabled = cachedDisabled || isObservabilityDisabledSync(serviceName);
343
+ const enabledRef = yield* Ref.make(!disabled);
395
344
  const tags = /* @__PURE__ */ new Map();
396
- 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;
397
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));
398
- if (!endpoint || !headers) {
399
- log3.info("Missing OTEL_ENDPOINT or OTEL_HEADERS", void 0, {
400
- F: __dxlog_file3,
401
- L: 77,
402
- S: this,
403
- C: (f, a) => f(...a)
404
- });
348
+ if (!endpoint) {
349
+ log3.info("Missing OTEL_ENDPOINT", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 35, S: this });
405
350
  return stubExtension;
406
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
+ }
407
358
  const resource = defaultResource().merge(resourceFromAttributes({
408
359
  [ATTR_SERVICE_NAME]: serviceName,
409
360
  [ATTR_SERVICE_VERSION]: serviceVersion,
410
- "deployment.environment": environment
361
+ "session.id": crypto.randomUUID(),
362
+ "deployment.environment": environment,
363
+ "dxos.process.type": detectProcessType(),
364
+ ...clientTag ? {
365
+ "ctx.tag": clientTag
366
+ } : {}
411
367
  }));
412
368
  const logs = logsEnabled ? new OtelLogs({
413
- endpoint,
414
- headers,
369
+ endpoint: resolvedEndpoint,
370
+ headers: resolvedHeaders,
415
371
  resource,
416
372
  getTags: () => Object.fromEntries(tags),
417
373
  logLevel
418
374
  }) : void 0;
419
375
  const metrics = metricsEnabled ? new OtelMetrics({
420
- endpoint,
421
- headers,
376
+ endpoint: resolvedEndpoint,
377
+ headers: resolvedHeaders,
422
378
  resource,
423
379
  getTags: () => Object.fromEntries(tags)
424
380
  }) : void 0;
425
381
  const traces = tracesEnabled ? new OtelTraces({
426
- endpoint,
427
- headers,
382
+ endpoint: resolvedEndpoint,
383
+ headers: resolvedHeaders,
428
384
  resource,
429
385
  getTags: () => Object.fromEntries(tags)
430
386
  }) : void 0;
431
- return {
387
+ const extension = {
432
388
  initialize: () => Effect3.sync(() => {
389
+ if (disabled) {
390
+ return;
391
+ }
433
392
  if (logs) {
434
393
  log3.runtimeConfig.processors.push(logs.logProcessor);
435
394
  }
@@ -446,12 +405,28 @@ var extensions = Effect3.fn(function* ({
446
405
  yield* Ref.update(enabledRef, () => false);
447
406
  }),
448
407
  close: () => Effect3.promise(async () => {
449
- await logs?.close();
450
- 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();
451
418
  }),
452
419
  flush: () => Effect3.promise(async () => {
453
- await logs?.flush();
454
- 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();
455
430
  }),
456
431
  setTags: (incomingTags) => {
457
432
  for (const [key, value2] of Object.entries(incomingTags)) {
@@ -479,7 +454,39 @@ var extensions = Effect3.fn(function* ({
479
454
  } : void 0
480
455
  ].filter(isNonNullable)
481
456
  };
457
+ return extension;
482
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
+ };
483
490
  var parseHeaders = (unparsedHeaders) => {
484
491
  return unparsedHeaders.split(";").reduce((acc, header) => {
485
492
  const [key, ...rest] = header.split(":");
@@ -498,7 +505,7 @@ __export(posthog_exports, {
498
505
 
499
506
  // src/extensions/posthog/extension.ts
500
507
  import * as Effect4 from "effect/Effect";
501
- import { LogBuffer, log as log4 } from "@dxos/log";
508
+ import { log as log4 } from "@dxos/log";
502
509
  var __dxlog_file4 = "/__w/dxos/dxos/packages/sdk/observability/src/extensions/posthog/extension.ts";
503
510
  var uploadLogs = async (body) => {
504
511
  try {
@@ -512,12 +519,7 @@ var uploadLogs = async (body) => {
512
519
  if (!response.ok) {
513
520
  log4.warn("feedback log upload failed", {
514
521
  status: response.status
515
- }, {
516
- F: __dxlog_file4,
517
- L: 34,
518
- S: void 0,
519
- C: (f, a) => f(...a)
520
- });
522
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 17, S: void 0 });
521
523
  return void 0;
522
524
  }
523
525
  const { key } = await response.json();
@@ -525,41 +527,26 @@ var uploadLogs = async (body) => {
525
527
  } catch (err) {
526
528
  log4.warn("feedback log upload error", {
527
529
  error: err
528
- }, {
529
- F: __dxlog_file4,
530
- L: 40,
531
- S: void 0,
532
- C: (f, a) => f(...a)
533
- });
530
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 25, S: void 0 });
534
531
  return void 0;
535
532
  }
536
533
  };
537
- var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig, logBuffer: externalLogBuffer }) {
534
+ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig, logStore, feedbackLogMaxSize }) {
538
535
  if (typeof window === "undefined") {
539
- log4("PostHog is being stubbed because it is running in a worker.", void 0, {
540
- F: __dxlog_file4,
541
- L: 54,
542
- S: this,
543
- C: (f, a) => f(...a)
544
- });
536
+ log4("PostHog is being stubbed because it is running in a worker.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 33, S: this });
545
537
  return stubExtension;
546
538
  }
547
539
  const feedbackSurveyId = config.get("runtime.app.env.DX_POSTHOG_FEEDBACK_SURVEY_ID");
548
540
  const apiKey = config.get("runtime.app.env.DX_POSTHOG_API_KEY");
549
541
  const api_host = config.get("runtime.app.env.DX_POSTHOG_API_HOST");
550
542
  if (!apiKey || !api_host) {
551
- log4.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, {
552
- F: __dxlog_file4,
553
- L: 62,
554
- S: this,
555
- C: (f, a) => f(...a)
556
- });
543
+ log4.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 40, S: this });
557
544
  return stubExtension;
558
545
  }
559
546
  const { default: posthog } = yield* Effect4.promise(() => import("posthog-js"));
560
- const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-FDLTDQEM.mjs"));
561
- const logBuffer = externalLogBuffer ?? new LogBuffer();
547
+ const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-HPHWNBOK.mjs"));
562
548
  let feedbackSurveyAvailable = null;
549
+ let unregisterPosthogProcessors;
563
550
  const checkFeedbackSurveyAvailable = () => feedbackSurveyId ? Effect4.promise(() => {
564
551
  if (feedbackSurveyAvailable !== null) {
565
552
  return Promise.resolve(feedbackSurveyAvailable);
@@ -590,19 +577,15 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
590
577
  } : {}
591
578
  });
592
579
  }
593
- log4.runtimeConfig.processors.push(logProcessor);
594
- 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
+ };
595
585
  }),
596
586
  close: () => Effect4.sync(() => {
597
- for (const processor of [
598
- logProcessor,
599
- logBuffer.logProcessor
600
- ]) {
601
- const index = log4.runtimeConfig.processors.indexOf(processor);
602
- if (index !== -1) {
603
- log4.runtimeConfig.processors.splice(index, 1);
604
- }
605
- }
587
+ unregisterPosthogProcessors?.();
588
+ unregisterPosthogProcessors = void 0;
606
589
  }),
607
590
  enable: () => Effect4.sync(() => posthog.opt_in_capturing()),
608
591
  disable: () => Effect4.sync(() => posthog.opt_out_capturing()),
@@ -637,36 +620,47 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
637
620
  kind: "feedback",
638
621
  // TODO(wittjosiah): Support custom surveys.
639
622
  captureUserFeedback: (form) => {
640
- posthog.getSurveys(async (surveys) => {
641
- const survey = surveys.find((survey2) => survey2.id === feedbackSurveyId);
642
- if (!survey || survey.questions.length === 0) {
643
- log4.error("Missing feedback survey or survey has no questions", {
644
- feedbackSurveyId
645
- }, {
646
- F: __dxlog_file4,
647
- L: 151,
648
- S: this,
649
- C: (f, a) => f(...a)
650
- });
651
- return;
652
- }
653
- let debugLogDumpKey;
654
- if (form.includeLogs !== false && logBuffer.size > 0) {
655
- debugLogDumpKey = await uploadLogs(logBuffer.serialize());
656
- }
657
- const question = survey.questions[0];
658
- posthog.capture("survey sent", {
659
- $survey_id: survey.id,
660
- $survey_questions: [
661
- {
662
- id: question.id,
663
- 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);
664
662
  }
665
- ],
666
- [`$survey_response_${question.id}`]: form.message,
667
- ...debugLogDumpKey ? {
668
- debug_log_dump_key: debugLogDumpKey
669
- } : {}
663
+ })();
670
664
  });
671
665
  });
672
666
  },
@@ -732,19 +726,11 @@ var identityProvider = (clientServices) => Effect5.fn(function* (observability)
732
726
  });
733
727
  });
734
728
  var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
735
- const ctx = new Context(void 0, {
736
- F: __dxlog_file5,
737
- L: 61
738
- });
729
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 50 });
739
730
  let lastNetworkStatus;
740
731
  const updateSignalMetrics = new Event().debounce(NETWORK_METRICS_MIN_INTERVAL);
741
732
  updateSignalMetrics.on(ctx, async () => {
742
- log5("send signal metrics", void 0, {
743
- F: __dxlog_file5,
744
- L: 67,
745
- S: this,
746
- C: (f, a) => f(...a)
747
- });
733
+ log5("send signal metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 55, S: this });
748
734
  lastNetworkStatus?.signaling?.forEach(({ server, state }) => {
749
735
  observability.metrics.gauge("dxos.client.network.signal.connectionState", state, {
750
736
  server
@@ -789,20 +775,11 @@ var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
789
775
  };
790
776
  });
791
777
  var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
792
- const ctx = new Context(void 0, {
793
- F: __dxlog_file5,
794
- L: 121
795
- });
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 });
796
780
  const platform = yield* Effect5.promise(() => clientServices.SystemService.getPlatform());
797
- invariant2(platform, "platform is required", {
798
- F: __dxlog_file5,
799
- L: 123,
800
- S: this,
801
- A: [
802
- "platform",
803
- "'platform is required'"
804
- ]
805
- });
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'"] });
806
783
  observability.setTags({
807
784
  platformType: Platform.PLATFORM_TYPE[platform.type].toLowerCase(),
808
785
  platform: platform.platform,
@@ -826,33 +803,20 @@ var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
826
803
  }
827
804
  }).catch((error) => log5("platform error", {
828
805
  error
829
- }, {
830
- F: __dxlog_file5,
831
- L: 152,
832
- S: this,
833
- C: (f, a) => f(...a)
834
- }));
806
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 126, S: this }));
835
807
  }, RUNTIME_METRICS_MIN_INTERVAL);
836
808
  return async () => {
837
809
  await ctx.dispose();
838
810
  };
839
811
  });
840
812
  var spacesMetricsProvider = (client) => Effect5.fn(function* (observability) {
841
- const ctx = new Context(void 0, {
842
- F: __dxlog_file5,
843
- L: 165
844
- });
813
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 135 });
845
814
  const spaces = client.spaces.get();
846
815
  const subscriptions = /* @__PURE__ */ new Map();
847
816
  ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));
848
817
  const updateSpaceMetrics = new Event().debounce(SPACE_METRICS_MIN_INTERVAL);
849
818
  updateSpaceMetrics.on(ctx, async () => {
850
- log5("send space metrics", void 0, {
851
- F: __dxlog_file5,
852
- L: 173,
853
- S: this,
854
- C: (f, a) => f(...a)
855
- });
819
+ log5("send space metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 142, S: this });
856
820
  for (const data of mapSpaces(spaces, {
857
821
  truncateKeys: true
858
822
  })) {
@@ -973,12 +937,7 @@ var provider = (config) => (observability) => Effect6.gen(function* () {
973
937
  }).pipe(Effect6.provide(FetchHttpClient.layer), Effect6.catchAll((err) => Effect6.sync(() => {
974
938
  log6.verbose("ipdata fetch failed", {
975
939
  err
976
- }, {
977
- F: __dxlog_file6,
978
- L: 88,
979
- S: void 0,
980
- C: (f, a) => f(...a)
981
- });
940
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 54, S: void 0 });
982
941
  })));
983
942
 
984
943
  // src/providers/storage.ts