@dxos/observability 0.8.4-main.c85a9c8dae → 0.8.4-main.d05539e30a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +102 -5
- package/dist/lib/browser/{chunk-K4VFBKST.mjs → chunk-PSFTIG54.mjs} +9 -2
- package/dist/lib/browser/chunk-PSFTIG54.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +176 -217
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{log-processor-FDLTDQEM.mjs → log-processor-HPHWNBOK.mjs} +11 -18
- package/dist/lib/browser/log-processor-HPHWNBOK.mjs.map +7 -0
- package/dist/lib/browser/{logs-ATTRIUTL.mjs → logs-UTNIFYHF.mjs} +7 -4
- package/dist/lib/browser/logs-UTNIFYHF.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/{metrics-PKTV6IGF.mjs → metrics-PRGSYAZJ.mjs} +7 -21
- package/dist/lib/browser/metrics-PRGSYAZJ.mjs.map +7 -0
- package/dist/lib/browser/traces-browser-XRINKQUA.mjs +154 -0
- package/dist/lib/browser/traces-browser-XRINKQUA.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-FEVP3MK4.mjs → chunk-EDDZWPYV.mjs} +9 -2
- package/dist/lib/node-esm/chunk-EDDZWPYV.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +161 -184
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{log-processor-TKJVJJSJ.mjs → log-processor-ZODHERST.mjs} +11 -18
- package/dist/lib/node-esm/log-processor-ZODHERST.mjs.map +7 -0
- package/dist/lib/node-esm/{logs-7J45KLM7.mjs → logs-ARJUVN3T.mjs} +7 -4
- package/dist/lib/node-esm/logs-ARJUVN3T.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/{metrics-H7DDLYSG.mjs → metrics-DREJOOAC.mjs} +7 -21
- package/dist/lib/node-esm/metrics-DREJOOAC.mjs.map +7 -0
- package/dist/lib/node-esm/traces-74F7JUKF.mjs +125 -0
- package/dist/lib/node-esm/traces-74F7JUKF.mjs.map +7 -0
- package/dist/types/src/cli-observability-secrets.json +2 -2
- package/dist/types/src/extensions/otel/extension.d.ts.map +1 -1
- package/dist/types/src/extensions/otel/extension.js +112 -16
- package/dist/types/src/extensions/otel/extension.js.map +1 -1
- package/dist/types/src/extensions/otel/logs.d.ts.map +1 -1
- package/dist/types/src/extensions/otel/logs.js +6 -3
- package/dist/types/src/extensions/otel/logs.js.map +1 -1
- package/dist/types/src/extensions/otel/metrics.d.ts.map +1 -1
- package/dist/types/src/extensions/otel/metrics.js +2 -2
- package/dist/types/src/extensions/otel/metrics.js.map +1 -1
- package/dist/types/src/extensions/otel/otel.d.ts +7 -0
- package/dist/types/src/extensions/otel/otel.d.ts.map +1 -1
- package/dist/types/src/extensions/otel/otel.js +12 -0
- package/dist/types/src/extensions/otel/otel.js.map +1 -1
- package/dist/types/src/extensions/otel/span-processors.d.ts +25 -0
- package/dist/types/src/extensions/otel/span-processors.d.ts.map +1 -0
- package/dist/types/src/extensions/otel/span-processors.js +41 -0
- package/dist/types/src/extensions/otel/span-processors.js.map +1 -0
- package/dist/types/src/extensions/otel/traces-browser.d.ts +17 -0
- package/dist/types/src/extensions/otel/traces-browser.d.ts.map +1 -1
- package/dist/types/src/extensions/otel/traces-browser.js +69 -14
- package/dist/types/src/extensions/otel/traces-browser.js.map +1 -1
- package/dist/types/src/extensions/otel/traces.d.ts +17 -0
- package/dist/types/src/extensions/otel/traces.d.ts.map +1 -1
- package/dist/types/src/extensions/otel/traces.js +59 -9
- package/dist/types/src/extensions/otel/traces.js.map +1 -1
- package/dist/types/src/extensions/posthog/extension.d.ts +13 -3
- package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -1
- package/dist/types/src/extensions/posthog/extension.js +42 -28
- package/dist/types/src/extensions/posthog/extension.js.map +1 -1
- package/dist/types/src/extensions/posthog/log-processor.d.ts.map +1 -1
- package/dist/types/src/extensions/posthog/log-processor.js +10 -19
- package/dist/types/src/extensions/posthog/log-processor.js.map +1 -1
- package/dist/types/src/extensions/posthog/log-processor.test.js +2 -2
- package/dist/types/src/extensions/posthog/log-processor.test.js.map +1 -1
- package/dist/types/src/observability-extension.d.ts +1 -1
- package/dist/types/src/observability-extension.d.ts.map +1 -1
- package/dist/types/src/observability.d.ts.map +1 -1
- package/dist/types/src/observability.js +4 -2
- package/dist/types/src/observability.js.map +1 -1
- package/dist/types/src/observability.test.js +1 -1
- package/dist/types/src/observability.test.js.map +1 -1
- package/dist/types/src/providers/client-observability.d.ts.map +1 -1
- package/dist/types/src/providers/client-observability.js +2 -0
- package/dist/types/src/providers/client-observability.js.map +1 -1
- package/dist/types/src/providers/ip-data.d.ts.map +1 -1
- package/dist/types/src/storage/browser.d.ts.map +1 -1
- package/dist/types/src/storage/browser.js +15 -4
- package/dist/types/src/storage/browser.js.map +1 -1
- package/dist/types/src/storage/node.d.ts.map +1 -1
- package/dist/types/src/storage/node.js +1 -1
- package/dist/types/src/storage/node.js.map +1 -1
- package/dist/types/src/storage/node.test.js +1 -1
- package/dist/types/src/storage/node.test.js.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +35 -31
- package/src/cli-observability-secrets.json +2 -2
- package/src/extensions/otel/extension.ts +118 -17
- package/src/extensions/otel/logs.ts +6 -3
- package/src/extensions/otel/metrics.ts +2 -2
- package/src/extensions/otel/otel.ts +13 -0
- package/src/extensions/otel/span-processors.ts +45 -0
- package/src/extensions/otel/traces-browser.ts +91 -15
- package/src/extensions/otel/traces.ts +76 -12
- package/src/extensions/posthog/extension.ts +55 -30
- package/src/extensions/posthog/log-processor.test.ts +7 -6
- package/src/extensions/posthog/log-processor.ts +10 -21
- package/src/observability-extension.ts +1 -1
- package/src/observability.test.ts +1 -1
- package/src/observability.ts +4 -2
- package/src/providers/client-observability.ts +2 -0
- package/src/storage/browser.ts +14 -4
- package/src/storage/node.test.ts +1 -2
- package/src/storage/node.ts +1 -2
- package/src/vite-import-meta.d.ts +14 -0
- package/dist/lib/browser/chunk-K4VFBKST.mjs.map +0 -7
- package/dist/lib/browser/log-processor-FDLTDQEM.mjs.map +0 -7
- package/dist/lib/browser/logs-ATTRIUTL.mjs.map +0 -7
- package/dist/lib/browser/metrics-PKTV6IGF.mjs.map +0 -7
- package/dist/lib/browser/traces-browser-5DQUYGQ7.mjs +0 -68
- package/dist/lib/browser/traces-browser-5DQUYGQ7.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-FEVP3MK4.mjs.map +0 -7
- package/dist/lib/node-esm/log-processor-TKJVJJSJ.mjs.map +0 -7
- package/dist/lib/node-esm/logs-7J45KLM7.mjs.map +0 -7
- package/dist/lib/node-esm/metrics-H7DDLYSG.mjs.map +0 -7
- package/dist/lib/node-esm/traces-KMTHMYFX.mjs +0 -44
- package/dist/lib/node-esm/traces-KMTHMYFX.mjs.map +0 -7
|
@@ -24,10 +24,10 @@ import { invariant } from "@dxos/invariant";
|
|
|
24
24
|
import { log } from "@dxos/log";
|
|
25
25
|
|
|
26
26
|
// src/storage/node.ts
|
|
27
|
+
import yaml from "js-yaml";
|
|
27
28
|
import { existsSync, statSync } from "node:fs";
|
|
28
29
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
29
30
|
import { join } from "node:path";
|
|
30
|
-
import yaml from "js-yaml";
|
|
31
31
|
import { v4 as uuid, validate as validateUuid } from "uuid";
|
|
32
32
|
var showObservabilityBanner = async (configDir, bannercb) => {
|
|
33
33
|
const path = join(configDir, ".observability-banner-printed");
|
|
@@ -114,12 +114,7 @@ var ObservabilityImpl = class {
|
|
|
114
114
|
this._subscriptions.add(...cleanups.filter((cleanup) => cleanup !== void 0));
|
|
115
115
|
this._initialized = true;
|
|
116
116
|
}).pipe(Effect.catchAll((error) => Effect.gen(this, function* () {
|
|
117
|
-
log.catch(error, void 0, {
|
|
118
|
-
F: __dxlog_file,
|
|
119
|
-
L: 85,
|
|
120
|
-
S: this,
|
|
121
|
-
C: (f, a) => f(...a)
|
|
122
|
-
});
|
|
117
|
+
log.catch(error, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 32, S: this });
|
|
123
118
|
for (const extension of initializedExtensions) {
|
|
124
119
|
if (extension.close) {
|
|
125
120
|
yield* extension.close().pipe(Effect.catchAll(() => Effect.succeed(void 0)));
|
|
@@ -168,27 +163,11 @@ var ObservabilityImpl = class {
|
|
|
168
163
|
});
|
|
169
164
|
}
|
|
170
165
|
_addExtension(extension) {
|
|
171
|
-
invariant(!this._initialized, "Observability is already initialized", {
|
|
172
|
-
F: __dxlog_file,
|
|
173
|
-
L: 142,
|
|
174
|
-
S: this,
|
|
175
|
-
A: [
|
|
176
|
-
"!this._initialized",
|
|
177
|
-
"'Observability is already initialized'"
|
|
178
|
-
]
|
|
179
|
-
});
|
|
166
|
+
invariant(!this._initialized, "Observability is already initialized", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 82, S: this, A: ["!this._initialized", "'Observability is already initialized'"] });
|
|
180
167
|
this._extensions.push(extension);
|
|
181
168
|
}
|
|
182
169
|
_addDataProvider(dataProvider) {
|
|
183
|
-
invariant(!this._initialized, "Observability is already initialized", {
|
|
184
|
-
F: __dxlog_file,
|
|
185
|
-
L: 147,
|
|
186
|
-
S: this,
|
|
187
|
-
A: [
|
|
188
|
-
"!this._initialized",
|
|
189
|
-
"'Observability is already initialized'"
|
|
190
|
-
]
|
|
191
|
-
});
|
|
170
|
+
invariant(!this._initialized, "Observability is already initialized", { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 86, S: this, A: ["!this._initialized", "'Observability is already initialized'"] });
|
|
192
171
|
this._dataProviders.push(dataProvider);
|
|
193
172
|
}
|
|
194
173
|
/**
|
|
@@ -248,10 +227,12 @@ var ObservabilityImpl = class {
|
|
|
248
227
|
}
|
|
249
228
|
get feedback() {
|
|
250
229
|
return {
|
|
251
|
-
captureUserFeedback: (form) => {
|
|
230
|
+
captureUserFeedback: async (form) => {
|
|
231
|
+
let eventUuid;
|
|
252
232
|
for (const extension of this._getExtensions("feedback")) {
|
|
253
|
-
extension.captureUserFeedback(form);
|
|
233
|
+
eventUuid = await extension.captureUserFeedback(form) ?? eventUuid;
|
|
254
234
|
}
|
|
235
|
+
return eventUuid;
|
|
255
236
|
}
|
|
256
237
|
};
|
|
257
238
|
}
|
|
@@ -297,29 +278,13 @@ var make = () => Effect.succeed(new ObservabilityImpl());
|
|
|
297
278
|
var addExtension = (_extension) => Effect.fn(function* (_observability) {
|
|
298
279
|
const observability = yield* _observability;
|
|
299
280
|
const extension = yield* _extension;
|
|
300
|
-
invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, {
|
|
301
|
-
F: __dxlog_file,
|
|
302
|
-
L: 276,
|
|
303
|
-
S: this,
|
|
304
|
-
A: [
|
|
305
|
-
"'_addExtension' in observability && typeof observability._addExtension === 'function'",
|
|
306
|
-
""
|
|
307
|
-
]
|
|
308
|
-
});
|
|
281
|
+
invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 196, S: this, A: ["'_addExtension' in observability && typeof observability._addExtension === 'function'", ""] });
|
|
309
282
|
observability._addExtension(extension);
|
|
310
283
|
return observability;
|
|
311
284
|
});
|
|
312
285
|
var addDataProvider = (dataProvider) => Effect.fn(function* (_observability) {
|
|
313
286
|
const observability = yield* _observability;
|
|
314
|
-
invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, {
|
|
315
|
-
F: __dxlog_file,
|
|
316
|
-
L: 284,
|
|
317
|
-
S: this,
|
|
318
|
-
A: [
|
|
319
|
-
"'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'",
|
|
320
|
-
""
|
|
321
|
-
]
|
|
322
|
-
});
|
|
287
|
+
invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 202, S: this, A: ["'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'", ""] });
|
|
323
288
|
observability._addDataProvider(dataProvider);
|
|
324
289
|
return observability;
|
|
325
290
|
});
|
|
@@ -349,6 +314,7 @@ import * as Effect3 from "effect/Effect";
|
|
|
349
314
|
import * as Match from "effect/Match";
|
|
350
315
|
import * as Option from "effect/Option";
|
|
351
316
|
import * as Ref from "effect/Ref";
|
|
317
|
+
import { resolveTelemetryTag } from "@dxos/config";
|
|
352
318
|
import { LogLevel, log as log2 } from "@dxos/log";
|
|
353
319
|
import { isNode, isNonNullable } from "@dxos/util";
|
|
354
320
|
|
|
@@ -356,8 +322,8 @@ import { isNode, isNonNullable } from "@dxos/util";
|
|
|
356
322
|
var cli_observability_secrets_default = {
|
|
357
323
|
POSTHOG_API_KEY: null,
|
|
358
324
|
IPDATA_API_KEY: "73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786",
|
|
359
|
-
OTEL_ENDPOINT: "
|
|
360
|
-
OTEL_HEADERS:
|
|
325
|
+
OTEL_ENDPOINT: "/api/otel",
|
|
326
|
+
OTEL_HEADERS: null
|
|
361
327
|
};
|
|
362
328
|
|
|
363
329
|
// src/extensions/stub.ts
|
|
@@ -392,49 +358,60 @@ var extensions = Effect3.fn(function* ({
|
|
|
392
358
|
metrics: metricsEnabled = false,
|
|
393
359
|
traces: tracesEnabled = false
|
|
394
360
|
}) {
|
|
395
|
-
const { OtelLogs } = yield* Effect3.promise(() => import("./logs-
|
|
396
|
-
const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-
|
|
397
|
-
const { OtelTraces } = yield* Effect3.promise(() => import("./traces-
|
|
361
|
+
const { OtelLogs } = yield* Effect3.promise(() => import("./logs-ARJUVN3T.mjs"));
|
|
362
|
+
const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-DREJOOAC.mjs"));
|
|
363
|
+
const { OtelTraces } = yield* Effect3.promise(() => import("./traces-74F7JUKF.mjs"));
|
|
398
364
|
const cachedDisabled = yield* Effect3.promise(() => isObservabilityDisabled(serviceName));
|
|
399
|
-
const
|
|
365
|
+
const disabled = cachedDisabled || isObservabilityDisabledSync(serviceName);
|
|
366
|
+
const enabledRef = yield* Ref.make(!disabled);
|
|
400
367
|
const tags = /* @__PURE__ */ new Map();
|
|
401
|
-
const
|
|
368
|
+
const rawEndpoint = isNode() ? process.env.DX_OTEL_ENDPOINT ?? _endpoint ?? cli_observability_secrets_default.OTEL_ENDPOINT : config.values.runtime?.app?.env?.DX_OTEL_ENDPOINT ?? _endpoint;
|
|
369
|
+
const endpoint = !isNode() && rawEndpoint?.startsWith("/") ? resolveRelativeEndpoint(rawEndpoint) : rawEndpoint;
|
|
402
370
|
const headers = _headers ?? Match.value(isNode()).pipe(Match.when(true, () => Option.fromNullable(process.env.DX_OTEL_HEADERS ?? cli_observability_secrets_default.OTEL_HEADERS)), Match.when(false, () => Option.fromNullable(config.values.runtime?.app?.env?.DX_OTEL_HEADERS)), Match.exhaustive, Option.map((raw) => parseHeaders(raw)), Option.getOrElse(() => void 0));
|
|
403
|
-
if (!endpoint
|
|
404
|
-
log2.info("Missing OTEL_ENDPOINT
|
|
405
|
-
F: __dxlog_file2,
|
|
406
|
-
L: 77,
|
|
407
|
-
S: this,
|
|
408
|
-
C: (f, a) => f(...a)
|
|
409
|
-
});
|
|
371
|
+
if (!endpoint) {
|
|
372
|
+
log2.info("Missing OTEL_ENDPOINT", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 35, S: this });
|
|
410
373
|
return stubExtension;
|
|
411
374
|
}
|
|
375
|
+
const resolvedHeaders = headers ?? {};
|
|
376
|
+
const resolvedEndpoint = !isNode() && endpoint.startsWith("/") ? `${globalThis.location.origin}${endpoint}` : endpoint;
|
|
377
|
+
const clientTag = resolveTelemetryTag(config);
|
|
378
|
+
if (clientTag) {
|
|
379
|
+
tags.set("ctx.tag", clientTag);
|
|
380
|
+
}
|
|
412
381
|
const resource = defaultResource().merge(resourceFromAttributes({
|
|
413
382
|
[ATTR_SERVICE_NAME]: serviceName,
|
|
414
383
|
[ATTR_SERVICE_VERSION]: serviceVersion,
|
|
415
|
-
"
|
|
384
|
+
"session.id": crypto.randomUUID(),
|
|
385
|
+
"deployment.environment": environment,
|
|
386
|
+
"dxos.process.type": detectProcessType(),
|
|
387
|
+
...clientTag ? {
|
|
388
|
+
"ctx.tag": clientTag
|
|
389
|
+
} : {}
|
|
416
390
|
}));
|
|
417
391
|
const logs = logsEnabled ? new OtelLogs({
|
|
418
|
-
endpoint,
|
|
419
|
-
headers,
|
|
392
|
+
endpoint: resolvedEndpoint,
|
|
393
|
+
headers: resolvedHeaders,
|
|
420
394
|
resource,
|
|
421
395
|
getTags: () => Object.fromEntries(tags),
|
|
422
396
|
logLevel
|
|
423
397
|
}) : void 0;
|
|
424
398
|
const metrics = metricsEnabled ? new OtelMetrics({
|
|
425
|
-
endpoint,
|
|
426
|
-
headers,
|
|
399
|
+
endpoint: resolvedEndpoint,
|
|
400
|
+
headers: resolvedHeaders,
|
|
427
401
|
resource,
|
|
428
402
|
getTags: () => Object.fromEntries(tags)
|
|
429
403
|
}) : void 0;
|
|
430
404
|
const traces = tracesEnabled ? new OtelTraces({
|
|
431
|
-
endpoint,
|
|
432
|
-
headers,
|
|
405
|
+
endpoint: resolvedEndpoint,
|
|
406
|
+
headers: resolvedHeaders,
|
|
433
407
|
resource,
|
|
434
408
|
getTags: () => Object.fromEntries(tags)
|
|
435
409
|
}) : void 0;
|
|
436
|
-
|
|
410
|
+
const extension = {
|
|
437
411
|
initialize: () => Effect3.sync(() => {
|
|
412
|
+
if (disabled) {
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
438
415
|
if (logs) {
|
|
439
416
|
log2.runtimeConfig.processors.push(logs.logProcessor);
|
|
440
417
|
}
|
|
@@ -451,12 +428,28 @@ var extensions = Effect3.fn(function* ({
|
|
|
451
428
|
yield* Ref.update(enabledRef, () => false);
|
|
452
429
|
}),
|
|
453
430
|
close: () => Effect3.promise(async () => {
|
|
454
|
-
await
|
|
455
|
-
|
|
431
|
+
const results = await Promise.allSettled([
|
|
432
|
+
logs?.close(),
|
|
433
|
+
metrics?.close()
|
|
434
|
+
]);
|
|
435
|
+
for (const result of results) {
|
|
436
|
+
if (result.status === "rejected") {
|
|
437
|
+
log2.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 120, S: this });
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
await traces?.close();
|
|
456
441
|
}),
|
|
457
442
|
flush: () => Effect3.promise(async () => {
|
|
458
|
-
await
|
|
459
|
-
|
|
443
|
+
const results = await Promise.allSettled([
|
|
444
|
+
logs?.flush(),
|
|
445
|
+
metrics?.flush()
|
|
446
|
+
]);
|
|
447
|
+
for (const result of results) {
|
|
448
|
+
if (result.status === "rejected") {
|
|
449
|
+
log2.catch(result.reason, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 135, S: this });
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
await traces?.flush();
|
|
460
453
|
}),
|
|
461
454
|
setTags: (incomingTags) => {
|
|
462
455
|
for (const [key, value2] of Object.entries(incomingTags)) {
|
|
@@ -484,7 +477,39 @@ var extensions = Effect3.fn(function* ({
|
|
|
484
477
|
} : void 0
|
|
485
478
|
].filter(isNonNullable)
|
|
486
479
|
};
|
|
480
|
+
return extension;
|
|
487
481
|
});
|
|
482
|
+
var isObservabilityDisabledSync = (serviceName) => {
|
|
483
|
+
if (isNode()) {
|
|
484
|
+
return process.env.DX_DISABLE_OBSERVABILITY === "true";
|
|
485
|
+
}
|
|
486
|
+
try {
|
|
487
|
+
if (typeof localStorage !== "undefined") {
|
|
488
|
+
return localStorage.getItem(`${serviceName}/observability-disabled`) === "true";
|
|
489
|
+
}
|
|
490
|
+
} catch {
|
|
491
|
+
}
|
|
492
|
+
return false;
|
|
493
|
+
};
|
|
494
|
+
var detectProcessType = () => {
|
|
495
|
+
if (isNode()) {
|
|
496
|
+
return "node";
|
|
497
|
+
}
|
|
498
|
+
if (typeof window !== "undefined") {
|
|
499
|
+
return "browser";
|
|
500
|
+
}
|
|
501
|
+
if (typeof globalThis.ServiceWorkerGlobalScope !== "undefined") {
|
|
502
|
+
return "service-worker";
|
|
503
|
+
}
|
|
504
|
+
if (typeof globalThis.SharedWorkerGlobalScope !== "undefined") {
|
|
505
|
+
return "shared-worker";
|
|
506
|
+
}
|
|
507
|
+
return "dedicated-worker";
|
|
508
|
+
};
|
|
509
|
+
var resolveRelativeEndpoint = (path) => {
|
|
510
|
+
const origin = globalThis.location?.origin;
|
|
511
|
+
return origin ? `${origin}${path}` : path;
|
|
512
|
+
};
|
|
488
513
|
var parseHeaders = (unparsedHeaders) => {
|
|
489
514
|
return unparsedHeaders.split(";").reduce((acc, header) => {
|
|
490
515
|
const [key, ...rest] = header.split(":");
|
|
@@ -503,7 +528,7 @@ __export(posthog_exports, {
|
|
|
503
528
|
|
|
504
529
|
// src/extensions/posthog/extension.ts
|
|
505
530
|
import * as Effect4 from "effect/Effect";
|
|
506
|
-
import {
|
|
531
|
+
import { log as log3 } from "@dxos/log";
|
|
507
532
|
var __dxlog_file3 = "/__w/dxos/dxos/packages/sdk/observability/src/extensions/posthog/extension.ts";
|
|
508
533
|
var uploadLogs = async (body) => {
|
|
509
534
|
try {
|
|
@@ -517,12 +542,7 @@ var uploadLogs = async (body) => {
|
|
|
517
542
|
if (!response.ok) {
|
|
518
543
|
log3.warn("feedback log upload failed", {
|
|
519
544
|
status: response.status
|
|
520
|
-
}, {
|
|
521
|
-
F: __dxlog_file3,
|
|
522
|
-
L: 34,
|
|
523
|
-
S: void 0,
|
|
524
|
-
C: (f, a) => f(...a)
|
|
525
|
-
});
|
|
545
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 17, S: void 0 });
|
|
526
546
|
return void 0;
|
|
527
547
|
}
|
|
528
548
|
const { key } = await response.json();
|
|
@@ -530,41 +550,26 @@ var uploadLogs = async (body) => {
|
|
|
530
550
|
} catch (err) {
|
|
531
551
|
log3.warn("feedback log upload error", {
|
|
532
552
|
error: err
|
|
533
|
-
}, {
|
|
534
|
-
F: __dxlog_file3,
|
|
535
|
-
L: 40,
|
|
536
|
-
S: void 0,
|
|
537
|
-
C: (f, a) => f(...a)
|
|
538
|
-
});
|
|
553
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 25, S: void 0 });
|
|
539
554
|
return void 0;
|
|
540
555
|
}
|
|
541
556
|
};
|
|
542
|
-
var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig,
|
|
557
|
+
var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig, logStore, feedbackLogMaxSize }) {
|
|
543
558
|
if (typeof window === "undefined") {
|
|
544
|
-
log3("PostHog is being stubbed because it is running in a worker.", void 0, {
|
|
545
|
-
F: __dxlog_file3,
|
|
546
|
-
L: 54,
|
|
547
|
-
S: this,
|
|
548
|
-
C: (f, a) => f(...a)
|
|
549
|
-
});
|
|
559
|
+
log3("PostHog is being stubbed because it is running in a worker.", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 33, S: this });
|
|
550
560
|
return stubExtension;
|
|
551
561
|
}
|
|
552
562
|
const feedbackSurveyId = config.get("runtime.app.env.DX_POSTHOG_FEEDBACK_SURVEY_ID");
|
|
553
563
|
const apiKey = config.get("runtime.app.env.DX_POSTHOG_API_KEY");
|
|
554
564
|
const api_host = config.get("runtime.app.env.DX_POSTHOG_API_HOST");
|
|
555
565
|
if (!apiKey || !api_host) {
|
|
556
|
-
log3.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, {
|
|
557
|
-
F: __dxlog_file3,
|
|
558
|
-
L: 62,
|
|
559
|
-
S: this,
|
|
560
|
-
C: (f, a) => f(...a)
|
|
561
|
-
});
|
|
566
|
+
log3.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 40, S: this });
|
|
562
567
|
return stubExtension;
|
|
563
568
|
}
|
|
564
569
|
const { default: posthog } = yield* Effect4.promise(() => import("posthog-js"));
|
|
565
|
-
const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-
|
|
566
|
-
const logBuffer = externalLogBuffer ?? new LogBuffer();
|
|
570
|
+
const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-ZODHERST.mjs"));
|
|
567
571
|
let feedbackSurveyAvailable = null;
|
|
572
|
+
let unregisterPosthogProcessors;
|
|
568
573
|
const checkFeedbackSurveyAvailable = () => feedbackSurveyId ? Effect4.promise(() => {
|
|
569
574
|
if (feedbackSurveyAvailable !== null) {
|
|
570
575
|
return Promise.resolve(feedbackSurveyAvailable);
|
|
@@ -595,19 +600,15 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
|
|
|
595
600
|
} : {}
|
|
596
601
|
});
|
|
597
602
|
}
|
|
598
|
-
|
|
599
|
-
log3.
|
|
603
|
+
unregisterPosthogProcessors?.();
|
|
604
|
+
const removePosthogLog = log3.addProcessor(logProcessor, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 79, S: this });
|
|
605
|
+
unregisterPosthogProcessors = () => {
|
|
606
|
+
removePosthogLog();
|
|
607
|
+
};
|
|
600
608
|
}),
|
|
601
609
|
close: () => Effect4.sync(() => {
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
logBuffer.logProcessor
|
|
605
|
-
]) {
|
|
606
|
-
const index = log3.runtimeConfig.processors.indexOf(processor);
|
|
607
|
-
if (index !== -1) {
|
|
608
|
-
log3.runtimeConfig.processors.splice(index, 1);
|
|
609
|
-
}
|
|
610
|
-
}
|
|
610
|
+
unregisterPosthogProcessors?.();
|
|
611
|
+
unregisterPosthogProcessors = void 0;
|
|
611
612
|
}),
|
|
612
613
|
enable: () => Effect4.sync(() => posthog.opt_in_capturing()),
|
|
613
614
|
disable: () => Effect4.sync(() => posthog.opt_out_capturing()),
|
|
@@ -642,36 +643,47 @@ var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog:
|
|
|
642
643
|
kind: "feedback",
|
|
643
644
|
// TODO(wittjosiah): Support custom surveys.
|
|
644
645
|
captureUserFeedback: (form) => {
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
646
|
+
return new Promise((resolve, reject) => {
|
|
647
|
+
posthog.getSurveys((surveys) => {
|
|
648
|
+
void (async () => {
|
|
649
|
+
try {
|
|
650
|
+
const survey = surveys.find((survey2) => survey2.id === feedbackSurveyId);
|
|
651
|
+
if (!survey || survey.questions.length === 0) {
|
|
652
|
+
log3.error("Missing feedback survey or survey has no questions", {
|
|
653
|
+
feedbackSurveyId
|
|
654
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 127, S: this });
|
|
655
|
+
resolve(void 0);
|
|
656
|
+
return;
|
|
657
|
+
}
|
|
658
|
+
let debugLogDumpKey = null;
|
|
659
|
+
if (form.includeLogs !== false && logStore !== void 0) {
|
|
660
|
+
const ndjson = await logStore.export({
|
|
661
|
+
maxSize: feedbackLogMaxSize
|
|
662
|
+
});
|
|
663
|
+
if (ndjson.length > 0) {
|
|
664
|
+
debugLogDumpKey = await uploadLogs(ndjson) ?? "failed";
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
const question = survey.questions[0];
|
|
668
|
+
const result = posthog.capture("survey sent", {
|
|
669
|
+
$survey_id: survey.id,
|
|
670
|
+
$survey_questions: [
|
|
671
|
+
{
|
|
672
|
+
id: question.id,
|
|
673
|
+
question: question.question
|
|
674
|
+
}
|
|
675
|
+
],
|
|
676
|
+
[`$survey_response_${question.id}`]: form.message,
|
|
677
|
+
debug_log_dump_key: debugLogDumpKey
|
|
678
|
+
});
|
|
679
|
+
resolve(result?.uuid);
|
|
680
|
+
} catch (err) {
|
|
681
|
+
log3.error("Failed to capture user feedback", {
|
|
682
|
+
err
|
|
683
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 157, S: this });
|
|
684
|
+
reject(err);
|
|
669
685
|
}
|
|
670
|
-
|
|
671
|
-
[`$survey_response_${question.id}`]: form.message,
|
|
672
|
-
...debugLogDumpKey ? {
|
|
673
|
-
debug_log_dump_key: debugLogDumpKey
|
|
674
|
-
} : {}
|
|
686
|
+
})();
|
|
675
687
|
});
|
|
676
688
|
});
|
|
677
689
|
},
|
|
@@ -737,19 +749,11 @@ var identityProvider = (clientServices) => Effect5.fn(function* (observability)
|
|
|
737
749
|
});
|
|
738
750
|
});
|
|
739
751
|
var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
|
|
740
|
-
const ctx = new Context(void 0, {
|
|
741
|
-
F: __dxlog_file4,
|
|
742
|
-
L: 61
|
|
743
|
-
});
|
|
752
|
+
const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 50 });
|
|
744
753
|
let lastNetworkStatus;
|
|
745
754
|
const updateSignalMetrics = new Event().debounce(NETWORK_METRICS_MIN_INTERVAL);
|
|
746
755
|
updateSignalMetrics.on(ctx, async () => {
|
|
747
|
-
log4("send signal metrics", void 0, {
|
|
748
|
-
F: __dxlog_file4,
|
|
749
|
-
L: 67,
|
|
750
|
-
S: this,
|
|
751
|
-
C: (f, a) => f(...a)
|
|
752
|
-
});
|
|
756
|
+
log4("send signal metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 55, S: this });
|
|
753
757
|
lastNetworkStatus?.signaling?.forEach(({ server, state }) => {
|
|
754
758
|
observability.metrics.gauge("dxos.client.network.signal.connectionState", state, {
|
|
755
759
|
server
|
|
@@ -794,20 +798,11 @@ var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
|
|
|
794
798
|
};
|
|
795
799
|
});
|
|
796
800
|
var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
|
|
797
|
-
const ctx = new Context(void 0, {
|
|
798
|
-
|
|
799
|
-
L: 121
|
|
800
|
-
});
|
|
801
|
+
const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 100 });
|
|
802
|
+
log4("runtimeMetricsProvider: requesting platform from SystemService", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 101, S: this });
|
|
801
803
|
const platform = yield* Effect5.promise(() => clientServices.SystemService.getPlatform());
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
L: 123,
|
|
805
|
-
S: this,
|
|
806
|
-
A: [
|
|
807
|
-
"platform",
|
|
808
|
-
"'platform is required'"
|
|
809
|
-
]
|
|
810
|
-
});
|
|
804
|
+
log4("runtimeMetricsProvider: platform received", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 103, S: this });
|
|
805
|
+
invariant2(platform, "platform is required", { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 104, S: this, A: ["platform", "'platform is required'"] });
|
|
811
806
|
observability.setTags({
|
|
812
807
|
platformType: Platform.PLATFORM_TYPE[platform.type].toLowerCase(),
|
|
813
808
|
platform: platform.platform,
|
|
@@ -831,33 +826,20 @@ var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observabi
|
|
|
831
826
|
}
|
|
832
827
|
}).catch((error) => log4("platform error", {
|
|
833
828
|
error
|
|
834
|
-
}, {
|
|
835
|
-
F: __dxlog_file4,
|
|
836
|
-
L: 152,
|
|
837
|
-
S: this,
|
|
838
|
-
C: (f, a) => f(...a)
|
|
839
|
-
}));
|
|
829
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 126, S: this }));
|
|
840
830
|
}, RUNTIME_METRICS_MIN_INTERVAL);
|
|
841
831
|
return async () => {
|
|
842
832
|
await ctx.dispose();
|
|
843
833
|
};
|
|
844
834
|
});
|
|
845
835
|
var spacesMetricsProvider = (client) => Effect5.fn(function* (observability) {
|
|
846
|
-
const ctx = new Context(void 0, {
|
|
847
|
-
F: __dxlog_file4,
|
|
848
|
-
L: 165
|
|
849
|
-
});
|
|
836
|
+
const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 135 });
|
|
850
837
|
const spaces = client.spaces.get();
|
|
851
838
|
const subscriptions = /* @__PURE__ */ new Map();
|
|
852
839
|
ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));
|
|
853
840
|
const updateSpaceMetrics = new Event().debounce(SPACE_METRICS_MIN_INTERVAL);
|
|
854
841
|
updateSpaceMetrics.on(ctx, async () => {
|
|
855
|
-
log4("send space metrics", void 0, {
|
|
856
|
-
F: __dxlog_file4,
|
|
857
|
-
L: 173,
|
|
858
|
-
S: this,
|
|
859
|
-
C: (f, a) => f(...a)
|
|
860
|
-
});
|
|
842
|
+
log4("send space metrics", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file4, L: 142, S: this });
|
|
861
843
|
for (const data of mapSpaces(spaces, {
|
|
862
844
|
truncateKeys: true
|
|
863
845
|
})) {
|
|
@@ -978,12 +960,7 @@ var provider = (config) => (observability) => Effect6.gen(function* () {
|
|
|
978
960
|
}).pipe(Effect6.provide(FetchHttpClient.layer), Effect6.catchAll((err) => Effect6.sync(() => {
|
|
979
961
|
log5.verbose("ipdata fetch failed", {
|
|
980
962
|
err
|
|
981
|
-
}, {
|
|
982
|
-
F: __dxlog_file5,
|
|
983
|
-
L: 88,
|
|
984
|
-
S: void 0,
|
|
985
|
-
C: (f, a) => f(...a)
|
|
986
|
-
});
|
|
963
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file5, L: 54, S: void 0 });
|
|
987
964
|
})));
|
|
988
965
|
|
|
989
966
|
// src/providers/storage.ts
|