@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
@@ -1,488 +1,209 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2025 DXOS.org
3
3
  //
4
- import { Event, scheduleTaskInterval } from '@dxos/async';
5
- import { PublicKey } from '@dxos/client';
6
- import { Context } from '@dxos/context';
4
+ import * as Array from 'effect/Array';
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Function from 'effect/Function';
7
+ import { SubscriptionList } from '@dxos/async';
7
8
  import { invariant } from '@dxos/invariant';
8
- import { log, LogLevel } from '@dxos/log';
9
- import { ConnectionState } from '@dxos/network-manager';
10
- import { DeviceKind, Platform } from '@dxos/protocols/proto/dxos/client/services';
11
- import { isNode } from '@dxos/util';
12
- import buildSecrets from './cli-observability-secrets.json';
13
- import { getTelemetryIdentity, mapSpaces } from './helpers';
14
- import { TelemetryEvent } from './segment';
15
- const SPACE_METRICS_MIN_INTERVAL = 1000 * 60; // 1 minute
16
- const SPACE_TELEMETRY_MIN_INTERVAL = 1000 * 60 * 60; // 1 hour
17
- const NETWORK_METRICS_MIN_INTERVAL = 1000 * 60 * 5; // 5 minutes
18
- /*
19
- * Observability provides a common interface for error logging, metrics, and telemetry.
20
- * It currently provides these capabilities using Sentry, OpenTelemetry, and Segment.
21
- *
22
- * Segment:
23
- * https://app.segment.com/dxos/sources/composer-app/debugger
24
- * https://app.segment.com/dxos/sources/composer-app/settings/keys
25
- *
26
- * NOTE:
27
- * - Segment maintains a set of admin creates Source (e.g., "composer-app").
28
- * - Each source has at least one API_KEY, which is used by the client.
29
- *
30
- * Testing:
31
- * https://app.segment.com/dxos/sources/composer-app/settings/keys
32
- * - DX_TELEMETRY_API_KEY
33
- * - DX_SENTRY_DESTINATION
34
- *
35
- * Sentry:
36
- * https://sentry.io/organizations/dxos/issues
37
- *
38
- * OpenTelemetry:
39
- * https://dxosorg.grafana.net/explore
40
- */
41
- export class Observability {
42
- // TODO(nf): make platform a required extension?
43
- constructor({ mode, namespace, environment, release, config, group, secrets, telemetry, errorLog, }) {
44
- var _a;
45
- this._tags = new Map();
46
- this._ctx = new Context();
47
- this.setIPDataTelemetryTags = (ipData) => {
48
- this.setTag('city', ipData.city, 'telemetry');
49
- this.setTag('region', ipData.region, 'telemetry');
50
- this.setTag('country', ipData.country, 'telemetry');
51
- ipData.latitude && this.setTag('latitude', ipData.latitude.toString(), 'telemetry');
52
- ipData.longitude && this.setTag('longitude', ipData.longitude.toString(), 'telemetry');
53
- };
54
- this._mode = mode;
55
- this._namespace = namespace;
56
- this._config = config;
57
- this._group = group;
58
- this._secrets = this._loadSecrets(config, secrets);
59
- this._telemetryBatchSize = (_a = telemetry === null || telemetry === void 0 ? void 0 : telemetry.batchSize) !== null && _a !== void 0 ? _a : 30;
60
- this._errorReportingOptions = errorLog === null || errorLog === void 0 ? void 0 : errorLog.sentryInitOptions;
61
- // Tags.
62
- this.setTag('mode', this._mode);
63
- this.setTag('namespace', this._namespace);
64
- this.setTag('environment', environment);
65
- this.setTag('release', release);
66
- this.setTag('session', PublicKey.random().toHex());
67
- this.setTag('group', this._group);
68
- }
69
- get mode() {
70
- return this._mode;
71
- }
72
- get group() {
73
- return this._group;
74
- }
75
- get enabled() {
76
- return this._mode !== 'disabled';
77
- }
78
- _loadSecrets(config, secrets) {
79
- if (isNode()) {
80
- const mergedSecrets = {
81
- ...buildSecrets,
82
- ...secrets,
83
- };
84
- process.env.DX_ENVIRONMENT && (mergedSecrets.DX_ENVIRONMENT = process.env.DX_ENVIRONMENT);
85
- process.env.DX_RELEASE && (mergedSecrets.DX_RELEASE = process.env.DX_RELEASE);
86
- process.env.SENTRY_DESTINATION && (mergedSecrets.SENTRY_DESTINATION = process.env.SENTRY_DESTINATION);
87
- process.env.TELEMETRY_API_KEY && (mergedSecrets.TELEMETRY_API_KEY = process.env.TELEMETRY_API_KEY);
88
- process.env.IPDATA_API_KEY && (mergedSecrets.IPDATA_API_KEY = process.env.IPDATA_API_KEY);
89
- process.env.DX_OTEL_ENDPOINT && (mergedSecrets.OTEL_ENDPOINT = process.env.DX_OTEL_ENDPOINT);
90
- process.env.DX_OTEL_AUTHORIZATION && (mergedSecrets.OTEL_AUTHORIZATION = process.env.DX_OTEL_AUTHORIZATION);
91
- return mergedSecrets;
92
- }
93
- else {
94
- log('config', { rtc: this._secrets, config });
95
- return {
96
- DX_ENVIRONMENT: config === null || config === void 0 ? void 0 : config.get('runtime.app.env.DX_ENVIRONMENT'),
97
- DX_RELEASE: config === null || config === void 0 ? void 0 : config.get('runtime.app.env.DX_RELEASE'),
98
- SENTRY_DESTINATION: config === null || config === void 0 ? void 0 : config.get('runtime.app.env.DX_SENTRY_DESTINATION'),
99
- TELEMETRY_API_KEY: config === null || config === void 0 ? void 0 : config.get('runtime.app.env.DX_TELEMETRY_API_KEY'),
100
- IPDATA_API_KEY: config === null || config === void 0 ? void 0 : config.get('runtime.app.env.DX_IPDATA_API_KEY'),
101
- OTEL_ENDPOINT: config === null || config === void 0 ? void 0 : config.get('runtime.app.env.DX_OTEL_ENDPOINT'),
102
- OTEL_AUTHORIZATION: config === null || config === void 0 ? void 0 : config.get('runtime.app.env.DX_OTEL_AUTHORIZATION'),
103
- ...secrets,
104
- };
105
- }
106
- }
107
- async initialize() {
108
- log('initializing...');
109
- await this._initLogs();
110
- await this._initMetrics();
111
- await this._initTelemetry();
112
- await this._initErrorLogs();
113
- await this._initTraces();
114
- }
115
- async close() {
116
- log('closing...');
117
- const closes = [];
118
- this._telemetry && closes.push(this._telemetry.close());
119
- this._otelMetrics && closes.push(this._otelMetrics.close());
120
- this._otelLogs && closes.push(this._otelLogs.close());
121
- await Promise.all(closes);
122
- await this._ctx.dispose();
123
- }
124
- setMode(mode) {
125
- this._mode = mode;
126
- }
127
- /**
128
- * camelCase keys are converted to snake_case in Segment.
129
- */
130
- setTag(key, value, scope) {
131
- var _a;
132
- if (value === undefined) {
133
- return;
134
- }
135
- if (this.enabled && (scope === undefined || scope === 'all' || scope === 'errors')) {
136
- (_a = this._setTag) === null || _a === void 0 ? void 0 : _a.call(this, key, value);
137
- }
138
- if (!scope) {
139
- scope = 'all';
140
- }
141
- this._tags.set(key, { value, scope });
142
- }
143
- getTag(key) {
144
- return this._tags.get(key);
145
- }
146
- // TODO(wittjosiah): Improve privacy of telemetry identifiers. See `getTelemetryIdentifier`.
147
- async setIdentityTags(clientServices) {
148
- if (clientServices.IdentityService) {
149
- clientServices.IdentityService.queryIdentity().subscribe((idqr) => {
150
- var _a, _b;
151
- if (!((_a = idqr === null || idqr === void 0 ? void 0 : idqr.identity) === null || _a === void 0 ? void 0 : _a.did)) {
152
- log('empty response from identity service', { idqr });
153
- return;
154
- }
155
- this.setTag('did', idqr.identity.did);
156
- (_b = this._telemetry) === null || _b === void 0 ? void 0 : _b.identify({ userId: idqr.identity.did });
157
- });
158
- }
159
- if (clientServices.DevicesService) {
160
- clientServices.DevicesService.queryDevices().subscribe((dqr) => {
161
- var _a;
162
- if (!dqr || !dqr.devices || dqr.devices.length === 0) {
163
- log('empty response from device service', { device: dqr });
164
- return;
165
- }
166
- invariant(dqr, 'empty response from device service');
167
- const thisDevice = dqr.devices.find((device) => device.kind === DeviceKind.CURRENT);
168
- if (!thisDevice) {
169
- log('no current device', { device: dqr });
170
- return;
171
- }
172
- this.setTag('deviceKey', thisDevice.deviceKey.truncate());
173
- if ((_a = thisDevice.profile) === null || _a === void 0 ? void 0 : _a.label) {
174
- this.setTag('deviceProfile', thisDevice.profile.label);
9
+ import { log } from '@dxos/log';
10
+ export * from './storage';
11
+ class ObservabilityImpl {
12
+ _initialized = false;
13
+ _extensions = [];
14
+ _dataProviders = [];
15
+ _subscriptions = new SubscriptionList();
16
+ initialize() {
17
+ if (this._initialized) {
18
+ return Effect.succeed(undefined);
19
+ }
20
+ const initializedExtensions = [];
21
+ return Effect.gen(this, function* () {
22
+ for (const extension of this._extensions) {
23
+ if (extension.initialize) {
24
+ yield* extension.initialize();
175
25
  }
176
- });
177
- }
178
- }
179
- //
180
- // Logs
181
- //
182
- async _initLogs() {
183
- var _a, _b;
184
- if (this._secrets.OTEL_ENDPOINT && this._secrets.OTEL_AUTHORIZATION && this._mode !== 'disabled') {
185
- const { OtelLogs } = await import('./otel');
186
- this._otelLogs = new OtelLogs({
187
- endpoint: this._secrets.OTEL_ENDPOINT,
188
- authorizationHeader: this._secrets.OTEL_AUTHORIZATION,
189
- serviceName: this._namespace,
190
- serviceVersion: (_b = (_a = this.getTag('release')) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : '0.0.0',
191
- getTags: () => Object.fromEntries(Array.from(this._tags)
192
- .filter(([key, value]) => {
193
- return value.scope === 'all' || value.scope === 'errors';
194
- })
195
- .map(([key, value]) => [key, value.value])),
196
- logLevel: LogLevel.VERBOSE,
197
- includeSharedWorkerLogs: false,
198
- });
199
- this._otelLogs && log.runtimeConfig.processors.push(this._otelLogs.logProcessor);
200
- log('otel logs enabled', { namespace: this._namespace });
201
- }
202
- else {
203
- log('otel logs disabled');
204
- }
205
- }
206
- //
207
- // Metrics
208
- //
209
- async _initMetrics() {
210
- var _a, _b;
211
- if (this.enabled && this._secrets.OTEL_ENDPOINT && this._secrets.OTEL_AUTHORIZATION) {
212
- const { OtelMetrics } = await import('./otel');
213
- this._otelMetrics = new OtelMetrics({
214
- endpoint: this._secrets.OTEL_ENDPOINT,
215
- authorizationHeader: this._secrets.OTEL_AUTHORIZATION,
216
- serviceName: this._namespace,
217
- serviceVersion: (_b = (_a = this.getTag('release')) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : '0.0.0',
218
- getTags: () => Object.fromEntries(Array.from(this._tags)
219
- .filter(([key, value]) => {
220
- return value.scope === 'all' || value.scope === 'metrics';
221
- })
222
- .map(([key, value]) => [key, value.value])),
223
- });
224
- log('otel metrics enabled');
225
- }
226
- else {
227
- log('otel metrics disabled');
228
- }
229
- }
230
- /**
231
- * Gauge metric.
232
- *
233
- * The default implementation uses OpenTelemetry
234
- */
235
- gauge(name, value, extraTags) {
236
- var _a;
237
- (_a = this._otelMetrics) === null || _a === void 0 ? void 0 : _a.gauge(name, value, extraTags);
238
- }
239
- // TODO(nf): Refactor into ObservabilityExtensions.
240
- startNetworkMetrics(clientServices) {
241
- if (!clientServices.NetworkService) {
242
- return;
243
- }
244
- // TODO(nf): support type in debounce()
245
- const updateSignalMetrics = new Event().debounce(NETWORK_METRICS_MIN_INTERVAL);
246
- updateSignalMetrics.on(this._ctx, async () => {
247
- var _a, _b, _c, _d;
248
- log('send signal metrics');
249
- (_b = (_a = this._lastNetworkStatus) === null || _a === void 0 ? void 0 : _a.signaling) === null || _b === void 0 ? void 0 : _b.forEach(({ server, state }) => {
250
- this.gauge('dxos.client.network.signal.connectionState', state, { server });
251
- });
252
- let swarmCount = 0;
253
- const connectionStates = new Map();
254
- for (const state in ConnectionState) {
255
- connectionStates.set(state, 0);
26
+ initializedExtensions.push(extension);
256
27
  }
257
- let totalReadBufferSize = 0;
258
- let totalWriteBufferSize = 0;
259
- let totalChannelBufferSize = 0;
260
- (_d = (_c = this._lastNetworkStatus) === null || _c === void 0 ? void 0 : _c.connectionInfo) === null || _d === void 0 ? void 0 : _d.forEach((connectionInfo) => {
261
- var _a, _b, _c, _d, _e, _f, _g;
262
- swarmCount++;
263
- for (const conn of (_a = connectionInfo.connections) !== null && _a !== void 0 ? _a : []) {
264
- connectionStates.set(conn.state, ((_b = connectionStates.get(conn.state)) !== null && _b !== void 0 ? _b : 0) + 1);
265
- totalReadBufferSize += (_c = conn.readBufferSize) !== null && _c !== void 0 ? _c : 0;
266
- totalWriteBufferSize += (_d = conn.writeBufferSize) !== null && _d !== void 0 ? _d : 0;
267
- for (const stream of (_e = conn.streams) !== null && _e !== void 0 ? _e : []) {
268
- totalChannelBufferSize += (_f = stream.writeBufferSize) !== null && _f !== void 0 ? _f : 0;
269
- }
28
+ const cleanups = yield* Effect.all(this._dataProviders.map((provider) => provider(this)));
29
+ this._subscriptions.add(...cleanups.filter((cleanup) => cleanup !== undefined));
30
+ this._initialized = true;
31
+ }).pipe(Effect.catchAll((error) => Effect.gen(this, function* () {
32
+ log.catch(error);
33
+ // Roll back already-initialized extensions.
34
+ for (const extension of initializedExtensions) {
35
+ if (extension.close) {
36
+ yield* extension.close().pipe(Effect.catchAll(() => Effect.succeed(undefined)));
270
37
  }
271
- this.gauge('dxos.client.network.swarm.count', swarmCount);
272
- for (const state in ConnectionState) {
273
- this.gauge('dxos.client.network.connection.count', (_g = connectionStates.get(state)) !== null && _g !== void 0 ? _g : 0, { state });
38
+ }
39
+ this._subscriptions.clear();
40
+ })));
41
+ }
42
+ close() {
43
+ return Effect.gen(this, function* () {
44
+ this._subscriptions.clear();
45
+ this._dataProviders.length = 0;
46
+ for (const extension of this._extensions) {
47
+ if (extension.close) {
48
+ yield* extension.close();
274
49
  }
275
- this.gauge('dxos.client.network.totalReadBufferSize', totalReadBufferSize);
276
- this.gauge('dxos.client.network.totalWriteBufferSize', totalWriteBufferSize);
277
- this.gauge('dxos.client.network.totalChannelBufferSize', totalChannelBufferSize);
278
- });
279
- });
280
- clientServices.NetworkService.queryStatus().subscribe((networkStatus) => {
281
- this._lastNetworkStatus = networkStatus;
282
- updateSignalMetrics.emit();
50
+ }
51
+ this._initialized = false;
283
52
  });
284
- scheduleTaskInterval(this._ctx, async () => updateSignalMetrics.emit(), NETWORK_METRICS_MIN_INTERVAL);
285
53
  }
286
- startSpacesMetrics(client, namespace) {
287
- // TODO(nf): update subscription on new spaces
288
- const spaces = client.spaces.get();
289
- const subscriptions = new Map();
290
- this._ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));
291
- const updateSpaceMetrics = new Event().debounce(SPACE_METRICS_MIN_INTERVAL);
292
- updateSpaceMetrics.on(this._ctx, async () => {
293
- log('send space metrics');
294
- for (const data of mapSpaces(spaces, { truncateKeys: true })) {
295
- this.gauge('dxos.client.space.members', data.members, { key: data.key });
296
- this.gauge('dxos.client.space.objects', data.objects, { key: data.key });
297
- this.gauge('dxos.client.space.epoch', data.epoch, { key: data.key });
298
- this.gauge('dxos.client.space.currentDataMutations', data.currentDataMutations, { key: data.key });
54
+ enable() {
55
+ return Effect.gen(this, function* () {
56
+ for (const extension of this._extensions) {
57
+ if (extension.enable) {
58
+ yield* extension.enable();
59
+ }
299
60
  }
300
61
  });
301
- const updateSpaceTelemetry = new Event().debounce(SPACE_TELEMETRY_MIN_INTERVAL);
302
- updateSpaceTelemetry.on(this._ctx, async () => {
303
- log('send space telemetry');
304
- for (const data of mapSpaces(spaces, { truncateKeys: true })) {
305
- this.track({
306
- ...getTelemetryIdentity(client),
307
- event: TelemetryEvent.METRICS,
308
- action: 'space.update',
309
- properties: data,
310
- });
62
+ }
63
+ disable() {
64
+ return Effect.gen(this, function* () {
65
+ for (const extension of this._extensions) {
66
+ if (extension.disable) {
67
+ yield* extension.disable();
68
+ }
311
69
  }
312
70
  });
313
- const subscribeToSpaceUpdate = (space) => space.pipeline.subscribe({
314
- next: () => {
315
- updateSpaceMetrics.emit();
316
- updateSpaceTelemetry.emit();
317
- },
318
- });
319
- spaces.forEach((space) => {
320
- subscriptions.set(space.id, subscribeToSpaceUpdate(space));
321
- });
322
- client.spaces.subscribe({
323
- next: async (spaces) => {
324
- spaces
325
- .filter((space) => !subscriptions.has(space.id))
326
- .forEach((space) => {
327
- subscriptions.set(space.id, subscribeToSpaceUpdate(space));
328
- });
329
- },
330
- });
331
- scheduleTaskInterval(this._ctx, async () => updateSpaceMetrics.emit(), NETWORK_METRICS_MIN_INTERVAL);
332
71
  }
333
- async startRuntimeMetrics(client, frequency = NETWORK_METRICS_MIN_INTERVAL) {
334
- var _a;
335
- const platform = await ((_a = client.services.services.SystemService) === null || _a === void 0 ? void 0 : _a.getPlatform());
336
- invariant(platform, 'platform is required');
337
- this.setTag('platformType', Platform.PLATFORM_TYPE[platform.type].toLowerCase());
338
- if (this._mode === 'full') {
339
- if (platform.platform) {
340
- this.setTag('platform', platform.platform);
341
- }
342
- if (platform.arch) {
343
- this.setTag('arch', platform.arch);
344
- }
345
- if (platform.runtime) {
346
- this.setTag('runtime', platform.runtime);
347
- }
348
- }
349
- scheduleTaskInterval(this._ctx, async () => {
350
- var _a;
351
- if (client.services.constructor.name === 'WorkerClientServices') {
352
- const memory = window.performance.memory;
353
- if (memory) {
354
- this.gauge('dxos.client.runtime.heapTotal', memory.totalJSHeapSize);
355
- this.gauge('dxos.client.runtime.heapUsed', memory.usedJSHeapSize);
356
- this.gauge('dxos.client.runtime.heapSizeLimit', memory.jsHeapSizeLimit);
72
+ flush() {
73
+ return Effect.gen(this, function* () {
74
+ for (const extension of this._extensions) {
75
+ if (extension.flush) {
76
+ yield* extension.flush();
357
77
  }
358
78
  }
359
- (_a = client.services.services.SystemService) === null || _a === void 0 ? void 0 : _a.getPlatform().then((platform) => {
360
- if (platform.memory) {
361
- this.gauge('dxos.client.services.runtime.rss', platform.memory.rss);
362
- this.gauge('dxos.client.services.runtime.heapTotal', platform.memory.heapTotal);
363
- this.gauge('dxos.client.services.runtime.heapUsed', platform.memory.heapUsed);
364
- }
365
- }).catch((error) => log('platform error', { error }));
366
- }, frequency);
79
+ });
367
80
  }
368
- //
369
- // Telemetry
370
- //
371
- async _initTelemetry() {
372
- if (this._secrets.TELEMETRY_API_KEY && this._mode !== 'disabled' && typeof document !== 'undefined') {
373
- const { SegmentTelemetry } = await import('./segment');
374
- this._telemetry = new SegmentTelemetry({
375
- apiKey: this._secrets.TELEMETRY_API_KEY,
376
- batchSize: this._telemetryBatchSize,
377
- getTags: () => Object.fromEntries(Array.from(this._tags)
378
- .filter(([key, value]) => {
379
- return value.scope === 'all' || value.scope === 'telemetry';
380
- })
381
- .map(([key, value]) => [key, value.value])),
382
- });
383
- }
384
- else {
385
- log('segment disabled');
386
- }
81
+ _addExtension(extension) {
82
+ invariant(!this._initialized, 'Observability is already initialized');
83
+ this._extensions.push(extension);
387
84
  }
388
- /**
389
- * Submit telemetry page view.
390
- * The default implementation uses Segment.
391
- */
392
- page(options) {
393
- var _a;
394
- (_a = this._telemetry) === null || _a === void 0 ? void 0 : _a.page(options);
85
+ _addDataProvider(dataProvider) {
86
+ invariant(!this._initialized, 'Observability is already initialized');
87
+ this._dataProviders.push(dataProvider);
395
88
  }
396
89
  /**
397
- * Submit telemetry user action.
398
- * The default implementation uses Segment.
90
+ * Adds a data provider and initializes it.
399
91
  */
400
- track(options) {
401
- var _a;
402
- (_a = this._telemetry) === null || _a === void 0 ? void 0 : _a.track(options);
92
+ addDataProvider(dataProvider) {
93
+ return Effect.gen(this, function* () {
94
+ this._dataProviders.push(dataProvider);
95
+ const cleanup = yield* dataProvider(this);
96
+ if (cleanup) {
97
+ this._subscriptions.add(cleanup);
98
+ }
99
+ });
403
100
  }
404
- //
405
- // Error Logs
406
- //
407
- async _initErrorLogs() {
408
- if (this._secrets.SENTRY_DESTINATION && this._mode !== 'disabled') {
409
- const { captureException, captureUserFeedback, init, setTag } = await import('./sentry');
410
- const { SentryLogProcessor } = await import('./sentry/sentry-log-processor');
411
- this._captureException = captureException;
412
- this._captureUserFeedback = captureUserFeedback;
413
- this._setTag = setTag;
414
- // TODO(nf): Refactor package into this one?
415
- log.info('Initializing Sentry', {
416
- dest: this._secrets.SENTRY_DESTINATION,
417
- options: this._errorReportingOptions,
418
- });
419
- this._sentryLogProcessor = new SentryLogProcessor();
420
- init({
421
- ...this._errorReportingOptions,
422
- destination: this._secrets.SENTRY_DESTINATION,
423
- scrubFilenames: this._mode !== 'full',
424
- onError: (event) => this._sentryLogProcessor.addLogBreadcrumbsTo(event),
425
- });
426
- // TODO(nf): Set platform at instantiation? needed for node.
427
- // TODO(nf): Is this different than passing as properties in options?
428
- this._tags.forEach((v, k) => {
429
- if (v.scope === 'all' || v.scope === 'errors') {
430
- setTag(k, v.value);
431
- }
432
- });
101
+ identify(distinctId, attributes, setOnceAttributes) {
102
+ for (const extension of this._extensions) {
103
+ extension.identify?.(distinctId, attributes, setOnceAttributes);
433
104
  }
434
- else {
435
- log('sentry disabled');
105
+ }
106
+ alias(distinctId, previousId) {
107
+ for (const extension of this._extensions) {
108
+ extension.alias?.(distinctId, previousId);
436
109
  }
437
110
  }
438
- startErrorLogs() {
439
- this._sentryLogProcessor && log.runtimeConfig.processors.push(this._sentryLogProcessor.logProcessor);
111
+ setTags(tags, kind) {
112
+ for (const extension of this._extensions) {
113
+ if (kind && !extension.apis.some((api) => api.kind === kind)) {
114
+ continue;
115
+ }
116
+ const processedTags = Object.fromEntries(Object.entries(tags)
117
+ .filter((entry) => entry[1] !== undefined)
118
+ .map(([key, value]) => [key, value.toString()]));
119
+ extension.setTags?.(processedTags);
120
+ }
440
121
  }
441
- startTraces() {
442
- this._otelTraces && this._otelTraces.start();
122
+ get enabled() {
123
+ return this._extensions.every((extension) => extension.enabled);
443
124
  }
444
- // TODO(nf): Refactor init based on providers and their capabilities.
445
- async _initTraces() {
446
- var _a, _b;
447
- if (this._secrets.OTEL_ENDPOINT && this._secrets.OTEL_AUTHORIZATION && this._mode !== 'disabled') {
448
- const { OtelTraces } = await import('./otel');
449
- this._otelTraces = new OtelTraces({
450
- endpoint: this._secrets.OTEL_ENDPOINT,
451
- authorizationHeader: this._secrets.OTEL_AUTHORIZATION,
452
- serviceName: this._namespace,
453
- serviceVersion: (_b = (_a = this.getTag('release')) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : '0.0.0',
454
- getTags: () => Object.fromEntries(Array.from(this._tags)
455
- .filter(([key, value]) => {
456
- return value.scope === 'all' || value.scope === 'metrics';
457
- })
458
- .map(([key, value]) => [key, value.value])),
459
- });
460
- }
125
+ get errors() {
126
+ return {
127
+ captureException: (error, attributes) => {
128
+ for (const extension of this._getExtensions('errors')) {
129
+ extension.captureException(error, attributes);
130
+ }
131
+ },
132
+ };
461
133
  }
462
- /**
463
- * Manually capture an exception.
464
- * The default implementation uses Sentry.
465
- */
466
- captureException(err) {
467
- var _a;
468
- if (this.enabled) {
469
- (_a = this._captureException) === null || _a === void 0 ? void 0 : _a.call(this, err);
470
- }
134
+ get events() {
135
+ return {
136
+ captureEvent: (event, attributes) => {
137
+ for (const extension of this._getExtensions('events')) {
138
+ extension.captureEvent(event, attributes);
139
+ }
140
+ },
141
+ };
471
142
  }
472
- /**
473
- * Manually capture user feedback.
474
- * The default implementation uses Sentry.
475
- */
476
- captureUserFeedback(message) {
477
- var _a;
478
- if (!this._secrets.SENTRY_DESTINATION) {
479
- log.info('Feedback submitted without Sentry destination', { message });
480
- return;
143
+ get feedback() {
144
+ return {
145
+ captureUserFeedback: (form) => {
146
+ for (const extension of this._getExtensions('feedback')) {
147
+ extension.captureUserFeedback(form);
148
+ }
149
+ },
150
+ };
151
+ }
152
+ isAvailable(kind) {
153
+ const apis = this._getExtensions(kind);
154
+ if (apis.length === 0) {
155
+ return Effect.succeed(false);
481
156
  }
482
- // TODO(Zan): Should this respect telemetry mode? Sending feedback is explicitly user-initiated.
483
- // - Maybe if telemetry is disable we shouldn't enable replay.
484
- // - (Check the browser.ts implementation for reference).
485
- void ((_a = this._captureUserFeedback) === null || _a === void 0 ? void 0 : _a.call(this, message));
157
+ return Effect.gen(this, function* () {
158
+ for (const api of apis) {
159
+ const available = yield* api.isAvailable();
160
+ if (available) {
161
+ return true;
162
+ }
163
+ }
164
+ return false;
165
+ });
166
+ }
167
+ get metrics() {
168
+ return {
169
+ gauge: (name, value, attributes) => {
170
+ for (const extension of this._getExtensions('metrics')) {
171
+ extension.gauge(name, value, attributes);
172
+ }
173
+ },
174
+ increment: (name, value, attributes) => {
175
+ for (const extension of this._getExtensions('metrics')) {
176
+ extension.increment(name, value, attributes);
177
+ }
178
+ },
179
+ distribution: (name, value, attributes) => {
180
+ for (const extension of this._getExtensions('metrics')) {
181
+ extension.distribution(name, value, attributes);
182
+ }
183
+ },
184
+ };
185
+ }
186
+ _getExtensions(kind) {
187
+ return Function.pipe(this._extensions, Array.flatMap((extension) => extension.apis), Array.filter((api) => api.kind === kind));
486
188
  }
487
189
  }
190
+ export const make = () => Effect.succeed(new ObservabilityImpl());
191
+ export const addExtension = (_extension) => Effect.fn(function* (_observability) {
192
+ const observability = yield* _observability;
193
+ const extension = yield* _extension;
194
+ invariant('_addExtension' in observability && typeof observability._addExtension === 'function');
195
+ observability._addExtension(extension);
196
+ return observability;
197
+ });
198
+ export const addDataProvider = (dataProvider) => Effect.fn(function* (_observability) {
199
+ const observability = yield* _observability;
200
+ invariant('_addDataProvider' in observability && typeof observability._addDataProvider === 'function');
201
+ observability._addDataProvider(dataProvider);
202
+ return observability;
203
+ });
204
+ export const initialize = Effect.fn(function* (_observability) {
205
+ const observability = yield* _observability;
206
+ yield* observability.initialize();
207
+ return observability;
208
+ });
488
209
  //# sourceMappingURL=observability.js.map