@dxos/observability 0.8.4-main.bc674ce → 0.8.4-main.bcb3aa67d6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -11
- package/dist/lib/browser/chunk-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 +922 -278
- 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-PUNCJ5KV.mjs +112 -0
- package/dist/lib/browser/traces-browser-PUNCJ5KV.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 +939 -293
- 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/{chunk-WAGGA7IT.mjs → traces-KMTHMYFX.mjs} +8 -16
- 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/{otel → extensions/otel}/logs.js +48 -18
- package/dist/types/src/extensions/otel/logs.js.map +1 -0
- package/dist/types/src/extensions/otel/metrics.d.ts.map +1 -0
- package/dist/types/src/{otel → extensions/otel}/metrics.js +2 -10
- 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/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 +85 -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/{otel → extensions/otel}/traces.js +5 -13
- package/dist/types/src/extensions/otel/traces.js.map +1 -0
- package/dist/types/src/extensions/posthog/extension.d.ts +18 -0
- package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -0
- package/dist/types/src/extensions/posthog/extension.js +142 -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 +3 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/index.js +4 -3
- package/dist/types/src/index.js.map +1 -1
- 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 +177 -465
- 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 +57 -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 +59 -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/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/{helpers/node-observability.js → storage/node.js} +37 -42
- 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 +26 -47
- 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/{otel → extensions/otel}/logs.ts +55 -23
- package/src/{otel → extensions/otel}/metrics.ts +2 -12
- package/src/{otel → extensions/otel}/otel.ts +3 -3
- package/src/extensions/otel/traces-browser.ts +110 -0
- package/src/{otel → extensions/otel}/traces.ts +10 -21
- package/src/extensions/posthog/extension.ts +174 -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 +4 -3
- 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 +91 -0
- package/src/providers/storage.ts +23 -0
- package/src/storage/browser.ts +62 -0
- package/src/{segment → storage}/index.ts +0 -1
- package/src/storage/node.test.ts +130 -0
- package/src/{helpers/node-observability.ts → storage/node.ts} +40 -69
- package/dist/lib/browser/chunk-5ICT2XF2.mjs +0 -1
- package/dist/lib/browser/chunk-5LN7D6GM.mjs +0 -148
- package/dist/lib/browser/chunk-5LN7D6GM.mjs.map +0 -7
- package/dist/lib/browser/chunk-JJQT5TQH.mjs +0 -672
- package/dist/lib/browser/chunk-JJQT5TQH.mjs.map +0 -7
- package/dist/lib/browser/chunk-O4BG5MRL.mjs +0 -164
- package/dist/lib/browser/chunk-O4BG5MRL.mjs.map +0 -7
- package/dist/lib/browser/chunk-U6JWT3E2.mjs +0 -1
- package/dist/lib/browser/chunk-VL6LVQPU.mjs +0 -69
- package/dist/lib/browser/chunk-VL6LVQPU.mjs.map +0 -7
- package/dist/lib/browser/observability-XK652NZG.mjs +0 -11
- package/dist/lib/browser/observability-XK652NZG.mjs.map +0 -7
- package/dist/lib/browser/otel/traces-browser.mjs +0 -7
- package/dist/lib/browser/otel/traces-browser.mjs.map +0 -7
- package/dist/lib/browser/otel/traces.mjs +0 -7
- package/dist/lib/browser/otel/traces.mjs.map +0 -7
- package/dist/lib/browser/otel-DI4ASU7Y.mjs +0 -226
- package/dist/lib/browser/otel-DI4ASU7Y.mjs.map +0 -7
- package/dist/lib/browser/segment/browser.mjs +0 -9
- package/dist/lib/browser/segment/browser.mjs.map +0 -7
- package/dist/lib/browser/segment/index.mjs +0 -12
- package/dist/lib/browser/segment/index.mjs.map +0 -7
- package/dist/lib/browser/segment/node.mjs +0 -9
- package/dist/lib/browser/segment/node.mjs.map +0 -7
- package/dist/lib/browser/sentry/browser.mjs +0 -23
- package/dist/lib/browser/sentry/browser.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/node.mjs +0 -23
- package/dist/lib/browser/sentry/node.mjs.map +0 -7
- package/dist/lib/browser/sentry-log-processor-W7LI6WXA.mjs +0 -146
- package/dist/lib/browser/sentry-log-processor-W7LI6WXA.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-KKNY7TRV.mjs +0 -673
- package/dist/lib/node-esm/chunk-KKNY7TRV.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-KLJGCUYA.mjs +0 -2
- package/dist/lib/node-esm/chunk-KLJGCUYA.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-KVJTNW3F.mjs +0 -147
- package/dist/lib/node-esm/chunk-KVJTNW3F.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-M4627SMT.mjs +0 -135
- package/dist/lib/node-esm/chunk-M4627SMT.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-QUZL7LKE.mjs +0 -2
- package/dist/lib/node-esm/chunk-QUZL7LKE.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-UIVXGEGJ.mjs +0 -62
- package/dist/lib/node-esm/chunk-UIVXGEGJ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-WAGGA7IT.mjs.map +0 -7
- package/dist/lib/node-esm/observability-CXQ3CZGB.mjs +0 -13
- package/dist/lib/node-esm/observability-CXQ3CZGB.mjs.map +0 -7
- package/dist/lib/node-esm/otel/traces-browser.mjs +0 -70
- package/dist/lib/node-esm/otel/traces-browser.mjs.map +0 -7
- package/dist/lib/node-esm/otel/traces.mjs +0 -8
- package/dist/lib/node-esm/otel/traces.mjs.map +0 -7
- package/dist/lib/node-esm/otel-JFXO22WD.mjs +0 -227
- package/dist/lib/node-esm/otel-JFXO22WD.mjs.map +0 -7
- package/dist/lib/node-esm/segment/browser.mjs +0 -92
- package/dist/lib/node-esm/segment/browser.mjs.map +0 -7
- package/dist/lib/node-esm/segment/index.mjs +0 -15
- package/dist/lib/node-esm/segment/index.mjs.map +0 -7
- package/dist/lib/node-esm/segment/node.mjs +0 -11
- package/dist/lib/node-esm/segment/node.mjs.map +0 -7
- package/dist/lib/node-esm/sentry/browser.mjs +0 -165
- package/dist/lib/node-esm/sentry/browser.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/node.mjs +0 -24
- package/dist/lib/node-esm/sentry/node.mjs.map +0 -7
- package/dist/lib/node-esm/sentry-log-processor-W3SG4RQL.mjs +0 -147
- package/dist/lib/node-esm/sentry-log-processor-W3SG4RQL.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 -138
- 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 -36
- 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.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 -94
- 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.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 -53
- 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.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 -51
- 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 -63
- 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 -84
- 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 -110
- 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.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 -106
- 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 -32
- 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 -144
- 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 -178
- 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 -109
- package/src/otel/index.ts +0 -8
- package/src/otel/traces-browser.ts +0 -62
- package/src/segment/base.ts +0 -69
- package/src/segment/browser.ts +0 -69
- package/src/segment/node.ts +0 -95
- package/src/segment/types.ts +0 -57
- package/src/sentry/browser.ts +0 -133
- package/src/sentry/index.ts +0 -6
- package/src/sentry/node.node.test.ts +0 -40
- package/src/sentry/node.ts +0 -126
- package/src/sentry/sentry-log-processor.ts +0 -176
- package/src/sentry/sentry.node.test.ts +0 -35
- 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-5ICT2XF2.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/{browser/chunk-U6JWT3E2.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
- /package/dist/types/src/{otel → extensions/otel}/metrics.d.ts +0 -0
- /package/dist/types/src/{otel → extensions/otel}/otel.js +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
- /package/dist/types/src/{sentry → storage}/index.js +0 -0
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
import { type PostHogConfig } from 'posthog-js';
|
|
7
|
+
|
|
8
|
+
import { type Config } from '@dxos/config';
|
|
9
|
+
import { LogBuffer, log } from '@dxos/log';
|
|
10
|
+
|
|
11
|
+
import { type Extension } from '../../observability-extension';
|
|
12
|
+
import { stubExtension } from '../stub';
|
|
13
|
+
|
|
14
|
+
export type ExtensionsOptions = {
|
|
15
|
+
config: Config;
|
|
16
|
+
/** Release identifier, e.g. `composer@0.8.3`. */
|
|
17
|
+
release?: string;
|
|
18
|
+
/** Deployment environment, e.g. `production` or `staging`. */
|
|
19
|
+
environment?: string;
|
|
20
|
+
posthog?: Partial<PostHogConfig>;
|
|
21
|
+
/** Shared log buffer for debug log dumps. Creates a local one if not provided. */
|
|
22
|
+
logBuffer?: LogBuffer;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** Upload serialized logs to the feedback-logs endpoint. Returns the R2 key on success. */
|
|
26
|
+
const uploadLogs = async (body: string): Promise<string | undefined> => {
|
|
27
|
+
try {
|
|
28
|
+
const response = await fetch('/api/feedback-logs', {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
headers: { 'Content-Type': 'application/x-ndjson' },
|
|
31
|
+
body,
|
|
32
|
+
});
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
log.warn('feedback log upload failed', { status: response.status });
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const { key } = await response.json();
|
|
38
|
+
return key;
|
|
39
|
+
} catch (err) {
|
|
40
|
+
log.warn('feedback log upload error', { error: err });
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/** Create a PostHog-backed observability extension for events, errors, and feedback. */
|
|
46
|
+
export const extensions: (options: ExtensionsOptions) => Effect.Effect<Extension> = Effect.fn(function* ({
|
|
47
|
+
config,
|
|
48
|
+
release,
|
|
49
|
+
environment,
|
|
50
|
+
posthog: posthogConfig,
|
|
51
|
+
logBuffer: externalLogBuffer,
|
|
52
|
+
}) {
|
|
53
|
+
if (typeof window === 'undefined') {
|
|
54
|
+
log('PostHog is being stubbed because it is running in a worker.');
|
|
55
|
+
return stubExtension;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const feedbackSurveyId = config.get('runtime.app.env.DX_POSTHOG_FEEDBACK_SURVEY_ID');
|
|
59
|
+
const apiKey = config.get('runtime.app.env.DX_POSTHOG_API_KEY');
|
|
60
|
+
const api_host = config.get('runtime.app.env.DX_POSTHOG_API_HOST');
|
|
61
|
+
if (!apiKey || !api_host) {
|
|
62
|
+
log.info('Missing POSTHOG_API_KEY or POSTHOG_API_HOST');
|
|
63
|
+
return stubExtension;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const { default: posthog } = yield* Effect.promise(() => import('posthog-js'));
|
|
67
|
+
const { logProcessor } = yield* Effect.promise(() => import('./log-processor'));
|
|
68
|
+
const logBuffer = externalLogBuffer ?? new LogBuffer();
|
|
69
|
+
let feedbackSurveyAvailable: boolean | null = null;
|
|
70
|
+
|
|
71
|
+
const checkFeedbackSurveyAvailable = (): Effect.Effect<boolean> =>
|
|
72
|
+
feedbackSurveyId
|
|
73
|
+
? Effect.promise(() => {
|
|
74
|
+
if (feedbackSurveyAvailable !== null) {
|
|
75
|
+
return Promise.resolve(feedbackSurveyAvailable);
|
|
76
|
+
}
|
|
77
|
+
return new Promise<boolean>((resolve) => {
|
|
78
|
+
posthog.getSurveys((surveys) => {
|
|
79
|
+
const found = surveys.some((s) => s.id === feedbackSurveyId);
|
|
80
|
+
feedbackSurveyAvailable = found;
|
|
81
|
+
resolve(found);
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
})
|
|
85
|
+
: Effect.succeed(false);
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
initialize: () =>
|
|
89
|
+
Effect.sync(() => {
|
|
90
|
+
// https://posthog.com/docs/libraries/js/config
|
|
91
|
+
posthog.init(apiKey, {
|
|
92
|
+
api_host,
|
|
93
|
+
mask_all_text: true,
|
|
94
|
+
capture_exceptions: true,
|
|
95
|
+
...posthogConfig,
|
|
96
|
+
});
|
|
97
|
+
if (release || environment) {
|
|
98
|
+
posthog.register({
|
|
99
|
+
...(release ? { release } : {}),
|
|
100
|
+
...(environment ? { environment } : {}),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
log.runtimeConfig.processors.push(logProcessor);
|
|
104
|
+
log.runtimeConfig.processors.push(logBuffer.logProcessor);
|
|
105
|
+
}),
|
|
106
|
+
close: () =>
|
|
107
|
+
Effect.sync(() => {
|
|
108
|
+
for (const processor of [logProcessor, logBuffer.logProcessor]) {
|
|
109
|
+
const index = log.runtimeConfig.processors.indexOf(processor);
|
|
110
|
+
if (index !== -1) {
|
|
111
|
+
log.runtimeConfig.processors.splice(index, 1);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}),
|
|
115
|
+
enable: () => Effect.sync(() => posthog.opt_in_capturing()),
|
|
116
|
+
disable: () => Effect.sync(() => posthog.opt_out_capturing()),
|
|
117
|
+
identify: (distinctId, attributes, setOnceAttributes) => {
|
|
118
|
+
posthog.identify(distinctId, attributes, setOnceAttributes);
|
|
119
|
+
},
|
|
120
|
+
alias: (distinctId, previousId) => {
|
|
121
|
+
posthog.alias(distinctId, previousId);
|
|
122
|
+
},
|
|
123
|
+
setTags: (tags) => {
|
|
124
|
+
posthog.register_for_session(tags);
|
|
125
|
+
},
|
|
126
|
+
get enabled(): boolean {
|
|
127
|
+
return posthog.is_capturing();
|
|
128
|
+
},
|
|
129
|
+
apis: [
|
|
130
|
+
{
|
|
131
|
+
kind: 'events',
|
|
132
|
+
isAvailable: () => Effect.succeed(true),
|
|
133
|
+
captureEvent: (event, attributes) => {
|
|
134
|
+
posthog.capture(event, attributes);
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
kind: 'errors',
|
|
139
|
+
isAvailable: () => Effect.succeed(true),
|
|
140
|
+
captureException: (error, attributes) => {
|
|
141
|
+
posthog.captureException(error, attributes);
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
kind: 'feedback',
|
|
146
|
+
// TODO(wittjosiah): Support custom surveys.
|
|
147
|
+
captureUserFeedback: (form) => {
|
|
148
|
+
posthog.getSurveys(async (surveys) => {
|
|
149
|
+
const survey = surveys.find((survey) => survey.id === feedbackSurveyId);
|
|
150
|
+
if (!survey || survey.questions.length === 0) {
|
|
151
|
+
log.error('Missing feedback survey or survey has no questions', { feedbackSurveyId });
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
let debugLogDumpKey: string | null = null;
|
|
156
|
+
if (form.includeLogs !== false && logBuffer.size > 0) {
|
|
157
|
+
debugLogDumpKey = (await uploadLogs(logBuffer.serialize())) ?? 'failed';
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// https://posthog.com/docs/surveys/implementing-custom-surveys
|
|
161
|
+
const question = survey.questions[0];
|
|
162
|
+
posthog.capture('survey sent', {
|
|
163
|
+
$survey_id: survey.id,
|
|
164
|
+
$survey_questions: [{ id: question.id, question: question.question }],
|
|
165
|
+
[`$survey_response_${question.id}`]: form.message,
|
|
166
|
+
debug_log_dump_key: debugLogDumpKey,
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
},
|
|
170
|
+
isAvailable: checkFeedbackSurveyAvailable,
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
};
|
|
174
|
+
});
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { beforeEach, describe, expect, test, vi } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import { InvariantViolation } from '@dxos/invariant';
|
|
8
|
+
import { type LogConfig, type LogEntry, LogLevel } from '@dxos/log';
|
|
9
|
+
|
|
10
|
+
// Replace the posthog-js module with a stub so log-processor's top-level import resolves to our mock.
|
|
11
|
+
// Dynamic imports are used so that both the mock and log-processor are loaded after vi.mock is hoisted.
|
|
12
|
+
vi.mock('posthog-js', () => ({
|
|
13
|
+
default: {
|
|
14
|
+
captureException: vi.fn(),
|
|
15
|
+
},
|
|
16
|
+
}));
|
|
17
|
+
const { default: posthog } = await import('posthog-js');
|
|
18
|
+
const { logProcessor } = await import('./log-processor');
|
|
19
|
+
|
|
20
|
+
const baseConfig: LogConfig = {
|
|
21
|
+
options: {},
|
|
22
|
+
captureFilters: [{ level: LogLevel.WARN }],
|
|
23
|
+
processors: [],
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const createEntry = (overrides: Partial<LogEntry> = {}): LogEntry => ({
|
|
27
|
+
level: LogLevel.ERROR,
|
|
28
|
+
message: 'test error',
|
|
29
|
+
...overrides,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe('logProcessor', () => {
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
vi.clearAllMocks();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test('skips entries that do not pass capture filters', () => {
|
|
38
|
+
const entry = createEntry({ level: LogLevel.DEBUG });
|
|
39
|
+
logProcessor(baseConfig, entry);
|
|
40
|
+
expect(posthog.captureException).not.toHaveBeenCalled();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test('skips entries from remote sessions', () => {
|
|
44
|
+
const entry = createEntry({
|
|
45
|
+
error: new Error('test'),
|
|
46
|
+
meta: { F: 'test.ts', L: 1, S: { remoteSessionId: 'remote-123' } },
|
|
47
|
+
});
|
|
48
|
+
logProcessor(baseConfig, entry);
|
|
49
|
+
expect(posthog.captureException).not.toHaveBeenCalled();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test('skips entries without errors', () => {
|
|
53
|
+
const entry = createEntry({ error: undefined, context: {} });
|
|
54
|
+
logProcessor(baseConfig, entry);
|
|
55
|
+
expect(posthog.captureException).not.toHaveBeenCalled();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test('captures error from entry.error', () => {
|
|
59
|
+
const error = new Error('direct error');
|
|
60
|
+
const entry = createEntry({
|
|
61
|
+
error,
|
|
62
|
+
meta: { F: 'packages/sdk/observability/src/test.ts', L: 42, S: undefined },
|
|
63
|
+
});
|
|
64
|
+
logProcessor(baseConfig, entry);
|
|
65
|
+
expect(posthog.captureException).toHaveBeenCalledWith(
|
|
66
|
+
error,
|
|
67
|
+
expect.objectContaining({
|
|
68
|
+
transaction: 'packages/sdk/observability/src/test.ts:42',
|
|
69
|
+
}),
|
|
70
|
+
);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test('captures error from context when level is ERROR but no entry.error', () => {
|
|
74
|
+
const contextError = new Error('context error');
|
|
75
|
+
const entry = createEntry({
|
|
76
|
+
level: LogLevel.ERROR,
|
|
77
|
+
error: undefined,
|
|
78
|
+
context: { someKey: contextError },
|
|
79
|
+
meta: { F: 'test.ts', L: 10, S: undefined },
|
|
80
|
+
});
|
|
81
|
+
logProcessor(baseConfig, entry);
|
|
82
|
+
expect(posthog.captureException).toHaveBeenCalledWith(contextError, expect.any(Object));
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('sets transaction from file:line metadata', () => {
|
|
86
|
+
const entry = createEntry({
|
|
87
|
+
error: new Error('err'),
|
|
88
|
+
meta: { F: '/home/user/project/packages/sdk/observability/src/index.ts', L: 99, S: undefined },
|
|
89
|
+
});
|
|
90
|
+
logProcessor(baseConfig, entry);
|
|
91
|
+
expect(posthog.captureException).toHaveBeenCalledWith(
|
|
92
|
+
expect.any(Error),
|
|
93
|
+
expect.objectContaining({
|
|
94
|
+
transaction: 'packages/sdk/observability/src/index.ts:99',
|
|
95
|
+
}),
|
|
96
|
+
);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test('sets service_host_issue/session for worker entries', () => {
|
|
100
|
+
const entry = createEntry({
|
|
101
|
+
error: new Error('worker err'),
|
|
102
|
+
meta: { F: 'test.ts', L: 1, S: { hostSessionId: 'host-abc' } },
|
|
103
|
+
});
|
|
104
|
+
logProcessor(baseConfig, entry);
|
|
105
|
+
expect(posthog.captureException).toHaveBeenCalledWith(
|
|
106
|
+
expect.any(Error),
|
|
107
|
+
expect.objectContaining({
|
|
108
|
+
service_host_issue: true,
|
|
109
|
+
service_host_session: 'host-abc',
|
|
110
|
+
}),
|
|
111
|
+
);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test('sets uptime_seconds from metadata', () => {
|
|
115
|
+
const entry = createEntry({
|
|
116
|
+
error: new Error('err'),
|
|
117
|
+
meta: { F: 'test.ts', L: 1, S: { uptimeSeconds: 123 } },
|
|
118
|
+
});
|
|
119
|
+
logProcessor(baseConfig, entry);
|
|
120
|
+
expect(posthog.captureException).toHaveBeenCalledWith(
|
|
121
|
+
expect.any(Error),
|
|
122
|
+
expect.objectContaining({
|
|
123
|
+
uptime_seconds: 123,
|
|
124
|
+
}),
|
|
125
|
+
);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
test('sets invariant_violation flag for InvariantViolation errors', () => {
|
|
129
|
+
const error = new InvariantViolation('broken invariant');
|
|
130
|
+
const entry = createEntry({
|
|
131
|
+
error,
|
|
132
|
+
meta: { F: 'test.ts', L: 1, S: undefined },
|
|
133
|
+
});
|
|
134
|
+
logProcessor(baseConfig, entry);
|
|
135
|
+
expect(posthog.captureException).toHaveBeenCalledWith(
|
|
136
|
+
error,
|
|
137
|
+
expect.objectContaining({
|
|
138
|
+
invariant_violation: true,
|
|
139
|
+
}),
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test('does not set invariant_violation for normal errors', () => {
|
|
144
|
+
const error = new Error('normal error');
|
|
145
|
+
const entry = createEntry({
|
|
146
|
+
error,
|
|
147
|
+
meta: { F: 'test.ts', L: 1, S: undefined },
|
|
148
|
+
});
|
|
149
|
+
logProcessor(baseConfig, entry);
|
|
150
|
+
const callArgs = vi.mocked(posthog.captureException).mock.calls[0];
|
|
151
|
+
expect(callArgs[1]).not.toHaveProperty('invariant_violation');
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
describe('getRelativeFilename', () => {
|
|
156
|
+
// We test this indirectly through the transaction property set by logProcessor.
|
|
157
|
+
|
|
158
|
+
test('extracts relative path from absolute path containing packages/', () => {
|
|
159
|
+
const entry = createEntry({
|
|
160
|
+
error: new Error('err'),
|
|
161
|
+
meta: { F: '/home/user/code/packages/sdk/observability/src/file.ts', L: 5, S: undefined },
|
|
162
|
+
});
|
|
163
|
+
logProcessor(baseConfig, entry);
|
|
164
|
+
expect(posthog.captureException).toHaveBeenCalledWith(
|
|
165
|
+
expect.any(Error),
|
|
166
|
+
expect.objectContaining({
|
|
167
|
+
transaction: 'packages/sdk/observability/src/file.ts:5',
|
|
168
|
+
}),
|
|
169
|
+
);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test('returns original filename if no match', () => {
|
|
173
|
+
const entry = createEntry({
|
|
174
|
+
error: new Error('err'),
|
|
175
|
+
meta: { F: 'no-packages-here.ts', L: 1, S: undefined },
|
|
176
|
+
});
|
|
177
|
+
logProcessor(baseConfig, entry);
|
|
178
|
+
expect(posthog.captureException).toHaveBeenCalledWith(
|
|
179
|
+
expect.any(Error),
|
|
180
|
+
expect.objectContaining({
|
|
181
|
+
transaction: 'no-packages-here.ts:1',
|
|
182
|
+
}),
|
|
183
|
+
);
|
|
184
|
+
});
|
|
185
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import posthog from 'posthog-js';
|
|
6
|
+
|
|
7
|
+
import { InvariantViolation } from '@dxos/invariant';
|
|
8
|
+
import { type LogConfig, type LogEntry, LogLevel, type LogProcessor, shouldLog } from '@dxos/log';
|
|
9
|
+
|
|
10
|
+
export const logProcessor: LogProcessor = (config: LogConfig, entry: LogEntry) => {
|
|
11
|
+
// Don't forward logs from remote sessions.
|
|
12
|
+
if (!shouldLog(entry, config.captureFilters) || entry.meta?.S?.remoteSessionId) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let capturedError = entry.error;
|
|
17
|
+
if (capturedError == null && entry.level === LogLevel.ERROR) {
|
|
18
|
+
capturedError = Object.values(entry.context ?? {}).find((v): v is Error => v instanceof Error);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (!capturedError) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const additionalProperties: Record<string, string | boolean | number> = {};
|
|
26
|
+
if (entry.meta) {
|
|
27
|
+
additionalProperties.transaction = `${getRelativeFilename(entry.meta.F)}:${entry.meta.L}`;
|
|
28
|
+
if (entry.meta.S?.hostSessionId) {
|
|
29
|
+
additionalProperties.service_host_issue = true;
|
|
30
|
+
additionalProperties.service_host_session = entry.meta.S?.hostSessionId;
|
|
31
|
+
}
|
|
32
|
+
if (entry.meta.S?.uptimeSeconds != null) {
|
|
33
|
+
additionalProperties.uptime_seconds = entry.meta.S.uptimeSeconds;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (capturedError instanceof InvariantViolation) {
|
|
38
|
+
additionalProperties.invariant_violation = true;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
posthog.captureException(capturedError, additionalProperties);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const getRelativeFilename = (filename: string) => {
|
|
45
|
+
// TODO(burdon): Hack uses "packages" as an anchor (pre-parse NX?)
|
|
46
|
+
// Including `packages/` part of the path so that excluded paths (e.g. from dist) are clickable in vscode.
|
|
47
|
+
const match = filename.match(/.+\/(packages\/.+\/.+)/);
|
|
48
|
+
if (match) {
|
|
49
|
+
const [, filePath] = match;
|
|
50
|
+
return filePath;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return filename;
|
|
54
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
import { type Extension } from '../observability-extension';
|
|
8
|
+
|
|
9
|
+
export const stubExtension: Extension = {
|
|
10
|
+
initialize: () => Effect.succeed(undefined),
|
|
11
|
+
enable: () => Effect.succeed(undefined),
|
|
12
|
+
disable: () => Effect.succeed(undefined),
|
|
13
|
+
flush: () => Effect.succeed(undefined),
|
|
14
|
+
setTags: () => undefined,
|
|
15
|
+
get enabled() {
|
|
16
|
+
return true;
|
|
17
|
+
},
|
|
18
|
+
apis: [],
|
|
19
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
//
|
|
2
|
-
// Copyright
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './observability';
|
|
5
|
+
export * as Observability from './observability';
|
|
6
|
+
export * as ObservabilityExtension from './observability-extension';
|
|
7
|
+
export * as ObservabilityProvider from './providers';
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import type * as Effect from 'effect/Effect';
|
|
6
|
+
|
|
7
|
+
export * from './extensions';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Kind of observability extension.
|
|
11
|
+
*
|
|
12
|
+
* - errors: Error tracking (e.g., PostHog)
|
|
13
|
+
* - events: Product usage event tracking (e.g., PostHog)
|
|
14
|
+
* - feedback: User feedback submission (e.g., PostHog)
|
|
15
|
+
* - logs: Structured logging (e.g., OTEL)
|
|
16
|
+
* - metrics: Metric data (e.g., OTEL)
|
|
17
|
+
* - traces: Distributed tracing (e.g., OTEL)
|
|
18
|
+
*/
|
|
19
|
+
export type Kind = 'errors' | 'events' | 'feedback' | 'logs' | 'metrics' | 'traces';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Base for every extension API variant. All kinds implement availability the same way.
|
|
23
|
+
*/
|
|
24
|
+
export type ExtensionApiBase<K extends Kind = Kind> = {
|
|
25
|
+
kind: K;
|
|
26
|
+
isAvailable(): Effect.Effect<boolean>;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Metrics extension API (kind-specific methods only).
|
|
31
|
+
*/
|
|
32
|
+
export type Metrics = {
|
|
33
|
+
gauge(name: string, value: number, tags?: Attributes): void;
|
|
34
|
+
increment(name: string, value?: number, tags?: Attributes): void;
|
|
35
|
+
distribution(name: string, value: number, tags?: Attributes): void;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Errors extension API (kind-specific methods only).
|
|
40
|
+
*/
|
|
41
|
+
export type Errors = {
|
|
42
|
+
captureException(error: Error, attributes?: Attributes): void;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Events extension API (kind-specific methods only).
|
|
47
|
+
*/
|
|
48
|
+
export type Events = {
|
|
49
|
+
captureEvent(event: string, attributes?: Attributes): void;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Feedback extension API (kind-specific methods only).
|
|
54
|
+
*/
|
|
55
|
+
export type Feedback = {
|
|
56
|
+
captureUserFeedback(form: FeedbackForm): void;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export type ExtensionApi =
|
|
60
|
+
| (ExtensionApiBase<'errors'> & Errors)
|
|
61
|
+
| (ExtensionApiBase<'events'> & Events)
|
|
62
|
+
| (ExtensionApiBase<'feedback'> & Feedback)
|
|
63
|
+
// TODO(wittjosiah): Direct logs api?
|
|
64
|
+
| ExtensionApiBase<'logs'>
|
|
65
|
+
| (ExtensionApiBase<'metrics'> & Metrics)
|
|
66
|
+
// TODO(wittjosiah): Direct traces api?
|
|
67
|
+
| ExtensionApiBase<'traces'>;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Feedback form to be captured by the feedback extension.
|
|
71
|
+
*/
|
|
72
|
+
// TODO(wittjosiah): Support more form fields (e.g., PostHog custom surveys).
|
|
73
|
+
export type FeedbackForm = { message: string; includeLogs?: boolean };
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Attributes to be attached to observability events.
|
|
77
|
+
*/
|
|
78
|
+
export type Attributes = Record<string, string | number | boolean | undefined>;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Implementation of an observability extension API.
|
|
82
|
+
*/
|
|
83
|
+
export type Extension = {
|
|
84
|
+
initialize?(): Effect.Effect<void, Error>;
|
|
85
|
+
close?(): Effect.Effect<void>;
|
|
86
|
+
enable?(): Effect.Effect<void>;
|
|
87
|
+
disable?(): Effect.Effect<void>;
|
|
88
|
+
flush?(): Effect.Effect<void>;
|
|
89
|
+
identify?(distinctId: string, attributes?: Attributes, setOnceAttributes?: Attributes): void;
|
|
90
|
+
alias?(distinctId: string, previousId?: string): void;
|
|
91
|
+
setTags?(tags: Record<string, string>): void;
|
|
92
|
+
enabled: boolean;
|
|
93
|
+
apis: ExtensionApi[];
|
|
94
|
+
};
|