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