@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.
- package/LICENSE +102 -5
- package/dist/lib/browser/{chunk-K4VFBKST.mjs → chunk-PSFTIG54.mjs} +9 -2
- package/dist/lib/browser/chunk-PSFTIG54.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +176 -217
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{log-processor-FDLTDQEM.mjs → log-processor-HPHWNBOK.mjs} +11 -18
- package/dist/lib/browser/log-processor-HPHWNBOK.mjs.map +7 -0
- package/dist/lib/browser/{logs-ATTRIUTL.mjs → logs-UTNIFYHF.mjs} +7 -4
- package/dist/lib/browser/logs-UTNIFYHF.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{metrics-PKTV6IGF.mjs → metrics-PRGSYAZJ.mjs} +7 -21
- package/dist/lib/browser/metrics-PRGSYAZJ.mjs.map +7 -0
- package/dist/lib/browser/traces-browser-XRINKQUA.mjs +154 -0
- package/dist/lib/browser/traces-browser-XRINKQUA.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-FEVP3MK4.mjs → chunk-EDDZWPYV.mjs} +9 -2
- package/dist/lib/node-esm/chunk-EDDZWPYV.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +161 -184
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{log-processor-TKJVJJSJ.mjs → log-processor-ZODHERST.mjs} +11 -18
- package/dist/lib/node-esm/log-processor-ZODHERST.mjs.map +7 -0
- package/dist/lib/node-esm/{logs-7J45KLM7.mjs → logs-ARJUVN3T.mjs} +7 -4
- package/dist/lib/node-esm/logs-ARJUVN3T.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{metrics-H7DDLYSG.mjs → metrics-DREJOOAC.mjs} +7 -21
- package/dist/lib/node-esm/metrics-DREJOOAC.mjs.map +7 -0
- package/dist/lib/node-esm/traces-74F7JUKF.mjs +125 -0
- package/dist/lib/node-esm/traces-74F7JUKF.mjs.map +7 -0
- package/dist/types/src/cli-observability-secrets.json +2 -2
- package/dist/types/src/extensions/otel/extension.d.ts.map +1 -1
- package/dist/types/src/extensions/otel/extension.js +112 -16
- package/dist/types/src/extensions/otel/extension.js.map +1 -1
- package/dist/types/src/extensions/otel/logs.d.ts.map +1 -1
- package/dist/types/src/extensions/otel/logs.js +6 -3
- package/dist/types/src/extensions/otel/logs.js.map +1 -1
- package/dist/types/src/extensions/otel/metrics.d.ts.map +1 -1
- package/dist/types/src/extensions/otel/metrics.js +2 -2
- package/dist/types/src/extensions/otel/metrics.js.map +1 -1
- package/dist/types/src/extensions/otel/otel.d.ts +7 -0
- package/dist/types/src/extensions/otel/otel.d.ts.map +1 -1
- package/dist/types/src/extensions/otel/otel.js +12 -0
- package/dist/types/src/extensions/otel/otel.js.map +1 -1
- package/dist/types/src/extensions/otel/span-processors.d.ts +25 -0
- package/dist/types/src/extensions/otel/span-processors.d.ts.map +1 -0
- package/dist/types/src/extensions/otel/span-processors.js +41 -0
- package/dist/types/src/extensions/otel/span-processors.js.map +1 -0
- package/dist/types/src/extensions/otel/traces-browser.d.ts +17 -0
- package/dist/types/src/extensions/otel/traces-browser.d.ts.map +1 -1
- package/dist/types/src/extensions/otel/traces-browser.js +69 -14
- package/dist/types/src/extensions/otel/traces-browser.js.map +1 -1
- package/dist/types/src/extensions/otel/traces.d.ts +17 -0
- package/dist/types/src/extensions/otel/traces.d.ts.map +1 -1
- package/dist/types/src/extensions/otel/traces.js +59 -9
- package/dist/types/src/extensions/otel/traces.js.map +1 -1
- package/dist/types/src/extensions/posthog/extension.d.ts +13 -3
- package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -1
- package/dist/types/src/extensions/posthog/extension.js +42 -28
- package/dist/types/src/extensions/posthog/extension.js.map +1 -1
- package/dist/types/src/extensions/posthog/log-processor.d.ts.map +1 -1
- package/dist/types/src/extensions/posthog/log-processor.js +10 -19
- package/dist/types/src/extensions/posthog/log-processor.js.map +1 -1
- package/dist/types/src/extensions/posthog/log-processor.test.js +2 -2
- package/dist/types/src/extensions/posthog/log-processor.test.js.map +1 -1
- package/dist/types/src/observability-extension.d.ts +1 -1
- package/dist/types/src/observability-extension.d.ts.map +1 -1
- package/dist/types/src/observability.d.ts.map +1 -1
- package/dist/types/src/observability.js +4 -2
- package/dist/types/src/observability.js.map +1 -1
- package/dist/types/src/observability.test.js +1 -1
- package/dist/types/src/observability.test.js.map +1 -1
- package/dist/types/src/providers/client-observability.d.ts.map +1 -1
- package/dist/types/src/providers/client-observability.js +2 -0
- package/dist/types/src/providers/client-observability.js.map +1 -1
- package/dist/types/src/providers/ip-data.d.ts.map +1 -1
- package/dist/types/src/storage/browser.d.ts.map +1 -1
- package/dist/types/src/storage/browser.js +15 -4
- package/dist/types/src/storage/browser.js.map +1 -1
- package/dist/types/src/storage/node.d.ts.map +1 -1
- package/dist/types/src/storage/node.js +1 -1
- package/dist/types/src/storage/node.js.map +1 -1
- package/dist/types/src/storage/node.test.js +1 -1
- package/dist/types/src/storage/node.test.js.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +35 -31
- package/src/cli-observability-secrets.json +2 -2
- package/src/extensions/otel/extension.ts +118 -17
- package/src/extensions/otel/logs.ts +6 -3
- package/src/extensions/otel/metrics.ts +2 -2
- package/src/extensions/otel/otel.ts +13 -0
- package/src/extensions/otel/span-processors.ts +45 -0
- package/src/extensions/otel/traces-browser.ts +91 -15
- package/src/extensions/otel/traces.ts +76 -12
- package/src/extensions/posthog/extension.ts +55 -30
- package/src/extensions/posthog/log-processor.test.ts +7 -6
- package/src/extensions/posthog/log-processor.ts +10 -21
- package/src/observability-extension.ts +1 -1
- package/src/observability.test.ts +1 -1
- package/src/observability.ts +4 -2
- package/src/providers/client-observability.ts +2 -0
- package/src/storage/browser.ts +14 -4
- package/src/storage/node.test.ts +1 -2
- package/src/storage/node.ts +1 -2
- package/src/vite-import-meta.d.ts +14 -0
- package/dist/lib/browser/chunk-K4VFBKST.mjs.map +0 -7
- package/dist/lib/browser/log-processor-FDLTDQEM.mjs.map +0 -7
- package/dist/lib/browser/logs-ATTRIUTL.mjs.map +0 -7
- package/dist/lib/browser/metrics-PKTV6IGF.mjs.map +0 -7
- package/dist/lib/browser/traces-browser-5DQUYGQ7.mjs +0 -68
- package/dist/lib/browser/traces-browser-5DQUYGQ7.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-FEVP3MK4.mjs.map +0 -7
- package/dist/lib/node-esm/log-processor-TKJVJJSJ.mjs.map +0 -7
- package/dist/lib/node-esm/logs-7J45KLM7.mjs.map +0 -7
- package/dist/lib/node-esm/metrics-H7DDLYSG.mjs.map +0 -7
- package/dist/lib/node-esm/traces-KMTHMYFX.mjs +0 -44
- 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(
|
|
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(
|
|
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
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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(
|
|
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(
|
|
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: "
|
|
355
|
-
OTEL_HEADERS:
|
|
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-
|
|
391
|
-
const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-
|
|
392
|
-
const { OtelTraces } = yield* Effect3.promise(() => import("./traces-browser-
|
|
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
|
|
342
|
+
const disabled = cachedDisabled || isObservabilityDisabledSync(serviceName);
|
|
343
|
+
const enabledRef = yield* Ref.make(!disabled);
|
|
395
344
|
const tags = /* @__PURE__ */ new Map();
|
|
396
|
-
const
|
|
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
|
|
399
|
-
log3.info("Missing OTEL_ENDPOINT
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
|
450
|
-
|
|
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
|
|
454
|
-
|
|
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 {
|
|
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,
|
|
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-
|
|
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
|
-
|
|
594
|
-
log4.
|
|
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
|
-
|
|
598
|
-
|
|
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
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
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
|
-
|
|
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
|
-
|
|
798
|
-
|
|
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
|