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