@dxos/observability 0.8.3 → 0.8.4-main.1068cf700f
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-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/chunk-K4VFBKST.mjs +13 -0
- package/dist/lib/browser/chunk-K4VFBKST.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1066 -34
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/log-processor-FDLTDQEM.mjs +45 -0
- package/dist/lib/browser/log-processor-FDLTDQEM.mjs.map +7 -0
- package/dist/lib/browser/logs-ATTRIUTL.mjs +113 -0
- package/dist/lib/browser/logs-ATTRIUTL.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/metrics-PKTV6IGF.mjs +130 -0
- package/dist/lib/browser/metrics-PKTV6IGF.mjs.map +7 -0
- package/dist/lib/browser/traces-browser-XYXBF5ZX.mjs +62 -0
- package/dist/lib/browser/traces-browser-XYXBF5ZX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-FEVP3MK4.mjs +15 -0
- package/dist/lib/node-esm/chunk-FEVP3MK4.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/index.mjs +1070 -34
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/log-processor-TKJVJJSJ.mjs +46 -0
- package/dist/lib/node-esm/log-processor-TKJVJJSJ.mjs.map +7 -0
- package/dist/lib/node-esm/logs-7J45KLM7.mjs +114 -0
- package/dist/lib/node-esm/logs-7J45KLM7.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/metrics-H7DDLYSG.mjs +131 -0
- package/dist/lib/node-esm/metrics-H7DDLYSG.mjs.map +7 -0
- package/dist/lib/node-esm/traces-KMTHMYFX.mjs +44 -0
- package/dist/lib/node-esm/traces-KMTHMYFX.mjs.map +7 -0
- package/dist/types/src/cli-observability-secrets.json +3 -4
- package/dist/types/src/extensions/index.d.ts +3 -0
- package/dist/types/src/extensions/index.d.ts.map +1 -0
- package/dist/types/src/extensions/index.js +6 -0
- package/dist/types/src/extensions/index.js.map +1 -0
- package/dist/types/src/extensions/otel/extension.d.ts +23 -0
- package/dist/types/src/extensions/otel/extension.d.ts.map +1 -0
- package/dist/types/src/extensions/otel/extension.js +124 -0
- package/dist/types/src/extensions/otel/extension.js.map +1 -0
- package/dist/types/src/extensions/otel/index.d.ts +2 -0
- package/dist/types/src/extensions/otel/index.d.ts.map +1 -0
- package/dist/types/src/extensions/otel/index.js +5 -0
- package/dist/types/src/extensions/otel/index.js.map +1 -0
- package/dist/types/src/{otel → extensions/otel}/logs.d.ts +4 -3
- package/dist/types/src/extensions/otel/logs.d.ts.map +1 -0
- package/dist/types/src/extensions/otel/logs.js +104 -0
- package/dist/types/src/extensions/otel/logs.js.map +1 -0
- package/dist/types/src/{otel → extensions/otel}/metrics.d.ts +0 -1
- package/dist/types/src/extensions/otel/metrics.d.ts.map +1 -0
- package/dist/types/src/{otel → extensions/otel}/metrics.js +6 -12
- package/dist/types/src/extensions/otel/metrics.js.map +1 -0
- package/dist/types/src/{otel → extensions/otel}/otel.d.ts +3 -3
- package/dist/types/src/extensions/otel/otel.d.ts.map +1 -0
- package/dist/types/src/{otel → extensions/otel}/otel.js +1 -1
- package/dist/types/src/extensions/otel/otel.js.map +1 -0
- package/dist/types/src/extensions/otel/traces-browser.d.ts.map +1 -0
- package/dist/types/src/extensions/otel/traces-browser.js +44 -0
- package/dist/types/src/extensions/otel/traces-browser.js.map +1 -0
- package/dist/types/src/extensions/otel/traces.d.ts.map +1 -0
- package/dist/types/src/extensions/otel/traces.js +38 -0
- package/dist/types/src/extensions/otel/traces.js.map +1 -0
- package/dist/types/src/extensions/posthog/extension.d.ts +15 -0
- package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -0
- package/dist/types/src/extensions/posthog/extension.js +143 -0
- package/dist/types/src/extensions/posthog/extension.js.map +1 -0
- package/dist/types/src/extensions/posthog/index.d.ts +2 -0
- package/dist/types/src/extensions/posthog/index.d.ts.map +1 -0
- package/dist/types/src/extensions/posthog/index.js +5 -0
- package/dist/types/src/extensions/posthog/index.js.map +1 -0
- package/dist/types/src/extensions/posthog/log-processor.d.ts +3 -0
- package/dist/types/src/extensions/posthog/log-processor.d.ts.map +1 -0
- package/dist/types/src/extensions/posthog/log-processor.js +45 -0
- package/dist/types/src/extensions/posthog/log-processor.js.map +1 -0
- package/dist/types/src/extensions/posthog/log-processor.test.d.ts +2 -0
- package/dist/types/src/extensions/posthog/log-processor.test.d.ts.map +1 -0
- package/dist/types/src/extensions/posthog/log-processor.test.js +146 -0
- package/dist/types/src/extensions/posthog/log-processor.test.js.map +1 -0
- package/dist/types/src/extensions/stub.d.ts +3 -0
- package/dist/types/src/extensions/stub.d.ts.map +1 -0
- package/dist/types/src/extensions/stub.js +16 -0
- package/dist/types/src/extensions/stub.js.map +1 -0
- package/dist/types/src/index.d.ts +4 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/index.js +5 -3
- package/dist/types/src/index.js.map +1 -1
- package/dist/types/src/log-buffer.d.ts +34 -0
- package/dist/types/src/log-buffer.d.ts.map +1 -0
- package/dist/types/src/log-buffer.js +70 -0
- package/dist/types/src/log-buffer.js.map +1 -0
- package/dist/types/src/log-buffer.test.d.ts +2 -0
- package/dist/types/src/log-buffer.test.d.ts.map +1 -0
- package/dist/types/src/log-buffer.test.js +107 -0
- package/dist/types/src/log-buffer.test.js.map +1 -0
- package/dist/types/src/observability-extension.d.ts +74 -0
- package/dist/types/src/observability-extension.d.ts.map +1 -0
- package/dist/types/src/observability-extension.js +5 -0
- package/dist/types/src/observability-extension.js.map +1 -0
- package/dist/types/src/observability.d.ts +32 -110
- package/dist/types/src/observability.d.ts.map +1 -1
- package/dist/types/src/observability.js +176 -455
- package/dist/types/src/observability.js.map +1 -1
- package/dist/types/src/observability.test.d.ts +2 -0
- package/dist/types/src/observability.test.d.ts.map +1 -0
- package/dist/types/src/observability.test.js +312 -0
- package/dist/types/src/observability.test.js.map +1 -0
- package/dist/types/src/providers/client-observability.d.ts +11 -0
- package/dist/types/src/providers/client-observability.d.ts.map +1 -0
- package/dist/types/src/providers/client-observability.js +200 -0
- package/dist/types/src/providers/client-observability.js.map +1 -0
- package/dist/types/src/providers/index.d.ts +4 -0
- package/dist/types/src/providers/index.d.ts.map +1 -0
- package/dist/types/src/providers/index.js +7 -0
- package/dist/types/src/providers/index.js.map +1 -0
- package/dist/types/src/providers/ip-data.d.ts +5 -0
- package/dist/types/src/providers/ip-data.d.ts.map +1 -0
- package/dist/types/src/providers/ip-data.js +55 -0
- package/dist/types/src/providers/ip-data.js.map +1 -0
- package/dist/types/src/providers/storage.d.ts +3 -0
- package/dist/types/src/providers/storage.d.ts.map +1 -0
- package/dist/types/src/providers/storage.js +19 -0
- package/dist/types/src/providers/storage.js.map +1 -0
- package/dist/types/src/storage/browser.d.ts +19 -0
- package/dist/types/src/storage/browser.d.ts.map +1 -0
- package/dist/types/src/storage/browser.js +58 -0
- package/dist/types/src/storage/browser.js.map +1 -0
- package/dist/types/src/storage/index.d.ts +2 -0
- package/dist/types/src/storage/index.d.ts.map +1 -0
- package/{src/segment/index.ts → dist/types/src/storage/index.js} +1 -2
- package/dist/types/src/storage/index.js.map +1 -0
- package/dist/types/src/storage/node.d.ts +26 -0
- package/dist/types/src/storage/node.d.ts.map +1 -0
- package/dist/types/src/storage/node.js +92 -0
- package/dist/types/src/storage/node.js.map +1 -0
- package/dist/types/src/storage/node.test.d.ts +2 -0
- package/dist/types/src/storage/node.test.d.ts.map +1 -0
- package/dist/types/src/storage/node.test.js +103 -0
- package/dist/types/src/storage/node.test.js.map +1 -0
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +42 -63
- package/src/cli-observability-secrets.json +3 -4
- package/src/extensions/index.ts +6 -0
- package/src/extensions/otel/extension.ts +178 -0
- package/src/extensions/otel/index.ts +5 -0
- package/src/extensions/otel/logs.ts +134 -0
- package/src/{otel → extensions/otel}/metrics.ts +4 -21
- package/src/{otel → extensions/otel}/otel.ts +4 -4
- package/src/extensions/otel/traces-browser.ts +57 -0
- package/src/extensions/otel/traces.ts +49 -0
- package/src/extensions/posthog/extension.ts +172 -0
- package/src/extensions/posthog/index.ts +5 -0
- package/src/extensions/posthog/log-processor.test.ts +185 -0
- package/src/extensions/posthog/log-processor.ts +54 -0
- package/src/extensions/stub.ts +19 -0
- package/src/index.ts +5 -3
- package/src/log-buffer.test.ts +134 -0
- package/src/log-buffer.ts +101 -0
- package/src/observability-extension.ts +94 -0
- package/src/observability.test.ts +531 -0
- package/src/observability.ts +236 -577
- package/src/providers/client-observability.ts +253 -0
- package/src/providers/index.ts +7 -0
- package/src/providers/ip-data.ts +88 -0
- package/src/providers/storage.ts +23 -0
- package/src/storage/browser.ts +61 -0
- package/src/{sentry → storage}/index.ts +0 -1
- package/src/storage/node.test.ts +130 -0
- package/src/{helpers/node-observability.ts → storage/node.ts} +42 -70
- package/dist/lib/browser/chunk-G6EE7HFV.mjs +0 -147
- package/dist/lib/browser/chunk-G6EE7HFV.mjs.map +0 -7
- package/dist/lib/browser/chunk-JA5VJRKF.mjs +0 -164
- package/dist/lib/browser/chunk-JA5VJRKF.mjs.map +0 -7
- package/dist/lib/browser/chunk-KDP3SESE.mjs +0 -1
- package/dist/lib/browser/chunk-YQJELTRP.mjs +0 -996
- package/dist/lib/browser/chunk-YQJELTRP.mjs.map +0 -7
- package/dist/lib/browser/observability-HDE3I7TA.mjs +0 -10
- package/dist/lib/browser/otel-LHAFLNBQ.mjs +0 -277
- package/dist/lib/browser/otel-LHAFLNBQ.mjs.map +0 -7
- package/dist/lib/browser/segment/index.mjs +0 -11
- package/dist/lib/browser/segment/index.mjs.map +0 -7
- package/dist/lib/browser/sentry/index.mjs +0 -24
- package/dist/lib/browser/sentry/index.mjs.map +0 -7
- package/dist/lib/browser/sentry-log-processor-625AISXI.mjs +0 -146
- package/dist/lib/browser/sentry-log-processor-625AISXI.mjs.map +0 -7
- package/dist/lib/node/chunk-325GAGFA.cjs +0 -213
- package/dist/lib/node/chunk-325GAGFA.cjs.map +0 -7
- package/dist/lib/node/chunk-BZHVFSLF.cjs +0 -1025
- package/dist/lib/node/chunk-BZHVFSLF.cjs.map +0 -7
- package/dist/lib/node/chunk-GIYJMZEQ.cjs +0 -2
- package/dist/lib/node/chunk-GIYJMZEQ.cjs.map +0 -7
- package/dist/lib/node/chunk-MZ3PMDTP.cjs +0 -163
- package/dist/lib/node/chunk-MZ3PMDTP.cjs.map +0 -7
- package/dist/lib/node/index.cjs +0 -60
- package/dist/lib/node/index.cjs.map +0 -7
- package/dist/lib/node/meta.json +0 -1
- package/dist/lib/node/observability-E2NGRIEN.cjs +0 -32
- package/dist/lib/node/observability-E2NGRIEN.cjs.map +0 -7
- package/dist/lib/node/otel-VF5YNCR3.cjs +0 -278
- package/dist/lib/node/otel-VF5YNCR3.cjs.map +0 -7
- package/dist/lib/node/segment/index.cjs +0 -33
- package/dist/lib/node/segment/index.cjs.map +0 -7
- package/dist/lib/node/sentry/index.cjs +0 -46
- package/dist/lib/node/sentry/index.cjs.map +0 -7
- package/dist/lib/node/sentry-log-processor-CCV4RL7N.cjs +0 -164
- package/dist/lib/node/sentry-log-processor-CCV4RL7N.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-AZMSBUWR.mjs +0 -202
- package/dist/lib/node-esm/chunk-AZMSBUWR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-H7Y2DDUN.mjs +0 -135
- package/dist/lib/node-esm/chunk-H7Y2DDUN.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-M7QJLFGR.mjs +0 -997
- package/dist/lib/node-esm/chunk-M7QJLFGR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YJ4KVBWC.mjs +0 -2
- package/dist/lib/node-esm/chunk-YJ4KVBWC.mjs.map +0 -7
- package/dist/lib/node-esm/observability-7BTI46NM.mjs +0 -11
- package/dist/lib/node-esm/observability-7BTI46NM.mjs.map +0 -7
- package/dist/lib/node-esm/otel-AF5TSABC.mjs +0 -260
- package/dist/lib/node-esm/otel-AF5TSABC.mjs.map +0 -7
- package/dist/lib/node-esm/segment/index.mjs +0 -12
- package/dist/lib/node-esm/segment/index.mjs.map +0 -7
- package/dist/lib/node-esm/sentry/index.mjs +0 -25
- package/dist/lib/node-esm/sentry/index.mjs.map +0 -7
- package/dist/lib/node-esm/sentry-log-processor-HPUPCMRG.mjs +0 -147
- package/dist/lib/node-esm/sentry-log-processor-HPUPCMRG.mjs.map +0 -7
- package/dist/types/src/helpers/browser-observability.d.ts +0 -17
- package/dist/types/src/helpers/browser-observability.d.ts.map +0 -1
- package/dist/types/src/helpers/browser-observability.js +0 -140
- package/dist/types/src/helpers/browser-observability.js.map +0 -1
- package/dist/types/src/helpers/common.d.ts +0 -12
- package/dist/types/src/helpers/common.d.ts.map +0 -1
- package/dist/types/src/helpers/common.js +0 -23
- package/dist/types/src/helpers/common.js.map +0 -1
- package/dist/types/src/helpers/index.d.ts +0 -6
- package/dist/types/src/helpers/index.d.ts.map +0 -1
- package/dist/types/src/helpers/index.js +0 -9
- package/dist/types/src/helpers/index.js.map +0 -1
- package/dist/types/src/helpers/map-spaces.d.ts +0 -18
- package/dist/types/src/helpers/map-spaces.d.ts.map +0 -1
- package/dist/types/src/helpers/map-spaces.js +0 -37
- package/dist/types/src/helpers/map-spaces.js.map +0 -1
- package/dist/types/src/helpers/node-observability.d.ts +0 -24
- package/dist/types/src/helpers/node-observability.d.ts.map +0 -1
- package/dist/types/src/helpers/node-observability.js +0 -101
- package/dist/types/src/helpers/node-observability.js.map +0 -1
- package/dist/types/src/helpers/setup-telemetry-listeners.d.ts +0 -4
- package/dist/types/src/helpers/setup-telemetry-listeners.d.ts.map +0 -1
- package/dist/types/src/helpers/setup-telemetry-listeners.js +0 -97
- package/dist/types/src/helpers/setup-telemetry-listeners.js.map +0 -1
- package/dist/types/src/otel/index.d.ts +0 -5
- package/dist/types/src/otel/index.d.ts.map +0 -1
- package/dist/types/src/otel/index.js +0 -8
- package/dist/types/src/otel/index.js.map +0 -1
- package/dist/types/src/otel/logs.d.ts.map +0 -1
- package/dist/types/src/otel/logs.js +0 -71
- package/dist/types/src/otel/logs.js.map +0 -1
- package/dist/types/src/otel/metrics.d.ts.map +0 -1
- package/dist/types/src/otel/metrics.js.map +0 -1
- package/dist/types/src/otel/otel.d.ts.map +0 -1
- package/dist/types/src/otel/otel.js.map +0 -1
- package/dist/types/src/otel/traces-browser.d.ts.map +0 -1
- package/dist/types/src/otel/traces-browser.js +0 -47
- package/dist/types/src/otel/traces-browser.js.map +0 -1
- package/dist/types/src/otel/traces.d.ts.map +0 -1
- package/dist/types/src/otel/traces.js +0 -40
- package/dist/types/src/otel/traces.js.map +0 -1
- package/dist/types/src/segment/base.d.ts +0 -15
- package/dist/types/src/segment/base.d.ts.map +0 -1
- package/dist/types/src/segment/base.js +0 -50
- package/dist/types/src/segment/base.js.map +0 -1
- package/dist/types/src/segment/browser.d.ts +0 -15
- package/dist/types/src/segment/browser.d.ts.map +0 -1
- package/dist/types/src/segment/browser.js +0 -67
- package/dist/types/src/segment/browser.js.map +0 -1
- package/dist/types/src/segment/index.d.ts +0 -3
- package/dist/types/src/segment/index.d.ts.map +0 -1
- package/dist/types/src/segment/index.js +0 -6
- package/dist/types/src/segment/index.js.map +0 -1
- package/dist/types/src/segment/node.d.ts +0 -16
- package/dist/types/src/segment/node.d.ts.map +0 -1
- package/dist/types/src/segment/node.js +0 -83
- package/dist/types/src/segment/node.js.map +0 -1
- package/dist/types/src/segment/types.d.ts +0 -52
- package/dist/types/src/segment/types.d.ts.map +0 -1
- package/dist/types/src/segment/types.js +0 -18
- package/dist/types/src/segment/types.js.map +0 -1
- package/dist/types/src/sentry/browser.d.ts +0 -32
- package/dist/types/src/sentry/browser.d.ts.map +0 -1
- package/dist/types/src/sentry/browser.js +0 -112
- package/dist/types/src/sentry/browser.js.map +0 -1
- package/dist/types/src/sentry/index.d.ts +0 -3
- package/dist/types/src/sentry/index.d.ts.map +0 -1
- package/dist/types/src/sentry/index.js +0 -6
- package/dist/types/src/sentry/index.js.map +0 -1
- package/dist/types/src/sentry/node.d.ts +0 -32
- package/dist/types/src/sentry/node.d.ts.map +0 -1
- package/dist/types/src/sentry/node.js +0 -111
- package/dist/types/src/sentry/node.js.map +0 -1
- package/dist/types/src/sentry/node.node.test.d.ts +0 -2
- package/dist/types/src/sentry/node.node.test.d.ts.map +0 -1
- package/dist/types/src/sentry/node.node.test.js +0 -34
- package/dist/types/src/sentry/node.node.test.js.map +0 -1
- package/dist/types/src/sentry/sentry-log-processor.d.ts +0 -9
- package/dist/types/src/sentry/sentry-log-processor.d.ts.map +0 -1
- package/dist/types/src/sentry/sentry-log-processor.js +0 -149
- package/dist/types/src/sentry/sentry-log-processor.js.map +0 -1
- package/dist/types/src/sentry/sentry.node.test.d.ts +0 -2
- package/dist/types/src/sentry/sentry.node.test.d.ts.map +0 -1
- package/dist/types/src/sentry/sentry.node.test.js +0 -28
- package/dist/types/src/sentry/sentry.node.test.js.map +0 -1
- package/dist/types/src/sentry/types.d.ts +0 -18
- package/dist/types/src/sentry/types.d.ts.map +0 -1
- package/dist/types/src/sentry/types.js +0 -4
- package/dist/types/src/sentry/types.js.map +0 -1
- package/dist/types/src/testing/index.d.ts +0 -2
- package/dist/types/src/testing/index.d.ts.map +0 -1
- package/dist/types/src/testing/index.js +0 -5
- package/dist/types/src/testing/index.js.map +0 -1
- package/dist/types/src/testing/testkit/browser.d.ts +0 -2
- package/dist/types/src/testing/testkit/browser.d.ts.map +0 -1
- package/dist/types/src/testing/testkit/browser.js +0 -7
- package/dist/types/src/testing/testkit/browser.js.map +0 -1
- package/dist/types/src/testing/testkit/index.d.ts +0 -2
- package/dist/types/src/testing/testkit/index.d.ts.map +0 -1
- package/dist/types/src/testing/testkit/index.js +0 -6
- package/dist/types/src/testing/testkit/index.js.map +0 -1
- package/src/helpers/browser-observability.ts +0 -177
- package/src/helpers/common.ts +0 -38
- package/src/helpers/index.ts +0 -9
- package/src/helpers/map-spaces.ts +0 -48
- package/src/helpers/setup-telemetry-listeners.ts +0 -108
- package/src/otel/index.ts +0 -8
- package/src/otel/logs.ts +0 -100
- package/src/otel/traces-browser.ts +0 -59
- package/src/otel/traces.ts +0 -57
- package/src/segment/base.ts +0 -69
- package/src/segment/browser.ts +0 -68
- package/src/segment/node.ts +0 -94
- package/src/segment/types.ts +0 -57
- package/src/sentry/browser.ts +0 -133
- package/src/sentry/node.node.test.ts +0 -39
- package/src/sentry/node.ts +0 -126
- package/src/sentry/sentry-log-processor.ts +0 -166
- package/src/sentry/sentry.node.test.ts +0 -34
- package/src/sentry/types.ts +0 -22
- package/src/testing/index.ts +0 -5
- package/src/testing/testkit/browser.ts +0 -8
- package/src/testing/testkit/index.ts +0 -7
- package/src/testing/testkit/shims.d.ts +0 -5
- /package/dist/lib/browser/{chunk-KDP3SESE.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/{browser/observability-HDE3I7TA.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
- /package/dist/types/src/{otel → extensions/otel}/traces-browser.d.ts +0 -0
- /package/dist/types/src/{otel → extensions/otel}/traces.d.ts +0 -0
|
@@ -1,39 +1,1075 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
3
|
+
__export
|
|
4
|
+
} from "./chunk-HSLMI22Q.mjs";
|
|
5
|
+
|
|
6
|
+
// src/log-buffer.ts
|
|
7
|
+
import { LogLevel, shortLevelName } from "@dxos/log";
|
|
8
|
+
import { CircularBuffer } from "@dxos/util";
|
|
9
|
+
var DEFAULT_BUFFER_SIZE = 2e3;
|
|
10
|
+
var MAX_CONTEXT_LENGTH = 500;
|
|
11
|
+
var LogBuffer = class {
|
|
12
|
+
_buffer;
|
|
13
|
+
constructor(size = DEFAULT_BUFFER_SIZE) {
|
|
14
|
+
this._buffer = new CircularBuffer(size);
|
|
15
|
+
}
|
|
16
|
+
/** Log processor that can be registered with `log.runtimeConfig.processors`. */
|
|
17
|
+
logProcessor = (_config, entry) => {
|
|
18
|
+
if (entry.level <= LogLevel.TRACE) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const record = {
|
|
22
|
+
t: (/* @__PURE__ */ new Date()).toISOString(),
|
|
23
|
+
l: shortLevelName[entry.level] ?? "?",
|
|
24
|
+
m: entry.message ?? ""
|
|
25
|
+
};
|
|
26
|
+
if (entry.meta) {
|
|
27
|
+
record.f = getRelativeFilename(entry.meta.F);
|
|
28
|
+
record.n = entry.meta.L;
|
|
29
|
+
}
|
|
30
|
+
if (entry.error) {
|
|
31
|
+
record.e = entry.error.stack ?? entry.error.message;
|
|
32
|
+
}
|
|
33
|
+
if (entry.context != null) {
|
|
34
|
+
try {
|
|
35
|
+
const ctx = typeof entry.context === "function" ? entry.context() : entry.context;
|
|
36
|
+
if (ctx != null && !(ctx instanceof Error)) {
|
|
37
|
+
let json = JSON.stringify(ctx);
|
|
38
|
+
if (json.length > MAX_CONTEXT_LENGTH) {
|
|
39
|
+
json = json.slice(0, MAX_CONTEXT_LENGTH);
|
|
40
|
+
}
|
|
41
|
+
record.c = json;
|
|
42
|
+
}
|
|
43
|
+
} catch {
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
this._buffer.push(record);
|
|
47
|
+
};
|
|
48
|
+
/** Number of entries currently in the buffer. */
|
|
49
|
+
get size() {
|
|
50
|
+
return this._buffer.elementCount;
|
|
51
|
+
}
|
|
52
|
+
/** Serialize buffer contents as NDJSON (newline-delimited JSON). */
|
|
53
|
+
serialize() {
|
|
54
|
+
const lines = [];
|
|
55
|
+
for (const record of this._buffer) {
|
|
56
|
+
lines.push(JSON.stringify(record));
|
|
57
|
+
}
|
|
58
|
+
return lines.join("\n");
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
var getRelativeFilename = (filename) => {
|
|
62
|
+
const match = filename.match(/.+\/(packages\/.+\/.+)/);
|
|
63
|
+
if (match) {
|
|
64
|
+
return match[1];
|
|
65
|
+
}
|
|
66
|
+
return filename;
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// src/observability.ts
|
|
70
|
+
var observability_exports = {};
|
|
71
|
+
__export(observability_exports, {
|
|
72
|
+
addDataProvider: () => addDataProvider,
|
|
73
|
+
addExtension: () => addExtension,
|
|
74
|
+
getObservabilityGroup: () => getObservabilityGroup,
|
|
75
|
+
initialize: () => initialize,
|
|
76
|
+
isObservabilityDisabled: () => isObservabilityDisabled,
|
|
77
|
+
make: () => make,
|
|
78
|
+
showObservabilityBanner: () => showObservabilityBanner,
|
|
79
|
+
storeObservabilityDisabled: () => storeObservabilityDisabled,
|
|
80
|
+
storeObservabilityGroup: () => storeObservabilityGroup
|
|
81
|
+
});
|
|
82
|
+
import * as Array from "effect/Array";
|
|
83
|
+
import * as Effect from "effect/Effect";
|
|
84
|
+
import * as Function from "effect/Function";
|
|
85
|
+
import { SubscriptionList } from "@dxos/async";
|
|
86
|
+
import { invariant } from "@dxos/invariant";
|
|
87
|
+
import { log } from "@dxos/log";
|
|
88
|
+
|
|
89
|
+
// src/storage/node.ts
|
|
90
|
+
import { existsSync, statSync } from "node:fs";
|
|
91
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
92
|
+
import { join } from "node:path";
|
|
93
|
+
import yaml from "js-yaml";
|
|
94
|
+
import { v4 as uuid, validate as validateUuid } from "uuid";
|
|
95
|
+
var showObservabilityBanner = async (configDir, bannercb) => {
|
|
96
|
+
const path = join(configDir, ".observability-banner-printed");
|
|
97
|
+
if (existsSync(path)) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
bannercb("Basic observability data will be sent to the DXOS team in order to improve the product. This includes performance metrics, error logs, and usage data. No personally identifiable information, other than your public key, is included with this data and no private data ever leaves your devices. To disable sending observability data, set the environment variable DX_DISABLE_OBSERVABILITY=true.");
|
|
101
|
+
await writeFile(path, "", "utf-8");
|
|
102
|
+
};
|
|
103
|
+
var isObservabilityDisabled = async (configDir) => {
|
|
104
|
+
const observabilityState = await getObservabilityState(configDir);
|
|
105
|
+
return observabilityState.disabled;
|
|
106
|
+
};
|
|
107
|
+
var storeObservabilityDisabled = async (configDir, value2) => {
|
|
108
|
+
const observabilityState = await getObservabilityState(configDir);
|
|
109
|
+
observabilityState.disabled = value2;
|
|
110
|
+
await writeFile(join(configDir, "observability.yml"), yaml.dump(observabilityState), "utf-8");
|
|
111
|
+
};
|
|
112
|
+
var getObservabilityGroup = async (configDir) => {
|
|
113
|
+
const observabilityState = await getObservabilityState(configDir);
|
|
114
|
+
return observabilityState.group;
|
|
115
|
+
};
|
|
116
|
+
var storeObservabilityGroup = async (configDir, value2) => {
|
|
117
|
+
const observabilityState = await getObservabilityState(configDir);
|
|
118
|
+
observabilityState.group = value2;
|
|
119
|
+
await writeFile(join(configDir, "observability.yml"), yaml.dump(observabilityState), "utf-8");
|
|
120
|
+
};
|
|
121
|
+
var getObservabilityState = async (configDir) => {
|
|
122
|
+
if (existsSync(configDir)) {
|
|
123
|
+
if (!statSync(configDir).isDirectory()) {
|
|
124
|
+
throw new Error(`Config directory ${configDir} exists but is not a directory`);
|
|
125
|
+
}
|
|
126
|
+
} else {
|
|
127
|
+
await mkdir(configDir, {
|
|
128
|
+
recursive: true
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
const idPath = join(configDir, "observability.yml");
|
|
132
|
+
if (existsSync(idPath)) {
|
|
133
|
+
const context = await readFile(idPath, "utf-8");
|
|
134
|
+
return validate(context) ?? initializeState(idPath);
|
|
135
|
+
}
|
|
136
|
+
return initializeState(idPath);
|
|
137
|
+
};
|
|
138
|
+
var initializeState = async (idPath) => {
|
|
139
|
+
const observabilityState = {
|
|
140
|
+
installationId: uuid(),
|
|
141
|
+
disabled: process.env.DX_DISABLE_OBSERVABILITY ? true : false,
|
|
142
|
+
group: process.env.DX_OBSERVABILITY_GROUP ?? void 0
|
|
143
|
+
};
|
|
144
|
+
await writeFile(idPath, "# This file is automatically generated by the @dxos/cli.\n" + yaml.dump(observabilityState), "utf-8");
|
|
145
|
+
return observabilityState;
|
|
146
|
+
};
|
|
147
|
+
var validate = (contextString) => {
|
|
148
|
+
const context = yaml.load(contextString);
|
|
149
|
+
if (Boolean(context.installationId) && validateUuid(context.installationId)) {
|
|
150
|
+
return {
|
|
151
|
+
...context,
|
|
152
|
+
disabled: process.env.DX_DISABLE_OBSERVABILITY ? true : context.disabled ?? false
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
// src/observability.ts
|
|
158
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/sdk/observability/src/observability.ts";
|
|
159
|
+
var ObservabilityImpl = class {
|
|
160
|
+
_initialized = false;
|
|
161
|
+
_extensions = [];
|
|
162
|
+
_dataProviders = [];
|
|
163
|
+
_subscriptions = new SubscriptionList();
|
|
164
|
+
initialize() {
|
|
165
|
+
if (this._initialized) {
|
|
166
|
+
return Effect.succeed(void 0);
|
|
167
|
+
}
|
|
168
|
+
const initializedExtensions = [];
|
|
169
|
+
return Effect.gen(this, function* () {
|
|
170
|
+
for (const extension of this._extensions) {
|
|
171
|
+
if (extension.initialize) {
|
|
172
|
+
yield* extension.initialize();
|
|
173
|
+
}
|
|
174
|
+
initializedExtensions.push(extension);
|
|
175
|
+
}
|
|
176
|
+
const cleanups = yield* Effect.all(this._dataProviders.map((provider3) => provider3(this)));
|
|
177
|
+
this._subscriptions.add(...cleanups.filter((cleanup) => cleanup !== void 0));
|
|
178
|
+
this._initialized = true;
|
|
179
|
+
}).pipe(Effect.catchAll((error) => Effect.gen(this, function* () {
|
|
180
|
+
log.catch(error, void 0, {
|
|
181
|
+
F: __dxlog_file,
|
|
182
|
+
L: 85,
|
|
183
|
+
S: this,
|
|
184
|
+
C: (f, a) => f(...a)
|
|
185
|
+
});
|
|
186
|
+
for (const extension of initializedExtensions) {
|
|
187
|
+
if (extension.close) {
|
|
188
|
+
yield* extension.close().pipe(Effect.catchAll(() => Effect.succeed(void 0)));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
this._subscriptions.clear();
|
|
192
|
+
})));
|
|
193
|
+
}
|
|
194
|
+
close() {
|
|
195
|
+
return Effect.gen(this, function* () {
|
|
196
|
+
this._subscriptions.clear();
|
|
197
|
+
this._dataProviders.length = 0;
|
|
198
|
+
for (const extension of this._extensions) {
|
|
199
|
+
if (extension.close) {
|
|
200
|
+
yield* extension.close();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
this._initialized = false;
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
enable() {
|
|
207
|
+
return Effect.gen(this, function* () {
|
|
208
|
+
for (const extension of this._extensions) {
|
|
209
|
+
if (extension.enable) {
|
|
210
|
+
yield* extension.enable();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
disable() {
|
|
216
|
+
return Effect.gen(this, function* () {
|
|
217
|
+
for (const extension of this._extensions) {
|
|
218
|
+
if (extension.disable) {
|
|
219
|
+
yield* extension.disable();
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
flush() {
|
|
225
|
+
return Effect.gen(this, function* () {
|
|
226
|
+
for (const extension of this._extensions) {
|
|
227
|
+
if (extension.flush) {
|
|
228
|
+
yield* extension.flush();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
_addExtension(extension) {
|
|
234
|
+
invariant(!this._initialized, "Observability is already initialized", {
|
|
235
|
+
F: __dxlog_file,
|
|
236
|
+
L: 142,
|
|
237
|
+
S: this,
|
|
238
|
+
A: [
|
|
239
|
+
"!this._initialized",
|
|
240
|
+
"'Observability is already initialized'"
|
|
241
|
+
]
|
|
242
|
+
});
|
|
243
|
+
this._extensions.push(extension);
|
|
244
|
+
}
|
|
245
|
+
_addDataProvider(dataProvider) {
|
|
246
|
+
invariant(!this._initialized, "Observability is already initialized", {
|
|
247
|
+
F: __dxlog_file,
|
|
248
|
+
L: 147,
|
|
249
|
+
S: this,
|
|
250
|
+
A: [
|
|
251
|
+
"!this._initialized",
|
|
252
|
+
"'Observability is already initialized'"
|
|
253
|
+
]
|
|
254
|
+
});
|
|
255
|
+
this._dataProviders.push(dataProvider);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Adds a data provider and initializes it.
|
|
259
|
+
*/
|
|
260
|
+
addDataProvider(dataProvider) {
|
|
261
|
+
return Effect.gen(this, function* () {
|
|
262
|
+
this._dataProviders.push(dataProvider);
|
|
263
|
+
const cleanup = yield* dataProvider(this);
|
|
264
|
+
if (cleanup) {
|
|
265
|
+
this._subscriptions.add(cleanup);
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
identify(distinctId, attributes, setOnceAttributes) {
|
|
270
|
+
for (const extension of this._extensions) {
|
|
271
|
+
extension.identify?.(distinctId, attributes, setOnceAttributes);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
alias(distinctId, previousId) {
|
|
275
|
+
for (const extension of this._extensions) {
|
|
276
|
+
extension.alias?.(distinctId, previousId);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
setTags(tags, kind) {
|
|
280
|
+
for (const extension of this._extensions) {
|
|
281
|
+
if (kind && !extension.apis.some((api) => api.kind === kind)) {
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const processedTags = Object.fromEntries(Object.entries(tags).filter((entry) => entry[1] !== void 0).map(([key, value2]) => [
|
|
285
|
+
key,
|
|
286
|
+
value2.toString()
|
|
287
|
+
]));
|
|
288
|
+
extension.setTags?.(processedTags);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
get enabled() {
|
|
292
|
+
return this._extensions.every((extension) => extension.enabled);
|
|
293
|
+
}
|
|
294
|
+
get errors() {
|
|
295
|
+
return {
|
|
296
|
+
captureException: (error, attributes) => {
|
|
297
|
+
for (const extension of this._getExtensions("errors")) {
|
|
298
|
+
extension.captureException(error, attributes);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
get events() {
|
|
304
|
+
return {
|
|
305
|
+
captureEvent: (event, attributes) => {
|
|
306
|
+
for (const extension of this._getExtensions("events")) {
|
|
307
|
+
extension.captureEvent(event, attributes);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
get feedback() {
|
|
313
|
+
return {
|
|
314
|
+
captureUserFeedback: (form) => {
|
|
315
|
+
for (const extension of this._getExtensions("feedback")) {
|
|
316
|
+
extension.captureUserFeedback(form);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
isAvailable(kind) {
|
|
322
|
+
const apis = this._getExtensions(kind);
|
|
323
|
+
if (apis.length === 0) {
|
|
324
|
+
return Effect.succeed(false);
|
|
325
|
+
}
|
|
326
|
+
return Effect.gen(this, function* () {
|
|
327
|
+
for (const api of apis) {
|
|
328
|
+
const available = yield* api.isAvailable();
|
|
329
|
+
if (available) {
|
|
330
|
+
return true;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return false;
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
get metrics() {
|
|
337
|
+
return {
|
|
338
|
+
gauge: (name, value2, attributes) => {
|
|
339
|
+
for (const extension of this._getExtensions("metrics")) {
|
|
340
|
+
extension.gauge(name, value2, attributes);
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
increment: (name, value2, attributes) => {
|
|
344
|
+
for (const extension of this._getExtensions("metrics")) {
|
|
345
|
+
extension.increment(name, value2, attributes);
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
distribution: (name, value2, attributes) => {
|
|
349
|
+
for (const extension of this._getExtensions("metrics")) {
|
|
350
|
+
extension.distribution(name, value2, attributes);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
_getExtensions(kind) {
|
|
356
|
+
return Function.pipe(this._extensions, Array.flatMap((extension) => extension.apis), Array.filter((api) => api.kind === kind));
|
|
357
|
+
}
|
|
358
|
+
};
|
|
359
|
+
var make = () => Effect.succeed(new ObservabilityImpl());
|
|
360
|
+
var addExtension = (_extension) => Effect.fn(function* (_observability) {
|
|
361
|
+
const observability = yield* _observability;
|
|
362
|
+
const extension = yield* _extension;
|
|
363
|
+
invariant("_addExtension" in observability && typeof observability._addExtension === "function", void 0, {
|
|
364
|
+
F: __dxlog_file,
|
|
365
|
+
L: 276,
|
|
366
|
+
S: this,
|
|
367
|
+
A: [
|
|
368
|
+
"'_addExtension' in observability && typeof observability._addExtension === 'function'",
|
|
369
|
+
""
|
|
370
|
+
]
|
|
371
|
+
});
|
|
372
|
+
observability._addExtension(extension);
|
|
373
|
+
return observability;
|
|
374
|
+
});
|
|
375
|
+
var addDataProvider = (dataProvider) => Effect.fn(function* (_observability) {
|
|
376
|
+
const observability = yield* _observability;
|
|
377
|
+
invariant("_addDataProvider" in observability && typeof observability._addDataProvider === "function", void 0, {
|
|
378
|
+
F: __dxlog_file,
|
|
379
|
+
L: 284,
|
|
380
|
+
S: this,
|
|
381
|
+
A: [
|
|
382
|
+
"'_addDataProvider' in observability && typeof observability._addDataProvider === 'function'",
|
|
383
|
+
""
|
|
384
|
+
]
|
|
385
|
+
});
|
|
386
|
+
observability._addDataProvider(dataProvider);
|
|
387
|
+
return observability;
|
|
388
|
+
});
|
|
389
|
+
var initialize = Effect.fn(function* (_observability) {
|
|
390
|
+
const observability = yield* _observability;
|
|
391
|
+
yield* observability.initialize();
|
|
392
|
+
return observability;
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
// src/observability-extension.ts
|
|
396
|
+
var observability_extension_exports = {};
|
|
397
|
+
__export(observability_extension_exports, {
|
|
398
|
+
Otel: () => otel_exports,
|
|
399
|
+
PostHog: () => posthog_exports
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
// src/extensions/otel/index.ts
|
|
403
|
+
var otel_exports = {};
|
|
404
|
+
__export(otel_exports, {
|
|
405
|
+
extensions: () => extensions
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
// src/extensions/otel/extension.ts
|
|
409
|
+
import { defaultResource, resourceFromAttributes } from "@opentelemetry/resources";
|
|
410
|
+
import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from "@opentelemetry/semantic-conventions";
|
|
411
|
+
import * as Effect3 from "effect/Effect";
|
|
412
|
+
import * as Match from "effect/Match";
|
|
413
|
+
import * as Option from "effect/Option";
|
|
414
|
+
import * as Ref from "effect/Ref";
|
|
415
|
+
import { LogLevel as LogLevel2, log as log2 } from "@dxos/log";
|
|
416
|
+
import { isNode, isNonNullable } from "@dxos/util";
|
|
417
|
+
|
|
418
|
+
// src/cli-observability-secrets.json
|
|
419
|
+
var cli_observability_secrets_default = {
|
|
420
|
+
POSTHOG_API_KEY: null,
|
|
421
|
+
IPDATA_API_KEY: "73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786",
|
|
422
|
+
OTEL_ENDPOINT: "https://ingest.eu.signoz.cloud:443",
|
|
423
|
+
OTEL_HEADERS: "signoz-ingestion-key: 5300e0c9-a5e8-4a10-9c61-f473e539c0b7"
|
|
424
|
+
};
|
|
425
|
+
|
|
426
|
+
// src/extensions/stub.ts
|
|
427
|
+
import * as Effect2 from "effect/Effect";
|
|
428
|
+
var stubExtension = {
|
|
429
|
+
initialize: () => Effect2.succeed(void 0),
|
|
430
|
+
enable: () => Effect2.succeed(void 0),
|
|
431
|
+
disable: () => Effect2.succeed(void 0),
|
|
432
|
+
flush: () => Effect2.succeed(void 0),
|
|
433
|
+
setTags: () => void 0,
|
|
434
|
+
get enabled() {
|
|
435
|
+
return true;
|
|
436
|
+
},
|
|
437
|
+
apis: []
|
|
438
|
+
};
|
|
439
|
+
|
|
440
|
+
// src/extensions/otel/extension.ts
|
|
441
|
+
var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/observability/src/extensions/otel/extension.ts";
|
|
442
|
+
var extensions = Effect3.fn(function* ({
|
|
443
|
+
serviceName,
|
|
444
|
+
serviceVersion,
|
|
445
|
+
environment,
|
|
446
|
+
config,
|
|
447
|
+
endpoint: _endpoint,
|
|
448
|
+
headers: _headers,
|
|
449
|
+
// TODO(wittjosiah): Logging integration.
|
|
450
|
+
// - logger should run even if observability is disabled
|
|
451
|
+
// - logs should be cached locally in a circular buffer
|
|
452
|
+
// - logs should be flushed to the server if user opts to include them in a bug report
|
|
453
|
+
logs: logsEnabled = false,
|
|
454
|
+
logLevel = LogLevel2.INFO,
|
|
455
|
+
metrics: metricsEnabled = false,
|
|
456
|
+
traces: tracesEnabled = false
|
|
457
|
+
}) {
|
|
458
|
+
const { OtelLogs } = yield* Effect3.promise(() => import("./logs-7J45KLM7.mjs"));
|
|
459
|
+
const { OtelMetrics } = yield* Effect3.promise(() => import("./metrics-H7DDLYSG.mjs"));
|
|
460
|
+
const { OtelTraces } = yield* Effect3.promise(() => import("./traces-KMTHMYFX.mjs"));
|
|
461
|
+
const cachedDisabled = yield* Effect3.promise(() => isObservabilityDisabled(serviceName));
|
|
462
|
+
const enabledRef = yield* Ref.make(!cachedDisabled);
|
|
463
|
+
const tags = /* @__PURE__ */ new Map();
|
|
464
|
+
const endpoint = isNode() ? process.env.DX_OTEL_ENDPOINT ?? _endpoint ?? cli_observability_secrets_default.OTEL_ENDPOINT : config.values.runtime?.app?.env?.DX_OTEL_ENDPOINT;
|
|
465
|
+
const headers = _headers ?? Match.value(isNode()).pipe(Match.when(true, () => Option.fromNullable(process.env.DX_OTEL_HEADERS ?? cli_observability_secrets_default.OTEL_HEADERS)), Match.when(false, () => Option.fromNullable(config.values.runtime?.app?.env?.DX_OTEL_HEADERS)), Match.exhaustive, Option.map((raw) => parseHeaders(raw)), Option.getOrElse(() => void 0));
|
|
466
|
+
if (!endpoint || !headers) {
|
|
467
|
+
log2.info("Missing OTEL_ENDPOINT or OTEL_HEADERS", void 0, {
|
|
468
|
+
F: __dxlog_file2,
|
|
469
|
+
L: 77,
|
|
470
|
+
S: this,
|
|
471
|
+
C: (f, a) => f(...a)
|
|
472
|
+
});
|
|
473
|
+
return stubExtension;
|
|
474
|
+
}
|
|
475
|
+
const resource = defaultResource().merge(resourceFromAttributes({
|
|
476
|
+
[ATTR_SERVICE_NAME]: serviceName,
|
|
477
|
+
[ATTR_SERVICE_VERSION]: serviceVersion,
|
|
478
|
+
"deployment.environment": environment
|
|
479
|
+
}));
|
|
480
|
+
const logs = logsEnabled ? new OtelLogs({
|
|
481
|
+
endpoint,
|
|
482
|
+
headers,
|
|
483
|
+
resource,
|
|
484
|
+
getTags: () => Object.fromEntries(tags),
|
|
485
|
+
logLevel
|
|
486
|
+
}) : void 0;
|
|
487
|
+
const metrics = metricsEnabled ? new OtelMetrics({
|
|
488
|
+
endpoint,
|
|
489
|
+
headers,
|
|
490
|
+
resource,
|
|
491
|
+
getTags: () => Object.fromEntries(tags)
|
|
492
|
+
}) : void 0;
|
|
493
|
+
const traces = tracesEnabled ? new OtelTraces({
|
|
494
|
+
endpoint,
|
|
495
|
+
headers,
|
|
496
|
+
resource,
|
|
497
|
+
getTags: () => Object.fromEntries(tags)
|
|
498
|
+
}) : void 0;
|
|
499
|
+
return {
|
|
500
|
+
initialize: () => Effect3.sync(() => {
|
|
501
|
+
if (logs) {
|
|
502
|
+
log2.runtimeConfig.processors.push(logs.logProcessor);
|
|
503
|
+
}
|
|
504
|
+
if (traces) {
|
|
505
|
+
traces.start();
|
|
506
|
+
}
|
|
507
|
+
}),
|
|
508
|
+
enable: Effect3.fn(function* () {
|
|
509
|
+
yield* Effect3.promise(() => storeObservabilityDisabled(serviceName, false));
|
|
510
|
+
yield* Ref.update(enabledRef, () => true);
|
|
511
|
+
}),
|
|
512
|
+
disable: Effect3.fn(function* () {
|
|
513
|
+
yield* Effect3.promise(() => storeObservabilityDisabled(serviceName, true));
|
|
514
|
+
yield* Ref.update(enabledRef, () => false);
|
|
515
|
+
}),
|
|
516
|
+
close: () => Effect3.promise(async () => {
|
|
517
|
+
await logs?.close();
|
|
518
|
+
await metrics?.close();
|
|
519
|
+
}),
|
|
520
|
+
flush: () => Effect3.promise(async () => {
|
|
521
|
+
await logs?.flush();
|
|
522
|
+
await metrics?.flush();
|
|
523
|
+
}),
|
|
524
|
+
setTags: (incomingTags) => {
|
|
525
|
+
for (const [key, value2] of Object.entries(incomingTags)) {
|
|
526
|
+
tags.set(key, value2);
|
|
527
|
+
}
|
|
528
|
+
},
|
|
529
|
+
get enabled() {
|
|
530
|
+
return Ref.get(enabledRef).pipe(Effect3.runSync);
|
|
531
|
+
},
|
|
532
|
+
apis: [
|
|
533
|
+
{
|
|
534
|
+
kind: "logs",
|
|
535
|
+
isAvailable: () => Effect3.succeed(!!logs)
|
|
536
|
+
},
|
|
537
|
+
metrics ? {
|
|
538
|
+
kind: "metrics",
|
|
539
|
+
isAvailable: () => Effect3.succeed(true),
|
|
540
|
+
gauge: (name, value2, tags2) => metrics.gauge(name, value2, tags2),
|
|
541
|
+
increment: (name, value2, tags2) => metrics.increment(name, value2, tags2),
|
|
542
|
+
distribution: (name, value2, tags2) => metrics.distribution(name, value2, tags2)
|
|
543
|
+
} : void 0,
|
|
544
|
+
traces ? {
|
|
545
|
+
kind: "traces",
|
|
546
|
+
isAvailable: () => Effect3.succeed(true)
|
|
547
|
+
} : void 0
|
|
548
|
+
].filter(isNonNullable)
|
|
549
|
+
};
|
|
550
|
+
});
|
|
551
|
+
var parseHeaders = (unparsedHeaders) => {
|
|
552
|
+
return unparsedHeaders.split(";").reduce((acc, header) => {
|
|
553
|
+
const [key, ...rest] = header.split(":");
|
|
554
|
+
if (key && rest.length > 0) {
|
|
555
|
+
acc[key.trim().toLowerCase()] = rest.join(":").trim();
|
|
556
|
+
}
|
|
557
|
+
return acc;
|
|
558
|
+
}, {});
|
|
559
|
+
};
|
|
560
|
+
|
|
561
|
+
// src/extensions/posthog/index.ts
|
|
562
|
+
var posthog_exports = {};
|
|
563
|
+
__export(posthog_exports, {
|
|
564
|
+
extensions: () => extensions2
|
|
565
|
+
});
|
|
566
|
+
|
|
567
|
+
// src/extensions/posthog/extension.ts
|
|
568
|
+
import * as Effect4 from "effect/Effect";
|
|
569
|
+
import { log as log3 } from "@dxos/log";
|
|
570
|
+
var __dxlog_file3 = "/__w/dxos/dxos/packages/sdk/observability/src/extensions/posthog/extension.ts";
|
|
571
|
+
var uploadLogs = async (body) => {
|
|
572
|
+
try {
|
|
573
|
+
const response = await fetch("/api/feedback-logs", {
|
|
574
|
+
method: "POST",
|
|
575
|
+
headers: {
|
|
576
|
+
"Content-Type": "application/x-ndjson"
|
|
577
|
+
},
|
|
578
|
+
body
|
|
579
|
+
});
|
|
580
|
+
if (!response.ok) {
|
|
581
|
+
log3.warn("feedback log upload failed", {
|
|
582
|
+
status: response.status
|
|
583
|
+
}, {
|
|
584
|
+
F: __dxlog_file3,
|
|
585
|
+
L: 33,
|
|
586
|
+
S: void 0,
|
|
587
|
+
C: (f, a) => f(...a)
|
|
588
|
+
});
|
|
589
|
+
return void 0;
|
|
590
|
+
}
|
|
591
|
+
const { key } = await response.json();
|
|
592
|
+
return key;
|
|
593
|
+
} catch (err) {
|
|
594
|
+
log3.warn("feedback log upload error", {
|
|
595
|
+
error: err
|
|
596
|
+
}, {
|
|
597
|
+
F: __dxlog_file3,
|
|
598
|
+
L: 39,
|
|
599
|
+
S: void 0,
|
|
600
|
+
C: (f, a) => f(...a)
|
|
601
|
+
});
|
|
602
|
+
return void 0;
|
|
603
|
+
}
|
|
604
|
+
};
|
|
605
|
+
var extensions2 = Effect4.fn(function* ({ config, release, environment, posthog: posthogConfig }) {
|
|
606
|
+
if (typeof window === "undefined") {
|
|
607
|
+
log3("PostHog is being stubbed because it is running in a worker.", void 0, {
|
|
608
|
+
F: __dxlog_file3,
|
|
609
|
+
L: 52,
|
|
610
|
+
S: this,
|
|
611
|
+
C: (f, a) => f(...a)
|
|
612
|
+
});
|
|
613
|
+
return stubExtension;
|
|
614
|
+
}
|
|
615
|
+
const feedbackSurveyId = config.get("runtime.app.env.DX_POSTHOG_FEEDBACK_SURVEY_ID");
|
|
616
|
+
const apiKey = config.get("runtime.app.env.DX_POSTHOG_API_KEY");
|
|
617
|
+
const api_host = config.get("runtime.app.env.DX_POSTHOG_API_HOST");
|
|
618
|
+
if (!apiKey || !api_host) {
|
|
619
|
+
log3.info("Missing POSTHOG_API_KEY or POSTHOG_API_HOST", void 0, {
|
|
620
|
+
F: __dxlog_file3,
|
|
621
|
+
L: 60,
|
|
622
|
+
S: this,
|
|
623
|
+
C: (f, a) => f(...a)
|
|
624
|
+
});
|
|
625
|
+
return stubExtension;
|
|
626
|
+
}
|
|
627
|
+
const { default: posthog } = yield* Effect4.promise(() => import("posthog-js"));
|
|
628
|
+
const { logProcessor } = yield* Effect4.promise(() => import("./log-processor-TKJVJJSJ.mjs"));
|
|
629
|
+
const logBuffer = new LogBuffer();
|
|
630
|
+
let feedbackSurveyAvailable = null;
|
|
631
|
+
const checkFeedbackSurveyAvailable = () => feedbackSurveyId ? Effect4.promise(() => {
|
|
632
|
+
if (feedbackSurveyAvailable !== null) {
|
|
633
|
+
return Promise.resolve(feedbackSurveyAvailable);
|
|
634
|
+
}
|
|
635
|
+
return new Promise((resolve) => {
|
|
636
|
+
posthog.getSurveys((surveys) => {
|
|
637
|
+
const found = surveys.some((s) => s.id === feedbackSurveyId);
|
|
638
|
+
feedbackSurveyAvailable = found;
|
|
639
|
+
resolve(found);
|
|
640
|
+
});
|
|
641
|
+
});
|
|
642
|
+
}) : Effect4.succeed(false);
|
|
643
|
+
return {
|
|
644
|
+
initialize: () => Effect4.sync(() => {
|
|
645
|
+
posthog.init(apiKey, {
|
|
646
|
+
api_host,
|
|
647
|
+
mask_all_text: true,
|
|
648
|
+
capture_exceptions: true,
|
|
649
|
+
...posthogConfig
|
|
650
|
+
});
|
|
651
|
+
if (release || environment) {
|
|
652
|
+
posthog.register({
|
|
653
|
+
...release ? {
|
|
654
|
+
release
|
|
655
|
+
} : {},
|
|
656
|
+
...environment ? {
|
|
657
|
+
environment
|
|
658
|
+
} : {}
|
|
659
|
+
});
|
|
660
|
+
}
|
|
661
|
+
log3.runtimeConfig.processors.push(logProcessor);
|
|
662
|
+
log3.runtimeConfig.processors.push(logBuffer.logProcessor);
|
|
663
|
+
}),
|
|
664
|
+
close: () => Effect4.sync(() => {
|
|
665
|
+
for (const processor of [
|
|
666
|
+
logProcessor,
|
|
667
|
+
logBuffer.logProcessor
|
|
668
|
+
]) {
|
|
669
|
+
const index = log3.runtimeConfig.processors.indexOf(processor);
|
|
670
|
+
if (index !== -1) {
|
|
671
|
+
log3.runtimeConfig.processors.splice(index, 1);
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
}),
|
|
675
|
+
enable: () => Effect4.sync(() => posthog.opt_in_capturing()),
|
|
676
|
+
disable: () => Effect4.sync(() => posthog.opt_out_capturing()),
|
|
677
|
+
identify: (distinctId, attributes, setOnceAttributes) => {
|
|
678
|
+
posthog.identify(distinctId, attributes, setOnceAttributes);
|
|
679
|
+
},
|
|
680
|
+
alias: (distinctId, previousId) => {
|
|
681
|
+
posthog.alias(distinctId, previousId);
|
|
682
|
+
},
|
|
683
|
+
setTags: (tags) => {
|
|
684
|
+
posthog.register_for_session(tags);
|
|
685
|
+
},
|
|
686
|
+
get enabled() {
|
|
687
|
+
return posthog.is_capturing();
|
|
688
|
+
},
|
|
689
|
+
apis: [
|
|
690
|
+
{
|
|
691
|
+
kind: "events",
|
|
692
|
+
isAvailable: () => Effect4.succeed(true),
|
|
693
|
+
captureEvent: (event, attributes) => {
|
|
694
|
+
posthog.capture(event, attributes);
|
|
695
|
+
}
|
|
696
|
+
},
|
|
697
|
+
{
|
|
698
|
+
kind: "errors",
|
|
699
|
+
isAvailable: () => Effect4.succeed(true),
|
|
700
|
+
captureException: (error, attributes) => {
|
|
701
|
+
posthog.captureException(error, attributes);
|
|
702
|
+
}
|
|
703
|
+
},
|
|
704
|
+
{
|
|
705
|
+
kind: "feedback",
|
|
706
|
+
// TODO(wittjosiah): Support custom surveys.
|
|
707
|
+
captureUserFeedback: (form) => {
|
|
708
|
+
posthog.getSurveys(async (surveys) => {
|
|
709
|
+
const survey = surveys.find((survey2) => survey2.id === feedbackSurveyId);
|
|
710
|
+
if (!survey || survey.questions.length === 0) {
|
|
711
|
+
log3.error("Missing feedback survey or survey has no questions", {
|
|
712
|
+
feedbackSurveyId
|
|
713
|
+
}, {
|
|
714
|
+
F: __dxlog_file3,
|
|
715
|
+
L: 149,
|
|
716
|
+
S: this,
|
|
717
|
+
C: (f, a) => f(...a)
|
|
718
|
+
});
|
|
719
|
+
return;
|
|
720
|
+
}
|
|
721
|
+
let debugLogDumpKey;
|
|
722
|
+
if (form.includeLogs !== false && logBuffer.size > 0) {
|
|
723
|
+
debugLogDumpKey = await uploadLogs(logBuffer.serialize());
|
|
724
|
+
}
|
|
725
|
+
const question = survey.questions[0];
|
|
726
|
+
posthog.capture("survey sent", {
|
|
727
|
+
$survey_id: survey.id,
|
|
728
|
+
$survey_questions: [
|
|
729
|
+
{
|
|
730
|
+
id: question.id,
|
|
731
|
+
question: question.question
|
|
732
|
+
}
|
|
733
|
+
],
|
|
734
|
+
[`$survey_response_${question.id}`]: form.message,
|
|
735
|
+
...debugLogDumpKey ? {
|
|
736
|
+
debug_log_dump_key: debugLogDumpKey
|
|
737
|
+
} : {}
|
|
738
|
+
});
|
|
739
|
+
});
|
|
740
|
+
},
|
|
741
|
+
isAvailable: checkFeedbackSurveyAvailable
|
|
742
|
+
}
|
|
743
|
+
]
|
|
744
|
+
};
|
|
745
|
+
});
|
|
746
|
+
|
|
747
|
+
// src/providers/index.ts
|
|
748
|
+
var providers_exports = {};
|
|
749
|
+
__export(providers_exports, {
|
|
750
|
+
Client: () => client_observability_exports,
|
|
751
|
+
IPData: () => ip_data_exports,
|
|
752
|
+
Storage: () => storage_exports
|
|
753
|
+
});
|
|
754
|
+
|
|
755
|
+
// src/providers/client-observability.ts
|
|
756
|
+
var client_observability_exports = {};
|
|
757
|
+
__export(client_observability_exports, {
|
|
758
|
+
identityProvider: () => identityProvider,
|
|
759
|
+
networkMetricsProvider: () => networkMetricsProvider,
|
|
760
|
+
runtimeMetricsProvider: () => runtimeMetricsProvider,
|
|
761
|
+
spacesMetricsProvider: () => spacesMetricsProvider
|
|
762
|
+
});
|
|
763
|
+
import * as Effect5 from "effect/Effect";
|
|
764
|
+
import { Event, scheduleTaskInterval } from "@dxos/async";
|
|
765
|
+
import { DeviceKind } from "@dxos/client/halo";
|
|
766
|
+
import { Context } from "@dxos/context";
|
|
767
|
+
import { invariant as invariant2 } from "@dxos/invariant";
|
|
768
|
+
import { log as log4 } from "@dxos/log";
|
|
769
|
+
import { ConnectionState, Platform } from "@dxos/protocols/proto/dxos/client/services";
|
|
770
|
+
var __dxlog_file4 = "/__w/dxos/dxos/packages/sdk/observability/src/providers/client-observability.ts";
|
|
771
|
+
var SPACE_METRICS_MIN_INTERVAL = 1e3 * 60 * 10;
|
|
772
|
+
var NETWORK_METRICS_MIN_INTERVAL = 1e3 * 60 * 10;
|
|
773
|
+
var RUNTIME_METRICS_MIN_INTERVAL = 1e3 * 60 * 10;
|
|
774
|
+
var identityProvider = (clientServices) => Effect5.fn(function* (observability) {
|
|
775
|
+
clientServices.IdentityService.queryIdentity().subscribe((idqr) => {
|
|
776
|
+
if (!idqr?.identity?.did) {
|
|
777
|
+
return;
|
|
778
|
+
}
|
|
779
|
+
observability.identify(idqr.identity.did);
|
|
780
|
+
observability.setTags({
|
|
781
|
+
did: idqr.identity.did
|
|
782
|
+
});
|
|
783
|
+
});
|
|
784
|
+
clientServices.DevicesService.queryDevices().subscribe((dqr) => {
|
|
785
|
+
if (!dqr?.devices || dqr.devices.length === 0) {
|
|
786
|
+
return;
|
|
787
|
+
}
|
|
788
|
+
const thisDevice = dqr.devices.find((device) => device.kind === DeviceKind.CURRENT);
|
|
789
|
+
if (!thisDevice) {
|
|
790
|
+
return;
|
|
791
|
+
}
|
|
792
|
+
observability.setTags({
|
|
793
|
+
deviceKey: thisDevice.deviceKey.truncate()
|
|
794
|
+
});
|
|
795
|
+
if (thisDevice.profile?.label) {
|
|
796
|
+
observability.setTags({
|
|
797
|
+
deviceProfile: thisDevice.profile.label
|
|
798
|
+
});
|
|
799
|
+
}
|
|
800
|
+
});
|
|
801
|
+
});
|
|
802
|
+
var networkMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
|
|
803
|
+
const ctx = new Context(void 0, {
|
|
804
|
+
F: __dxlog_file4,
|
|
805
|
+
L: 61
|
|
806
|
+
});
|
|
807
|
+
let lastNetworkStatus;
|
|
808
|
+
const updateSignalMetrics = new Event().debounce(NETWORK_METRICS_MIN_INTERVAL);
|
|
809
|
+
updateSignalMetrics.on(ctx, async () => {
|
|
810
|
+
log4("send signal metrics", void 0, {
|
|
811
|
+
F: __dxlog_file4,
|
|
812
|
+
L: 67,
|
|
813
|
+
S: this,
|
|
814
|
+
C: (f, a) => f(...a)
|
|
815
|
+
});
|
|
816
|
+
lastNetworkStatus?.signaling?.forEach(({ server, state }) => {
|
|
817
|
+
observability.metrics.gauge("dxos.client.network.signal.connectionState", state, {
|
|
818
|
+
server
|
|
819
|
+
});
|
|
820
|
+
});
|
|
821
|
+
let swarmCount = 0;
|
|
822
|
+
const connectionStates = /* @__PURE__ */ new Map();
|
|
823
|
+
for (const state in ConnectionState) {
|
|
824
|
+
connectionStates.set(state, 0);
|
|
825
|
+
}
|
|
826
|
+
let totalReadBufferSize = 0;
|
|
827
|
+
let totalWriteBufferSize = 0;
|
|
828
|
+
let totalChannelBufferSize = 0;
|
|
829
|
+
lastNetworkStatus?.connectionInfo?.forEach((connectionInfo) => {
|
|
830
|
+
swarmCount++;
|
|
831
|
+
for (const conn of connectionInfo.connections ?? []) {
|
|
832
|
+
connectionStates.set(conn.state, (connectionStates.get(conn.state) ?? 0) + 1);
|
|
833
|
+
totalReadBufferSize += conn.readBufferSize ?? 0;
|
|
834
|
+
totalWriteBufferSize += conn.writeBufferSize ?? 0;
|
|
835
|
+
for (const stream of conn.streams ?? []) {
|
|
836
|
+
totalChannelBufferSize += stream.writeBufferSize ?? 0;
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
observability.metrics.gauge("dxos.client.network.swarm.count", swarmCount);
|
|
840
|
+
for (const state in ConnectionState) {
|
|
841
|
+
observability.metrics.gauge("dxos.client.network.connection.count", connectionStates.get(state) ?? 0, {
|
|
842
|
+
state
|
|
843
|
+
});
|
|
844
|
+
}
|
|
845
|
+
observability.metrics.gauge("dxos.client.network.totalReadBufferSize", totalReadBufferSize);
|
|
846
|
+
observability.metrics.gauge("dxos.client.network.totalWriteBufferSize", totalWriteBufferSize);
|
|
847
|
+
observability.metrics.gauge("dxos.client.network.totalChannelBufferSize", totalChannelBufferSize);
|
|
848
|
+
});
|
|
849
|
+
});
|
|
850
|
+
clientServices.NetworkService.queryStatus().subscribe((networkStatus) => {
|
|
851
|
+
lastNetworkStatus = networkStatus;
|
|
852
|
+
updateSignalMetrics.emit();
|
|
853
|
+
});
|
|
854
|
+
scheduleTaskInterval(ctx, async () => updateSignalMetrics.emit(), NETWORK_METRICS_MIN_INTERVAL);
|
|
855
|
+
return async () => {
|
|
856
|
+
await ctx.dispose();
|
|
857
|
+
};
|
|
858
|
+
});
|
|
859
|
+
var runtimeMetricsProvider = (clientServices) => Effect5.fn(function* (observability) {
|
|
860
|
+
const ctx = new Context(void 0, {
|
|
861
|
+
F: __dxlog_file4,
|
|
862
|
+
L: 121
|
|
863
|
+
});
|
|
864
|
+
const platform = yield* Effect5.promise(() => clientServices.SystemService.getPlatform());
|
|
865
|
+
invariant2(platform, "platform is required", {
|
|
866
|
+
F: __dxlog_file4,
|
|
867
|
+
L: 123,
|
|
868
|
+
S: this,
|
|
869
|
+
A: [
|
|
870
|
+
"platform",
|
|
871
|
+
"'platform is required'"
|
|
872
|
+
]
|
|
873
|
+
});
|
|
874
|
+
observability.setTags({
|
|
875
|
+
platformType: Platform.PLATFORM_TYPE[platform.type].toLowerCase(),
|
|
876
|
+
platform: platform.platform,
|
|
877
|
+
arch: platform.arch,
|
|
878
|
+
runtime: platform.runtime
|
|
879
|
+
});
|
|
880
|
+
scheduleTaskInterval(ctx, async () => {
|
|
881
|
+
if (clientServices.constructor.name === "WorkerClientServices") {
|
|
882
|
+
const memory = window.performance.memory;
|
|
883
|
+
if (memory) {
|
|
884
|
+
observability.metrics.gauge("dxos.client.runtime.heapTotal", memory.totalJSHeapSize);
|
|
885
|
+
observability.metrics.gauge("dxos.client.runtime.heapUsed", memory.usedJSHeapSize);
|
|
886
|
+
observability.metrics.gauge("dxos.client.runtime.heapSizeLimit", memory.jsHeapSizeLimit);
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
clientServices.SystemService?.getPlatform().then((platform2) => {
|
|
890
|
+
if (platform2.memory) {
|
|
891
|
+
observability.metrics.gauge("dxos.client.services.runtime.rss", platform2.memory.rss);
|
|
892
|
+
observability.metrics.gauge("dxos.client.services.runtime.heapTotal", platform2.memory.heapTotal);
|
|
893
|
+
observability.metrics.gauge("dxos.client.services.runtime.heapUsed", platform2.memory.heapUsed);
|
|
894
|
+
}
|
|
895
|
+
}).catch((error) => log4("platform error", {
|
|
896
|
+
error
|
|
897
|
+
}, {
|
|
898
|
+
F: __dxlog_file4,
|
|
899
|
+
L: 152,
|
|
900
|
+
S: this,
|
|
901
|
+
C: (f, a) => f(...a)
|
|
902
|
+
}));
|
|
903
|
+
}, RUNTIME_METRICS_MIN_INTERVAL);
|
|
904
|
+
return async () => {
|
|
905
|
+
await ctx.dispose();
|
|
906
|
+
};
|
|
907
|
+
});
|
|
908
|
+
var spacesMetricsProvider = (client) => Effect5.fn(function* (observability) {
|
|
909
|
+
const ctx = new Context(void 0, {
|
|
910
|
+
F: __dxlog_file4,
|
|
911
|
+
L: 165
|
|
912
|
+
});
|
|
913
|
+
const spaces = client.spaces.get();
|
|
914
|
+
const subscriptions = /* @__PURE__ */ new Map();
|
|
915
|
+
ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));
|
|
916
|
+
const updateSpaceMetrics = new Event().debounce(SPACE_METRICS_MIN_INTERVAL);
|
|
917
|
+
updateSpaceMetrics.on(ctx, async () => {
|
|
918
|
+
log4("send space metrics", void 0, {
|
|
919
|
+
F: __dxlog_file4,
|
|
920
|
+
L: 173,
|
|
921
|
+
S: this,
|
|
922
|
+
C: (f, a) => f(...a)
|
|
923
|
+
});
|
|
924
|
+
for (const data of mapSpaces(spaces, {
|
|
925
|
+
truncateKeys: true
|
|
926
|
+
})) {
|
|
927
|
+
observability.metrics.gauge("dxos.client.space.members", data.members, {
|
|
928
|
+
key: data.key
|
|
929
|
+
});
|
|
930
|
+
observability.metrics.gauge("dxos.client.space.objects", data.objects, {
|
|
931
|
+
key: data.key
|
|
932
|
+
});
|
|
933
|
+
observability.metrics.gauge("dxos.client.space.epoch", data.epoch, {
|
|
934
|
+
key: data.key
|
|
935
|
+
});
|
|
936
|
+
observability.metrics.gauge("dxos.client.space.currentDataMutations", data.currentDataMutations, {
|
|
937
|
+
key: data.key
|
|
938
|
+
});
|
|
939
|
+
}
|
|
940
|
+
});
|
|
941
|
+
const subscribeToSpaceUpdate = (space) => space.pipeline.subscribe({
|
|
942
|
+
next: () => {
|
|
943
|
+
updateSpaceMetrics.emit();
|
|
944
|
+
}
|
|
945
|
+
});
|
|
946
|
+
spaces.forEach((space) => {
|
|
947
|
+
subscriptions.set(space.id, subscribeToSpaceUpdate(space));
|
|
948
|
+
});
|
|
949
|
+
client.spaces.subscribe({
|
|
950
|
+
next: async (spaces2) => {
|
|
951
|
+
spaces2.filter((space) => !subscriptions.has(space.id)).forEach((space) => {
|
|
952
|
+
subscriptions.set(space.id, subscribeToSpaceUpdate(space));
|
|
953
|
+
});
|
|
954
|
+
}
|
|
955
|
+
});
|
|
956
|
+
scheduleTaskInterval(ctx, async () => updateSpaceMetrics.emit(), SPACE_METRICS_MIN_INTERVAL);
|
|
957
|
+
return async () => {
|
|
958
|
+
await ctx.dispose();
|
|
959
|
+
};
|
|
960
|
+
});
|
|
961
|
+
var mapSpaces = (spaces, options = {
|
|
962
|
+
verbose: false,
|
|
963
|
+
truncateKeys: false
|
|
964
|
+
}) => {
|
|
965
|
+
return spaces.map((space) => {
|
|
966
|
+
const { open, ready } = space.internal.data.metrics ?? {};
|
|
967
|
+
const startup = open && ready && ready.getTime() - open.getTime();
|
|
968
|
+
const pipeline = space.internal.data.pipeline;
|
|
969
|
+
const startDataMutations = pipeline?.currentEpoch?.subject.assertion.timeframe.totalMessages() ?? 0;
|
|
970
|
+
const epoch = pipeline?.currentEpoch?.subject.assertion.number;
|
|
971
|
+
const currentDataMutations = pipeline?.currentDataTimeframe?.totalMessages() ?? 0;
|
|
972
|
+
const totalDataMutations = pipeline?.targetDataTimeframe?.totalMessages() ?? 0;
|
|
973
|
+
return {
|
|
974
|
+
// TODO(nf): truncate keys for DD?
|
|
975
|
+
key: space.key.truncate(),
|
|
976
|
+
open: space.isOpen,
|
|
977
|
+
members: space.members.get().length,
|
|
978
|
+
objects: space.internal.db.coreDatabase.getAllObjectIds().length,
|
|
979
|
+
startup,
|
|
980
|
+
epoch,
|
|
981
|
+
// appliedEpoch,
|
|
982
|
+
startDataMutations,
|
|
983
|
+
currentDataMutations,
|
|
984
|
+
totalDataMutations,
|
|
985
|
+
// TODO(burdon): Negative?
|
|
986
|
+
progress: (Math.min(Math.abs((currentDataMutations - startDataMutations) / (totalDataMutations - startDataMutations)), 1) * 100).toFixed(0)
|
|
987
|
+
};
|
|
988
|
+
});
|
|
989
|
+
};
|
|
990
|
+
|
|
991
|
+
// src/providers/ip-data.ts
|
|
992
|
+
var ip_data_exports = {};
|
|
993
|
+
__export(ip_data_exports, {
|
|
994
|
+
provider: () => provider
|
|
995
|
+
});
|
|
996
|
+
import * as FetchHttpClient from "@effect/platform/FetchHttpClient";
|
|
997
|
+
import * as HttpClient from "@effect/platform/HttpClient";
|
|
998
|
+
import * as HttpClientRequest from "@effect/platform/HttpClientRequest";
|
|
999
|
+
import * as Effect6 from "effect/Effect";
|
|
1000
|
+
import * as Schema from "effect/Schema";
|
|
1001
|
+
import * as localForage from "localforage";
|
|
1002
|
+
import { log as log5 } from "@dxos/log";
|
|
1003
|
+
var __dxlog_file5 = "/__w/dxos/dxos/packages/sdk/observability/src/providers/ip-data.ts";
|
|
1004
|
+
var IP_DATA_CACHE_TIMEOUT = 6 * 60 * 60 * 1e3;
|
|
1005
|
+
var IPData = Schema.Struct({
|
|
1006
|
+
city: Schema.String,
|
|
1007
|
+
region: Schema.String,
|
|
1008
|
+
country: Schema.String,
|
|
1009
|
+
latitude: Schema.optional(Schema.Number),
|
|
1010
|
+
longitude: Schema.optional(Schema.Number)
|
|
1011
|
+
});
|
|
1012
|
+
var getIPData = Effect6.fn(function* (config) {
|
|
1013
|
+
const httpClient = yield* HttpClient.HttpClient;
|
|
1014
|
+
const cachedData = yield* Effect6.promise(() => localForage.getItem("dxos:observability:ipdata"));
|
|
1015
|
+
if (cachedData && cachedData.timestamp > Date.now() - IP_DATA_CACHE_TIMEOUT) {
|
|
1016
|
+
return cachedData.data;
|
|
1017
|
+
}
|
|
1018
|
+
const IPDATA_API_KEY = config.get("runtime.app.env.DX_IPDATA_API_KEY");
|
|
1019
|
+
if (IPDATA_API_KEY) {
|
|
1020
|
+
const data = yield* HttpClientRequest.get(`https://api.ipdata.co?api-key=${IPDATA_API_KEY}`).pipe(httpClient.execute, Effect6.flatMap((res) => res.json), Effect6.flatMap(Schema.decodeUnknown(IPData)));
|
|
1021
|
+
yield* Effect6.promise(() => localForage.setItem("dxos:observability:ipdata", {
|
|
1022
|
+
data,
|
|
1023
|
+
timestamp: Date.now()
|
|
1024
|
+
}));
|
|
1025
|
+
return data;
|
|
1026
|
+
}
|
|
1027
|
+
});
|
|
1028
|
+
var provider = (config) => (observability) => Effect6.gen(function* () {
|
|
1029
|
+
const ipData = yield* getIPData(config);
|
|
1030
|
+
if (!ipData) {
|
|
1031
|
+
return;
|
|
1032
|
+
}
|
|
1033
|
+
observability.setTags({
|
|
1034
|
+
city: ipData.city,
|
|
1035
|
+
region: ipData.region,
|
|
1036
|
+
country: ipData.country,
|
|
1037
|
+
latitude: ipData.latitude,
|
|
1038
|
+
longitude: ipData.longitude
|
|
1039
|
+
});
|
|
1040
|
+
}).pipe(Effect6.provide(FetchHttpClient.layer), Effect6.catchAll((err) => Effect6.sync(() => {
|
|
1041
|
+
log5.catch(err, void 0, {
|
|
1042
|
+
F: __dxlog_file5,
|
|
1043
|
+
L: 85,
|
|
1044
|
+
S: void 0,
|
|
1045
|
+
C: (f, a) => f(...a)
|
|
1046
|
+
});
|
|
1047
|
+
})));
|
|
1048
|
+
|
|
1049
|
+
// src/providers/storage.ts
|
|
1050
|
+
var storage_exports = {};
|
|
1051
|
+
__export(storage_exports, {
|
|
1052
|
+
provider: () => provider2
|
|
1053
|
+
});
|
|
1054
|
+
import * as Duration from "effect/Duration";
|
|
1055
|
+
import * as Effect7 from "effect/Effect";
|
|
1056
|
+
import * as Fiber from "effect/Fiber";
|
|
1057
|
+
import * as Schedule from "effect/Schedule";
|
|
1058
|
+
var provider2 = Effect7.fn(function* (observability) {
|
|
1059
|
+
if (typeof navigator !== "undefined" && navigator.storage?.estimate) {
|
|
1060
|
+
const action = Effect7.gen(function* () {
|
|
1061
|
+
const storageEstimate = yield* Effect7.tryPromise(() => navigator.storage.estimate());
|
|
1062
|
+
storageEstimate.usage && observability.metrics.gauge("storageUsage", storageEstimate.usage);
|
|
1063
|
+
storageEstimate.quota && observability.metrics.gauge("storageQuota", storageEstimate.quota);
|
|
1064
|
+
});
|
|
1065
|
+
const fiber = action.pipe(Effect7.repeat(Schedule.fixed(Duration.hours(1))), Effect7.runFork);
|
|
1066
|
+
return () => Effect7.runSync(Fiber.interrupt(fiber));
|
|
1067
|
+
}
|
|
1068
|
+
});
|
|
22
1069
|
export {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
getObservabilityState,
|
|
28
|
-
getTelemetryIdentifier,
|
|
29
|
-
getTelemetryIdentity,
|
|
30
|
-
initializeAppObservability,
|
|
31
|
-
initializeNodeObservability,
|
|
32
|
-
isObservabilityDisabled,
|
|
33
|
-
mapSpaces,
|
|
34
|
-
setupTelemetryListeners,
|
|
35
|
-
showObservabilityBanner,
|
|
36
|
-
storeObservabilityDisabled,
|
|
37
|
-
storeObservabilityGroup
|
|
1070
|
+
LogBuffer,
|
|
1071
|
+
observability_exports as Observability,
|
|
1072
|
+
observability_extension_exports as ObservabilityExtension,
|
|
1073
|
+
providers_exports as ObservabilityProvider
|
|
38
1074
|
};
|
|
39
1075
|
//# sourceMappingURL=index.mjs.map
|