@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.
Files changed (348) hide show
  1. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  2. package/dist/lib/browser/chunk-K4VFBKST.mjs +13 -0
  3. package/dist/lib/browser/chunk-K4VFBKST.mjs.map +7 -0
  4. package/dist/lib/browser/index.mjs +1066 -34
  5. package/dist/lib/browser/index.mjs.map +4 -4
  6. package/dist/lib/browser/log-processor-FDLTDQEM.mjs +45 -0
  7. package/dist/lib/browser/log-processor-FDLTDQEM.mjs.map +7 -0
  8. package/dist/lib/browser/logs-ATTRIUTL.mjs +113 -0
  9. package/dist/lib/browser/logs-ATTRIUTL.mjs.map +7 -0
  10. package/dist/lib/browser/meta.json +1 -1
  11. package/dist/lib/browser/metrics-PKTV6IGF.mjs +130 -0
  12. package/dist/lib/browser/metrics-PKTV6IGF.mjs.map +7 -0
  13. package/dist/lib/browser/traces-browser-XYXBF5ZX.mjs +62 -0
  14. package/dist/lib/browser/traces-browser-XYXBF5ZX.mjs.map +7 -0
  15. package/dist/lib/node-esm/chunk-FEVP3MK4.mjs +15 -0
  16. package/dist/lib/node-esm/chunk-FEVP3MK4.mjs.map +7 -0
  17. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  18. package/dist/lib/node-esm/index.mjs +1070 -34
  19. package/dist/lib/node-esm/index.mjs.map +4 -4
  20. package/dist/lib/node-esm/log-processor-TKJVJJSJ.mjs +46 -0
  21. package/dist/lib/node-esm/log-processor-TKJVJJSJ.mjs.map +7 -0
  22. package/dist/lib/node-esm/logs-7J45KLM7.mjs +114 -0
  23. package/dist/lib/node-esm/logs-7J45KLM7.mjs.map +7 -0
  24. package/dist/lib/node-esm/meta.json +1 -1
  25. package/dist/lib/node-esm/metrics-H7DDLYSG.mjs +131 -0
  26. package/dist/lib/node-esm/metrics-H7DDLYSG.mjs.map +7 -0
  27. package/dist/lib/node-esm/traces-KMTHMYFX.mjs +44 -0
  28. package/dist/lib/node-esm/traces-KMTHMYFX.mjs.map +7 -0
  29. package/dist/types/src/cli-observability-secrets.json +3 -4
  30. package/dist/types/src/extensions/index.d.ts +3 -0
  31. package/dist/types/src/extensions/index.d.ts.map +1 -0
  32. package/dist/types/src/extensions/index.js +6 -0
  33. package/dist/types/src/extensions/index.js.map +1 -0
  34. package/dist/types/src/extensions/otel/extension.d.ts +23 -0
  35. package/dist/types/src/extensions/otel/extension.d.ts.map +1 -0
  36. package/dist/types/src/extensions/otel/extension.js +124 -0
  37. package/dist/types/src/extensions/otel/extension.js.map +1 -0
  38. package/dist/types/src/extensions/otel/index.d.ts +2 -0
  39. package/dist/types/src/extensions/otel/index.d.ts.map +1 -0
  40. package/dist/types/src/extensions/otel/index.js +5 -0
  41. package/dist/types/src/extensions/otel/index.js.map +1 -0
  42. package/dist/types/src/{otel → extensions/otel}/logs.d.ts +4 -3
  43. package/dist/types/src/extensions/otel/logs.d.ts.map +1 -0
  44. package/dist/types/src/extensions/otel/logs.js +104 -0
  45. package/dist/types/src/extensions/otel/logs.js.map +1 -0
  46. package/dist/types/src/{otel → extensions/otel}/metrics.d.ts +0 -1
  47. package/dist/types/src/extensions/otel/metrics.d.ts.map +1 -0
  48. package/dist/types/src/{otel → extensions/otel}/metrics.js +6 -12
  49. package/dist/types/src/extensions/otel/metrics.js.map +1 -0
  50. package/dist/types/src/{otel → extensions/otel}/otel.d.ts +3 -3
  51. package/dist/types/src/extensions/otel/otel.d.ts.map +1 -0
  52. package/dist/types/src/{otel → extensions/otel}/otel.js +1 -1
  53. package/dist/types/src/extensions/otel/otel.js.map +1 -0
  54. package/dist/types/src/extensions/otel/traces-browser.d.ts.map +1 -0
  55. package/dist/types/src/extensions/otel/traces-browser.js +44 -0
  56. package/dist/types/src/extensions/otel/traces-browser.js.map +1 -0
  57. package/dist/types/src/extensions/otel/traces.d.ts.map +1 -0
  58. package/dist/types/src/extensions/otel/traces.js +38 -0
  59. package/dist/types/src/extensions/otel/traces.js.map +1 -0
  60. package/dist/types/src/extensions/posthog/extension.d.ts +15 -0
  61. package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -0
  62. package/dist/types/src/extensions/posthog/extension.js +143 -0
  63. package/dist/types/src/extensions/posthog/extension.js.map +1 -0
  64. package/dist/types/src/extensions/posthog/index.d.ts +2 -0
  65. package/dist/types/src/extensions/posthog/index.d.ts.map +1 -0
  66. package/dist/types/src/extensions/posthog/index.js +5 -0
  67. package/dist/types/src/extensions/posthog/index.js.map +1 -0
  68. package/dist/types/src/extensions/posthog/log-processor.d.ts +3 -0
  69. package/dist/types/src/extensions/posthog/log-processor.d.ts.map +1 -0
  70. package/dist/types/src/extensions/posthog/log-processor.js +45 -0
  71. package/dist/types/src/extensions/posthog/log-processor.js.map +1 -0
  72. package/dist/types/src/extensions/posthog/log-processor.test.d.ts +2 -0
  73. package/dist/types/src/extensions/posthog/log-processor.test.d.ts.map +1 -0
  74. package/dist/types/src/extensions/posthog/log-processor.test.js +146 -0
  75. package/dist/types/src/extensions/posthog/log-processor.test.js.map +1 -0
  76. package/dist/types/src/extensions/stub.d.ts +3 -0
  77. package/dist/types/src/extensions/stub.d.ts.map +1 -0
  78. package/dist/types/src/extensions/stub.js +16 -0
  79. package/dist/types/src/extensions/stub.js.map +1 -0
  80. package/dist/types/src/index.d.ts +4 -2
  81. package/dist/types/src/index.d.ts.map +1 -1
  82. package/dist/types/src/index.js +5 -3
  83. package/dist/types/src/index.js.map +1 -1
  84. package/dist/types/src/log-buffer.d.ts +34 -0
  85. package/dist/types/src/log-buffer.d.ts.map +1 -0
  86. package/dist/types/src/log-buffer.js +70 -0
  87. package/dist/types/src/log-buffer.js.map +1 -0
  88. package/dist/types/src/log-buffer.test.d.ts +2 -0
  89. package/dist/types/src/log-buffer.test.d.ts.map +1 -0
  90. package/dist/types/src/log-buffer.test.js +107 -0
  91. package/dist/types/src/log-buffer.test.js.map +1 -0
  92. package/dist/types/src/observability-extension.d.ts +74 -0
  93. package/dist/types/src/observability-extension.d.ts.map +1 -0
  94. package/dist/types/src/observability-extension.js +5 -0
  95. package/dist/types/src/observability-extension.js.map +1 -0
  96. package/dist/types/src/observability.d.ts +32 -110
  97. package/dist/types/src/observability.d.ts.map +1 -1
  98. package/dist/types/src/observability.js +176 -455
  99. package/dist/types/src/observability.js.map +1 -1
  100. package/dist/types/src/observability.test.d.ts +2 -0
  101. package/dist/types/src/observability.test.d.ts.map +1 -0
  102. package/dist/types/src/observability.test.js +312 -0
  103. package/dist/types/src/observability.test.js.map +1 -0
  104. package/dist/types/src/providers/client-observability.d.ts +11 -0
  105. package/dist/types/src/providers/client-observability.d.ts.map +1 -0
  106. package/dist/types/src/providers/client-observability.js +200 -0
  107. package/dist/types/src/providers/client-observability.js.map +1 -0
  108. package/dist/types/src/providers/index.d.ts +4 -0
  109. package/dist/types/src/providers/index.d.ts.map +1 -0
  110. package/dist/types/src/providers/index.js +7 -0
  111. package/dist/types/src/providers/index.js.map +1 -0
  112. package/dist/types/src/providers/ip-data.d.ts +5 -0
  113. package/dist/types/src/providers/ip-data.d.ts.map +1 -0
  114. package/dist/types/src/providers/ip-data.js +55 -0
  115. package/dist/types/src/providers/ip-data.js.map +1 -0
  116. package/dist/types/src/providers/storage.d.ts +3 -0
  117. package/dist/types/src/providers/storage.d.ts.map +1 -0
  118. package/dist/types/src/providers/storage.js +19 -0
  119. package/dist/types/src/providers/storage.js.map +1 -0
  120. package/dist/types/src/storage/browser.d.ts +19 -0
  121. package/dist/types/src/storage/browser.d.ts.map +1 -0
  122. package/dist/types/src/storage/browser.js +58 -0
  123. package/dist/types/src/storage/browser.js.map +1 -0
  124. package/dist/types/src/storage/index.d.ts +2 -0
  125. package/dist/types/src/storage/index.d.ts.map +1 -0
  126. package/{src/segment/index.ts → dist/types/src/storage/index.js} +1 -2
  127. package/dist/types/src/storage/index.js.map +1 -0
  128. package/dist/types/src/storage/node.d.ts +26 -0
  129. package/dist/types/src/storage/node.d.ts.map +1 -0
  130. package/dist/types/src/storage/node.js +92 -0
  131. package/dist/types/src/storage/node.js.map +1 -0
  132. package/dist/types/src/storage/node.test.d.ts +2 -0
  133. package/dist/types/src/storage/node.test.d.ts.map +1 -0
  134. package/dist/types/src/storage/node.test.js +103 -0
  135. package/dist/types/src/storage/node.test.js.map +1 -0
  136. package/dist/types/tsconfig.tsbuildinfo +1 -1
  137. package/package.json +42 -63
  138. package/src/cli-observability-secrets.json +3 -4
  139. package/src/extensions/index.ts +6 -0
  140. package/src/extensions/otel/extension.ts +178 -0
  141. package/src/extensions/otel/index.ts +5 -0
  142. package/src/extensions/otel/logs.ts +134 -0
  143. package/src/{otel → extensions/otel}/metrics.ts +4 -21
  144. package/src/{otel → extensions/otel}/otel.ts +4 -4
  145. package/src/extensions/otel/traces-browser.ts +57 -0
  146. package/src/extensions/otel/traces.ts +49 -0
  147. package/src/extensions/posthog/extension.ts +172 -0
  148. package/src/extensions/posthog/index.ts +5 -0
  149. package/src/extensions/posthog/log-processor.test.ts +185 -0
  150. package/src/extensions/posthog/log-processor.ts +54 -0
  151. package/src/extensions/stub.ts +19 -0
  152. package/src/index.ts +5 -3
  153. package/src/log-buffer.test.ts +134 -0
  154. package/src/log-buffer.ts +101 -0
  155. package/src/observability-extension.ts +94 -0
  156. package/src/observability.test.ts +531 -0
  157. package/src/observability.ts +236 -577
  158. package/src/providers/client-observability.ts +253 -0
  159. package/src/providers/index.ts +7 -0
  160. package/src/providers/ip-data.ts +88 -0
  161. package/src/providers/storage.ts +23 -0
  162. package/src/storage/browser.ts +61 -0
  163. package/src/{sentry → storage}/index.ts +0 -1
  164. package/src/storage/node.test.ts +130 -0
  165. package/src/{helpers/node-observability.ts → storage/node.ts} +42 -70
  166. package/dist/lib/browser/chunk-G6EE7HFV.mjs +0 -147
  167. package/dist/lib/browser/chunk-G6EE7HFV.mjs.map +0 -7
  168. package/dist/lib/browser/chunk-JA5VJRKF.mjs +0 -164
  169. package/dist/lib/browser/chunk-JA5VJRKF.mjs.map +0 -7
  170. package/dist/lib/browser/chunk-KDP3SESE.mjs +0 -1
  171. package/dist/lib/browser/chunk-YQJELTRP.mjs +0 -996
  172. package/dist/lib/browser/chunk-YQJELTRP.mjs.map +0 -7
  173. package/dist/lib/browser/observability-HDE3I7TA.mjs +0 -10
  174. package/dist/lib/browser/otel-LHAFLNBQ.mjs +0 -277
  175. package/dist/lib/browser/otel-LHAFLNBQ.mjs.map +0 -7
  176. package/dist/lib/browser/segment/index.mjs +0 -11
  177. package/dist/lib/browser/segment/index.mjs.map +0 -7
  178. package/dist/lib/browser/sentry/index.mjs +0 -24
  179. package/dist/lib/browser/sentry/index.mjs.map +0 -7
  180. package/dist/lib/browser/sentry-log-processor-625AISXI.mjs +0 -146
  181. package/dist/lib/browser/sentry-log-processor-625AISXI.mjs.map +0 -7
  182. package/dist/lib/node/chunk-325GAGFA.cjs +0 -213
  183. package/dist/lib/node/chunk-325GAGFA.cjs.map +0 -7
  184. package/dist/lib/node/chunk-BZHVFSLF.cjs +0 -1025
  185. package/dist/lib/node/chunk-BZHVFSLF.cjs.map +0 -7
  186. package/dist/lib/node/chunk-GIYJMZEQ.cjs +0 -2
  187. package/dist/lib/node/chunk-GIYJMZEQ.cjs.map +0 -7
  188. package/dist/lib/node/chunk-MZ3PMDTP.cjs +0 -163
  189. package/dist/lib/node/chunk-MZ3PMDTP.cjs.map +0 -7
  190. package/dist/lib/node/index.cjs +0 -60
  191. package/dist/lib/node/index.cjs.map +0 -7
  192. package/dist/lib/node/meta.json +0 -1
  193. package/dist/lib/node/observability-E2NGRIEN.cjs +0 -32
  194. package/dist/lib/node/observability-E2NGRIEN.cjs.map +0 -7
  195. package/dist/lib/node/otel-VF5YNCR3.cjs +0 -278
  196. package/dist/lib/node/otel-VF5YNCR3.cjs.map +0 -7
  197. package/dist/lib/node/segment/index.cjs +0 -33
  198. package/dist/lib/node/segment/index.cjs.map +0 -7
  199. package/dist/lib/node/sentry/index.cjs +0 -46
  200. package/dist/lib/node/sentry/index.cjs.map +0 -7
  201. package/dist/lib/node/sentry-log-processor-CCV4RL7N.cjs +0 -164
  202. package/dist/lib/node/sentry-log-processor-CCV4RL7N.cjs.map +0 -7
  203. package/dist/lib/node-esm/chunk-AZMSBUWR.mjs +0 -202
  204. package/dist/lib/node-esm/chunk-AZMSBUWR.mjs.map +0 -7
  205. package/dist/lib/node-esm/chunk-H7Y2DDUN.mjs +0 -135
  206. package/dist/lib/node-esm/chunk-H7Y2DDUN.mjs.map +0 -7
  207. package/dist/lib/node-esm/chunk-M7QJLFGR.mjs +0 -997
  208. package/dist/lib/node-esm/chunk-M7QJLFGR.mjs.map +0 -7
  209. package/dist/lib/node-esm/chunk-YJ4KVBWC.mjs +0 -2
  210. package/dist/lib/node-esm/chunk-YJ4KVBWC.mjs.map +0 -7
  211. package/dist/lib/node-esm/observability-7BTI46NM.mjs +0 -11
  212. package/dist/lib/node-esm/observability-7BTI46NM.mjs.map +0 -7
  213. package/dist/lib/node-esm/otel-AF5TSABC.mjs +0 -260
  214. package/dist/lib/node-esm/otel-AF5TSABC.mjs.map +0 -7
  215. package/dist/lib/node-esm/segment/index.mjs +0 -12
  216. package/dist/lib/node-esm/segment/index.mjs.map +0 -7
  217. package/dist/lib/node-esm/sentry/index.mjs +0 -25
  218. package/dist/lib/node-esm/sentry/index.mjs.map +0 -7
  219. package/dist/lib/node-esm/sentry-log-processor-HPUPCMRG.mjs +0 -147
  220. package/dist/lib/node-esm/sentry-log-processor-HPUPCMRG.mjs.map +0 -7
  221. package/dist/types/src/helpers/browser-observability.d.ts +0 -17
  222. package/dist/types/src/helpers/browser-observability.d.ts.map +0 -1
  223. package/dist/types/src/helpers/browser-observability.js +0 -140
  224. package/dist/types/src/helpers/browser-observability.js.map +0 -1
  225. package/dist/types/src/helpers/common.d.ts +0 -12
  226. package/dist/types/src/helpers/common.d.ts.map +0 -1
  227. package/dist/types/src/helpers/common.js +0 -23
  228. package/dist/types/src/helpers/common.js.map +0 -1
  229. package/dist/types/src/helpers/index.d.ts +0 -6
  230. package/dist/types/src/helpers/index.d.ts.map +0 -1
  231. package/dist/types/src/helpers/index.js +0 -9
  232. package/dist/types/src/helpers/index.js.map +0 -1
  233. package/dist/types/src/helpers/map-spaces.d.ts +0 -18
  234. package/dist/types/src/helpers/map-spaces.d.ts.map +0 -1
  235. package/dist/types/src/helpers/map-spaces.js +0 -37
  236. package/dist/types/src/helpers/map-spaces.js.map +0 -1
  237. package/dist/types/src/helpers/node-observability.d.ts +0 -24
  238. package/dist/types/src/helpers/node-observability.d.ts.map +0 -1
  239. package/dist/types/src/helpers/node-observability.js +0 -101
  240. package/dist/types/src/helpers/node-observability.js.map +0 -1
  241. package/dist/types/src/helpers/setup-telemetry-listeners.d.ts +0 -4
  242. package/dist/types/src/helpers/setup-telemetry-listeners.d.ts.map +0 -1
  243. package/dist/types/src/helpers/setup-telemetry-listeners.js +0 -97
  244. package/dist/types/src/helpers/setup-telemetry-listeners.js.map +0 -1
  245. package/dist/types/src/otel/index.d.ts +0 -5
  246. package/dist/types/src/otel/index.d.ts.map +0 -1
  247. package/dist/types/src/otel/index.js +0 -8
  248. package/dist/types/src/otel/index.js.map +0 -1
  249. package/dist/types/src/otel/logs.d.ts.map +0 -1
  250. package/dist/types/src/otel/logs.js +0 -71
  251. package/dist/types/src/otel/logs.js.map +0 -1
  252. package/dist/types/src/otel/metrics.d.ts.map +0 -1
  253. package/dist/types/src/otel/metrics.js.map +0 -1
  254. package/dist/types/src/otel/otel.d.ts.map +0 -1
  255. package/dist/types/src/otel/otel.js.map +0 -1
  256. package/dist/types/src/otel/traces-browser.d.ts.map +0 -1
  257. package/dist/types/src/otel/traces-browser.js +0 -47
  258. package/dist/types/src/otel/traces-browser.js.map +0 -1
  259. package/dist/types/src/otel/traces.d.ts.map +0 -1
  260. package/dist/types/src/otel/traces.js +0 -40
  261. package/dist/types/src/otel/traces.js.map +0 -1
  262. package/dist/types/src/segment/base.d.ts +0 -15
  263. package/dist/types/src/segment/base.d.ts.map +0 -1
  264. package/dist/types/src/segment/base.js +0 -50
  265. package/dist/types/src/segment/base.js.map +0 -1
  266. package/dist/types/src/segment/browser.d.ts +0 -15
  267. package/dist/types/src/segment/browser.d.ts.map +0 -1
  268. package/dist/types/src/segment/browser.js +0 -67
  269. package/dist/types/src/segment/browser.js.map +0 -1
  270. package/dist/types/src/segment/index.d.ts +0 -3
  271. package/dist/types/src/segment/index.d.ts.map +0 -1
  272. package/dist/types/src/segment/index.js +0 -6
  273. package/dist/types/src/segment/index.js.map +0 -1
  274. package/dist/types/src/segment/node.d.ts +0 -16
  275. package/dist/types/src/segment/node.d.ts.map +0 -1
  276. package/dist/types/src/segment/node.js +0 -83
  277. package/dist/types/src/segment/node.js.map +0 -1
  278. package/dist/types/src/segment/types.d.ts +0 -52
  279. package/dist/types/src/segment/types.d.ts.map +0 -1
  280. package/dist/types/src/segment/types.js +0 -18
  281. package/dist/types/src/segment/types.js.map +0 -1
  282. package/dist/types/src/sentry/browser.d.ts +0 -32
  283. package/dist/types/src/sentry/browser.d.ts.map +0 -1
  284. package/dist/types/src/sentry/browser.js +0 -112
  285. package/dist/types/src/sentry/browser.js.map +0 -1
  286. package/dist/types/src/sentry/index.d.ts +0 -3
  287. package/dist/types/src/sentry/index.d.ts.map +0 -1
  288. package/dist/types/src/sentry/index.js +0 -6
  289. package/dist/types/src/sentry/index.js.map +0 -1
  290. package/dist/types/src/sentry/node.d.ts +0 -32
  291. package/dist/types/src/sentry/node.d.ts.map +0 -1
  292. package/dist/types/src/sentry/node.js +0 -111
  293. package/dist/types/src/sentry/node.js.map +0 -1
  294. package/dist/types/src/sentry/node.node.test.d.ts +0 -2
  295. package/dist/types/src/sentry/node.node.test.d.ts.map +0 -1
  296. package/dist/types/src/sentry/node.node.test.js +0 -34
  297. package/dist/types/src/sentry/node.node.test.js.map +0 -1
  298. package/dist/types/src/sentry/sentry-log-processor.d.ts +0 -9
  299. package/dist/types/src/sentry/sentry-log-processor.d.ts.map +0 -1
  300. package/dist/types/src/sentry/sentry-log-processor.js +0 -149
  301. package/dist/types/src/sentry/sentry-log-processor.js.map +0 -1
  302. package/dist/types/src/sentry/sentry.node.test.d.ts +0 -2
  303. package/dist/types/src/sentry/sentry.node.test.d.ts.map +0 -1
  304. package/dist/types/src/sentry/sentry.node.test.js +0 -28
  305. package/dist/types/src/sentry/sentry.node.test.js.map +0 -1
  306. package/dist/types/src/sentry/types.d.ts +0 -18
  307. package/dist/types/src/sentry/types.d.ts.map +0 -1
  308. package/dist/types/src/sentry/types.js +0 -4
  309. package/dist/types/src/sentry/types.js.map +0 -1
  310. package/dist/types/src/testing/index.d.ts +0 -2
  311. package/dist/types/src/testing/index.d.ts.map +0 -1
  312. package/dist/types/src/testing/index.js +0 -5
  313. package/dist/types/src/testing/index.js.map +0 -1
  314. package/dist/types/src/testing/testkit/browser.d.ts +0 -2
  315. package/dist/types/src/testing/testkit/browser.d.ts.map +0 -1
  316. package/dist/types/src/testing/testkit/browser.js +0 -7
  317. package/dist/types/src/testing/testkit/browser.js.map +0 -1
  318. package/dist/types/src/testing/testkit/index.d.ts +0 -2
  319. package/dist/types/src/testing/testkit/index.d.ts.map +0 -1
  320. package/dist/types/src/testing/testkit/index.js +0 -6
  321. package/dist/types/src/testing/testkit/index.js.map +0 -1
  322. package/src/helpers/browser-observability.ts +0 -177
  323. package/src/helpers/common.ts +0 -38
  324. package/src/helpers/index.ts +0 -9
  325. package/src/helpers/map-spaces.ts +0 -48
  326. package/src/helpers/setup-telemetry-listeners.ts +0 -108
  327. package/src/otel/index.ts +0 -8
  328. package/src/otel/logs.ts +0 -100
  329. package/src/otel/traces-browser.ts +0 -59
  330. package/src/otel/traces.ts +0 -57
  331. package/src/segment/base.ts +0 -69
  332. package/src/segment/browser.ts +0 -68
  333. package/src/segment/node.ts +0 -94
  334. package/src/segment/types.ts +0 -57
  335. package/src/sentry/browser.ts +0 -133
  336. package/src/sentry/node.node.test.ts +0 -39
  337. package/src/sentry/node.ts +0 -126
  338. package/src/sentry/sentry-log-processor.ts +0 -166
  339. package/src/sentry/sentry.node.test.ts +0 -34
  340. package/src/sentry/types.ts +0 -22
  341. package/src/testing/index.ts +0 -5
  342. package/src/testing/testkit/browser.ts +0 -8
  343. package/src/testing/testkit/index.ts +0 -7
  344. package/src/testing/testkit/shims.d.ts +0 -5
  345. /package/dist/lib/browser/{chunk-KDP3SESE.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  346. /package/dist/lib/{browser/observability-HDE3I7TA.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
  347. /package/dist/types/src/{otel → extensions/otel}/traces-browser.d.ts +0 -0
  348. /package/dist/types/src/{otel → extensions/otel}/traces.d.ts +0 -0
@@ -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
+ };
@@ -0,0 +1,531 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { describe, it } from '@effect/vitest';
6
+ import * as Effect from 'effect/Effect';
7
+ import * as Exit from 'effect/Exit';
8
+ import * as Function from 'effect/Function';
9
+ import { expect, vi } from 'vitest';
10
+
11
+ import * as Observability from './observability';
12
+ import { type Extension, type ExtensionApi } from './observability-extension';
13
+
14
+ const createMockExtension = (overrides?: Partial<Extension> & { apis?: ExtensionApi[] }): Extension => ({
15
+ initialize: vi.fn(() => Effect.succeed(undefined)),
16
+ close: vi.fn(() => Effect.succeed(undefined)),
17
+ enable: vi.fn(() => Effect.succeed(undefined)),
18
+ disable: vi.fn(() => Effect.succeed(undefined)),
19
+ flush: vi.fn(() => Effect.succeed(undefined)),
20
+ identify: vi.fn(),
21
+ alias: vi.fn(),
22
+ setTags: vi.fn(),
23
+ enabled: true,
24
+ apis: [],
25
+ ...overrides,
26
+ });
27
+
28
+ describe('Observability', () => {
29
+ describe('lifecycle', () => {
30
+ it.effect('initializes all extensions in order', () =>
31
+ Effect.gen(function* () {
32
+ const callOrder: number[] = [];
33
+ const ext1 = createMockExtension({
34
+ initialize: vi.fn(() => {
35
+ callOrder.push(1);
36
+ return Effect.succeed(undefined);
37
+ }),
38
+ });
39
+ const ext2 = createMockExtension({
40
+ initialize: vi.fn(() => {
41
+ callOrder.push(2);
42
+ return Effect.succeed(undefined);
43
+ }),
44
+ });
45
+
46
+ yield* Function.pipe(
47
+ Observability.make(),
48
+ Observability.addExtension(Effect.succeed(ext1)),
49
+ Observability.addExtension(Effect.succeed(ext2)),
50
+ Observability.initialize,
51
+ );
52
+ expect(callOrder).toEqual([1, 2]);
53
+ }),
54
+ );
55
+
56
+ it.effect('calls close on all extensions', () =>
57
+ Effect.gen(function* () {
58
+ const ext1 = createMockExtension();
59
+ const ext2 = createMockExtension();
60
+
61
+ const obs = yield* Function.pipe(
62
+ Observability.make(),
63
+ Observability.addExtension(Effect.succeed(ext1)),
64
+ Observability.addExtension(Effect.succeed(ext2)),
65
+ Observability.initialize,
66
+ );
67
+ yield* obs.close();
68
+ expect(ext1.close).toHaveBeenCalled();
69
+ expect(ext2.close).toHaveBeenCalled();
70
+ }),
71
+ );
72
+
73
+ it.effect('initialize is idempotent (second call is no-op)', () =>
74
+ Effect.gen(function* () {
75
+ const ext = createMockExtension();
76
+ const obs = yield* Function.pipe(
77
+ Observability.make(),
78
+ Observability.addExtension(Effect.succeed(ext)),
79
+ Observability.initialize,
80
+ );
81
+ yield* obs.initialize();
82
+ expect(ext.initialize).toHaveBeenCalledTimes(1);
83
+ }),
84
+ );
85
+
86
+ it.effect('initialize resets on error (can retry)', () =>
87
+ Effect.gen(function* () {
88
+ let callCount = 0;
89
+ const ext = createMockExtension({
90
+ initialize: vi.fn(() =>
91
+ ++callCount === 1 ? Effect.fail(new Error('init failed')) : Effect.succeed(undefined),
92
+ ),
93
+ });
94
+
95
+ const obs = yield* Function.pipe(Observability.make(), Observability.addExtension(Effect.succeed(ext)));
96
+ // First init fails but is caught internally.
97
+ yield* obs.initialize();
98
+ // Can retry since _initialized was reset.
99
+ yield* obs.initialize();
100
+ expect(callCount).toBe(2);
101
+ }),
102
+ );
103
+
104
+ it.effect('close clears subscriptions', () =>
105
+ Effect.gen(function* () {
106
+ const cleanup = vi.fn();
107
+ const provider: Observability.DataProvider = () => Effect.succeed(cleanup);
108
+
109
+ const obs = yield* Function.pipe(
110
+ Observability.make(),
111
+ Observability.addDataProvider(provider),
112
+ Observability.initialize,
113
+ );
114
+ yield* obs.close();
115
+ expect(cleanup).toHaveBeenCalled();
116
+ }),
117
+ );
118
+ });
119
+
120
+ describe('enable/disable', () => {
121
+ it.effect('enable calls enable on all extensions', () =>
122
+ Effect.gen(function* () {
123
+ const ext1 = createMockExtension();
124
+ const ext2 = createMockExtension();
125
+ const obs = yield* Function.pipe(
126
+ Observability.make(),
127
+ Observability.addExtension(Effect.succeed(ext1)),
128
+ Observability.addExtension(Effect.succeed(ext2)),
129
+ Observability.initialize,
130
+ );
131
+ yield* obs.enable();
132
+ expect(ext1.enable).toHaveBeenCalled();
133
+ expect(ext2.enable).toHaveBeenCalled();
134
+ }),
135
+ );
136
+
137
+ it.effect('disable calls disable on all extensions', () =>
138
+ Effect.gen(function* () {
139
+ const ext1 = createMockExtension();
140
+ const ext2 = createMockExtension();
141
+ const obs = yield* Function.pipe(
142
+ Observability.make(),
143
+ Observability.addExtension(Effect.succeed(ext1)),
144
+ Observability.addExtension(Effect.succeed(ext2)),
145
+ Observability.initialize,
146
+ );
147
+ yield* obs.disable();
148
+ expect(ext1.disable).toHaveBeenCalled();
149
+ expect(ext2.disable).toHaveBeenCalled();
150
+ }),
151
+ );
152
+ });
153
+
154
+ describe('flush', () => {
155
+ it.effect('flush calls flush on all extensions', () =>
156
+ Effect.gen(function* () {
157
+ const ext1 = createMockExtension();
158
+ const ext2 = createMockExtension();
159
+ const obs = yield* Function.pipe(
160
+ Observability.make(),
161
+ Observability.addExtension(Effect.succeed(ext1)),
162
+ Observability.addExtension(Effect.succeed(ext2)),
163
+ Observability.initialize,
164
+ );
165
+ yield* obs.flush();
166
+ expect(ext1.flush).toHaveBeenCalled();
167
+ expect(ext2.flush).toHaveBeenCalled();
168
+ }),
169
+ );
170
+ });
171
+
172
+ describe('extensions', () => {
173
+ it.effect('cannot add extension after initialization', () =>
174
+ Effect.gen(function* () {
175
+ const obs = yield* Function.pipe(Observability.make(), Observability.initialize);
176
+ // addExtension calls the internal _addExtension which throws an invariant after init.
177
+ // The invariant throw becomes a defect inside Effect.gen.
178
+ const exit = yield* Function.pipe(
179
+ Effect.succeed(obs),
180
+ Observability.addExtension(Effect.succeed(createMockExtension())),
181
+ Effect.exit,
182
+ );
183
+ expect(Exit.isFailure(exit)).toBe(true);
184
+ }),
185
+ );
186
+
187
+ it.effect('enabled returns true when all extensions are enabled', () =>
188
+ Effect.gen(function* () {
189
+ const ext1 = createMockExtension({ enabled: true });
190
+ const ext2 = createMockExtension({ enabled: true });
191
+ const obs = yield* Function.pipe(
192
+ Observability.make(),
193
+ Observability.addExtension(Effect.succeed(ext1)),
194
+ Observability.addExtension(Effect.succeed(ext2)),
195
+ Observability.initialize,
196
+ );
197
+ expect(obs.enabled).toBe(true);
198
+ }),
199
+ );
200
+
201
+ it.effect('enabled returns false when any extension is disabled', () =>
202
+ Effect.gen(function* () {
203
+ const ext1 = createMockExtension({ enabled: true });
204
+ const ext2 = createMockExtension({ enabled: false });
205
+ const obs = yield* Function.pipe(
206
+ Observability.make(),
207
+ Observability.addExtension(Effect.succeed(ext1)),
208
+ Observability.addExtension(Effect.succeed(ext2)),
209
+ Observability.initialize,
210
+ );
211
+ expect(obs.enabled).toBe(false);
212
+ }),
213
+ );
214
+ });
215
+
216
+ describe('identify/alias', () => {
217
+ it.effect('identify forwards to all extensions', () =>
218
+ Effect.gen(function* () {
219
+ const ext1 = createMockExtension();
220
+ const ext2 = createMockExtension();
221
+ const obs = yield* Function.pipe(
222
+ Observability.make(),
223
+ Observability.addExtension(Effect.succeed(ext1)),
224
+ Observability.addExtension(Effect.succeed(ext2)),
225
+ Observability.initialize,
226
+ );
227
+ obs.identify('user-1', { name: 'Alice' }, { first_seen: 'today' });
228
+ expect(ext1.identify).toHaveBeenCalledWith('user-1', { name: 'Alice' }, { first_seen: 'today' });
229
+ expect(ext2.identify).toHaveBeenCalledWith('user-1', { name: 'Alice' }, { first_seen: 'today' });
230
+ }),
231
+ );
232
+
233
+ it.effect('alias forwards to all extensions', () =>
234
+ Effect.gen(function* () {
235
+ const ext1 = createMockExtension();
236
+ const ext2 = createMockExtension();
237
+ const obs = yield* Function.pipe(
238
+ Observability.make(),
239
+ Observability.addExtension(Effect.succeed(ext1)),
240
+ Observability.addExtension(Effect.succeed(ext2)),
241
+ Observability.initialize,
242
+ );
243
+ obs.alias('new-id', 'old-id');
244
+ expect(ext1.alias).toHaveBeenCalledWith('new-id', 'old-id');
245
+ expect(ext2.alias).toHaveBeenCalledWith('new-id', 'old-id');
246
+ }),
247
+ );
248
+ });
249
+
250
+ describe('setTags', () => {
251
+ it.effect('forwards processed tags to all extensions', () =>
252
+ Effect.gen(function* () {
253
+ const ext = createMockExtension();
254
+ const obs = yield* Function.pipe(
255
+ Observability.make(),
256
+ Observability.addExtension(Effect.succeed(ext)),
257
+ Observability.initialize,
258
+ );
259
+ obs.setTags({ key: 'value' });
260
+ expect(ext.setTags).toHaveBeenCalledWith({ key: 'value' });
261
+ }),
262
+ );
263
+
264
+ it.effect('filters out undefined values', () =>
265
+ Effect.gen(function* () {
266
+ const ext = createMockExtension();
267
+ const obs = yield* Function.pipe(
268
+ Observability.make(),
269
+ Observability.addExtension(Effect.succeed(ext)),
270
+ Observability.initialize,
271
+ );
272
+ obs.setTags({ key: 'value', empty: undefined });
273
+ expect(ext.setTags).toHaveBeenCalledWith({ key: 'value' });
274
+ }),
275
+ );
276
+
277
+ it.effect('converts values to strings', () =>
278
+ Effect.gen(function* () {
279
+ const ext = createMockExtension();
280
+ const obs = yield* Function.pipe(
281
+ Observability.make(),
282
+ Observability.addExtension(Effect.succeed(ext)),
283
+ Observability.initialize,
284
+ );
285
+ obs.setTags({ count: 42, flag: true });
286
+ expect(ext.setTags).toHaveBeenCalledWith({ count: '42', flag: 'true' });
287
+ }),
288
+ );
289
+
290
+ it.effect('filters by kind when specified', () =>
291
+ Effect.gen(function* () {
292
+ const errorsExt = createMockExtension({
293
+ apis: [{ kind: 'errors', isAvailable: () => Effect.succeed(true), captureException: vi.fn() }],
294
+ });
295
+ const eventsExt = createMockExtension({
296
+ apis: [{ kind: 'events', isAvailable: () => Effect.succeed(true), captureEvent: vi.fn() }],
297
+ });
298
+ const obs = yield* Function.pipe(
299
+ Observability.make(),
300
+ Observability.addExtension(Effect.succeed(errorsExt)),
301
+ Observability.addExtension(Effect.succeed(eventsExt)),
302
+ Observability.initialize,
303
+ );
304
+
305
+ obs.setTags({ key: 'value' }, 'errors');
306
+ expect(errorsExt.setTags).toHaveBeenCalledWith({ key: 'value' });
307
+ // The eventsExt is skipped because its api kind ('events') !== 'errors'.
308
+ expect(eventsExt.setTags).not.toHaveBeenCalled();
309
+ }),
310
+ );
311
+ });
312
+
313
+ describe('api delegation', () => {
314
+ it.effect('errors.captureException delegates to error-kind extensions only', () =>
315
+ Effect.gen(function* () {
316
+ const captureException = vi.fn();
317
+ const errorsExt = createMockExtension({
318
+ apis: [{ kind: 'errors', isAvailable: () => Effect.succeed(true), captureException }],
319
+ });
320
+ const eventsExt = createMockExtension({
321
+ apis: [{ kind: 'events', isAvailable: () => Effect.succeed(true), captureEvent: vi.fn() }],
322
+ });
323
+ const obs = yield* Function.pipe(
324
+ Observability.make(),
325
+ Observability.addExtension(Effect.succeed(errorsExt)),
326
+ Observability.addExtension(Effect.succeed(eventsExt)),
327
+ Observability.initialize,
328
+ );
329
+ const error = new Error('test');
330
+ obs.errors.captureException(error, { context: 'test' });
331
+ expect(captureException).toHaveBeenCalledWith(error, { context: 'test' });
332
+ }),
333
+ );
334
+
335
+ it.effect('events.captureEvent delegates to events-kind extensions only', () =>
336
+ Effect.gen(function* () {
337
+ const captureEvent = vi.fn();
338
+ const eventsExt = createMockExtension({
339
+ apis: [{ kind: 'events', isAvailable: () => Effect.succeed(true), captureEvent }],
340
+ });
341
+ const errorsExt = createMockExtension({
342
+ apis: [{ kind: 'errors', isAvailable: () => Effect.succeed(true), captureException: vi.fn() }],
343
+ });
344
+ const obs = yield* Function.pipe(
345
+ Observability.make(),
346
+ Observability.addExtension(Effect.succeed(eventsExt)),
347
+ Observability.addExtension(Effect.succeed(errorsExt)),
348
+ Observability.initialize,
349
+ );
350
+ obs.events.captureEvent('button_click', { page: 'home' });
351
+ expect(captureEvent).toHaveBeenCalledWith('button_click', { page: 'home' });
352
+ }),
353
+ );
354
+
355
+ it.effect('feedback.captureUserFeedback delegates to feedback-kind extensions only', () =>
356
+ Effect.gen(function* () {
357
+ const captureUserFeedback = vi.fn();
358
+ const feedbackExt = createMockExtension({
359
+ apis: [{ kind: 'feedback', isAvailable: () => Effect.succeed(true), captureUserFeedback }],
360
+ });
361
+ const obs = yield* Function.pipe(
362
+ Observability.make(),
363
+ Observability.addExtension(Effect.succeed(feedbackExt)),
364
+ Observability.initialize,
365
+ );
366
+ obs.feedback.captureUserFeedback({ message: 'great app' });
367
+ expect(captureUserFeedback).toHaveBeenCalledWith({ message: 'great app' });
368
+ }),
369
+ );
370
+
371
+ it.effect('metrics delegates to metrics-kind extensions only', () =>
372
+ Effect.gen(function* () {
373
+ const gauge = vi.fn();
374
+ const increment = vi.fn();
375
+ const distribution = vi.fn();
376
+ const metricsExt = createMockExtension({
377
+ apis: [{ kind: 'metrics', isAvailable: () => Effect.succeed(true), gauge, increment, distribution }],
378
+ });
379
+ const obs = yield* Function.pipe(
380
+ Observability.make(),
381
+ Observability.addExtension(Effect.succeed(metricsExt)),
382
+ Observability.initialize,
383
+ );
384
+ obs.metrics.gauge('cpu', 0.5, { host: 'a' });
385
+ obs.metrics.increment('requests', 1, { route: '/api' });
386
+ obs.metrics.distribution('latency', 120, { endpoint: '/api' });
387
+ expect(gauge).toHaveBeenCalledWith('cpu', 0.5, { host: 'a' });
388
+ expect(increment).toHaveBeenCalledWith('requests', 1, { route: '/api' });
389
+ expect(distribution).toHaveBeenCalledWith('latency', 120, { endpoint: '/api' });
390
+ }),
391
+ );
392
+
393
+ it.effect('ignores extensions that do not provide the requested kind', () =>
394
+ Effect.gen(function* () {
395
+ const captureException = vi.fn();
396
+ const ext = createMockExtension({
397
+ apis: [{ kind: 'errors', isAvailable: () => Effect.succeed(true), captureException }],
398
+ });
399
+ const obs = yield* Function.pipe(
400
+ Observability.make(),
401
+ Observability.addExtension(Effect.succeed(ext)),
402
+ Observability.initialize,
403
+ );
404
+ // Call events — errors extension should not be invoked.
405
+ obs.events.captureEvent('test', {});
406
+ expect(captureException).not.toHaveBeenCalled();
407
+ }),
408
+ );
409
+ });
410
+
411
+ describe('data providers', () => {
412
+ it.effect('providers registered before init run during initialization', () =>
413
+ Effect.gen(function* () {
414
+ const providerFn = vi.fn();
415
+ const provider: Observability.DataProvider = (obs) => {
416
+ providerFn(obs);
417
+ return Effect.succeed(undefined);
418
+ };
419
+
420
+ yield* Function.pipe(Observability.make(), Observability.addDataProvider(provider), Observability.initialize);
421
+ expect(providerFn).toHaveBeenCalledTimes(1);
422
+ }),
423
+ );
424
+
425
+ it.effect('addDataProvider (post-init) immediately runs provider', () =>
426
+ Effect.gen(function* () {
427
+ const cleanup = vi.fn();
428
+ const provider: Observability.DataProvider = () => Effect.succeed(cleanup);
429
+
430
+ const obs = yield* Function.pipe(Observability.make(), Observability.initialize);
431
+ yield* obs.addDataProvider(provider);
432
+ // Provider runs immediately; cleanup registered.
433
+ yield* obs.close();
434
+ expect(cleanup).toHaveBeenCalled();
435
+ }),
436
+ );
437
+
438
+ it.effect('provider cleanup functions are called on close', () =>
439
+ Effect.gen(function* () {
440
+ const cleanup1 = vi.fn();
441
+ const cleanup2 = vi.fn();
442
+ const provider1: Observability.DataProvider = () => Effect.succeed(cleanup1);
443
+ const provider2: Observability.DataProvider = () => Effect.succeed(cleanup2);
444
+
445
+ const obs = yield* Function.pipe(
446
+ Observability.make(),
447
+ Observability.addDataProvider(provider1),
448
+ Observability.addDataProvider(provider2),
449
+ Observability.initialize,
450
+ );
451
+ yield* obs.close();
452
+ expect(cleanup1).toHaveBeenCalled();
453
+ expect(cleanup2).toHaveBeenCalled();
454
+ }),
455
+ );
456
+
457
+ it.effect('provider errors do not crash initialization', () =>
458
+ Effect.gen(function* () {
459
+ const failingProvider: Observability.DataProvider = () => Effect.fail(new Error('provider failed'));
460
+ const obs = yield* Function.pipe(Observability.make(), Observability.addDataProvider(failingProvider));
461
+ // Should not throw — error is caught internally.
462
+ yield* obs.initialize();
463
+ }),
464
+ );
465
+ });
466
+
467
+ describe('composition helpers', () => {
468
+ it.effect('make() creates a new Observability instance', () =>
469
+ Effect.gen(function* () {
470
+ const obs = yield* Observability.make();
471
+ expect(obs).toBeDefined();
472
+ expect(typeof obs.initialize).toBe('function');
473
+ expect(typeof obs.close).toBe('function');
474
+ expect(typeof obs.enable).toBe('function');
475
+ expect(typeof obs.disable).toBe('function');
476
+ }),
477
+ );
478
+
479
+ it.effect('addExtension pipes an extension into the instance', () =>
480
+ Effect.gen(function* () {
481
+ const ext = createMockExtension();
482
+ const obs = yield* Function.pipe(Observability.make(), Observability.addExtension(Effect.succeed(ext)));
483
+ yield* obs.initialize();
484
+ expect(ext.initialize).toHaveBeenCalled();
485
+ }),
486
+ );
487
+
488
+ it.effect('addDataProvider pipes a provider into the instance', () =>
489
+ Effect.gen(function* () {
490
+ const providerFn = vi.fn(() => Effect.succeed(undefined));
491
+ const provider: Observability.DataProvider = () => providerFn();
492
+
493
+ const obs = yield* Function.pipe(Observability.make(), Observability.addDataProvider(provider));
494
+ yield* obs.initialize();
495
+ expect(providerFn).toHaveBeenCalled();
496
+ }),
497
+ );
498
+
499
+ it.effect('initialize triggers initialization', () =>
500
+ Effect.gen(function* () {
501
+ const ext = createMockExtension();
502
+ const obs = yield* Function.pipe(
503
+ Observability.make(),
504
+ Observability.addExtension(Effect.succeed(ext)),
505
+ Observability.initialize,
506
+ );
507
+ expect(ext.initialize).toHaveBeenCalled();
508
+ expect(obs).toBeDefined();
509
+ }),
510
+ );
511
+
512
+ it.effect('full pipeline: make -> addExtension -> addDataProvider -> initialize', () =>
513
+ Effect.gen(function* () {
514
+ const ext = createMockExtension();
515
+ const providerFn = vi.fn(() => Effect.succeed(undefined));
516
+ const provider: Observability.DataProvider = () => providerFn();
517
+
518
+ const obs = yield* Function.pipe(
519
+ Observability.make(),
520
+ Observability.addExtension(Effect.succeed(ext)),
521
+ Observability.addDataProvider(provider),
522
+ Observability.initialize,
523
+ );
524
+
525
+ expect(ext.initialize).toHaveBeenCalled();
526
+ expect(providerFn).toHaveBeenCalled();
527
+ expect(obs.enabled).toBe(true);
528
+ }),
529
+ );
530
+ });
531
+ });