@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
@@ -3,69 +3,6 @@ import {
3
3
  __export
4
4
  } from "./chunk-HSLMI22Q.mjs";
5
5
 
6
- // src/log-buffer.ts
7
- import { LogLevel, shortLevelName } from "@dxos/log";
8
- import { CircularBuffer } from "@dxos/util";
9
- var DEFAULT_BUFFER_SIZE = 2e3;
10
- var MAX_CONTEXT_LENGTH = 500;
11
- var LogBuffer = class {
12
- _buffer;
13
- constructor(size = DEFAULT_BUFFER_SIZE) {
14
- this._buffer = new CircularBuffer(size);
15
- }
16
- /** Log processor that can be registered with `log.runtimeConfig.processors`. */
17
- logProcessor = (_config, entry) => {
18
- if (entry.level <= LogLevel.TRACE) {
19
- return;
20
- }
21
- const record = {
22
- t: (/* @__PURE__ */ new Date()).toISOString(),
23
- l: shortLevelName[entry.level] ?? "?",
24
- m: entry.message ?? ""
25
- };
26
- if (entry.meta) {
27
- record.f = getRelativeFilename(entry.meta.F);
28
- record.n = entry.meta.L;
29
- }
30
- if (entry.error) {
31
- record.e = entry.error.stack ?? entry.error.message;
32
- }
33
- if (entry.context != null) {
34
- try {
35
- const ctx = typeof entry.context === "function" ? entry.context() : entry.context;
36
- if (ctx != null && !(ctx instanceof Error)) {
37
- let json = JSON.stringify(ctx);
38
- if (json.length > MAX_CONTEXT_LENGTH) {
39
- json = json.slice(0, MAX_CONTEXT_LENGTH);
40
- }
41
- record.c = json;
42
- }
43
- } catch {
44
- }
45
- }
46
- this._buffer.push(record);
47
- };
48
- /** Number of entries currently in the buffer. */
49
- get size() {
50
- return this._buffer.elementCount;
51
- }
52
- /** Serialize buffer contents as NDJSON (newline-delimited JSON). */
53
- serialize() {
54
- const lines = [];
55
- for (const record of this._buffer) {
56
- lines.push(JSON.stringify(record));
57
- }
58
- return lines.join("\n");
59
- }
60
- };
61
- var getRelativeFilename = (filename) => {
62
- const match = filename.match(/.+\/(packages\/.+\/.+)/);
63
- if (match) {
64
- return match[1];
65
- }
66
- return filename;
67
- };
68
-
69
6
  // src/observability.ts
70
7
  var observability_exports = {};
71
8
  __export(observability_exports, {
@@ -87,10 +24,10 @@ import { invariant } from "@dxos/invariant";
87
24
  import { log } from "@dxos/log";
88
25
 
89
26
  // src/storage/node.ts
27
+ import yaml from "js-yaml";
90
28
  import { existsSync, statSync } from "node:fs";
91
29
  import { mkdir, readFile, writeFile } from "node:fs/promises";
92
30
  import { join } from "node:path";
93
- import yaml from "js-yaml";
94
31
  import { v4 as uuid, validate as validateUuid } from "uuid";
95
32
  var showObservabilityBanner = async (configDir, bannercb) => {
96
33
  const path = join(configDir, ".observability-banner-printed");
@@ -177,12 +114,7 @@ var ObservabilityImpl = class {
177
114
  this._subscriptions.add(...cleanups.filter((cleanup) => cleanup !== void 0));
178
115
  this._initialized = true;
179
116
  }).pipe(Effect.catchAll((error) => Effect.gen(this, function* () {
180
- log.catch(error, void 0, {
181
- F: __dxlog_file,
182
- L: 85,
183
- S: this,
184
- C: (f, a) => f(...a)
185
- });
117
+ log.catch(error, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 32, S: this });
186
118
  for (const extension of initializedExtensions) {
187
119
  if (extension.close) {
188
120
  yield* extension.close().pipe(Effect.catchAll(() => Effect.succeed(void 0)));
@@ -231,27 +163,11 @@ var ObservabilityImpl = class {
231
163
  });
232
164
  }
233
165
  _addExtension(extension) {
234
- invariant(!this._initialized, "Observability is already initialized", {
235
- F: __dxlog_file,
236
- L: 142,
237
- S: this,
238
- A: [
239
- "!this._initialized",
240
- "'Observability is already initialized'"
241
- ]
242
- });
166
+ invariant(!this._initialized, "Observability is already initialized", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 82, S: this, A: ["!this._initialized", "'Observability is already initialized'"] });
243
167
  this._extensions.push(extension);
244
168
  }
245
169
  _addDataProvider(dataProvider) {
246
- invariant(!this._initialized, "Observability is already initialized", {
247
- F: __dxlog_file,
248
- L: 147,
249
- S: this,
250
- A: [
251
- "!this._initialized",
252
- "'Observability is already initialized'"
253
- ]
254
- });
170
+ invariant(!this._initialized, "Observability is already initialized", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 86, S: this, A: ["!this._initialized", "'Observability is already initialized'"] });
255
171
  this._dataProviders.push(dataProvider);
256
172
  }
257
173
  /**
@@ -311,10 +227,12 @@ var ObservabilityImpl = class {
311
227
  }
312
228
  get feedback() {
313
229
  return {
314
- captureUserFeedback: (form) => {
230
+ captureUserFeedback: async (form) => {
231
+ let eventUuid;
315
232
  for (const extension of this._getExtensions("feedback")) {
316
- extension.captureUserFeedback(form);
233
+ eventUuid = await extension.captureUserFeedback(form) ?? eventUuid;
317
234
  }
235
+ return eventUuid;
318
236
  }
319
237
  };
320
238
  }
@@ -360,29 +278,13 @@ var make = () => Effect.succeed(new ObservabilityImpl());
360
278
  var addExtension = (_extension) => Effect.fn(function* (_observability) {
361
279
  const observability = yield* _observability;
362
280
  const extension = yield* _extension;
363
- invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, {
364
- F: __dxlog_file,
365
- L: 276,
366
- S: this,
367
- A: [
368
- "'_addExtension' in observability && typeof observability._addExtension === 'function'",
369
- ""
370
- ]
371
- });
281
+ invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 196, S: this, A: ["'_addExtension' in observability && typeof observability._addExtension === 'function'", ""] });
372
282
  observability._addExtension(extension);
373
283
  return observability;
374
284
  });
375
285
  var addDataProvider = (dataProvider) => Effect.fn(function* (_observability) {
376
286
  const observability = yield* _observability;
377
- invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, {
378
- F: __dxlog_file,
379
- L: 284,
380
- S: this,
381
- A: [
382
- "'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'",
383
- ""
384
- ]
385
- });
287
+ invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 202, S: this, A: ["'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'", ""] });
386
288
  observability._addDataProvider(dataProvider);
387
289
  return observability;
388
290
  });
@@ -412,15 +314,16 @@ import * as Effect3 from "effect/Effect";
412
314
  import * as Match from "effect/Match";
413
315
  import * as Option from "effect/Option";
414
316
  import * as Ref from "effect/Ref";
415
- import { LogLevel as LogLevel2, log as log2 } from "@dxos/log";
317
+ import { resolveTelemetryTag } from "@dxos/config";
318
+ import { LogLevel, log as log2 } from "@dxos/log";
416
319
  import { isNode, isNonNullable } from "@dxos/util";
417
320
 
418
321
  // src/cli-observability-secrets.json
419
322
  var cli_observability_secrets_default = {
420
323
  POSTHOG_API_KEY: null,
421
324
  IPDATA_API_KEY: "73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786",
422
- OTEL_ENDPOINT: "https://ingest.eu.signoz.cloud:443",
423
- OTEL_HEADERS: "signoz-ingestion-key: 5300e0c9-a5e8-4a10-9c61-f473e539c0b7"
325
+ OTEL_ENDPOINT: "/api/otel",
326
+ OTEL_HEADERS: null
424
327
  };
425
328
 
426
329
  // src/extensions/stub.ts
@@ -451,53 +354,64 @@ var extensions = Effect3.fn(function* ({
451
354
  // - logs should be cached locally in a circular buffer
452
355
  // - logs should be flushed to the server if user opts to include them in a bug report
453
356
  logs: logsEnabled = false,
454
- logLevel = LogLevel2.INFO,
357
+ logLevel = LogLevel.INFO,
455
358
  metrics: metricsEnabled = false,
456
359
  traces: tracesEnabled = false
457
360
  }) {
458
- const { OtelLogs } = yield* Effect3.promise(() => import("./logs-7J45KLM7.mjs"));
459
- const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-H7DDLYSG.mjs"));
460
- const { OtelTraces } = yield* Effect3.promise(() => import("./traces-KMTHMYFX.mjs"));
361
+ const { OtelLogs } = yield* Effect3.promise(() => import("./logs-ARJUVN3T.mjs"));
362
+ const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-DREJOOAC.mjs"));
363
+ const { OtelTraces } = yield* Effect3.promise(() => import("./traces-74F7JUKF.mjs"));
461
364
  const cachedDisabled = yield* Effect3.promise(() => isObservabilityDisabled(serviceName));
462
- const enabledRef = yield* Ref.make(!cachedDisabled);
365
+ const disabled = cachedDisabled || isObservabilityDisabledSync(serviceName);
366
+ const enabledRef = yield* Ref.make(!disabled);
463
367
  const tags = /* @__PURE__ */ new Map();
464
- const endpoint = isNode() ? process.env.DX_OTEL_ENDPOINT ?? _endpoint ?? cli_observability_secrets_default.OTEL_ENDPOINT : config.values.runtime?.app?.env?.DX_OTEL_ENDPOINT;
368
+ const rawEndpoint = isNode() ? process.env.DX_OTEL_ENDPOINT ?? _endpoint ?? cli_observability_secrets_default.OTEL_ENDPOINT : config.values.runtime?.app?.env?.DX_OTEL_ENDPOINT ?? _endpoint;
369
+ const endpoint = !isNode() && rawEndpoint?.startsWith("/") ? resolveRelativeEndpoint(rawEndpoint) : rawEndpoint;
465
370
  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));
466
- if (!endpoint || !headers) {
467
- log2.info("Missing OTEL_ENDPOINT or OTEL_HEADERS", void 0, {
468
- F: __dxlog_file2,
469
- L: 77,
470
- S: this,
471
- C: (f, a) => f(...a)
472
- });
371
+ if (!endpoint) {
372
+ log2.info("Missing OTEL_ENDPOINT", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 35, S: this });
473
373
  return stubExtension;
474
374
  }
375
+ const resolvedHeaders = headers ?? {};
376
+ const resolvedEndpoint = !isNode() && endpoint.startsWith("/") ? `${globalThis.location.origin}${endpoint}` : endpoint;
377
+ const clientTag = resolveTelemetryTag(config);
378
+ if (clientTag) {
379
+ tags.set("ctx.tag", clientTag);
380
+ }
475
381
  const resource = defaultResource().merge(resourceFromAttributes({
476
382
  [ATTR_SERVICE_NAME]: serviceName,
477
383
  [ATTR_SERVICE_VERSION]: serviceVersion,
478
- "deployment.environment": environment
384
+ "session.id": crypto.randomUUID(),
385
+ "deployment.environment": environment,
386
+ "dxos.process.type": detectProcessType(),
387
+ ...clientTag ? {
388
+ "ctx.tag": clientTag
389
+ } : {}
479
390
  }));
480
391
  const logs = logsEnabled ? new OtelLogs({
481
- endpoint,
482
- headers,
392
+ endpoint: resolvedEndpoint,
393
+ headers: resolvedHeaders,
483
394
  resource,
484
395
  getTags: () => Object.fromEntries(tags),
485
396
  logLevel
486
397
  }) : void 0;
487
398
  const metrics = metricsEnabled ? new OtelMetrics({
488
- endpoint,
489
- headers,
399
+ endpoint: resolvedEndpoint,
400
+ headers: resolvedHeaders,
490
401
  resource,
491
402
  getTags: () => Object.fromEntries(tags)
492
403
  }) : void 0;
493
404
  const traces = tracesEnabled ? new OtelTraces({
494
- endpoint,
495
- headers,
405
+ endpoint: resolvedEndpoint,
406
+ headers: resolvedHeaders,
496
407
  resource,
497
408
  getTags: () => Object.fromEntries(tags)
498
409
  }) : void 0;
499
- return {
410
+ const extension = {
500
411
  initialize: () => Effect3.sync(() => {
412
+ if (disabled) {
413
+ return;
414
+ }
501
415
  if (logs) {
502
416
  log2.runtimeConfig.processors.push(logs.logProcessor);
503
417
  }
@@ -514,12 +428,28 @@ var extensions = Effect3.fn(function* ({
514
428
  yield* Ref.update(enabledRef, () => false);
515
429
  }),
516
430
  close: () => Effect3.promise(async () => {
517
- await logs?.close();
518
- await metrics?.close();
431
+ const results = await Promise.allSettled([
432
+ logs?.close(),
433
+ metrics?.close()
434
+ ]);
435
+ for (const result of results) {
436
+ if (result.status === "rejected") {
437
+ log2.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 120, S: this });
438
+ }
439
+ }
440
+ await traces?.close();
519
441
  }),
520
442
  flush: () => Effect3.promise(async () => {
521
- await logs?.flush();
522
- await metrics?.flush();
443
+ const results = await Promise.allSettled([
444
+ logs?.flush(),
445
+ metrics?.flush()
446
+ ]);
447
+ for (const result of results) {
448
+ if (result.status === "rejected") {
449
+ log2.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 135, S: this });
450
+ }
451
+ }
452
+ await traces?.flush();
523
453
  }),
524
454
  setTags: (incomingTags) => {
525
455
  for (const [key, value2] of Object.entries(incomingTags)) {
@@ -547,7 +477,39 @@ var extensions = Effect3.fn(function* ({
547
477
  } : void 0
548
478
  ].filter(isNonNullable)
549
479
  };
480
+ return extension;
550
481
  });
482
+ var isObservabilityDisabledSync = (serviceName) => {
483
+ if (isNode()) {
484
+ return process.env.DX_DISABLE_OBSERVABILITY === "true";
485
+ }
486
+ try {
487
+ if (typeof localStorage !== "undefined") {
488
+ return localStorage.getItem(`${serviceName}/observability-disabled`) === "true";
489
+ }
490
+ } catch {
491
+ }
492
+ return false;
493
+ };
494
+ var detectProcessType = () => {
495
+ if (isNode()) {
496
+ return "node";
497
+ }
498
+ if (typeof window !== "undefined") {
499
+ return "browser";
500
+ }
501
+ if (typeof globalThis.ServiceWorkerGlobalScope !== "undefined") {
502
+ return "service-worker";
503
+ }
504
+ if (typeof globalThis.SharedWorkerGlobalScope !== "undefined") {
505
+ return "shared-worker";
506
+ }
507
+ return "dedicated-worker";
508
+ };
509
+ var resolveRelativeEndpoint = (path) => {
510
+ const origin = globalThis.location?.origin;
511
+ return origin ? `${origin}${path}` : path;
512
+ };
551
513
  var parseHeaders = (unparsedHeaders) => {
552
514
  return unparsedHeaders.split(";").reduce((acc, header) => {
553
515
  const [key, ...rest] = header.split(":");
@@ -580,12 +542,7 @@ var uploadLogs = async (body) => {
580
542
  if (!response.ok) {
581
543
  log3.warn("feedback log upload failed", {
582
544
  status: response.status
583
- }, {
584
- F: __dxlog_file3,
585
- L: 33,
586
- S: void 0,
587
- C: (f, a) => f(...a)
588
- });
545
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 17, S: void 0 });
589
546
  return void 0;
590
547
  }
591
548
  const { key } = await response.json();
@@ -593,41 +550,26 @@ var uploadLogs = async (body) => {
593
550
  } catch (err) {
594
551
  log3.warn("feedback log upload error", {
595
552
  error: err
596
- }, {
597
- F: __dxlog_file3,
598
- L: 39,
599
- S: void 0,
600
- C: (f, a) => f(...a)
601
- });
553
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 25, S: void 0 });
602
554
  return void 0;
603
555
  }
604
556
  };
605
- var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig }) {
557
+ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig, logStore, feedbackLogMaxSize }) {
606
558
  if (typeof window === "undefined") {
607
- log3("PostHog is being stubbed because it is running in a worker.", void 0, {
608
- F: __dxlog_file3,
609
- L: 52,
610
- S: this,
611
- C: (f, a) => f(...a)
612
- });
559
+ log3("PostHog is being stubbed because it is running in a worker.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 33, S: this });
613
560
  return stubExtension;
614
561
  }
615
562
  const feedbackSurveyId = config.get("runtime.app.env.DX_POSTHOG_FEEDBACK_SURVEY_ID");
616
563
  const apiKey = config.get("runtime.app.env.DX_POSTHOG_API_KEY");
617
564
  const api_host = config.get("runtime.app.env.DX_POSTHOG_API_HOST");
618
565
  if (!apiKey || !api_host) {
619
- log3.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, {
620
- F: __dxlog_file3,
621
- L: 60,
622
- S: this,
623
- C: (f, a) => f(...a)
624
- });
566
+ log3.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 40, S: this });
625
567
  return stubExtension;
626
568
  }
627
569
  const { default: posthog } = yield* Effect4.promise(() => import("posthog-js"));
628
- const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-TKJVJJSJ.mjs"));
629
- const logBuffer = new LogBuffer();
570
+ const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-ZODHERST.mjs"));
630
571
  let feedbackSurveyAvailable = null;
572
+ let unregisterPosthogProcessors;
631
573
  const checkFeedbackSurveyAvailable = () => feedbackSurveyId ? Effect4.promise(() => {
632
574
  if (feedbackSurveyAvailable !== null) {
633
575
  return Promise.resolve(feedbackSurveyAvailable);
@@ -658,19 +600,15 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
658
600
  } : {}
659
601
  });
660
602
  }
661
- log3.runtimeConfig.processors.push(logProcessor);
662
- log3.runtimeConfig.processors.push(logBuffer.logProcessor);
603
+ unregisterPosthogProcessors?.();
604
+ const removePosthogLog = log3.addProcessor(logProcessor, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 79, S: this });
605
+ unregisterPosthogProcessors = () => {
606
+ removePosthogLog();
607
+ };
663
608
  }),
664
609
  close: () => Effect4.sync(() => {
665
- for (const processor of [
666
- logProcessor,
667
- logBuffer.logProcessor
668
- ]) {
669
- const index = log3.runtimeConfig.processors.indexOf(processor);
670
- if (index !== -1) {
671
- log3.runtimeConfig.processors.splice(index, 1);
672
- }
673
- }
610
+ unregisterPosthogProcessors?.();
611
+ unregisterPosthogProcessors = void 0;
674
612
  }),
675
613
  enable: () => Effect4.sync(() => posthog.opt_in_capturing()),
676
614
  disable: () => Effect4.sync(() => posthog.opt_out_capturing()),
@@ -705,36 +643,47 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
705
643
  kind: "feedback",
706
644
  // TODO(wittjosiah): Support custom surveys.
707
645
  captureUserFeedback: (form) => {
708
- posthog.getSurveys(async (surveys) => {
709
- const survey = surveys.find((survey2) => survey2.id === feedbackSurveyId);
710
- if (!survey || survey.questions.length === 0) {
711
- log3.error("Missing feedback survey or survey has no questions", {
712
- feedbackSurveyId
713
- }, {
714
- F: __dxlog_file3,
715
- L: 149,
716
- S: this,
717
- C: (f, a) => f(...a)
718
- });
719
- return;
720
- }
721
- let debugLogDumpKey;
722
- if (form.includeLogs !== false && logBuffer.size > 0) {
723
- debugLogDumpKey = await uploadLogs(logBuffer.serialize());
724
- }
725
- const question = survey.questions[0];
726
- posthog.capture("survey sent", {
727
- $survey_id: survey.id,
728
- $survey_questions: [
729
- {
730
- id: question.id,
731
- question: question.question
646
+ return new Promise((resolve, reject) => {
647
+ posthog.getSurveys((surveys) => {
648
+ void (async () => {
649
+ try {
650
+ const survey = surveys.find((survey2) => survey2.id === feedbackSurveyId);
651
+ if (!survey || survey.questions.length === 0) {
652
+ log3.error("Missing feedback survey or survey has no questions", {
653
+ feedbackSurveyId
654
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 127, S: this });
655
+ resolve(void 0);
656
+ return;
657
+ }
658
+ let debugLogDumpKey = null;
659
+ if (form.includeLogs !== false && logStore !== void 0) {
660
+ const ndjson = await logStore.export({
661
+ maxSize: feedbackLogMaxSize
662
+ });
663
+ if (ndjson.length > 0) {
664
+ debugLogDumpKey = await uploadLogs(ndjson) ?? "failed";
665
+ }
666
+ }
667
+ const question = survey.questions[0];
668
+ const result = posthog.capture("survey sent", {
669
+ $survey_id: survey.id,
670
+ $survey_questions: [
671
+ {
672
+ id: question.id,
673
+ question: question.question
674
+ }
675
+ ],
676
+ [`$survey_response_${question.id}`]: form.message,
677
+ debug_log_dump_key: debugLogDumpKey
678
+ });
679
+ resolve(result?.uuid);
680
+ } catch (err) {
681
+ log3.error("Failed to capture user feedback", {
682
+ err
683
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 157, S: this });
684
+ reject(err);
732
685
  }
733
- ],
734
- [`$survey_response_${question.id}`]: form.message,
735
- ...debugLogDumpKey ? {
736
- debug_log_dump_key: debugLogDumpKey
737
- } : {}
686
+ })();
738
687
  });
739
688
  });
740
689
  },
@@ -800,19 +749,11 @@ var identityProvider = (clientServices) => Effect5.fn(function* (observability)
800
749
  });
801
750
  });
802
751
  var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
803
- const ctx = new Context(void 0, {
804
- F: __dxlog_file4,
805
- L: 61
806
- });
752
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 50 });
807
753
  let lastNetworkStatus;
808
754
  const updateSignalMetrics = new Event().debounce(NETWORK_METRICS_MIN_INTERVAL);
809
755
  updateSignalMetrics.on(ctx, async () => {
810
- log4("send signal metrics", void 0, {
811
- F: __dxlog_file4,
812
- L: 67,
813
- S: this,
814
- C: (f, a) => f(...a)
815
- });
756
+ log4("send signal metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 55, S: this });
816
757
  lastNetworkStatus?.signaling?.forEach(({ server, state }) => {
817
758
  observability.metrics.gauge("dxos.client.network.signal.connectionState", state, {
818
759
  server
@@ -857,20 +798,11 @@ var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
857
798
  };
858
799
  });
859
800
  var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
860
- const ctx = new Context(void 0, {
861
- F: __dxlog_file4,
862
- L: 121
863
- });
801
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 100 });
802
+ log4("runtimeMetricsProvider: requesting platform from SystemService", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 101, S: this });
864
803
  const platform = yield* Effect5.promise(() => clientServices.SystemService.getPlatform());
865
- invariant2(platform, "platform is required", {
866
- F: __dxlog_file4,
867
- L: 123,
868
- S: this,
869
- A: [
870
- "platform",
871
- "'platform is required'"
872
- ]
873
- });
804
+ log4("runtimeMetricsProvider: platform received", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 103, S: this });
805
+ invariant2(platform, "platform is required", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 104, S: this, A: ["platform", "'platform is required'"] });
874
806
  observability.setTags({
875
807
  platformType: Platform.PLATFORM_TYPE[platform.type].toLowerCase(),
876
808
  platform: platform.platform,
@@ -894,33 +826,20 @@ var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
894
826
  }
895
827
  }).catch((error) => log4("platform error", {
896
828
  error
897
- }, {
898
- F: __dxlog_file4,
899
- L: 152,
900
- S: this,
901
- C: (f, a) => f(...a)
902
- }));
829
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 126, S: this }));
903
830
  }, RUNTIME_METRICS_MIN_INTERVAL);
904
831
  return async () => {
905
832
  await ctx.dispose();
906
833
  };
907
834
  });
908
835
  var spacesMetricsProvider = (client) => Effect5.fn(function* (observability) {
909
- const ctx = new Context(void 0, {
910
- F: __dxlog_file4,
911
- L: 165
912
- });
836
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 135 });
913
837
  const spaces = client.spaces.get();
914
838
  const subscriptions = /* @__PURE__ */ new Map();
915
839
  ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));
916
840
  const updateSpaceMetrics = new Event().debounce(SPACE_METRICS_MIN_INTERVAL);
917
841
  updateSpaceMetrics.on(ctx, async () => {
918
- log4("send space metrics", void 0, {
919
- F: __dxlog_file4,
920
- L: 173,
921
- S: this,
922
- C: (f, a) => f(...a)
923
- });
842
+ log4("send space metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 142, S: this });
924
843
  for (const data of mapSpaces(spaces, {
925
844
  truncateKeys: true
926
845
  })) {
@@ -1011,13 +930,14 @@ var IPData = Schema.Struct({
1011
930
  });
1012
931
  var getIPData = Effect6.fn(function* (config) {
1013
932
  const httpClient = yield* HttpClient.HttpClient;
933
+ const httpClientNoTrace = httpClient.pipe(HttpClient.withTracerDisabledWhen(() => true));
1014
934
  const cachedData = yield* Effect6.promise(() => localForage.getItem("dxos:observability:ipdata"));
1015
935
  if (cachedData && cachedData.timestamp > Date.now() - IP_DATA_CACHE_TIMEOUT) {
1016
936
  return cachedData.data;
1017
937
  }
1018
938
  const IPDATA_API_KEY = config.get("runtime.app.env.DX_IPDATA_API_KEY");
1019
939
  if (IPDATA_API_KEY) {
1020
- 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)));
940
+ 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)));
1021
941
  yield* Effect6.promise(() => localForage.setItem("dxos:observability:ipdata", {
1022
942
  data,
1023
943
  timestamp: Date.now()
@@ -1038,12 +958,9 @@ var provider = (config) => (observability) => Effect6.gen(function* () {
1038
958
  longitude: ipData.longitude
1039
959
  });
1040
960
  }).pipe(Effect6.provide(FetchHttpClient.layer), Effect6.catchAll((err) => Effect6.sync(() => {
1041
- log5.catch(err, void 0, {
1042
- F: __dxlog_file5,
1043
- L: 85,
1044
- S: void 0,
1045
- C: (f, a) => f(...a)
1046
- });
961
+ log5.verbose("ipdata fetch failed", {
962
+ err
963
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 54, S: void 0 });
1047
964
  })));
1048
965
 
1049
966
  // src/providers/storage.ts
@@ -1067,7 +984,6 @@ var provider2 = Effect7.fn(function* (observability) {
1067
984
  }
1068
985
  });
1069
986
  export {
1070
- LogBuffer,
1071
987
  observability_exports as Observability,
1072
988
  observability_extension_exports as ObservabilityExtension,
1073
989
  providers_exports as ObservabilityProvider