@dxos/observability 0.8.4-main.3eb6e50203 → 0.8.4-main.3fbcb4aa9b
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/README.md +14 -11
- package/dist/lib/browser/{chunk-K4VFBKST.mjs → chunk-3534PNWM.mjs} +1 -1
- package/dist/lib/browser/{chunk-K4VFBKST.mjs.map → chunk-3534PNWM.mjs.map} +2 -2
- package/dist/lib/browser/index.mjs +130 -256
- 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-A2VDAHHD.mjs} +5 -3
- package/dist/lib/browser/{logs-ATTRIUTL.mjs.map → logs-A2VDAHHD.mjs.map} +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{metrics-PKTV6IGF.mjs → metrics-6OSN54ZV.mjs} +5 -20
- package/dist/lib/browser/{metrics-PKTV6IGF.mjs.map → metrics-6OSN54ZV.mjs.map} +2 -2
- package/dist/lib/browser/traces-browser-6MRGAKFC.mjs +151 -0
- package/dist/lib/browser/traces-browser-6MRGAKFC.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-FEVP3MK4.mjs → chunk-SYPJQI4L.mjs} +1 -1
- package/dist/lib/node-esm/{chunk-FEVP3MK4.mjs.map → chunk-SYPJQI4L.mjs.map} +2 -2
- package/dist/lib/node-esm/index.mjs +115 -223
- 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-TA32MBMW.mjs} +5 -3
- package/dist/lib/node-esm/{logs-7J45KLM7.mjs.map → logs-TA32MBMW.mjs.map} +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{metrics-H7DDLYSG.mjs → metrics-C5IKPAWD.mjs} +5 -20
- package/dist/lib/node-esm/{metrics-H7DDLYSG.mjs.map → metrics-C5IKPAWD.mjs.map} +2 -2
- package/dist/lib/node-esm/traces-5LKHMVVG.mjs +122 -0
- package/dist/lib/node-esm/traces-5LKHMVVG.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 +83 -6
- 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 +4 -1
- 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.map +1 -1
- package/dist/types/src/extensions/otel/otel.d.ts.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 +71 -11
- 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 +57 -8
- package/dist/types/src/extensions/otel/traces.js.map +1 -1
- package/dist/types/src/extensions/posthog/extension.d.ts +7 -0
- package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -1
- package/dist/types/src/extensions/posthog/extension.js +16 -15
- 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.d.ts.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 +22 -18
- package/src/cli-observability-secrets.json +2 -2
- package/src/extensions/otel/extension.ts +87 -7
- package/src/extensions/otel/logs.ts +4 -1
- package/src/extensions/otel/span-processors.ts +45 -0
- package/src/extensions/otel/traces-browser.ts +93 -11
- package/src/extensions/otel/traces.ts +74 -10
- package/src/extensions/posthog/extension.ts +23 -14
- 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/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/log-processor-FDLTDQEM.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/log-processor-TKJVJJSJ.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
|
/**
|
|
@@ -360,29 +276,13 @@ var make = () => Effect.succeed(new ObservabilityImpl());
|
|
|
360
276
|
var addExtension = (_extension) => Effect.fn(function* (_observability) {
|
|
361
277
|
const observability = yield* _observability;
|
|
362
278
|
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
|
-
});
|
|
279
|
+
invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 194, S: this, A: ["'_addExtension' in observability && typeof observability._addExtension === 'function'", ""] });
|
|
372
280
|
observability._addExtension(extension);
|
|
373
281
|
return observability;
|
|
374
282
|
});
|
|
375
283
|
var addDataProvider = (dataProvider) => Effect.fn(function* (_observability) {
|
|
376
284
|
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
|
-
});
|
|
285
|
+
invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 200, S: this, A: ["'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'", ""] });
|
|
386
286
|
observability._addDataProvider(dataProvider);
|
|
387
287
|
return observability;
|
|
388
288
|
});
|
|
@@ -412,15 +312,16 @@ import * as Effect3 from "effect/Effect";
|
|
|
412
312
|
import * as Match from "effect/Match";
|
|
413
313
|
import * as Option from "effect/Option";
|
|
414
314
|
import * as Ref from "effect/Ref";
|
|
415
|
-
import {
|
|
315
|
+
import { resolveTelemetryTag } from "@dxos/config";
|
|
316
|
+
import { LogLevel, log as log2 } from "@dxos/log";
|
|
416
317
|
import { isNode, isNonNullable } from "@dxos/util";
|
|
417
318
|
|
|
418
319
|
// src/cli-observability-secrets.json
|
|
419
320
|
var cli_observability_secrets_default = {
|
|
420
321
|
POSTHOG_API_KEY: null,
|
|
421
322
|
IPDATA_API_KEY: "73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786",
|
|
422
|
-
OTEL_ENDPOINT: "
|
|
423
|
-
OTEL_HEADERS:
|
|
323
|
+
OTEL_ENDPOINT: "/api/otel",
|
|
324
|
+
OTEL_HEADERS: null
|
|
424
325
|
};
|
|
425
326
|
|
|
426
327
|
// src/extensions/stub.ts
|
|
@@ -451,31 +352,36 @@ var extensions = Effect3.fn(function* ({
|
|
|
451
352
|
// - logs should be cached locally in a circular buffer
|
|
452
353
|
// - logs should be flushed to the server if user opts to include them in a bug report
|
|
453
354
|
logs: logsEnabled = false,
|
|
454
|
-
logLevel =
|
|
355
|
+
logLevel = LogLevel.INFO,
|
|
455
356
|
metrics: metricsEnabled = false,
|
|
456
357
|
traces: tracesEnabled = false
|
|
457
358
|
}) {
|
|
458
|
-
const { OtelLogs } = yield* Effect3.promise(() => import("./logs-
|
|
459
|
-
const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-
|
|
460
|
-
const { OtelTraces } = yield* Effect3.promise(() => import("./traces-
|
|
359
|
+
const { OtelLogs } = yield* Effect3.promise(() => import("./logs-TA32MBMW.mjs"));
|
|
360
|
+
const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-C5IKPAWD.mjs"));
|
|
361
|
+
const { OtelTraces } = yield* Effect3.promise(() => import("./traces-5LKHMVVG.mjs"));
|
|
461
362
|
const cachedDisabled = yield* Effect3.promise(() => isObservabilityDisabled(serviceName));
|
|
462
|
-
const
|
|
363
|
+
const disabled = cachedDisabled || isObservabilityDisabledSync(serviceName);
|
|
364
|
+
const enabledRef = yield* Ref.make(!disabled);
|
|
463
365
|
const tags = /* @__PURE__ */ new Map();
|
|
464
366
|
const endpoint = isNode() ? process.env.DX_OTEL_ENDPOINT ?? _endpoint ?? cli_observability_secrets_default.OTEL_ENDPOINT : config.values.runtime?.app?.env?.DX_OTEL_ENDPOINT;
|
|
465
367
|
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
368
|
if (!endpoint || !headers) {
|
|
467
|
-
log2.info("Missing OTEL_ENDPOINT or OTEL_HEADERS", void 0, {
|
|
468
|
-
F: __dxlog_file2,
|
|
469
|
-
L: 77,
|
|
470
|
-
S: this,
|
|
471
|
-
C: (f, a) => f(...a)
|
|
472
|
-
});
|
|
369
|
+
log2.info("Missing OTEL_ENDPOINT or OTEL_HEADERS", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 31, S: this });
|
|
473
370
|
return stubExtension;
|
|
474
371
|
}
|
|
372
|
+
const clientTag = resolveTelemetryTag(config);
|
|
373
|
+
if (clientTag) {
|
|
374
|
+
tags.set("ctx.tag", clientTag);
|
|
375
|
+
}
|
|
475
376
|
const resource = defaultResource().merge(resourceFromAttributes({
|
|
476
377
|
[ATTR_SERVICE_NAME]: serviceName,
|
|
477
378
|
[ATTR_SERVICE_VERSION]: serviceVersion,
|
|
478
|
-
"
|
|
379
|
+
"session.id": crypto.randomUUID(),
|
|
380
|
+
"deployment.environment": environment,
|
|
381
|
+
"dxos.process.type": detectProcessType(),
|
|
382
|
+
...clientTag ? {
|
|
383
|
+
"ctx.tag": clientTag
|
|
384
|
+
} : {}
|
|
479
385
|
}));
|
|
480
386
|
const logs = logsEnabled ? new OtelLogs({
|
|
481
387
|
endpoint,
|
|
@@ -496,8 +402,11 @@ var extensions = Effect3.fn(function* ({
|
|
|
496
402
|
resource,
|
|
497
403
|
getTags: () => Object.fromEntries(tags)
|
|
498
404
|
}) : void 0;
|
|
499
|
-
|
|
405
|
+
const extension = {
|
|
500
406
|
initialize: () => Effect3.sync(() => {
|
|
407
|
+
if (disabled) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
501
410
|
if (logs) {
|
|
502
411
|
log2.runtimeConfig.processors.push(logs.logProcessor);
|
|
503
412
|
}
|
|
@@ -514,12 +423,28 @@ var extensions = Effect3.fn(function* ({
|
|
|
514
423
|
yield* Ref.update(enabledRef, () => false);
|
|
515
424
|
}),
|
|
516
425
|
close: () => Effect3.promise(async () => {
|
|
517
|
-
await
|
|
518
|
-
|
|
426
|
+
const results = await Promise.allSettled([
|
|
427
|
+
logs?.close(),
|
|
428
|
+
metrics?.close()
|
|
429
|
+
]);
|
|
430
|
+
for (const result of results) {
|
|
431
|
+
if (result.status === "rejected") {
|
|
432
|
+
log2.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 111, S: this });
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
await traces?.close();
|
|
519
436
|
}),
|
|
520
437
|
flush: () => Effect3.promise(async () => {
|
|
521
|
-
await
|
|
522
|
-
|
|
438
|
+
const results = await Promise.allSettled([
|
|
439
|
+
logs?.flush(),
|
|
440
|
+
metrics?.flush()
|
|
441
|
+
]);
|
|
442
|
+
for (const result of results) {
|
|
443
|
+
if (result.status === "rejected") {
|
|
444
|
+
log2.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 126, S: this });
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
await traces?.flush();
|
|
523
448
|
}),
|
|
524
449
|
setTags: (incomingTags) => {
|
|
525
450
|
for (const [key, value2] of Object.entries(incomingTags)) {
|
|
@@ -547,7 +472,35 @@ var extensions = Effect3.fn(function* ({
|
|
|
547
472
|
} : void 0
|
|
548
473
|
].filter(isNonNullable)
|
|
549
474
|
};
|
|
475
|
+
return extension;
|
|
550
476
|
});
|
|
477
|
+
var isObservabilityDisabledSync = (serviceName) => {
|
|
478
|
+
if (isNode()) {
|
|
479
|
+
return process.env.DX_DISABLE_OBSERVABILITY === "true";
|
|
480
|
+
}
|
|
481
|
+
try {
|
|
482
|
+
if (typeof localStorage !== "undefined") {
|
|
483
|
+
return localStorage.getItem(`${serviceName}/observability-disabled`) === "true";
|
|
484
|
+
}
|
|
485
|
+
} catch {
|
|
486
|
+
}
|
|
487
|
+
return false;
|
|
488
|
+
};
|
|
489
|
+
var detectProcessType = () => {
|
|
490
|
+
if (isNode()) {
|
|
491
|
+
return "node";
|
|
492
|
+
}
|
|
493
|
+
if (typeof window !== "undefined") {
|
|
494
|
+
return "browser";
|
|
495
|
+
}
|
|
496
|
+
if (typeof globalThis.ServiceWorkerGlobalScope !== "undefined") {
|
|
497
|
+
return "service-worker";
|
|
498
|
+
}
|
|
499
|
+
if (typeof globalThis.SharedWorkerGlobalScope !== "undefined") {
|
|
500
|
+
return "shared-worker";
|
|
501
|
+
}
|
|
502
|
+
return "dedicated-worker";
|
|
503
|
+
};
|
|
551
504
|
var parseHeaders = (unparsedHeaders) => {
|
|
552
505
|
return unparsedHeaders.split(";").reduce((acc, header) => {
|
|
553
506
|
const [key, ...rest] = header.split(":");
|
|
@@ -580,12 +533,7 @@ var uploadLogs = async (body) => {
|
|
|
580
533
|
if (!response.ok) {
|
|
581
534
|
log3.warn("feedback log upload failed", {
|
|
582
535
|
status: response.status
|
|
583
|
-
}, {
|
|
584
|
-
F: __dxlog_file3,
|
|
585
|
-
L: 33,
|
|
586
|
-
S: void 0,
|
|
587
|
-
C: (f, a) => f(...a)
|
|
588
|
-
});
|
|
536
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 17, S: void 0 });
|
|
589
537
|
return void 0;
|
|
590
538
|
}
|
|
591
539
|
const { key } = await response.json();
|
|
@@ -593,41 +541,26 @@ var uploadLogs = async (body) => {
|
|
|
593
541
|
} catch (err) {
|
|
594
542
|
log3.warn("feedback log upload error", {
|
|
595
543
|
error: err
|
|
596
|
-
}, {
|
|
597
|
-
F: __dxlog_file3,
|
|
598
|
-
L: 39,
|
|
599
|
-
S: void 0,
|
|
600
|
-
C: (f, a) => f(...a)
|
|
601
|
-
});
|
|
544
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 25, S: void 0 });
|
|
602
545
|
return void 0;
|
|
603
546
|
}
|
|
604
547
|
};
|
|
605
|
-
var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig }) {
|
|
548
|
+
var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig, logStore }) {
|
|
606
549
|
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
|
-
});
|
|
550
|
+
log3("PostHog is being stubbed because it is running in a worker.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 33, S: this });
|
|
613
551
|
return stubExtension;
|
|
614
552
|
}
|
|
615
553
|
const feedbackSurveyId = config.get("runtime.app.env.DX_POSTHOG_FEEDBACK_SURVEY_ID");
|
|
616
554
|
const apiKey = config.get("runtime.app.env.DX_POSTHOG_API_KEY");
|
|
617
555
|
const api_host = config.get("runtime.app.env.DX_POSTHOG_API_HOST");
|
|
618
556
|
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
|
-
});
|
|
557
|
+
log3.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 40, S: this });
|
|
625
558
|
return stubExtension;
|
|
626
559
|
}
|
|
627
560
|
const { default: posthog } = yield* Effect4.promise(() => import("posthog-js"));
|
|
628
|
-
const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-
|
|
629
|
-
const logBuffer = new LogBuffer();
|
|
561
|
+
const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-ZODHERST.mjs"));
|
|
630
562
|
let feedbackSurveyAvailable = null;
|
|
563
|
+
let unregisterPosthogProcessors;
|
|
631
564
|
const checkFeedbackSurveyAvailable = () => feedbackSurveyId ? Effect4.promise(() => {
|
|
632
565
|
if (feedbackSurveyAvailable !== null) {
|
|
633
566
|
return Promise.resolve(feedbackSurveyAvailable);
|
|
@@ -658,19 +591,15 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
|
|
|
658
591
|
} : {}
|
|
659
592
|
});
|
|
660
593
|
}
|
|
661
|
-
|
|
662
|
-
log3.
|
|
594
|
+
unregisterPosthogProcessors?.();
|
|
595
|
+
const removePosthogLog = log3.addProcessor(logProcessor, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 79, S: this });
|
|
596
|
+
unregisterPosthogProcessors = () => {
|
|
597
|
+
removePosthogLog();
|
|
598
|
+
};
|
|
663
599
|
}),
|
|
664
600
|
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
|
-
}
|
|
601
|
+
unregisterPosthogProcessors?.();
|
|
602
|
+
unregisterPosthogProcessors = void 0;
|
|
674
603
|
}),
|
|
675
604
|
enable: () => Effect4.sync(() => posthog.opt_in_capturing()),
|
|
676
605
|
disable: () => Effect4.sync(() => posthog.opt_out_capturing()),
|
|
@@ -710,17 +639,15 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
|
|
|
710
639
|
if (!survey || survey.questions.length === 0) {
|
|
711
640
|
log3.error("Missing feedback survey or survey has no questions", {
|
|
712
641
|
feedbackSurveyId
|
|
713
|
-
}, {
|
|
714
|
-
F: __dxlog_file3,
|
|
715
|
-
L: 149,
|
|
716
|
-
S: this,
|
|
717
|
-
C: (f, a) => f(...a)
|
|
718
|
-
});
|
|
642
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 124, S: this });
|
|
719
643
|
return;
|
|
720
644
|
}
|
|
721
|
-
let debugLogDumpKey;
|
|
722
|
-
if (form.includeLogs !== false &&
|
|
723
|
-
|
|
645
|
+
let debugLogDumpKey = null;
|
|
646
|
+
if (form.includeLogs !== false && logStore !== void 0) {
|
|
647
|
+
const ndjson = await logStore.export();
|
|
648
|
+
if (ndjson.length > 0) {
|
|
649
|
+
debugLogDumpKey = await uploadLogs(ndjson) ?? "failed";
|
|
650
|
+
}
|
|
724
651
|
}
|
|
725
652
|
const question = survey.questions[0];
|
|
726
653
|
posthog.capture("survey sent", {
|
|
@@ -732,9 +659,7 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
|
|
|
732
659
|
}
|
|
733
660
|
],
|
|
734
661
|
[`$survey_response_${question.id}`]: form.message,
|
|
735
|
-
|
|
736
|
-
debug_log_dump_key: debugLogDumpKey
|
|
737
|
-
} : {}
|
|
662
|
+
debug_log_dump_key: debugLogDumpKey
|
|
738
663
|
});
|
|
739
664
|
});
|
|
740
665
|
},
|
|
@@ -800,19 +725,11 @@ var identityProvider = (clientServices) => Effect5.fn(function* (observability)
|
|
|
800
725
|
});
|
|
801
726
|
});
|
|
802
727
|
var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
|
|
803
|
-
const ctx = new Context(void 0, {
|
|
804
|
-
F: __dxlog_file4,
|
|
805
|
-
L: 61
|
|
806
|
-
});
|
|
728
|
+
const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 50 });
|
|
807
729
|
let lastNetworkStatus;
|
|
808
730
|
const updateSignalMetrics = new Event().debounce(NETWORK_METRICS_MIN_INTERVAL);
|
|
809
731
|
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
|
-
});
|
|
732
|
+
log4("send signal metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 55, S: this });
|
|
816
733
|
lastNetworkStatus?.signaling?.forEach(({ server, state }) => {
|
|
817
734
|
observability.metrics.gauge("dxos.client.network.signal.connectionState", state, {
|
|
818
735
|
server
|
|
@@ -857,20 +774,11 @@ var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
|
|
|
857
774
|
};
|
|
858
775
|
});
|
|
859
776
|
var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
|
|
860
|
-
const ctx = new Context(void 0, {
|
|
861
|
-
|
|
862
|
-
L: 121
|
|
863
|
-
});
|
|
777
|
+
const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 100 });
|
|
778
|
+
log4("runtimeMetricsProvider: requesting platform from SystemService", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 101, S: this });
|
|
864
779
|
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
|
-
});
|
|
780
|
+
log4("runtimeMetricsProvider: platform received", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 103, S: this });
|
|
781
|
+
invariant2(platform, "platform is required", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 104, S: this, A: ["platform", "'platform is required'"] });
|
|
874
782
|
observability.setTags({
|
|
875
783
|
platformType: Platform.PLATFORM_TYPE[platform.type].toLowerCase(),
|
|
876
784
|
platform: platform.platform,
|
|
@@ -894,33 +802,20 @@ var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
|
|
|
894
802
|
}
|
|
895
803
|
}).catch((error) => log4("platform error", {
|
|
896
804
|
error
|
|
897
|
-
}, {
|
|
898
|
-
F: __dxlog_file4,
|
|
899
|
-
L: 152,
|
|
900
|
-
S: this,
|
|
901
|
-
C: (f, a) => f(...a)
|
|
902
|
-
}));
|
|
805
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 126, S: this }));
|
|
903
806
|
}, RUNTIME_METRICS_MIN_INTERVAL);
|
|
904
807
|
return async () => {
|
|
905
808
|
await ctx.dispose();
|
|
906
809
|
};
|
|
907
810
|
});
|
|
908
811
|
var spacesMetricsProvider = (client) => Effect5.fn(function* (observability) {
|
|
909
|
-
const ctx = new Context(void 0, {
|
|
910
|
-
F: __dxlog_file4,
|
|
911
|
-
L: 165
|
|
912
|
-
});
|
|
812
|
+
const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 135 });
|
|
913
813
|
const spaces = client.spaces.get();
|
|
914
814
|
const subscriptions = /* @__PURE__ */ new Map();
|
|
915
815
|
ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));
|
|
916
816
|
const updateSpaceMetrics = new Event().debounce(SPACE_METRICS_MIN_INTERVAL);
|
|
917
817
|
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
|
-
});
|
|
818
|
+
log4("send space metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 142, S: this });
|
|
924
819
|
for (const data of mapSpaces(spaces, {
|
|
925
820
|
truncateKeys: true
|
|
926
821
|
})) {
|
|
@@ -1011,13 +906,14 @@ var IPData = Schema.Struct({
|
|
|
1011
906
|
});
|
|
1012
907
|
var getIPData = Effect6.fn(function* (config) {
|
|
1013
908
|
const httpClient = yield* HttpClient.HttpClient;
|
|
909
|
+
const httpClientNoTrace = httpClient.pipe(HttpClient.withTracerDisabledWhen(() => true));
|
|
1014
910
|
const cachedData = yield* Effect6.promise(() => localForage.getItem("dxos:observability:ipdata"));
|
|
1015
911
|
if (cachedData && cachedData.timestamp > Date.now() - IP_DATA_CACHE_TIMEOUT) {
|
|
1016
912
|
return cachedData.data;
|
|
1017
913
|
}
|
|
1018
914
|
const IPDATA_API_KEY = config.get("runtime.app.env.DX_IPDATA_API_KEY");
|
|
1019
915
|
if (IPDATA_API_KEY) {
|
|
1020
|
-
const data = yield* HttpClientRequest.get(`https://api.ipdata.co?api-key=${IPDATA_API_KEY}`).pipe(
|
|
916
|
+
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
917
|
yield* Effect6.promise(() => localForage.setItem("dxos:observability:ipdata", {
|
|
1022
918
|
data,
|
|
1023
919
|
timestamp: Date.now()
|
|
@@ -1038,12 +934,9 @@ var provider = (config) => (observability) => Effect6.gen(function* () {
|
|
|
1038
934
|
longitude: ipData.longitude
|
|
1039
935
|
});
|
|
1040
936
|
}).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
|
-
});
|
|
937
|
+
log5.verbose("ipdata fetch failed", {
|
|
938
|
+
err
|
|
939
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 54, S: void 0 });
|
|
1047
940
|
})));
|
|
1048
941
|
|
|
1049
942
|
// src/providers/storage.ts
|
|
@@ -1067,7 +960,6 @@ var provider2 = Effect7.fn(function* (observability) {
|
|
|
1067
960
|
}
|
|
1068
961
|
});
|
|
1069
962
|
export {
|
|
1070
|
-
LogBuffer,
|
|
1071
963
|
observability_exports as Observability,
|
|
1072
964
|
observability_extension_exports as ObservabilityExtension,
|
|
1073
965
|
providers_exports as ObservabilityProvider
|