@dxos/observability 0.8.4-main.937b3ca → 0.8.4-main.9be5663bfe

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