@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
|
@@ -2,69 +2,6 @@ import {
|
|
|
2
2
|
__export
|
|
3
3
|
} from "./chunk-J5LGTIGS.mjs";
|
|
4
4
|
|
|
5
|
-
// src/log-buffer.ts
|
|
6
|
-
import { LogLevel, shortLevelName } from "@dxos/log";
|
|
7
|
-
import { CircularBuffer } from "@dxos/util";
|
|
8
|
-
var DEFAULT_BUFFER_SIZE = 2e3;
|
|
9
|
-
var MAX_CONTEXT_LENGTH = 500;
|
|
10
|
-
var LogBuffer = class {
|
|
11
|
-
_buffer;
|
|
12
|
-
constructor(size = DEFAULT_BUFFER_SIZE) {
|
|
13
|
-
this._buffer = new CircularBuffer(size);
|
|
14
|
-
}
|
|
15
|
-
/** Log processor that can be registered with `log.runtimeConfig.processors`. */
|
|
16
|
-
logProcessor = (_config, entry) => {
|
|
17
|
-
if (entry.level <= LogLevel.TRACE) {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
const record = {
|
|
21
|
-
t: (/* @__PURE__ */ new Date()).toISOString(),
|
|
22
|
-
l: shortLevelName[entry.level] ?? "?",
|
|
23
|
-
m: entry.message ?? ""
|
|
24
|
-
};
|
|
25
|
-
if (entry.meta) {
|
|
26
|
-
record.f = getRelativeFilename(entry.meta.F);
|
|
27
|
-
record.n = entry.meta.L;
|
|
28
|
-
}
|
|
29
|
-
if (entry.error) {
|
|
30
|
-
record.e = entry.error.stack ?? entry.error.message;
|
|
31
|
-
}
|
|
32
|
-
if (entry.context != null) {
|
|
33
|
-
try {
|
|
34
|
-
const ctx = typeof entry.context === "function" ? entry.context() : entry.context;
|
|
35
|
-
if (ctx != null && !(ctx instanceof Error)) {
|
|
36
|
-
let json = JSON.stringify(ctx);
|
|
37
|
-
if (json.length > MAX_CONTEXT_LENGTH) {
|
|
38
|
-
json = json.slice(0, MAX_CONTEXT_LENGTH);
|
|
39
|
-
}
|
|
40
|
-
record.c = json;
|
|
41
|
-
}
|
|
42
|
-
} catch {
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
this._buffer.push(record);
|
|
46
|
-
};
|
|
47
|
-
/** Number of entries currently in the buffer. */
|
|
48
|
-
get size() {
|
|
49
|
-
return this._buffer.elementCount;
|
|
50
|
-
}
|
|
51
|
-
/** Serialize buffer contents as NDJSON (newline-delimited JSON). */
|
|
52
|
-
serialize() {
|
|
53
|
-
const lines = [];
|
|
54
|
-
for (const record of this._buffer) {
|
|
55
|
-
lines.push(JSON.stringify(record));
|
|
56
|
-
}
|
|
57
|
-
return lines.join("\n");
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
var getRelativeFilename = (filename) => {
|
|
61
|
-
const match = filename.match(/.+\/(packages\/.+\/.+)/);
|
|
62
|
-
if (match) {
|
|
63
|
-
return match[1];
|
|
64
|
-
}
|
|
65
|
-
return filename;
|
|
66
|
-
};
|
|
67
|
-
|
|
68
5
|
// src/observability.ts
|
|
69
6
|
var observability_exports = {};
|
|
70
7
|
__export(observability_exports, {
|
|
@@ -88,64 +25,46 @@ import { log as log2 } from "@dxos/log";
|
|
|
88
25
|
// src/storage/browser.ts
|
|
89
26
|
import * as localForage from "localforage";
|
|
90
27
|
import { log } from "@dxos/log";
|
|
28
|
+
import { compositeKey } from "@dxos/util";
|
|
91
29
|
var __dxlog_file = "/__w/dxos/dxos/packages/sdk/observability/src/storage/browser.ts";
|
|
92
30
|
var OBSERVABILITY_DISABLED_KEY = "observability-disabled";
|
|
93
31
|
var OBSERVABILITY_GROUP_KEY = "observability-group";
|
|
94
32
|
var showObservabilityBanner = () => {
|
|
95
|
-
log.warn("showObservabilityBanner is not supported in browser contexts.", void 0, {
|
|
96
|
-
F: __dxlog_file,
|
|
97
|
-
L: 15,
|
|
98
|
-
S: void 0,
|
|
99
|
-
C: (f, a) => f(...a)
|
|
100
|
-
});
|
|
33
|
+
log.warn("showObservabilityBanner is not supported in browser contexts.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 11, S: void 0 });
|
|
101
34
|
};
|
|
102
35
|
var isObservabilityDisabled = async (namespace) => {
|
|
103
36
|
try {
|
|
104
|
-
return await localForage.getItem(
|
|
37
|
+
return await localForage.getItem(compositeKey(namespace, OBSERVABILITY_DISABLED_KEY)) === "true";
|
|
105
38
|
} catch (err) {
|
|
106
|
-
log.catch("Failed to check if observability is disabled, assuming it is", err, {
|
|
107
|
-
F: __dxlog_file,
|
|
108
|
-
L: 25,
|
|
109
|
-
S: void 0,
|
|
110
|
-
C: (f, a) => f(...a)
|
|
111
|
-
});
|
|
39
|
+
log.catch("Failed to check if observability is disabled, assuming it is", err, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 19, S: void 0 });
|
|
112
40
|
return true;
|
|
113
41
|
}
|
|
114
42
|
};
|
|
115
43
|
var storeObservabilityDisabled = async (namespace, value2) => {
|
|
116
44
|
try {
|
|
117
|
-
await localForage.setItem(
|
|
45
|
+
await localForage.setItem(compositeKey(namespace, OBSERVABILITY_DISABLED_KEY), String(value2));
|
|
118
46
|
} catch (err) {
|
|
119
|
-
log.catch("Failed to store observability disabled", err, {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
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 {
|
|
125
54
|
}
|
|
126
55
|
};
|
|
127
56
|
var getObservabilityGroup = async (namespace) => {
|
|
128
57
|
try {
|
|
129
|
-
return await localForage.getItem(
|
|
58
|
+
return await localForage.getItem(compositeKey(namespace, OBSERVABILITY_GROUP_KEY)) ?? void 0;
|
|
130
59
|
} catch (err) {
|
|
131
|
-
log.catch("Failed to get observability group", err, {
|
|
132
|
-
F: __dxlog_file,
|
|
133
|
-
L: 48,
|
|
134
|
-
S: void 0,
|
|
135
|
-
C: (f, a) => f(...a)
|
|
136
|
-
});
|
|
60
|
+
log.catch("Failed to get observability group", err, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 47, S: void 0 });
|
|
137
61
|
}
|
|
138
62
|
};
|
|
139
63
|
var storeObservabilityGroup = async (namespace, value2) => {
|
|
140
64
|
try {
|
|
141
|
-
await localForage.setItem(
|
|
65
|
+
await localForage.setItem(compositeKey(namespace, OBSERVABILITY_GROUP_KEY), value2);
|
|
142
66
|
} catch (err) {
|
|
143
|
-
log.catch("Failed to store observability group", err, {
|
|
144
|
-
F: __dxlog_file,
|
|
145
|
-
L: 59,
|
|
146
|
-
S: void 0,
|
|
147
|
-
C: (f, a) => f(...a)
|
|
148
|
-
});
|
|
67
|
+
log.catch("Failed to store observability group", err, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 56, S: void 0 });
|
|
149
68
|
}
|
|
150
69
|
};
|
|
151
70
|
|
|
@@ -172,12 +91,7 @@ var ObservabilityImpl = class {
|
|
|
172
91
|
this._subscriptions.add(...cleanups.filter((cleanup) => cleanup !== void 0));
|
|
173
92
|
this._initialized = true;
|
|
174
93
|
}).pipe(Effect.catchAll((error) => Effect.gen(this, function* () {
|
|
175
|
-
log2.catch(error, void 0, {
|
|
176
|
-
F: __dxlog_file2,
|
|
177
|
-
L: 85,
|
|
178
|
-
S: this,
|
|
179
|
-
C: (f, a) => f(...a)
|
|
180
|
-
});
|
|
94
|
+
log2.catch(error, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 32, S: this });
|
|
181
95
|
for (const extension of initializedExtensions) {
|
|
182
96
|
if (extension.close) {
|
|
183
97
|
yield* extension.close().pipe(Effect.catchAll(() => Effect.succeed(void 0)));
|
|
@@ -226,27 +140,11 @@ var ObservabilityImpl = class {
|
|
|
226
140
|
});
|
|
227
141
|
}
|
|
228
142
|
_addExtension(extension) {
|
|
229
|
-
invariant(!this._initialized, "Observability is already initialized", {
|
|
230
|
-
F: __dxlog_file2,
|
|
231
|
-
L: 142,
|
|
232
|
-
S: this,
|
|
233
|
-
A: [
|
|
234
|
-
"!this._initialized",
|
|
235
|
-
"'Observability is already initialized'"
|
|
236
|
-
]
|
|
237
|
-
});
|
|
143
|
+
invariant(!this._initialized, "Observability is already initialized", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 82, S: this, A: ["!this._initialized", "'Observability is already initialized'"] });
|
|
238
144
|
this._extensions.push(extension);
|
|
239
145
|
}
|
|
240
146
|
_addDataProvider(dataProvider) {
|
|
241
|
-
invariant(!this._initialized, "Observability is already initialized", {
|
|
242
|
-
F: __dxlog_file2,
|
|
243
|
-
L: 147,
|
|
244
|
-
S: this,
|
|
245
|
-
A: [
|
|
246
|
-
"!this._initialized",
|
|
247
|
-
"'Observability is already initialized'"
|
|
248
|
-
]
|
|
249
|
-
});
|
|
147
|
+
invariant(!this._initialized, "Observability is already initialized", { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 86, S: this, A: ["!this._initialized", "'Observability is already initialized'"] });
|
|
250
148
|
this._dataProviders.push(dataProvider);
|
|
251
149
|
}
|
|
252
150
|
/**
|
|
@@ -355,29 +253,13 @@ var make = () => Effect.succeed(new ObservabilityImpl());
|
|
|
355
253
|
var addExtension = (_extension) => Effect.fn(function* (_observability) {
|
|
356
254
|
const observability = yield* _observability;
|
|
357
255
|
const extension = yield* _extension;
|
|
358
|
-
invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, {
|
|
359
|
-
F: __dxlog_file2,
|
|
360
|
-
L: 276,
|
|
361
|
-
S: this,
|
|
362
|
-
A: [
|
|
363
|
-
"'_addExtension' in observability && typeof observability._addExtension === 'function'",
|
|
364
|
-
""
|
|
365
|
-
]
|
|
366
|
-
});
|
|
256
|
+
invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 194, S: this, A: ["'_addExtension' in observability && typeof observability._addExtension === 'function'", ""] });
|
|
367
257
|
observability._addExtension(extension);
|
|
368
258
|
return observability;
|
|
369
259
|
});
|
|
370
260
|
var addDataProvider = (dataProvider) => Effect.fn(function* (_observability) {
|
|
371
261
|
const observability = yield* _observability;
|
|
372
|
-
invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, {
|
|
373
|
-
F: __dxlog_file2,
|
|
374
|
-
L: 284,
|
|
375
|
-
S: this,
|
|
376
|
-
A: [
|
|
377
|
-
"'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'",
|
|
378
|
-
""
|
|
379
|
-
]
|
|
380
|
-
});
|
|
262
|
+
invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 200, S: this, A: ["'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'", ""] });
|
|
381
263
|
observability._addDataProvider(dataProvider);
|
|
382
264
|
return observability;
|
|
383
265
|
});
|
|
@@ -407,15 +289,16 @@ import * as Effect3 from "effect/Effect";
|
|
|
407
289
|
import * as Match from "effect/Match";
|
|
408
290
|
import * as Option from "effect/Option";
|
|
409
291
|
import * as Ref from "effect/Ref";
|
|
410
|
-
import {
|
|
292
|
+
import { resolveTelemetryTag } from "@dxos/config";
|
|
293
|
+
import { LogLevel, log as log3 } from "@dxos/log";
|
|
411
294
|
import { isNode, isNonNullable } from "@dxos/util";
|
|
412
295
|
|
|
413
296
|
// src/cli-observability-secrets.json
|
|
414
297
|
var cli_observability_secrets_default = {
|
|
415
298
|
POSTHOG_API_KEY: null,
|
|
416
299
|
IPDATA_API_KEY: "73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786",
|
|
417
|
-
OTEL_ENDPOINT: "
|
|
418
|
-
OTEL_HEADERS:
|
|
300
|
+
OTEL_ENDPOINT: "/api/otel",
|
|
301
|
+
OTEL_HEADERS: null
|
|
419
302
|
};
|
|
420
303
|
|
|
421
304
|
// src/extensions/stub.ts
|
|
@@ -446,31 +329,36 @@ var extensions = Effect3.fn(function* ({
|
|
|
446
329
|
// - logs should be cached locally in a circular buffer
|
|
447
330
|
// - logs should be flushed to the server if user opts to include them in a bug report
|
|
448
331
|
logs: logsEnabled = false,
|
|
449
|
-
logLevel =
|
|
332
|
+
logLevel = LogLevel.INFO,
|
|
450
333
|
metrics: metricsEnabled = false,
|
|
451
334
|
traces: tracesEnabled = false
|
|
452
335
|
}) {
|
|
453
|
-
const { OtelLogs } = yield* Effect3.promise(() => import("./logs-
|
|
454
|
-
const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-
|
|
455
|
-
const { OtelTraces } = yield* Effect3.promise(() => import("./traces-browser-
|
|
336
|
+
const { OtelLogs } = yield* Effect3.promise(() => import("./logs-A2VDAHHD.mjs"));
|
|
337
|
+
const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-6OSN54ZV.mjs"));
|
|
338
|
+
const { OtelTraces } = yield* Effect3.promise(() => import("./traces-browser-6MRGAKFC.mjs"));
|
|
456
339
|
const cachedDisabled = yield* Effect3.promise(() => isObservabilityDisabled(serviceName));
|
|
457
|
-
const
|
|
340
|
+
const disabled = cachedDisabled || isObservabilityDisabledSync(serviceName);
|
|
341
|
+
const enabledRef = yield* Ref.make(!disabled);
|
|
458
342
|
const tags = /* @__PURE__ */ new Map();
|
|
459
343
|
const endpoint = isNode() ? process.env.DX_OTEL_ENDPOINT ?? _endpoint ?? cli_observability_secrets_default.OTEL_ENDPOINT : config.values.runtime?.app?.env?.DX_OTEL_ENDPOINT;
|
|
460
344
|
const headers = _headers ?? Match.value(isNode()).pipe(Match.when(true, () => Option.fromNullable(process.env.DX_OTEL_HEADERS ?? cli_observability_secrets_default.OTEL_HEADERS)), Match.when(false, () => Option.fromNullable(config.values.runtime?.app?.env?.DX_OTEL_HEADERS)), Match.exhaustive, Option.map((raw) => parseHeaders(raw)), Option.getOrElse(() => void 0));
|
|
461
345
|
if (!endpoint || !headers) {
|
|
462
|
-
log3.info("Missing OTEL_ENDPOINT or OTEL_HEADERS", void 0, {
|
|
463
|
-
F: __dxlog_file3,
|
|
464
|
-
L: 77,
|
|
465
|
-
S: this,
|
|
466
|
-
C: (f, a) => f(...a)
|
|
467
|
-
});
|
|
346
|
+
log3.info("Missing OTEL_ENDPOINT or OTEL_HEADERS", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 31, S: this });
|
|
468
347
|
return stubExtension;
|
|
469
348
|
}
|
|
349
|
+
const clientTag = resolveTelemetryTag(config);
|
|
350
|
+
if (clientTag) {
|
|
351
|
+
tags.set("ctx.tag", clientTag);
|
|
352
|
+
}
|
|
470
353
|
const resource = defaultResource().merge(resourceFromAttributes({
|
|
471
354
|
[ATTR_SERVICE_NAME]: serviceName,
|
|
472
355
|
[ATTR_SERVICE_VERSION]: serviceVersion,
|
|
473
|
-
"
|
|
356
|
+
"session.id": crypto.randomUUID(),
|
|
357
|
+
"deployment.environment": environment,
|
|
358
|
+
"dxos.process.type": detectProcessType(),
|
|
359
|
+
...clientTag ? {
|
|
360
|
+
"ctx.tag": clientTag
|
|
361
|
+
} : {}
|
|
474
362
|
}));
|
|
475
363
|
const logs = logsEnabled ? new OtelLogs({
|
|
476
364
|
endpoint,
|
|
@@ -491,8 +379,11 @@ var extensions = Effect3.fn(function* ({
|
|
|
491
379
|
resource,
|
|
492
380
|
getTags: () => Object.fromEntries(tags)
|
|
493
381
|
}) : void 0;
|
|
494
|
-
|
|
382
|
+
const extension = {
|
|
495
383
|
initialize: () => Effect3.sync(() => {
|
|
384
|
+
if (disabled) {
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
496
387
|
if (logs) {
|
|
497
388
|
log3.runtimeConfig.processors.push(logs.logProcessor);
|
|
498
389
|
}
|
|
@@ -509,12 +400,28 @@ var extensions = Effect3.fn(function* ({
|
|
|
509
400
|
yield* Ref.update(enabledRef, () => false);
|
|
510
401
|
}),
|
|
511
402
|
close: () => Effect3.promise(async () => {
|
|
512
|
-
await
|
|
513
|
-
|
|
403
|
+
const results = await Promise.allSettled([
|
|
404
|
+
logs?.close(),
|
|
405
|
+
metrics?.close()
|
|
406
|
+
]);
|
|
407
|
+
for (const result of results) {
|
|
408
|
+
if (result.status === "rejected") {
|
|
409
|
+
log3.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 111, S: this });
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
await traces?.close();
|
|
514
413
|
}),
|
|
515
414
|
flush: () => Effect3.promise(async () => {
|
|
516
|
-
await
|
|
517
|
-
|
|
415
|
+
const results = await Promise.allSettled([
|
|
416
|
+
logs?.flush(),
|
|
417
|
+
metrics?.flush()
|
|
418
|
+
]);
|
|
419
|
+
for (const result of results) {
|
|
420
|
+
if (result.status === "rejected") {
|
|
421
|
+
log3.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 126, S: this });
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
await traces?.flush();
|
|
518
425
|
}),
|
|
519
426
|
setTags: (incomingTags) => {
|
|
520
427
|
for (const [key, value2] of Object.entries(incomingTags)) {
|
|
@@ -542,7 +449,35 @@ var extensions = Effect3.fn(function* ({
|
|
|
542
449
|
} : void 0
|
|
543
450
|
].filter(isNonNullable)
|
|
544
451
|
};
|
|
452
|
+
return extension;
|
|
545
453
|
});
|
|
454
|
+
var isObservabilityDisabledSync = (serviceName) => {
|
|
455
|
+
if (isNode()) {
|
|
456
|
+
return process.env.DX_DISABLE_OBSERVABILITY === "true";
|
|
457
|
+
}
|
|
458
|
+
try {
|
|
459
|
+
if (typeof localStorage !== "undefined") {
|
|
460
|
+
return localStorage.getItem(`${serviceName}/observability-disabled`) === "true";
|
|
461
|
+
}
|
|
462
|
+
} catch {
|
|
463
|
+
}
|
|
464
|
+
return false;
|
|
465
|
+
};
|
|
466
|
+
var detectProcessType = () => {
|
|
467
|
+
if (isNode()) {
|
|
468
|
+
return "node";
|
|
469
|
+
}
|
|
470
|
+
if (typeof window !== "undefined") {
|
|
471
|
+
return "browser";
|
|
472
|
+
}
|
|
473
|
+
if (typeof globalThis.ServiceWorkerGlobalScope !== "undefined") {
|
|
474
|
+
return "service-worker";
|
|
475
|
+
}
|
|
476
|
+
if (typeof globalThis.SharedWorkerGlobalScope !== "undefined") {
|
|
477
|
+
return "shared-worker";
|
|
478
|
+
}
|
|
479
|
+
return "dedicated-worker";
|
|
480
|
+
};
|
|
546
481
|
var parseHeaders = (unparsedHeaders) => {
|
|
547
482
|
return unparsedHeaders.split(";").reduce((acc, header) => {
|
|
548
483
|
const [key, ...rest] = header.split(":");
|
|
@@ -575,12 +510,7 @@ var uploadLogs = async (body) => {
|
|
|
575
510
|
if (!response.ok) {
|
|
576
511
|
log4.warn("feedback log upload failed", {
|
|
577
512
|
status: response.status
|
|
578
|
-
}, {
|
|
579
|
-
F: __dxlog_file4,
|
|
580
|
-
L: 33,
|
|
581
|
-
S: void 0,
|
|
582
|
-
C: (f, a) => f(...a)
|
|
583
|
-
});
|
|
513
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 17, S: void 0 });
|
|
584
514
|
return void 0;
|
|
585
515
|
}
|
|
586
516
|
const { key } = await response.json();
|
|
@@ -588,41 +518,26 @@ var uploadLogs = async (body) => {
|
|
|
588
518
|
} catch (err) {
|
|
589
519
|
log4.warn("feedback log upload error", {
|
|
590
520
|
error: err
|
|
591
|
-
}, {
|
|
592
|
-
F: __dxlog_file4,
|
|
593
|
-
L: 39,
|
|
594
|
-
S: void 0,
|
|
595
|
-
C: (f, a) => f(...a)
|
|
596
|
-
});
|
|
521
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 25, S: void 0 });
|
|
597
522
|
return void 0;
|
|
598
523
|
}
|
|
599
524
|
};
|
|
600
|
-
var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig }) {
|
|
525
|
+
var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig, logStore }) {
|
|
601
526
|
if (typeof window === "undefined") {
|
|
602
|
-
log4("PostHog is being stubbed because it is running in a worker.", void 0, {
|
|
603
|
-
F: __dxlog_file4,
|
|
604
|
-
L: 52,
|
|
605
|
-
S: this,
|
|
606
|
-
C: (f, a) => f(...a)
|
|
607
|
-
});
|
|
527
|
+
log4("PostHog is being stubbed because it is running in a worker.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 33, S: this });
|
|
608
528
|
return stubExtension;
|
|
609
529
|
}
|
|
610
530
|
const feedbackSurveyId = config.get("runtime.app.env.DX_POSTHOG_FEEDBACK_SURVEY_ID");
|
|
611
531
|
const apiKey = config.get("runtime.app.env.DX_POSTHOG_API_KEY");
|
|
612
532
|
const api_host = config.get("runtime.app.env.DX_POSTHOG_API_HOST");
|
|
613
533
|
if (!apiKey || !api_host) {
|
|
614
|
-
log4.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, {
|
|
615
|
-
F: __dxlog_file4,
|
|
616
|
-
L: 60,
|
|
617
|
-
S: this,
|
|
618
|
-
C: (f, a) => f(...a)
|
|
619
|
-
});
|
|
534
|
+
log4.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 40, S: this });
|
|
620
535
|
return stubExtension;
|
|
621
536
|
}
|
|
622
537
|
const { default: posthog } = yield* Effect4.promise(() => import("posthog-js"));
|
|
623
|
-
const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-
|
|
624
|
-
const logBuffer = new LogBuffer();
|
|
538
|
+
const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-HPHWNBOK.mjs"));
|
|
625
539
|
let feedbackSurveyAvailable = null;
|
|
540
|
+
let unregisterPosthogProcessors;
|
|
626
541
|
const checkFeedbackSurveyAvailable = () => feedbackSurveyId ? Effect4.promise(() => {
|
|
627
542
|
if (feedbackSurveyAvailable !== null) {
|
|
628
543
|
return Promise.resolve(feedbackSurveyAvailable);
|
|
@@ -653,19 +568,15 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
|
|
|
653
568
|
} : {}
|
|
654
569
|
});
|
|
655
570
|
}
|
|
656
|
-
|
|
657
|
-
log4.
|
|
571
|
+
unregisterPosthogProcessors?.();
|
|
572
|
+
const removePosthogLog = log4.addProcessor(logProcessor, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 79, S: this });
|
|
573
|
+
unregisterPosthogProcessors = () => {
|
|
574
|
+
removePosthogLog();
|
|
575
|
+
};
|
|
658
576
|
}),
|
|
659
577
|
close: () => Effect4.sync(() => {
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
logBuffer.logProcessor
|
|
663
|
-
]) {
|
|
664
|
-
const index = log4.runtimeConfig.processors.indexOf(processor);
|
|
665
|
-
if (index !== -1) {
|
|
666
|
-
log4.runtimeConfig.processors.splice(index, 1);
|
|
667
|
-
}
|
|
668
|
-
}
|
|
578
|
+
unregisterPosthogProcessors?.();
|
|
579
|
+
unregisterPosthogProcessors = void 0;
|
|
669
580
|
}),
|
|
670
581
|
enable: () => Effect4.sync(() => posthog.opt_in_capturing()),
|
|
671
582
|
disable: () => Effect4.sync(() => posthog.opt_out_capturing()),
|
|
@@ -705,17 +616,15 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
|
|
|
705
616
|
if (!survey || survey.questions.length === 0) {
|
|
706
617
|
log4.error("Missing feedback survey or survey has no questions", {
|
|
707
618
|
feedbackSurveyId
|
|
708
|
-
}, {
|
|
709
|
-
F: __dxlog_file4,
|
|
710
|
-
L: 149,
|
|
711
|
-
S: this,
|
|
712
|
-
C: (f, a) => f(...a)
|
|
713
|
-
});
|
|
619
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 124, S: this });
|
|
714
620
|
return;
|
|
715
621
|
}
|
|
716
|
-
let debugLogDumpKey;
|
|
717
|
-
if (form.includeLogs !== false &&
|
|
718
|
-
|
|
622
|
+
let debugLogDumpKey = null;
|
|
623
|
+
if (form.includeLogs !== false && logStore !== void 0) {
|
|
624
|
+
const ndjson = await logStore.export();
|
|
625
|
+
if (ndjson.length > 0) {
|
|
626
|
+
debugLogDumpKey = await uploadLogs(ndjson) ?? "failed";
|
|
627
|
+
}
|
|
719
628
|
}
|
|
720
629
|
const question = survey.questions[0];
|
|
721
630
|
posthog.capture("survey sent", {
|
|
@@ -727,9 +636,7 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
|
|
|
727
636
|
}
|
|
728
637
|
],
|
|
729
638
|
[`$survey_response_${question.id}`]: form.message,
|
|
730
|
-
|
|
731
|
-
debug_log_dump_key: debugLogDumpKey
|
|
732
|
-
} : {}
|
|
639
|
+
debug_log_dump_key: debugLogDumpKey
|
|
733
640
|
});
|
|
734
641
|
});
|
|
735
642
|
},
|
|
@@ -795,19 +702,11 @@ var identityProvider = (clientServices) => Effect5.fn(function* (observability)
|
|
|
795
702
|
});
|
|
796
703
|
});
|
|
797
704
|
var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
|
|
798
|
-
const ctx = new Context(void 0, {
|
|
799
|
-
F: __dxlog_file5,
|
|
800
|
-
L: 61
|
|
801
|
-
});
|
|
705
|
+
const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 50 });
|
|
802
706
|
let lastNetworkStatus;
|
|
803
707
|
const updateSignalMetrics = new Event().debounce(NETWORK_METRICS_MIN_INTERVAL);
|
|
804
708
|
updateSignalMetrics.on(ctx, async () => {
|
|
805
|
-
log5("send signal metrics", void 0, {
|
|
806
|
-
F: __dxlog_file5,
|
|
807
|
-
L: 67,
|
|
808
|
-
S: this,
|
|
809
|
-
C: (f, a) => f(...a)
|
|
810
|
-
});
|
|
709
|
+
log5("send signal metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 55, S: this });
|
|
811
710
|
lastNetworkStatus?.signaling?.forEach(({ server, state }) => {
|
|
812
711
|
observability.metrics.gauge("dxos.client.network.signal.connectionState", state, {
|
|
813
712
|
server
|
|
@@ -852,20 +751,11 @@ var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
|
|
|
852
751
|
};
|
|
853
752
|
});
|
|
854
753
|
var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
|
|
855
|
-
const ctx = new Context(void 0, {
|
|
856
|
-
|
|
857
|
-
L: 121
|
|
858
|
-
});
|
|
754
|
+
const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 100 });
|
|
755
|
+
log5("runtimeMetricsProvider: requesting platform from SystemService", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 101, S: this });
|
|
859
756
|
const platform = yield* Effect5.promise(() => clientServices.SystemService.getPlatform());
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
L: 123,
|
|
863
|
-
S: this,
|
|
864
|
-
A: [
|
|
865
|
-
"platform",
|
|
866
|
-
"'platform is required'"
|
|
867
|
-
]
|
|
868
|
-
});
|
|
757
|
+
log5("runtimeMetricsProvider: platform received", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 103, S: this });
|
|
758
|
+
invariant2(platform, "platform is required", { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 104, S: this, A: ["platform", "'platform is required'"] });
|
|
869
759
|
observability.setTags({
|
|
870
760
|
platformType: Platform.PLATFORM_TYPE[platform.type].toLowerCase(),
|
|
871
761
|
platform: platform.platform,
|
|
@@ -889,33 +779,20 @@ var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
|
|
|
889
779
|
}
|
|
890
780
|
}).catch((error) => log5("platform error", {
|
|
891
781
|
error
|
|
892
|
-
}, {
|
|
893
|
-
F: __dxlog_file5,
|
|
894
|
-
L: 152,
|
|
895
|
-
S: this,
|
|
896
|
-
C: (f, a) => f(...a)
|
|
897
|
-
}));
|
|
782
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 126, S: this }));
|
|
898
783
|
}, RUNTIME_METRICS_MIN_INTERVAL);
|
|
899
784
|
return async () => {
|
|
900
785
|
await ctx.dispose();
|
|
901
786
|
};
|
|
902
787
|
});
|
|
903
788
|
var spacesMetricsProvider = (client) => Effect5.fn(function* (observability) {
|
|
904
|
-
const ctx = new Context(void 0, {
|
|
905
|
-
F: __dxlog_file5,
|
|
906
|
-
L: 165
|
|
907
|
-
});
|
|
789
|
+
const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 135 });
|
|
908
790
|
const spaces = client.spaces.get();
|
|
909
791
|
const subscriptions = /* @__PURE__ */ new Map();
|
|
910
792
|
ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));
|
|
911
793
|
const updateSpaceMetrics = new Event().debounce(SPACE_METRICS_MIN_INTERVAL);
|
|
912
794
|
updateSpaceMetrics.on(ctx, async () => {
|
|
913
|
-
log5("send space metrics", void 0, {
|
|
914
|
-
F: __dxlog_file5,
|
|
915
|
-
L: 173,
|
|
916
|
-
S: this,
|
|
917
|
-
C: (f, a) => f(...a)
|
|
918
|
-
});
|
|
795
|
+
log5("send space metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 142, S: this });
|
|
919
796
|
for (const data of mapSpaces(spaces, {
|
|
920
797
|
truncateKeys: true
|
|
921
798
|
})) {
|
|
@@ -1006,13 +883,14 @@ var IPData = Schema.Struct({
|
|
|
1006
883
|
});
|
|
1007
884
|
var getIPData = Effect6.fn(function* (config) {
|
|
1008
885
|
const httpClient = yield* HttpClient.HttpClient;
|
|
886
|
+
const httpClientNoTrace = httpClient.pipe(HttpClient.withTracerDisabledWhen(() => true));
|
|
1009
887
|
const cachedData = yield* Effect6.promise(() => localForage2.getItem("dxos:observability:ipdata"));
|
|
1010
888
|
if (cachedData && cachedData.timestamp > Date.now() - IP_DATA_CACHE_TIMEOUT) {
|
|
1011
889
|
return cachedData.data;
|
|
1012
890
|
}
|
|
1013
891
|
const IPDATA_API_KEY = config.get("runtime.app.env.DX_IPDATA_API_KEY");
|
|
1014
892
|
if (IPDATA_API_KEY) {
|
|
1015
|
-
const data = yield* HttpClientRequest.get(`https://api.ipdata.co?api-key=${IPDATA_API_KEY}`).pipe(
|
|
893
|
+
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)));
|
|
1016
894
|
yield* Effect6.promise(() => localForage2.setItem("dxos:observability:ipdata", {
|
|
1017
895
|
data,
|
|
1018
896
|
timestamp: Date.now()
|
|
@@ -1033,12 +911,9 @@ var provider = (config) => (observability) => Effect6.gen(function* () {
|
|
|
1033
911
|
longitude: ipData.longitude
|
|
1034
912
|
});
|
|
1035
913
|
}).pipe(Effect6.provide(FetchHttpClient.layer), Effect6.catchAll((err) => Effect6.sync(() => {
|
|
1036
|
-
log6.
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
S: void 0,
|
|
1040
|
-
C: (f, a) => f(...a)
|
|
1041
|
-
});
|
|
914
|
+
log6.verbose("ipdata fetch failed", {
|
|
915
|
+
err
|
|
916
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file6, L: 54, S: void 0 });
|
|
1042
917
|
})));
|
|
1043
918
|
|
|
1044
919
|
// src/providers/storage.ts
|
|
@@ -1062,7 +937,6 @@ var provider2 = Effect7.fn(function* (observability) {
|
|
|
1062
937
|
}
|
|
1063
938
|
});
|
|
1064
939
|
export {
|
|
1065
|
-
LogBuffer,
|
|
1066
940
|
observability_exports as Observability,
|
|
1067
941
|
observability_extension_exports as ObservabilityExtension,
|
|
1068
942
|
providers_exports as ObservabilityProvider
|