@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.
- package/LICENSE +102 -5
- package/README.md +14 -11
- 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 +181 -283
- package/dist/lib/browser/index.mjs.map +4 -4
- 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 +166 -250
- package/dist/lib/node-esm/index.mjs.map +4 -4
- 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 +73 -12
- 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 -0
- package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -1
- package/dist/types/src/extensions/posthog/extension.js +41 -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/index.d.ts +0 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/index.js +0 -1
- package/dist/types/src/index.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/providers/ip-data.js +4 -2
- package/dist/types/src/providers/ip-data.js.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 +36 -32
- 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 +95 -13
- package/src/extensions/otel/traces.ts +76 -12
- package/src/extensions/posthog/extension.ts +54 -27
- package/src/extensions/posthog/log-processor.test.ts +7 -6
- package/src/extensions/posthog/log-processor.ts +10 -21
- package/src/index.ts +0 -1
- 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/providers/ip-data.ts +5 -2
- 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-XYXBF5ZX.mjs +0 -62
- package/dist/lib/browser/traces-browser-XYXBF5ZX.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
- package/dist/types/src/log-buffer.d.ts +0 -34
- package/dist/types/src/log-buffer.d.ts.map +0 -1
- package/dist/types/src/log-buffer.js +0 -70
- package/dist/types/src/log-buffer.js.map +0 -1
- package/dist/types/src/log-buffer.test.d.ts +0 -2
- package/dist/types/src/log-buffer.test.d.ts.map +0 -1
- package/dist/types/src/log-buffer.test.js +0 -107
- package/dist/types/src/log-buffer.test.js.map +0 -1
- package/src/log-buffer.test.ts +0 -134
- 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 {
|
|
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: "
|
|
423
|
-
OTEL_HEADERS:
|
|
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 =
|
|
357
|
+
logLevel = LogLevel.INFO,
|
|
455
358
|
metrics: metricsEnabled = false,
|
|
456
359
|
traces: tracesEnabled = false
|
|
457
360
|
}) {
|
|
458
|
-
const { OtelLogs } = yield* Effect3.promise(() => import("./logs-
|
|
459
|
-
const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-
|
|
460
|
-
const { OtelTraces } = yield* Effect3.promise(() => import("./traces-
|
|
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
|
|
365
|
+
const disabled = cachedDisabled || isObservabilityDisabledSync(serviceName);
|
|
366
|
+
const enabledRef = yield* Ref.make(!disabled);
|
|
463
367
|
const tags = /* @__PURE__ */ new Map();
|
|
464
|
-
const
|
|
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
|
|
467
|
-
log2.info("Missing OTEL_ENDPOINT
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
|
518
|
-
|
|
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
|
|
522
|
-
|
|
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-
|
|
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
|
-
|
|
662
|
-
log3.
|
|
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
|
-
|
|
666
|
-
|
|
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
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
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
|
-
|
|
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
|
-
|
|
866
|
-
|
|
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(
|
|
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.
|
|
1042
|
-
|
|
1043
|
-
|
|
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
|