@dxos/observability 0.8.4-main.4a85c3132b → 0.8.4-main.4f23b4e393

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 (104) hide show
  1. package/dist/lib/browser/{chunk-K4VFBKST.mjs → chunk-PSFTIG54.mjs} +9 -2
  2. package/dist/lib/browser/chunk-PSFTIG54.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +137 -198
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/{log-processor-FDLTDQEM.mjs → log-processor-HPHWNBOK.mjs} +11 -18
  6. package/dist/lib/browser/log-processor-HPHWNBOK.mjs.map +7 -0
  7. package/dist/lib/browser/{logs-ATTRIUTL.mjs → logs-UTNIFYHF.mjs} +7 -4
  8. package/dist/lib/browser/logs-UTNIFYHF.mjs.map +7 -0
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/{metrics-PKTV6IGF.mjs → metrics-PRGSYAZJ.mjs} +7 -21
  11. package/dist/lib/browser/metrics-PRGSYAZJ.mjs.map +7 -0
  12. package/dist/lib/browser/traces-browser-XRINKQUA.mjs +154 -0
  13. package/dist/lib/browser/traces-browser-XRINKQUA.mjs.map +7 -0
  14. package/dist/lib/node-esm/{chunk-FEVP3MK4.mjs → chunk-EDDZWPYV.mjs} +9 -2
  15. package/dist/lib/node-esm/chunk-EDDZWPYV.mjs.map +7 -0
  16. package/dist/lib/node-esm/index.mjs +122 -165
  17. package/dist/lib/node-esm/index.mjs.map +3 -3
  18. package/dist/lib/node-esm/{log-processor-TKJVJJSJ.mjs → log-processor-ZODHERST.mjs} +11 -18
  19. package/dist/lib/node-esm/log-processor-ZODHERST.mjs.map +7 -0
  20. package/dist/lib/node-esm/{logs-7J45KLM7.mjs → logs-ARJUVN3T.mjs} +7 -4
  21. package/dist/lib/node-esm/logs-ARJUVN3T.mjs.map +7 -0
  22. package/dist/lib/node-esm/meta.json +1 -1
  23. package/dist/lib/node-esm/{metrics-H7DDLYSG.mjs → metrics-DREJOOAC.mjs} +7 -21
  24. package/dist/lib/node-esm/metrics-DREJOOAC.mjs.map +7 -0
  25. package/dist/lib/node-esm/traces-74F7JUKF.mjs +125 -0
  26. package/dist/lib/node-esm/traces-74F7JUKF.mjs.map +7 -0
  27. package/dist/types/src/cli-observability-secrets.json +2 -2
  28. package/dist/types/src/extensions/otel/extension.d.ts.map +1 -1
  29. package/dist/types/src/extensions/otel/extension.js +97 -15
  30. package/dist/types/src/extensions/otel/extension.js.map +1 -1
  31. package/dist/types/src/extensions/otel/logs.d.ts.map +1 -1
  32. package/dist/types/src/extensions/otel/logs.js +6 -3
  33. package/dist/types/src/extensions/otel/logs.js.map +1 -1
  34. package/dist/types/src/extensions/otel/metrics.d.ts.map +1 -1
  35. package/dist/types/src/extensions/otel/metrics.js +2 -2
  36. package/dist/types/src/extensions/otel/metrics.js.map +1 -1
  37. package/dist/types/src/extensions/otel/otel.d.ts +7 -0
  38. package/dist/types/src/extensions/otel/otel.d.ts.map +1 -1
  39. package/dist/types/src/extensions/otel/otel.js +12 -0
  40. package/dist/types/src/extensions/otel/otel.js.map +1 -1
  41. package/dist/types/src/extensions/otel/span-processors.d.ts +25 -0
  42. package/dist/types/src/extensions/otel/span-processors.d.ts.map +1 -0
  43. package/dist/types/src/extensions/otel/span-processors.js +41 -0
  44. package/dist/types/src/extensions/otel/span-processors.js.map +1 -0
  45. package/dist/types/src/extensions/otel/traces-browser.d.ts +17 -0
  46. package/dist/types/src/extensions/otel/traces-browser.d.ts.map +1 -1
  47. package/dist/types/src/extensions/otel/traces-browser.js +69 -14
  48. package/dist/types/src/extensions/otel/traces-browser.js.map +1 -1
  49. package/dist/types/src/extensions/otel/traces.d.ts +17 -0
  50. package/dist/types/src/extensions/otel/traces.d.ts.map +1 -1
  51. package/dist/types/src/extensions/otel/traces.js +59 -9
  52. package/dist/types/src/extensions/otel/traces.js.map +1 -1
  53. package/dist/types/src/extensions/posthog/extension.d.ts +13 -3
  54. package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -1
  55. package/dist/types/src/extensions/posthog/extension.js +17 -15
  56. package/dist/types/src/extensions/posthog/extension.js.map +1 -1
  57. package/dist/types/src/extensions/posthog/log-processor.d.ts.map +1 -1
  58. package/dist/types/src/extensions/posthog/log-processor.js +10 -19
  59. package/dist/types/src/extensions/posthog/log-processor.js.map +1 -1
  60. package/dist/types/src/extensions/posthog/log-processor.test.js +2 -2
  61. package/dist/types/src/extensions/posthog/log-processor.test.js.map +1 -1
  62. package/dist/types/src/observability.d.ts.map +1 -1
  63. package/dist/types/src/providers/client-observability.d.ts.map +1 -1
  64. package/dist/types/src/providers/client-observability.js +2 -0
  65. package/dist/types/src/providers/client-observability.js.map +1 -1
  66. package/dist/types/src/providers/ip-data.d.ts.map +1 -1
  67. package/dist/types/src/storage/browser.d.ts.map +1 -1
  68. package/dist/types/src/storage/browser.js +15 -4
  69. package/dist/types/src/storage/browser.js.map +1 -1
  70. package/dist/types/src/storage/node.d.ts.map +1 -1
  71. package/dist/types/src/storage/node.js +1 -1
  72. package/dist/types/src/storage/node.js.map +1 -1
  73. package/dist/types/src/storage/node.test.js +1 -1
  74. package/dist/types/src/storage/node.test.js.map +1 -1
  75. package/dist/types/tsconfig.tsbuildinfo +1 -1
  76. package/package.json +21 -17
  77. package/src/cli-observability-secrets.json +2 -2
  78. package/src/extensions/otel/extension.ts +102 -16
  79. package/src/extensions/otel/logs.ts +6 -3
  80. package/src/extensions/otel/metrics.ts +2 -2
  81. package/src/extensions/otel/otel.ts +13 -0
  82. package/src/extensions/otel/span-processors.ts +45 -0
  83. package/src/extensions/otel/traces-browser.ts +91 -15
  84. package/src/extensions/otel/traces.ts +76 -12
  85. package/src/extensions/posthog/extension.ts +31 -17
  86. package/src/extensions/posthog/log-processor.test.ts +7 -6
  87. package/src/extensions/posthog/log-processor.ts +10 -21
  88. package/src/providers/client-observability.ts +2 -0
  89. package/src/storage/browser.ts +14 -4
  90. package/src/storage/node.test.ts +1 -2
  91. package/src/storage/node.ts +1 -2
  92. package/src/vite-import-meta.d.ts +14 -0
  93. package/dist/lib/browser/chunk-K4VFBKST.mjs.map +0 -7
  94. package/dist/lib/browser/log-processor-FDLTDQEM.mjs.map +0 -7
  95. package/dist/lib/browser/logs-ATTRIUTL.mjs.map +0 -7
  96. package/dist/lib/browser/metrics-PKTV6IGF.mjs.map +0 -7
  97. package/dist/lib/browser/traces-browser-5DQUYGQ7.mjs +0 -68
  98. package/dist/lib/browser/traces-browser-5DQUYGQ7.mjs.map +0 -7
  99. package/dist/lib/node-esm/chunk-FEVP3MK4.mjs.map +0 -7
  100. package/dist/lib/node-esm/log-processor-TKJVJJSJ.mjs.map +0 -7
  101. package/dist/lib/node-esm/logs-7J45KLM7.mjs.map +0 -7
  102. package/dist/lib/node-esm/metrics-H7DDLYSG.mjs.map +0 -7
  103. package/dist/lib/node-esm/traces-KMTHMYFX.mjs +0 -44
  104. package/dist/lib/node-esm/traces-KMTHMYFX.mjs.map +0 -7
@@ -6,8 +6,15 @@ var setDiagLogger = (level) => {
6
6
  diag.setLogger(new DiagConsoleLogger(), logLevel);
7
7
  }
8
8
  };
9
+ var resolveOtlpUrl = (url) => {
10
+ if (typeof window !== "undefined" && url.startsWith("/")) {
11
+ return new URL(url, window.location.origin).toString();
12
+ }
13
+ return url;
14
+ };
9
15
 
10
16
  export {
11
- setDiagLogger
17
+ setDiagLogger,
18
+ resolveOtlpUrl
12
19
  };
13
- //# sourceMappingURL=chunk-K4VFBKST.mjs.map
20
+ //# sourceMappingURL=chunk-PSFTIG54.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/extensions/otel/otel.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api';\nimport { type Resource } from '@opentelemetry/resources';\n\nexport type OtelOptions = {\n endpoint: string;\n headers: Record<string, string>;\n resource: Resource;\n getTags: () => { [key: string]: string };\n consoleDiagLogLevel?: string;\n};\n\nexport const setDiagLogger = (level?: string) => {\n const logLevel = DiagLogLevel[level as keyof typeof DiagLogLevel];\n if (logLevel) {\n diag.setLogger(new DiagConsoleLogger(), logLevel);\n }\n};\n\n/**\n * Resolve a possibly-relative OTLP exporter URL to an absolute URL.\n * The OpenTelemetry browser HTTP exporter validates user-provided URLs with `new URL(url)`,\n * which throws on relative paths like `/api/otel/v1/logs`. In a browser context we resolve\n * against `window.location.origin`; outside the browser we return the input unchanged.\n */\nexport const resolveOtlpUrl = (url: string): string => {\n if (typeof window !== 'undefined' && url.startsWith('/')) {\n return new URL(url, window.location.origin).toString();\n }\n return url;\n};\n"],
5
+ "mappings": ";AAIA,SAASA,mBAAmBC,cAAcC,YAAY;AAW/C,IAAMC,gBAAgB,CAACC,UAAAA;AAC5B,QAAMC,WAAWJ,aAAaG,KAAAA;AAC9B,MAAIC,UAAU;AACZH,SAAKI,UAAU,IAAIN,kBAAAA,GAAqBK,QAAAA;EAC1C;AACF;AAQO,IAAME,iBAAiB,CAACC,QAAAA;AAC7B,MAAI,OAAOC,WAAW,eAAeD,IAAIE,WAAW,GAAA,GAAM;AACxD,WAAO,IAAIC,IAAIH,KAAKC,OAAOG,SAASC,MAAM,EAAEC,SAAQ;EACtD;AACA,SAAON;AACT;",
6
+ "names": ["DiagConsoleLogger", "DiagLogLevel", "diag", "setDiagLogger", "level", "logLevel", "setLogger", "resolveOtlpUrl", "url", "window", "startsWith", "URL", "location", "origin", "toString"]
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
  /**
@@ -292,29 +253,13 @@ var make = () => Effect.succeed(new ObservabilityImpl());
292
253
  var addExtension = (_extension) => Effect.fn(function* (_observability) {
293
254
  const observability = yield* _observability;
294
255
  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
- });
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'", ""] });
304
257
  observability._addExtension(extension);
305
258
  return observability;
306
259
  });
307
260
  var addDataProvider = (dataProvider) => Effect.fn(function* (_observability) {
308
261
  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
- });
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'", ""] });
318
263
  observability._addDataProvider(dataProvider);
319
264
  return observability;
320
265
  });
@@ -344,6 +289,7 @@ import * as Effect3 from "effect/Effect";
344
289
  import * as Match from "effect/Match";
345
290
  import * as Option from "effect/Option";
346
291
  import * as Ref from "effect/Ref";
292
+ import { resolveTelemetryTag } from "@dxos/config";
347
293
  import { LogLevel, log as log3 } from "@dxos/log";
348
294
  import { isNode, isNonNullable } from "@dxos/util";
349
295
 
@@ -351,8 +297,8 @@ import { isNode, isNonNullable } from "@dxos/util";
351
297
  var cli_observability_secrets_default = {
352
298
  POSTHOG_API_KEY: null,
353
299
  IPDATA_API_KEY: "73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786",
354
- OTEL_ENDPOINT: "https://ingest.eu.signoz.cloud:443",
355
- OTEL_HEADERS: "signoz-ingestion-key: 5300e0c9-a5e8-4a10-9c61-f473e539c0b7"
300
+ OTEL_ENDPOINT: "/api/otel",
301
+ OTEL_HEADERS: null
356
302
  };
357
303
 
358
304
  // src/extensions/stub.ts
@@ -387,49 +333,59 @@ var extensions = Effect3.fn(function* ({
387
333
  metrics: metricsEnabled = false,
388
334
  traces: tracesEnabled = false
389
335
  }) {
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"));
336
+ const { OtelLogs } = yield* Effect3.promise(() => import("./logs-UTNIFYHF.mjs"));
337
+ const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-PRGSYAZJ.mjs"));
338
+ const { OtelTraces } = yield* Effect3.promise(() => import("./traces-browser-XRINKQUA.mjs"));
393
339
  const cachedDisabled = yield* Effect3.promise(() => isObservabilityDisabled(serviceName));
394
- const enabledRef = yield* Ref.make(!cachedDisabled);
340
+ const disabled = cachedDisabled || isObservabilityDisabledSync(serviceName);
341
+ const enabledRef = yield* Ref.make(!disabled);
395
342
  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;
343
+ const endpoint = isNode() ? process.env.DX_OTEL_ENDPOINT ?? _endpoint ?? cli_observability_secrets_default.OTEL_ENDPOINT : config.values.runtime?.app?.env?.DX_OTEL_ENDPOINT ?? _endpoint;
397
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));
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
- });
345
+ if (!endpoint) {
346
+ log3.info("Missing OTEL_ENDPOINT", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 31, S: this });
405
347
  return stubExtension;
406
348
  }
349
+ const resolvedHeaders = headers ?? {};
350
+ const resolvedEndpoint = !isNode() && endpoint.startsWith("/") ? `${globalThis.location.origin}${endpoint}` : endpoint;
351
+ const clientTag = resolveTelemetryTag(config);
352
+ if (clientTag) {
353
+ tags.set("ctx.tag", clientTag);
354
+ }
407
355
  const resource = defaultResource().merge(resourceFromAttributes({
408
356
  [ATTR_SERVICE_NAME]: serviceName,
409
357
  [ATTR_SERVICE_VERSION]: serviceVersion,
410
- "deployment.environment": environment
358
+ "session.id": crypto.randomUUID(),
359
+ "deployment.environment": environment,
360
+ "dxos.process.type": detectProcessType(),
361
+ ...clientTag ? {
362
+ "ctx.tag": clientTag
363
+ } : {}
411
364
  }));
412
365
  const logs = logsEnabled ? new OtelLogs({
413
- endpoint,
414
- headers,
366
+ endpoint: resolvedEndpoint,
367
+ headers: resolvedHeaders,
415
368
  resource,
416
369
  getTags: () => Object.fromEntries(tags),
417
370
  logLevel
418
371
  }) : void 0;
419
372
  const metrics = metricsEnabled ? new OtelMetrics({
420
- endpoint,
421
- headers,
373
+ endpoint: resolvedEndpoint,
374
+ headers: resolvedHeaders,
422
375
  resource,
423
376
  getTags: () => Object.fromEntries(tags)
424
377
  }) : void 0;
425
378
  const traces = tracesEnabled ? new OtelTraces({
426
- endpoint,
427
- headers,
379
+ endpoint: resolvedEndpoint,
380
+ headers: resolvedHeaders,
428
381
  resource,
429
382
  getTags: () => Object.fromEntries(tags)
430
383
  }) : void 0;
431
- return {
384
+ const extension = {
432
385
  initialize: () => Effect3.sync(() => {
386
+ if (disabled) {
387
+ return;
388
+ }
433
389
  if (logs) {
434
390
  log3.runtimeConfig.processors.push(logs.logProcessor);
435
391
  }
@@ -446,12 +402,28 @@ var extensions = Effect3.fn(function* ({
446
402
  yield* Ref.update(enabledRef, () => false);
447
403
  }),
448
404
  close: () => Effect3.promise(async () => {
449
- await logs?.close();
450
- await metrics?.close();
405
+ const results = await Promise.allSettled([
406
+ logs?.close(),
407
+ metrics?.close()
408
+ ]);
409
+ for (const result of results) {
410
+ if (result.status === "rejected") {
411
+ log3.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 116, S: this });
412
+ }
413
+ }
414
+ await traces?.close();
451
415
  }),
452
416
  flush: () => Effect3.promise(async () => {
453
- await logs?.flush();
454
- await metrics?.flush();
417
+ const results = await Promise.allSettled([
418
+ logs?.flush(),
419
+ metrics?.flush()
420
+ ]);
421
+ for (const result of results) {
422
+ if (result.status === "rejected") {
423
+ log3.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 131, S: this });
424
+ }
425
+ }
426
+ await traces?.flush();
455
427
  }),
456
428
  setTags: (incomingTags) => {
457
429
  for (const [key, value2] of Object.entries(incomingTags)) {
@@ -479,7 +451,35 @@ var extensions = Effect3.fn(function* ({
479
451
  } : void 0
480
452
  ].filter(isNonNullable)
481
453
  };
454
+ return extension;
482
455
  });
456
+ var isObservabilityDisabledSync = (serviceName) => {
457
+ if (isNode()) {
458
+ return process.env.DX_DISABLE_OBSERVABILITY === "true";
459
+ }
460
+ try {
461
+ if (typeof localStorage !== "undefined") {
462
+ return localStorage.getItem(`${serviceName}/observability-disabled`) === "true";
463
+ }
464
+ } catch {
465
+ }
466
+ return false;
467
+ };
468
+ var detectProcessType = () => {
469
+ if (isNode()) {
470
+ return "node";
471
+ }
472
+ if (typeof window !== "undefined") {
473
+ return "browser";
474
+ }
475
+ if (typeof globalThis.ServiceWorkerGlobalScope !== "undefined") {
476
+ return "service-worker";
477
+ }
478
+ if (typeof globalThis.SharedWorkerGlobalScope !== "undefined") {
479
+ return "shared-worker";
480
+ }
481
+ return "dedicated-worker";
482
+ };
483
483
  var parseHeaders = (unparsedHeaders) => {
484
484
  return unparsedHeaders.split(";").reduce((acc, header) => {
485
485
  const [key, ...rest] = header.split(":");
@@ -498,7 +498,7 @@ __export(posthog_exports, {
498
498
 
499
499
  // src/extensions/posthog/extension.ts
500
500
  import * as Effect4 from "effect/Effect";
501
- import { LogBuffer, log as log4 } from "@dxos/log";
501
+ import { log as log4 } from "@dxos/log";
502
502
  var __dxlog_file4 = "/__w/dxos/dxos/packages/sdk/observability/src/extensions/posthog/extension.ts";
503
503
  var uploadLogs = async (body) => {
504
504
  try {
@@ -512,12 +512,7 @@ var uploadLogs = async (body) => {
512
512
  if (!response.ok) {
513
513
  log4.warn("feedback log upload failed", {
514
514
  status: response.status
515
- }, {
516
- F: __dxlog_file4,
517
- L: 34,
518
- S: void 0,
519
- C: (f, a) => f(...a)
520
- });
515
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 17, S: void 0 });
521
516
  return void 0;
522
517
  }
523
518
  const { key } = await response.json();
@@ -525,41 +520,26 @@ var uploadLogs = async (body) => {
525
520
  } catch (err) {
526
521
  log4.warn("feedback log upload error", {
527
522
  error: err
528
- }, {
529
- F: __dxlog_file4,
530
- L: 40,
531
- S: void 0,
532
- C: (f, a) => f(...a)
533
- });
523
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 25, S: void 0 });
534
524
  return void 0;
535
525
  }
536
526
  };
537
- var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig, logBuffer: externalLogBuffer }) {
527
+ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig, logStore, feedbackLogMaxSize }) {
538
528
  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
- });
529
+ log4("PostHog is being stubbed because it is running in a worker.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 33, S: this });
545
530
  return stubExtension;
546
531
  }
547
532
  const feedbackSurveyId = config.get("runtime.app.env.DX_POSTHOG_FEEDBACK_SURVEY_ID");
548
533
  const apiKey = config.get("runtime.app.env.DX_POSTHOG_API_KEY");
549
534
  const api_host = config.get("runtime.app.env.DX_POSTHOG_API_HOST");
550
535
  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
- });
536
+ log4.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 40, S: this });
557
537
  return stubExtension;
558
538
  }
559
539
  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();
540
+ const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-HPHWNBOK.mjs"));
562
541
  let feedbackSurveyAvailable = null;
542
+ let unregisterPosthogProcessors;
563
543
  const checkFeedbackSurveyAvailable = () => feedbackSurveyId ? Effect4.promise(() => {
564
544
  if (feedbackSurveyAvailable !== null) {
565
545
  return Promise.resolve(feedbackSurveyAvailable);
@@ -590,19 +570,15 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
590
570
  } : {}
591
571
  });
592
572
  }
593
- log4.runtimeConfig.processors.push(logProcessor);
594
- log4.runtimeConfig.processors.push(logBuffer.logProcessor);
573
+ unregisterPosthogProcessors?.();
574
+ const removePosthogLog = log4.addProcessor(logProcessor, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 79, S: this });
575
+ unregisterPosthogProcessors = () => {
576
+ removePosthogLog();
577
+ };
595
578
  }),
596
579
  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
- }
580
+ unregisterPosthogProcessors?.();
581
+ unregisterPosthogProcessors = void 0;
606
582
  }),
607
583
  enable: () => Effect4.sync(() => posthog.opt_in_capturing()),
608
584
  disable: () => Effect4.sync(() => posthog.opt_out_capturing()),
@@ -642,17 +618,17 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
642
618
  if (!survey || survey.questions.length === 0) {
643
619
  log4.error("Missing feedback survey or survey has no questions", {
644
620
  feedbackSurveyId
645
- }, {
646
- F: __dxlog_file4,
647
- L: 151,
648
- S: this,
649
- C: (f, a) => f(...a)
650
- });
621
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 124, S: this });
651
622
  return;
652
623
  }
653
- let debugLogDumpKey;
654
- if (form.includeLogs !== false && logBuffer.size > 0) {
655
- debugLogDumpKey = await uploadLogs(logBuffer.serialize());
624
+ let debugLogDumpKey = null;
625
+ if (form.includeLogs !== false && logStore !== void 0) {
626
+ const ndjson = await logStore.export({
627
+ maxSize: feedbackLogMaxSize
628
+ });
629
+ if (ndjson.length > 0) {
630
+ debugLogDumpKey = await uploadLogs(ndjson) ?? "failed";
631
+ }
656
632
  }
657
633
  const question = survey.questions[0];
658
634
  posthog.capture("survey sent", {
@@ -664,9 +640,7 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
664
640
  }
665
641
  ],
666
642
  [`$survey_response_${question.id}`]: form.message,
667
- ...debugLogDumpKey ? {
668
- debug_log_dump_key: debugLogDumpKey
669
- } : {}
643
+ debug_log_dump_key: debugLogDumpKey
670
644
  });
671
645
  });
672
646
  },
@@ -732,19 +706,11 @@ var identityProvider = (clientServices) => Effect5.fn(function* (observability)
732
706
  });
733
707
  });
734
708
  var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
735
- const ctx = new Context(void 0, {
736
- F: __dxlog_file5,
737
- L: 61
738
- });
709
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 50 });
739
710
  let lastNetworkStatus;
740
711
  const updateSignalMetrics = new Event().debounce(NETWORK_METRICS_MIN_INTERVAL);
741
712
  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
- });
713
+ log5("send signal metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 55, S: this });
748
714
  lastNetworkStatus?.signaling?.forEach(({ server, state }) => {
749
715
  observability.metrics.gauge("dxos.client.network.signal.connectionState", state, {
750
716
  server
@@ -789,20 +755,11 @@ var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
789
755
  };
790
756
  });
791
757
  var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
792
- const ctx = new Context(void 0, {
793
- F: __dxlog_file5,
794
- L: 121
795
- });
758
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 100 });
759
+ log5("runtimeMetricsProvider: requesting platform from SystemService", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 101, S: this });
796
760
  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
- });
761
+ log5("runtimeMetricsProvider: platform received", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 103, S: this });
762
+ invariant2(platform, "platform is required", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 104, S: this, A: ["platform", "'platform is required'"] });
806
763
  observability.setTags({
807
764
  platformType: Platform.PLATFORM_TYPE[platform.type].toLowerCase(),
808
765
  platform: platform.platform,
@@ -826,33 +783,20 @@ var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
826
783
  }
827
784
  }).catch((error) => log5("platform error", {
828
785
  error
829
- }, {
830
- F: __dxlog_file5,
831
- L: 152,
832
- S: this,
833
- C: (f, a) => f(...a)
834
- }));
786
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 126, S: this }));
835
787
  }, RUNTIME_METRICS_MIN_INTERVAL);
836
788
  return async () => {
837
789
  await ctx.dispose();
838
790
  };
839
791
  });
840
792
  var spacesMetricsProvider = (client) => Effect5.fn(function* (observability) {
841
- const ctx = new Context(void 0, {
842
- F: __dxlog_file5,
843
- L: 165
844
- });
793
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 135 });
845
794
  const spaces = client.spaces.get();
846
795
  const subscriptions = /* @__PURE__ */ new Map();
847
796
  ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));
848
797
  const updateSpaceMetrics = new Event().debounce(SPACE_METRICS_MIN_INTERVAL);
849
798
  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
- });
799
+ log5("send space metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 142, S: this });
856
800
  for (const data of mapSpaces(spaces, {
857
801
  truncateKeys: true
858
802
  })) {
@@ -973,12 +917,7 @@ var provider = (config) => (observability) => Effect6.gen(function* () {
973
917
  }).pipe(Effect6.provide(FetchHttpClient.layer), Effect6.catchAll((err) => Effect6.sync(() => {
974
918
  log6.verbose("ipdata fetch failed", {
975
919
  err
976
- }, {
977
- F: __dxlog_file6,
978
- L: 88,
979
- S: void 0,
980
- C: (f, a) => f(...a)
981
- });
920
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 54, S: void 0 });
982
921
  })));
983
922
 
984
923
  // src/providers/storage.ts