@dxos/observability 0.8.4-main.ae835ea → 0.8.4-main.bc2380dfbc

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 (329) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +14 -11
  3. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  4. package/dist/lib/browser/chunk-PSFTIG54.mjs +20 -0
  5. package/dist/lib/browser/chunk-PSFTIG54.mjs.map +7 -0
  6. package/dist/lib/browser/index.mjs +944 -34
  7. package/dist/lib/browser/index.mjs.map +4 -4
  8. package/dist/lib/browser/log-processor-HPHWNBOK.mjs +38 -0
  9. package/dist/lib/browser/log-processor-HPHWNBOK.mjs.map +7 -0
  10. package/dist/lib/browser/logs-UTNIFYHF.mjs +116 -0
  11. package/dist/lib/browser/logs-UTNIFYHF.mjs.map +7 -0
  12. package/dist/lib/browser/meta.json +1 -1
  13. package/dist/lib/browser/metrics-PRGSYAZJ.mjs +116 -0
  14. package/dist/lib/browser/metrics-PRGSYAZJ.mjs.map +7 -0
  15. package/dist/lib/browser/traces-browser-XRINKQUA.mjs +154 -0
  16. package/dist/lib/browser/traces-browser-XRINKQUA.mjs.map +7 -0
  17. package/dist/lib/node-esm/chunk-EDDZWPYV.mjs +22 -0
  18. package/dist/lib/node-esm/chunk-EDDZWPYV.mjs.map +7 -0
  19. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  20. package/dist/lib/node-esm/index.mjs +966 -34
  21. package/dist/lib/node-esm/index.mjs.map +4 -4
  22. package/dist/lib/node-esm/log-processor-ZODHERST.mjs +39 -0
  23. package/dist/lib/node-esm/log-processor-ZODHERST.mjs.map +7 -0
  24. package/dist/lib/node-esm/logs-ARJUVN3T.mjs +117 -0
  25. package/dist/lib/node-esm/logs-ARJUVN3T.mjs.map +7 -0
  26. package/dist/lib/node-esm/meta.json +1 -1
  27. package/dist/lib/node-esm/metrics-DREJOOAC.mjs +117 -0
  28. package/dist/lib/node-esm/metrics-DREJOOAC.mjs.map +7 -0
  29. package/dist/lib/node-esm/traces-74F7JUKF.mjs +125 -0
  30. package/dist/lib/node-esm/traces-74F7JUKF.mjs.map +7 -0
  31. package/dist/types/src/cli-observability-secrets.json +3 -4
  32. package/dist/types/src/extensions/index.d.ts +3 -0
  33. package/dist/types/src/extensions/index.d.ts.map +1 -0
  34. package/dist/types/src/extensions/index.js +6 -0
  35. package/dist/types/src/extensions/index.js.map +1 -0
  36. package/dist/types/src/extensions/otel/extension.d.ts +23 -0
  37. package/dist/types/src/extensions/otel/extension.d.ts.map +1 -0
  38. package/dist/types/src/extensions/otel/extension.js +206 -0
  39. package/dist/types/src/extensions/otel/extension.js.map +1 -0
  40. package/dist/types/src/extensions/otel/index.d.ts +2 -0
  41. package/dist/types/src/extensions/otel/index.d.ts.map +1 -0
  42. package/dist/types/src/extensions/otel/index.js +5 -0
  43. package/dist/types/src/extensions/otel/index.js.map +1 -0
  44. package/dist/types/src/{otel → extensions/otel}/logs.d.ts +4 -3
  45. package/dist/types/src/extensions/otel/logs.d.ts.map +1 -0
  46. package/dist/types/src/extensions/otel/logs.js +107 -0
  47. package/dist/types/src/extensions/otel/logs.js.map +1 -0
  48. package/dist/types/src/extensions/otel/metrics.d.ts.map +1 -0
  49. package/dist/types/src/{otel → extensions/otel}/metrics.js +4 -12
  50. package/dist/types/src/extensions/otel/metrics.js.map +1 -0
  51. package/dist/types/src/extensions/otel/otel.d.ts +19 -0
  52. package/dist/types/src/extensions/otel/otel.d.ts.map +1 -0
  53. package/dist/types/src/extensions/otel/otel.js +23 -0
  54. package/dist/types/src/extensions/otel/otel.js.map +1 -0
  55. package/dist/types/src/extensions/otel/span-processors.d.ts +25 -0
  56. package/dist/types/src/extensions/otel/span-processors.d.ts.map +1 -0
  57. package/dist/types/src/extensions/otel/span-processors.js +41 -0
  58. package/dist/types/src/extensions/otel/span-processors.js.map +1 -0
  59. package/dist/types/src/extensions/otel/traces-browser.d.ts +25 -0
  60. package/dist/types/src/extensions/otel/traces-browser.d.ts.map +1 -0
  61. package/dist/types/src/extensions/otel/traces-browser.js +105 -0
  62. package/dist/types/src/extensions/otel/traces-browser.js.map +1 -0
  63. package/dist/types/src/extensions/otel/traces.d.ts +25 -0
  64. package/dist/types/src/extensions/otel/traces.d.ts.map +1 -0
  65. package/dist/types/src/extensions/otel/traces.js +88 -0
  66. package/dist/types/src/extensions/otel/traces.js.map +1 -0
  67. package/dist/types/src/extensions/posthog/extension.d.ts +28 -0
  68. package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -0
  69. package/dist/types/src/extensions/posthog/extension.js +144 -0
  70. package/dist/types/src/extensions/posthog/extension.js.map +1 -0
  71. package/dist/types/src/extensions/posthog/index.d.ts +2 -0
  72. package/dist/types/src/extensions/posthog/index.d.ts.map +1 -0
  73. package/dist/types/src/extensions/posthog/index.js +5 -0
  74. package/dist/types/src/extensions/posthog/index.js.map +1 -0
  75. package/dist/types/src/extensions/posthog/log-processor.d.ts +3 -0
  76. package/dist/types/src/extensions/posthog/log-processor.d.ts.map +1 -0
  77. package/dist/types/src/extensions/posthog/log-processor.js +36 -0
  78. package/dist/types/src/extensions/posthog/log-processor.js.map +1 -0
  79. package/dist/types/src/extensions/posthog/log-processor.test.d.ts +2 -0
  80. package/dist/types/src/extensions/posthog/log-processor.test.d.ts.map +1 -0
  81. package/dist/types/src/extensions/posthog/log-processor.test.js +146 -0
  82. package/dist/types/src/extensions/posthog/log-processor.test.js.map +1 -0
  83. package/dist/types/src/extensions/stub.d.ts +3 -0
  84. package/dist/types/src/extensions/stub.d.ts.map +1 -0
  85. package/dist/types/src/extensions/stub.js +16 -0
  86. package/dist/types/src/extensions/stub.js.map +1 -0
  87. package/dist/types/src/index.d.ts +3 -2
  88. package/dist/types/src/index.d.ts.map +1 -1
  89. package/dist/types/src/index.js +4 -3
  90. package/dist/types/src/index.js.map +1 -1
  91. package/dist/types/src/observability-extension.d.ts +74 -0
  92. package/dist/types/src/observability-extension.d.ts.map +1 -0
  93. package/dist/types/src/observability-extension.js +5 -0
  94. package/dist/types/src/observability-extension.js.map +1 -0
  95. package/dist/types/src/observability.d.ts +32 -110
  96. package/dist/types/src/observability.d.ts.map +1 -1
  97. package/dist/types/src/observability.js +177 -465
  98. package/dist/types/src/observability.js.map +1 -1
  99. package/dist/types/src/observability.test.d.ts +2 -0
  100. package/dist/types/src/observability.test.d.ts.map +1 -0
  101. package/dist/types/src/observability.test.js +312 -0
  102. package/dist/types/src/observability.test.js.map +1 -0
  103. package/dist/types/src/providers/client-observability.d.ts +11 -0
  104. package/dist/types/src/providers/client-observability.d.ts.map +1 -0
  105. package/dist/types/src/providers/client-observability.js +202 -0
  106. package/dist/types/src/providers/client-observability.js.map +1 -0
  107. package/dist/types/src/providers/index.d.ts +4 -0
  108. package/dist/types/src/providers/index.d.ts.map +1 -0
  109. package/dist/types/src/providers/index.js +7 -0
  110. package/dist/types/src/providers/index.js.map +1 -0
  111. package/dist/types/src/providers/ip-data.d.ts +5 -0
  112. package/dist/types/src/providers/ip-data.d.ts.map +1 -0
  113. package/dist/types/src/providers/ip-data.js +57 -0
  114. package/dist/types/src/providers/ip-data.js.map +1 -0
  115. package/dist/types/src/providers/storage.d.ts +3 -0
  116. package/dist/types/src/providers/storage.d.ts.map +1 -0
  117. package/dist/types/src/providers/storage.js +19 -0
  118. package/dist/types/src/providers/storage.js.map +1 -0
  119. package/dist/types/src/storage/browser.d.ts +19 -0
  120. package/dist/types/src/storage/browser.d.ts.map +1 -0
  121. package/dist/types/src/storage/browser.js +69 -0
  122. package/dist/types/src/storage/browser.js.map +1 -0
  123. package/dist/types/src/storage/index.d.ts +2 -0
  124. package/dist/types/src/storage/index.d.ts.map +1 -0
  125. package/dist/types/src/storage/index.js.map +1 -0
  126. package/dist/types/src/storage/node.d.ts +26 -0
  127. package/dist/types/src/storage/node.d.ts.map +1 -0
  128. package/dist/types/src/{helpers/node-observability.js → storage/node.js} +38 -43
  129. package/dist/types/src/storage/node.js.map +1 -0
  130. package/dist/types/src/storage/node.test.d.ts +2 -0
  131. package/dist/types/src/storage/node.test.d.ts.map +1 -0
  132. package/dist/types/src/storage/node.test.js +103 -0
  133. package/dist/types/src/storage/node.test.js.map +1 -0
  134. package/dist/types/tsconfig.tsbuildinfo +1 -1
  135. package/package.json +48 -65
  136. package/src/cli-observability-secrets.json +3 -4
  137. package/src/extensions/index.ts +6 -0
  138. package/src/extensions/otel/extension.ts +264 -0
  139. package/src/extensions/otel/index.ts +5 -0
  140. package/src/extensions/otel/logs.ts +137 -0
  141. package/src/{otel → extensions/otel}/metrics.ts +4 -14
  142. package/src/extensions/otel/otel.ts +34 -0
  143. package/src/extensions/otel/span-processors.ts +45 -0
  144. package/src/extensions/otel/traces-browser.ts +139 -0
  145. package/src/extensions/otel/traces.ts +113 -0
  146. package/src/extensions/posthog/extension.ts +188 -0
  147. package/src/extensions/posthog/index.ts +5 -0
  148. package/src/extensions/posthog/log-processor.test.ts +186 -0
  149. package/src/extensions/posthog/log-processor.ts +43 -0
  150. package/src/extensions/stub.ts +19 -0
  151. package/src/index.ts +4 -3
  152. package/src/observability-extension.ts +94 -0
  153. package/src/observability.test.ts +531 -0
  154. package/src/observability.ts +236 -577
  155. package/src/providers/client-observability.ts +255 -0
  156. package/src/providers/index.ts +7 -0
  157. package/src/providers/ip-data.ts +91 -0
  158. package/src/providers/storage.ts +23 -0
  159. package/src/storage/browser.ts +71 -0
  160. package/src/{segment → storage}/index.ts +0 -1
  161. package/src/storage/node.test.ts +129 -0
  162. package/src/{helpers/node-observability.ts → storage/node.ts} +41 -71
  163. package/src/vite-import-meta.d.ts +14 -0
  164. package/dist/lib/browser/chunk-5ICT2XF2.mjs +0 -1
  165. package/dist/lib/browser/chunk-USIB5JOP.mjs +0 -1019
  166. package/dist/lib/browser/chunk-USIB5JOP.mjs.map +0 -7
  167. package/dist/lib/browser/chunk-XNAF22QM.mjs +0 -148
  168. package/dist/lib/browser/chunk-XNAF22QM.mjs.map +0 -7
  169. package/dist/lib/browser/chunk-ZI3ZS3PA.mjs +0 -164
  170. package/dist/lib/browser/chunk-ZI3ZS3PA.mjs.map +0 -7
  171. package/dist/lib/browser/observability-AOZNUWZS.mjs +0 -10
  172. package/dist/lib/browser/otel-UH7ZRWC2.mjs +0 -287
  173. package/dist/lib/browser/otel-UH7ZRWC2.mjs.map +0 -7
  174. package/dist/lib/browser/segment/index.mjs +0 -11
  175. package/dist/lib/browser/segment/index.mjs.map +0 -7
  176. package/dist/lib/browser/sentry/index.mjs +0 -24
  177. package/dist/lib/browser/sentry/index.mjs.map +0 -7
  178. package/dist/lib/browser/sentry-log-processor-5LSQJMIO.mjs +0 -146
  179. package/dist/lib/browser/sentry-log-processor-5LSQJMIO.mjs.map +0 -7
  180. package/dist/lib/node-esm/chunk-JJS4CBLT.mjs +0 -1020
  181. package/dist/lib/node-esm/chunk-JJS4CBLT.mjs.map +0 -7
  182. package/dist/lib/node-esm/chunk-OJV247NY.mjs +0 -204
  183. package/dist/lib/node-esm/chunk-OJV247NY.mjs.map +0 -7
  184. package/dist/lib/node-esm/chunk-QK5IUYVA.mjs +0 -135
  185. package/dist/lib/node-esm/chunk-QK5IUYVA.mjs.map +0 -7
  186. package/dist/lib/node-esm/chunk-QUZL7LKE.mjs +0 -2
  187. package/dist/lib/node-esm/chunk-QUZL7LKE.mjs.map +0 -7
  188. package/dist/lib/node-esm/observability-UWX2LAYX.mjs +0 -11
  189. package/dist/lib/node-esm/observability-UWX2LAYX.mjs.map +0 -7
  190. package/dist/lib/node-esm/otel-7PUCFSTY.mjs +0 -270
  191. package/dist/lib/node-esm/otel-7PUCFSTY.mjs.map +0 -7
  192. package/dist/lib/node-esm/segment/index.mjs +0 -12
  193. package/dist/lib/node-esm/segment/index.mjs.map +0 -7
  194. package/dist/lib/node-esm/sentry/index.mjs +0 -25
  195. package/dist/lib/node-esm/sentry/index.mjs.map +0 -7
  196. package/dist/lib/node-esm/sentry-log-processor-C4UGMAMV.mjs +0 -147
  197. package/dist/lib/node-esm/sentry-log-processor-C4UGMAMV.mjs.map +0 -7
  198. package/dist/types/src/helpers/browser-observability.d.ts +0 -17
  199. package/dist/types/src/helpers/browser-observability.d.ts.map +0 -1
  200. package/dist/types/src/helpers/browser-observability.js +0 -138
  201. package/dist/types/src/helpers/browser-observability.js.map +0 -1
  202. package/dist/types/src/helpers/common.d.ts +0 -12
  203. package/dist/types/src/helpers/common.d.ts.map +0 -1
  204. package/dist/types/src/helpers/common.js +0 -23
  205. package/dist/types/src/helpers/common.js.map +0 -1
  206. package/dist/types/src/helpers/index.d.ts +0 -6
  207. package/dist/types/src/helpers/index.d.ts.map +0 -1
  208. package/dist/types/src/helpers/index.js +0 -9
  209. package/dist/types/src/helpers/index.js.map +0 -1
  210. package/dist/types/src/helpers/map-spaces.d.ts +0 -18
  211. package/dist/types/src/helpers/map-spaces.d.ts.map +0 -1
  212. package/dist/types/src/helpers/map-spaces.js +0 -36
  213. package/dist/types/src/helpers/map-spaces.js.map +0 -1
  214. package/dist/types/src/helpers/node-observability.d.ts +0 -24
  215. package/dist/types/src/helpers/node-observability.d.ts.map +0 -1
  216. package/dist/types/src/helpers/node-observability.js.map +0 -1
  217. package/dist/types/src/helpers/setup-telemetry-listeners.d.ts +0 -4
  218. package/dist/types/src/helpers/setup-telemetry-listeners.d.ts.map +0 -1
  219. package/dist/types/src/helpers/setup-telemetry-listeners.js +0 -94
  220. package/dist/types/src/helpers/setup-telemetry-listeners.js.map +0 -1
  221. package/dist/types/src/otel/index.d.ts +0 -5
  222. package/dist/types/src/otel/index.d.ts.map +0 -1
  223. package/dist/types/src/otel/index.js +0 -8
  224. package/dist/types/src/otel/index.js.map +0 -1
  225. package/dist/types/src/otel/logs.d.ts.map +0 -1
  226. package/dist/types/src/otel/logs.js +0 -74
  227. package/dist/types/src/otel/logs.js.map +0 -1
  228. package/dist/types/src/otel/metrics.d.ts.map +0 -1
  229. package/dist/types/src/otel/metrics.js.map +0 -1
  230. package/dist/types/src/otel/otel.d.ts +0 -12
  231. package/dist/types/src/otel/otel.d.ts.map +0 -1
  232. package/dist/types/src/otel/otel.js +0 -11
  233. package/dist/types/src/otel/otel.js.map +0 -1
  234. package/dist/types/src/otel/traces-browser.d.ts +0 -8
  235. package/dist/types/src/otel/traces-browser.d.ts.map +0 -1
  236. package/dist/types/src/otel/traces-browser.js +0 -53
  237. package/dist/types/src/otel/traces-browser.js.map +0 -1
  238. package/dist/types/src/otel/traces.d.ts +0 -8
  239. package/dist/types/src/otel/traces.d.ts.map +0 -1
  240. package/dist/types/src/otel/traces.js +0 -46
  241. package/dist/types/src/otel/traces.js.map +0 -1
  242. package/dist/types/src/segment/base.d.ts +0 -15
  243. package/dist/types/src/segment/base.d.ts.map +0 -1
  244. package/dist/types/src/segment/base.js +0 -51
  245. package/dist/types/src/segment/base.js.map +0 -1
  246. package/dist/types/src/segment/browser.d.ts +0 -15
  247. package/dist/types/src/segment/browser.d.ts.map +0 -1
  248. package/dist/types/src/segment/browser.js +0 -63
  249. package/dist/types/src/segment/browser.js.map +0 -1
  250. package/dist/types/src/segment/index.d.ts +0 -3
  251. package/dist/types/src/segment/index.d.ts.map +0 -1
  252. package/dist/types/src/segment/index.js +0 -6
  253. package/dist/types/src/segment/index.js.map +0 -1
  254. package/dist/types/src/segment/node.d.ts +0 -16
  255. package/dist/types/src/segment/node.d.ts.map +0 -1
  256. package/dist/types/src/segment/node.js +0 -84
  257. package/dist/types/src/segment/node.js.map +0 -1
  258. package/dist/types/src/segment/types.d.ts +0 -52
  259. package/dist/types/src/segment/types.d.ts.map +0 -1
  260. package/dist/types/src/segment/types.js +0 -18
  261. package/dist/types/src/segment/types.js.map +0 -1
  262. package/dist/types/src/sentry/browser.d.ts +0 -32
  263. package/dist/types/src/sentry/browser.d.ts.map +0 -1
  264. package/dist/types/src/sentry/browser.js +0 -110
  265. package/dist/types/src/sentry/browser.js.map +0 -1
  266. package/dist/types/src/sentry/index.d.ts +0 -3
  267. package/dist/types/src/sentry/index.d.ts.map +0 -1
  268. package/dist/types/src/sentry/index.js.map +0 -1
  269. package/dist/types/src/sentry/node.d.ts +0 -32
  270. package/dist/types/src/sentry/node.d.ts.map +0 -1
  271. package/dist/types/src/sentry/node.js +0 -106
  272. package/dist/types/src/sentry/node.js.map +0 -1
  273. package/dist/types/src/sentry/node.node.test.d.ts +0 -2
  274. package/dist/types/src/sentry/node.node.test.d.ts.map +0 -1
  275. package/dist/types/src/sentry/node.node.test.js +0 -32
  276. package/dist/types/src/sentry/node.node.test.js.map +0 -1
  277. package/dist/types/src/sentry/sentry-log-processor.d.ts +0 -9
  278. package/dist/types/src/sentry/sentry-log-processor.d.ts.map +0 -1
  279. package/dist/types/src/sentry/sentry-log-processor.js +0 -144
  280. package/dist/types/src/sentry/sentry-log-processor.js.map +0 -1
  281. package/dist/types/src/sentry/sentry.node.test.d.ts +0 -2
  282. package/dist/types/src/sentry/sentry.node.test.d.ts.map +0 -1
  283. package/dist/types/src/sentry/sentry.node.test.js +0 -28
  284. package/dist/types/src/sentry/sentry.node.test.js.map +0 -1
  285. package/dist/types/src/sentry/types.d.ts +0 -18
  286. package/dist/types/src/sentry/types.d.ts.map +0 -1
  287. package/dist/types/src/sentry/types.js +0 -4
  288. package/dist/types/src/sentry/types.js.map +0 -1
  289. package/dist/types/src/testing/index.d.ts +0 -2
  290. package/dist/types/src/testing/index.d.ts.map +0 -1
  291. package/dist/types/src/testing/index.js +0 -5
  292. package/dist/types/src/testing/index.js.map +0 -1
  293. package/dist/types/src/testing/testkit/browser.d.ts +0 -2
  294. package/dist/types/src/testing/testkit/browser.d.ts.map +0 -1
  295. package/dist/types/src/testing/testkit/browser.js +0 -7
  296. package/dist/types/src/testing/testkit/browser.js.map +0 -1
  297. package/dist/types/src/testing/testkit/index.d.ts +0 -2
  298. package/dist/types/src/testing/testkit/index.d.ts.map +0 -1
  299. package/dist/types/src/testing/testkit/index.js +0 -6
  300. package/dist/types/src/testing/testkit/index.js.map +0 -1
  301. package/src/helpers/browser-observability.ts +0 -178
  302. package/src/helpers/common.ts +0 -38
  303. package/src/helpers/index.ts +0 -9
  304. package/src/helpers/map-spaces.ts +0 -48
  305. package/src/helpers/setup-telemetry-listeners.ts +0 -109
  306. package/src/otel/index.ts +0 -8
  307. package/src/otel/logs.ts +0 -102
  308. package/src/otel/otel.ts +0 -21
  309. package/src/otel/traces-browser.ts +0 -62
  310. package/src/otel/traces.ts +0 -60
  311. package/src/segment/base.ts +0 -69
  312. package/src/segment/browser.ts +0 -69
  313. package/src/segment/node.ts +0 -95
  314. package/src/segment/types.ts +0 -57
  315. package/src/sentry/browser.ts +0 -133
  316. package/src/sentry/index.ts +0 -6
  317. package/src/sentry/node.node.test.ts +0 -40
  318. package/src/sentry/node.ts +0 -126
  319. package/src/sentry/sentry-log-processor.ts +0 -174
  320. package/src/sentry/sentry.node.test.ts +0 -35
  321. package/src/sentry/types.ts +0 -22
  322. package/src/testing/index.ts +0 -5
  323. package/src/testing/testkit/browser.ts +0 -8
  324. package/src/testing/testkit/index.ts +0 -7
  325. package/src/testing/testkit/shims.d.ts +0 -5
  326. /package/dist/lib/browser/{chunk-5ICT2XF2.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  327. /package/dist/lib/{browser/observability-AOZNUWZS.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
  328. /package/dist/types/src/{otel → extensions/otel}/metrics.d.ts +0 -0
  329. /package/dist/types/src/{sentry → storage}/index.js +0 -0
@@ -0,0 +1,202 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+ import * as Effect from 'effect/Effect';
5
+ import { Event, scheduleTaskInterval } from '@dxos/async';
6
+ import { DeviceKind } from '@dxos/client/halo';
7
+ import { Context } from '@dxos/context';
8
+ import { invariant } from '@dxos/invariant';
9
+ import { log } from '@dxos/log';
10
+ import { ConnectionState, Platform } from '@dxos/protocols/proto/dxos/client/services';
11
+ const SPACE_METRICS_MIN_INTERVAL = 1000 * 60 * 10; // 10 minutes
12
+ const NETWORK_METRICS_MIN_INTERVAL = 1000 * 60 * 10; // 10 minutes
13
+ const RUNTIME_METRICS_MIN_INTERVAL = 1000 * 60 * 10; // 10 minutes
14
+ // TODO(wittjosiah): Improve privacy of telemetry identifiers.
15
+ // - Identifier should be generated client-side with no attachment to identity.
16
+ // - Identifier can then be reset by user.
17
+ // - Identifier can be synced via HALO to allow for correlation of events bewteen devices.
18
+ // - Identifier should also be stored outside of HALO such that it is available immediately on startup.
19
+ /** Subscribes to identity and device changes and sets observability tags accordingly. */
20
+ export const identityProvider = (clientServices) => Effect.fn(function* (observability) {
21
+ // TODO(wittjosiah): RPC subscribe returns void; cleanup requires upstream API change.
22
+ clientServices.IdentityService.queryIdentity().subscribe((idqr) => {
23
+ if (!idqr?.identity?.did) {
24
+ return;
25
+ }
26
+ observability.identify(idqr.identity.did);
27
+ observability.setTags({ did: idqr.identity.did });
28
+ });
29
+ // TODO(wittjosiah): RPC subscribe returns void; cleanup requires upstream API change.
30
+ clientServices.DevicesService.queryDevices().subscribe((dqr) => {
31
+ if (!dqr?.devices || dqr.devices.length === 0) {
32
+ return;
33
+ }
34
+ const thisDevice = dqr.devices.find((device) => device.kind === DeviceKind.CURRENT);
35
+ if (!thisDevice) {
36
+ return;
37
+ }
38
+ observability.setTags({ deviceKey: thisDevice.deviceKey.truncate() });
39
+ if (thisDevice.profile?.label) {
40
+ observability.setTags({ deviceProfile: thisDevice.profile.label });
41
+ }
42
+ });
43
+ });
44
+ /** Periodically publishes network connection and buffer metrics. */
45
+ export const networkMetricsProvider = (clientServices) => Effect.fn(function* (observability) {
46
+ const ctx = new Context();
47
+ let lastNetworkStatus;
48
+ // TODO(nf): support type in debounce()
49
+ const updateSignalMetrics = new Event().debounce(NETWORK_METRICS_MIN_INTERVAL);
50
+ updateSignalMetrics.on(ctx, async () => {
51
+ log('send signal metrics');
52
+ lastNetworkStatus?.signaling?.forEach(({ server, state }) => {
53
+ observability.metrics.gauge('dxos.client.network.signal.connectionState', state, { server });
54
+ });
55
+ let swarmCount = 0;
56
+ const connectionStates = new Map();
57
+ for (const state in ConnectionState) {
58
+ connectionStates.set(state, 0);
59
+ }
60
+ let totalReadBufferSize = 0;
61
+ let totalWriteBufferSize = 0;
62
+ let totalChannelBufferSize = 0;
63
+ lastNetworkStatus?.connectionInfo?.forEach((connectionInfo) => {
64
+ swarmCount++;
65
+ for (const conn of connectionInfo.connections ?? []) {
66
+ connectionStates.set(conn.state, (connectionStates.get(conn.state) ?? 0) + 1);
67
+ totalReadBufferSize += conn.readBufferSize ?? 0;
68
+ totalWriteBufferSize += conn.writeBufferSize ?? 0;
69
+ for (const stream of conn.streams ?? []) {
70
+ totalChannelBufferSize += stream.writeBufferSize ?? 0;
71
+ }
72
+ }
73
+ observability.metrics.gauge('dxos.client.network.swarm.count', swarmCount);
74
+ for (const state in ConnectionState) {
75
+ observability.metrics.gauge('dxos.client.network.connection.count', connectionStates.get(state) ?? 0, {
76
+ state,
77
+ });
78
+ }
79
+ observability.metrics.gauge('dxos.client.network.totalReadBufferSize', totalReadBufferSize);
80
+ observability.metrics.gauge('dxos.client.network.totalWriteBufferSize', totalWriteBufferSize);
81
+ observability.metrics.gauge('dxos.client.network.totalChannelBufferSize', totalChannelBufferSize);
82
+ });
83
+ });
84
+ clientServices.NetworkService.queryStatus().subscribe((networkStatus) => {
85
+ lastNetworkStatus = networkStatus;
86
+ updateSignalMetrics.emit();
87
+ });
88
+ scheduleTaskInterval(ctx, async () => updateSignalMetrics.emit(), NETWORK_METRICS_MIN_INTERVAL);
89
+ return async () => {
90
+ await ctx.dispose();
91
+ };
92
+ });
93
+ /** Periodically publishes platform and heap memory metrics. */
94
+ export const runtimeMetricsProvider = (clientServices) => Effect.fn(function* (observability) {
95
+ const ctx = new Context();
96
+ log('runtimeMetricsProvider: requesting platform from SystemService');
97
+ const platform = yield* Effect.promise(() => clientServices.SystemService.getPlatform());
98
+ log('runtimeMetricsProvider: platform received');
99
+ invariant(platform, 'platform is required');
100
+ observability.setTags({
101
+ platformType: Platform.PLATFORM_TYPE[platform.type].toLowerCase(),
102
+ platform: platform.platform,
103
+ arch: platform.arch,
104
+ runtime: platform.runtime,
105
+ });
106
+ scheduleTaskInterval(ctx, async () => {
107
+ if (clientServices.constructor.name === 'WorkerClientServices') {
108
+ const memory = window.performance.memory;
109
+ if (memory) {
110
+ observability.metrics.gauge('dxos.client.runtime.heapTotal', memory.totalJSHeapSize);
111
+ observability.metrics.gauge('dxos.client.runtime.heapUsed', memory.usedJSHeapSize);
112
+ observability.metrics.gauge('dxos.client.runtime.heapSizeLimit', memory.jsHeapSizeLimit);
113
+ }
114
+ }
115
+ clientServices.SystemService?.getPlatform()
116
+ .then((platform) => {
117
+ if (platform.memory) {
118
+ observability.metrics.gauge('dxos.client.services.runtime.rss', platform.memory.rss);
119
+ observability.metrics.gauge('dxos.client.services.runtime.heapTotal', platform.memory.heapTotal);
120
+ observability.metrics.gauge('dxos.client.services.runtime.heapUsed', platform.memory.heapUsed);
121
+ }
122
+ })
123
+ .catch((error) => log('platform error', { error }));
124
+ }, RUNTIME_METRICS_MIN_INTERVAL);
125
+ return async () => {
126
+ await ctx.dispose();
127
+ };
128
+ });
129
+ /** Periodically publishes space membership, object count, and pipeline progress metrics. */
130
+ export const spacesMetricsProvider = (client) => Effect.fn(function* (observability) {
131
+ const ctx = new Context();
132
+ // TODO(nf): update subscription on new spaces
133
+ const spaces = client.spaces.get();
134
+ const subscriptions = new Map();
135
+ ctx.onDispose(() => subscriptions.forEach((subscription) => subscription.unsubscribe()));
136
+ const updateSpaceMetrics = new Event().debounce(SPACE_METRICS_MIN_INTERVAL);
137
+ updateSpaceMetrics.on(ctx, async () => {
138
+ log('send space metrics');
139
+ for (const data of mapSpaces(spaces, { truncateKeys: true })) {
140
+ observability.metrics.gauge('dxos.client.space.members', data.members, { key: data.key });
141
+ observability.metrics.gauge('dxos.client.space.objects', data.objects, { key: data.key });
142
+ observability.metrics.gauge('dxos.client.space.epoch', data.epoch, { key: data.key });
143
+ observability.metrics.gauge('dxos.client.space.currentDataMutations', data.currentDataMutations, {
144
+ key: data.key,
145
+ });
146
+ }
147
+ });
148
+ const subscribeToSpaceUpdate = (space) => space.pipeline.subscribe({
149
+ next: () => {
150
+ updateSpaceMetrics.emit();
151
+ },
152
+ });
153
+ spaces.forEach((space) => {
154
+ subscriptions.set(space.id, subscribeToSpaceUpdate(space));
155
+ });
156
+ client.spaces.subscribe({
157
+ next: async (spaces) => {
158
+ spaces
159
+ .filter((space) => !subscriptions.has(space.id))
160
+ .forEach((space) => {
161
+ subscriptions.set(space.id, subscribeToSpaceUpdate(space));
162
+ });
163
+ },
164
+ });
165
+ scheduleTaskInterval(ctx, async () => updateSpaceMetrics.emit(), SPACE_METRICS_MIN_INTERVAL);
166
+ return async () => {
167
+ await ctx.dispose();
168
+ };
169
+ });
170
+ const mapSpaces = (spaces, options = { verbose: false, truncateKeys: false }) => {
171
+ return spaces.map((space) => {
172
+ // TODO(burdon): Factor out.
173
+ // TODO(burdon): Agent needs to restart before `ready` is available.
174
+ const { open, ready } = space.internal.data.metrics ?? {};
175
+ const startup = open && ready && ready.getTime() - open.getTime();
176
+ // TODO(burdon): Get feeds from client-services if verbose (factor out from devtools/diagnostics).
177
+ // const host = client.services.services.DevtoolsHost!;
178
+ const pipeline = space.internal.data.pipeline;
179
+ const startDataMutations = pipeline?.currentEpoch?.subject.assertion.timeframe.totalMessages() ?? 0;
180
+ const epoch = pipeline?.currentEpoch?.subject.assertion.number;
181
+ // const appliedEpoch = pipeline?.appliedEpoch?.subject.assertion.number;
182
+ const currentDataMutations = pipeline?.currentDataTimeframe?.totalMessages() ?? 0;
183
+ const totalDataMutations = pipeline?.targetDataTimeframe?.totalMessages() ?? 0;
184
+ return {
185
+ // TODO(nf): truncate keys for DD?
186
+ key: space.key.truncate(),
187
+ open: space.isOpen,
188
+ members: space.members.get().length,
189
+ objects: space.internal.db.coreDatabase.getAllObjectIds().length,
190
+ startup,
191
+ epoch,
192
+ // appliedEpoch,
193
+ startDataMutations,
194
+ currentDataMutations,
195
+ totalDataMutations,
196
+ // TODO(burdon): Negative?
197
+ progress: (Math.min(Math.abs((currentDataMutations - startDataMutations) / (totalDataMutations - startDataMutations)), 1) *
198
+ 100).toFixed(0),
199
+ };
200
+ });
201
+ };
202
+ //# sourceMappingURL=client-observability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-observability.js","sourceRoot":"","sources":["../../../../src/providers/client-observability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * as Client from './client-observability';
2
+ export * as IPData from './ip-data';
3
+ export * as Storage from './storage';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/providers/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,MAAM,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC"}
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+ export * as Client from './client-observability';
5
+ export * as IPData from './ip-data';
6
+ export * as Storage from './storage';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/providers/index.ts"],"names":[],"mappings":"AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;AAEF,OAAO,KAAK,MAAM,MAAM,wBAAwB,CAAC;AACjD,OAAO,KAAK,MAAM,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { type Config } from '@dxos/config';
2
+ import { type DataProvider } from '../observability';
3
+ /** Fetches IP geolocation data and sets city/region/country tags on the observability instance. */
4
+ export declare const provider: (config: Config) => DataProvider;
5
+ //# sourceMappingURL=ip-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip-data.d.ts","sourceRoot":"","sources":["../../../../src/providers/ip-data.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAmDrD,mGAAmG;AACnG,eAAO,MAAM,QAAQ,WACV,MAAM,KAAG,YAsBf,CAAC"}
@@ -0,0 +1,57 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+ import * as FetchHttpClient from '@effect/platform/FetchHttpClient';
5
+ import * as HttpClient from '@effect/platform/HttpClient';
6
+ import * as HttpClientRequest from '@effect/platform/HttpClientRequest';
7
+ import * as Effect from 'effect/Effect';
8
+ import * as Schema from 'effect/Schema';
9
+ // NOTE: localStorage is not available in web workers.
10
+ import * as localForage from 'localforage';
11
+ import { log } from '@dxos/log';
12
+ const IP_DATA_CACHE_TIMEOUT = 6 * 60 * 60 * 1000; // 6 hours
13
+ const IPData = Schema.Struct({
14
+ city: Schema.String,
15
+ region: Schema.String,
16
+ country: Schema.String,
17
+ latitude: Schema.optional(Schema.Number),
18
+ longitude: Schema.optional(Schema.Number),
19
+ });
20
+ const getIPData = Effect.fn(function* (config) {
21
+ const httpClient = yield* HttpClient.HttpClient;
22
+ // Disable tracing to avoid CORS errors from traceparent header on cross-origin requests.
23
+ const httpClientNoTrace = httpClient.pipe(HttpClient.withTracerDisabledWhen(() => true));
24
+ // Check cache first.
25
+ const cachedData = yield* Effect.promise(() => localForage.getItem('dxos:observability:ipdata'));
26
+ if (cachedData && cachedData.timestamp > Date.now() - IP_DATA_CACHE_TIMEOUT) {
27
+ return cachedData.data;
28
+ }
29
+ // Fetch data if not cached.
30
+ const IPDATA_API_KEY = config.get('runtime.app.env.DX_IPDATA_API_KEY');
31
+ if (IPDATA_API_KEY) {
32
+ const data = yield* HttpClientRequest.get(`https://api.ipdata.co?api-key=${IPDATA_API_KEY}`).pipe(httpClientNoTrace.execute, Effect.flatMap((res) => res.json), Effect.flatMap(Schema.decodeUnknown(IPData)));
33
+ // Cache data.
34
+ yield* Effect.promise(() => localForage.setItem('dxos:observability:ipdata', {
35
+ data,
36
+ timestamp: Date.now(),
37
+ }));
38
+ return data;
39
+ }
40
+ });
41
+ /** Fetches IP geolocation data and sets city/region/country tags on the observability instance. */
42
+ export const provider = (config) => (observability) => Effect.gen(function* () {
43
+ const ipData = yield* getIPData(config);
44
+ if (!ipData) {
45
+ return;
46
+ }
47
+ observability.setTags({
48
+ city: ipData.city,
49
+ region: ipData.region,
50
+ country: ipData.country,
51
+ latitude: ipData.latitude,
52
+ longitude: ipData.longitude,
53
+ });
54
+ }).pipe(Effect.provide(FetchHttpClient.layer), Effect.catchAll((err) => Effect.sync(() => {
55
+ log.verbose('ipdata fetch failed', { err });
56
+ })));
57
+ //# sourceMappingURL=ip-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip-data.js","sourceRoot":"","sources":["../../../../src/providers/ip-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type DataProvider } from '../observability';
2
+ export declare const provider: DataProvider;
3
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/providers/storage.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,eAAO,MAAM,QAAQ,EAAE,YAWrB,CAAC"}
@@ -0,0 +1,19 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+ import * as Duration from 'effect/Duration';
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Fiber from 'effect/Fiber';
7
+ import * as Schedule from 'effect/Schedule';
8
+ export const provider = Effect.fn(function* (observability) {
9
+ if (typeof navigator !== 'undefined' && navigator.storage?.estimate) {
10
+ const action = Effect.gen(function* () {
11
+ const storageEstimate = yield* Effect.tryPromise(() => navigator.storage.estimate());
12
+ storageEstimate.usage && observability.metrics.gauge('storageUsage', storageEstimate.usage);
13
+ storageEstimate.quota && observability.metrics.gauge('storageQuota', storageEstimate.quota);
14
+ });
15
+ const fiber = action.pipe(Effect.repeat(Schedule.fixed(Duration.hours(1))), Effect.runFork);
16
+ return () => Effect.runSync(Fiber.interrupt(fiber));
17
+ }
18
+ });
19
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../../src/providers/storage.ts"],"names":[],"mappings":"AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;AAEF,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAI5C,MAAM,CAAC,MAAM,QAAQ,GAAiB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,aAAa;IACtE,IAAI,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YACjC,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YACrF,eAAe,CAAC,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;YAC5F,eAAe,CAAC,KAAK,IAAI,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5F,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACtD,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /** No-op in browser contexts. */
2
+ export declare const showObservabilityBanner: () => void;
3
+ /**
4
+ * @param namespace - localForage key prefix used to scope the observability state in browser storage.
5
+ */
6
+ export declare const isObservabilityDisabled: (namespace: string) => Promise<boolean>;
7
+ /**
8
+ * @param namespace - localForage key prefix used to scope the observability state in browser storage.
9
+ */
10
+ export declare const storeObservabilityDisabled: (namespace: string, value: boolean) => Promise<void>;
11
+ /**
12
+ * @param namespace - localForage key prefix used to scope the observability state in browser storage.
13
+ */
14
+ export declare const getObservabilityGroup: (namespace: string) => Promise<string | undefined>;
15
+ /**
16
+ * @param namespace - localForage key prefix used to scope the observability state in browser storage.
17
+ */
18
+ export declare const storeObservabilityGroup: (namespace: string, value: string) => Promise<void>;
19
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/storage/browser.ts"],"names":[],"mappings":"AAaA,iCAAiC;AACjC,eAAO,MAAM,uBAAuB,YAEnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,cAAqB,MAAM,KAAG,OAAO,CAAC,OAAO,CAOhF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,cAAqB,MAAM,SAAS,OAAO,kBAejF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,cAAqB,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAMzF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,cAAqB,MAAM,SAAS,MAAM,kBAM7E,CAAC"}
@@ -0,0 +1,69 @@
1
+ //
2
+ // Copyright 2022 DXOS.org
3
+ //
4
+ // NOTE: localStorage is not available in web workers.
5
+ import * as localForage from 'localforage';
6
+ import { log } from '@dxos/log';
7
+ import { compositeKey } from '@dxos/util';
8
+ const OBSERVABILITY_DISABLED_KEY = 'observability-disabled';
9
+ const OBSERVABILITY_GROUP_KEY = 'observability-group';
10
+ /** No-op in browser contexts. */
11
+ export const showObservabilityBanner = () => {
12
+ log.warn('showObservabilityBanner is not supported in browser contexts.');
13
+ };
14
+ /**
15
+ * @param namespace - localForage key prefix used to scope the observability state in browser storage.
16
+ */
17
+ export const isObservabilityDisabled = async (namespace) => {
18
+ try {
19
+ return (await localForage.getItem(compositeKey(namespace, OBSERVABILITY_DISABLED_KEY))) === 'true';
20
+ }
21
+ catch (err) {
22
+ log.catch('Failed to check if observability is disabled, assuming it is', err);
23
+ return true;
24
+ }
25
+ };
26
+ /**
27
+ * @param namespace - localForage key prefix used to scope the observability state in browser storage.
28
+ */
29
+ export const storeObservabilityDisabled = async (namespace, value) => {
30
+ try {
31
+ await localForage.setItem(compositeKey(namespace, OBSERVABILITY_DISABLED_KEY), String(value));
32
+ }
33
+ catch (err) {
34
+ log.catch('Failed to store observability disabled', err);
35
+ }
36
+ // Mirror to localStorage so the synchronous opt-out check in the OTEL extension picks it up
37
+ // without waiting for an async IndexedDB read.
38
+ try {
39
+ if (typeof localStorage !== 'undefined') {
40
+ localStorage.setItem(`${namespace}/${OBSERVABILITY_DISABLED_KEY}`, String(value));
41
+ }
42
+ }
43
+ catch {
44
+ // localStorage not available (e.g., in workers).
45
+ }
46
+ };
47
+ /**
48
+ * @param namespace - localForage key prefix used to scope the observability state in browser storage.
49
+ */
50
+ export const getObservabilityGroup = async (namespace) => {
51
+ try {
52
+ return (await localForage.getItem(compositeKey(namespace, OBSERVABILITY_GROUP_KEY))) ?? undefined;
53
+ }
54
+ catch (err) {
55
+ log.catch('Failed to get observability group', err);
56
+ }
57
+ };
58
+ /**
59
+ * @param namespace - localForage key prefix used to scope the observability state in browser storage.
60
+ */
61
+ export const storeObservabilityGroup = async (namespace, value) => {
62
+ try {
63
+ await localForage.setItem(compositeKey(namespace, OBSERVABILITY_GROUP_KEY), value);
64
+ }
65
+ catch (err) {
66
+ log.catch('Failed to store observability group', err);
67
+ }
68
+ };
69
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../../src/storage/browser.ts"],"names":[],"mappings":"AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;AAEF,sDAAsD;AACtD,OAAO,KAAK,WAAW,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,0BAA0B,GAAG,wBAAwB,CAAC;AAC5D,MAAM,uBAAuB,GAAG,qBAAqB,CAAC;AAEtD,iCAAiC;AACjC,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,EAAE;IAC1C,GAAG,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;AAC5E,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,SAAiB,EAAoB,EAAE;IACnF,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;IACrG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,8DAA8D,EAAE,GAAG,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,EAAE,SAAiB,EAAE,KAAc,EAAE,EAAE;IACpF,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,0BAA0B,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC;IACD,4FAA4F;IAC5F,+CAA+C;IAC/C,IAAI,CAAC;QACH,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;YACxC,YAAY,CAAC,OAAO,CAAC,GAAG,SAAS,IAAI,0BAA0B,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,SAAiB,EAA+B,EAAE;IAC5F,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IACpG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,SAAiB,EAAE,KAAa,EAAE,EAAE;IAChF,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,uBAAuB,CAAC,EAAE,KAAK,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './node';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/storage/index.ts"],"names":[],"mappings":"AAIA,cAAc,QAAQ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/storage/index.ts"],"names":[],"mappings":"AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;AAEF,cAAc,QAAQ,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Print observability banner once per installation.
3
+ */
4
+ export declare const showObservabilityBanner: (configDir: string, bannercb: (input: string) => void) => Promise<void>;
5
+ /**
6
+ * @param configDir - Filesystem path to the directory containing the `observability.yml` state file.
7
+ */
8
+ export declare const isObservabilityDisabled: (configDir: string) => Promise<boolean>;
9
+ /**
10
+ * @param configDir - Filesystem path to the directory containing the `observability.yml` state file.
11
+ */
12
+ export declare const storeObservabilityDisabled: (configDir: string, value: boolean) => Promise<void>;
13
+ /**
14
+ * @param configDir - Filesystem path to the directory containing the `observability.yml` state file.
15
+ */
16
+ export declare const getObservabilityGroup: (configDir: string) => Promise<string | undefined>;
17
+ /**
18
+ * @param configDir - Filesystem path to the directory containing the `observability.yml` state file.
19
+ */
20
+ export declare const storeObservabilityGroup: (configDir: string, value: string) => Promise<void>;
21
+ export type PersistentObservabilityState = {
22
+ installationId: string;
23
+ disabled: boolean;
24
+ group?: string;
25
+ };
26
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../../src/storage/node.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,eAAO,MAAM,uBAAuB,cAAqB,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,kBAajG,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,cAAqB,MAAM,KAAG,OAAO,CAAC,OAAO,CAGhF,CAAC;AAEF;;GAEG;AAGH,eAAO,MAAM,0BAA0B,cAAqB,MAAM,SAAS,OAAO,kBAIjF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,cAAqB,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAGzF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,uBAAuB,cAAqB,MAAM,SAAS,MAAM,kBAI7E,CAAC;AAsBF,MAAM,MAAM,4BAA4B,GAAG;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC"}
@@ -1,13 +1,11 @@
1
+ import yaml from 'js-yaml';
1
2
  //
2
3
  // Copyright 2022 DXOS.org
3
4
  //
4
5
  import { existsSync, statSync } from 'node:fs';
5
6
  import { mkdir, readFile, writeFile } from 'node:fs/promises';
6
7
  import { join } from 'node:path';
7
- import yaml from 'js-yaml';
8
8
  import { v4 as uuid, validate as validateUuid } from 'uuid';
9
- import { log } from '@dxos/log';
10
- import { Observability } from '../observability';
11
9
  /**
12
10
  * Print observability banner once per installation.
13
11
  */
@@ -16,15 +14,45 @@ export const showObservabilityBanner = async (configDir, bannercb) => {
16
14
  if (existsSync(path)) {
17
15
  return;
18
16
  }
19
- bannercb(
20
- // eslint-disable-next-line no-multi-str
21
- 'Basic observability data will be sent to the DXOS team in order to improve the product. This includes \
17
+ bannercb('Basic observability data will be sent to the DXOS team in order to improve the product. This includes \
22
18
  performance metrics, error logs, and usage data. No personally identifiable information, other than your \
23
19
  public key, is included with this data and no private data ever leaves your devices. To disable sending \
24
20
  observability data, set the environment variable DX_DISABLE_OBSERVABILITY=true.');
25
21
  await writeFile(path, '', 'utf-8');
26
22
  };
27
- export const getObservabilityState = async (configDir) => {
23
+ /**
24
+ * @param configDir - Filesystem path to the directory containing the `observability.yml` state file.
25
+ */
26
+ export const isObservabilityDisabled = async (configDir) => {
27
+ const observabilityState = await getObservabilityState(configDir);
28
+ return observabilityState.disabled;
29
+ };
30
+ /**
31
+ * @param configDir - Filesystem path to the directory containing the `observability.yml` state file.
32
+ */
33
+ // NOTE: read-modify-write is not atomic; concurrent callers could overwrite each other.
34
+ // Acceptable here because writes are infrequent and triggered by explicit user action.
35
+ export const storeObservabilityDisabled = async (configDir, value) => {
36
+ const observabilityState = await getObservabilityState(configDir);
37
+ observabilityState.disabled = value;
38
+ await writeFile(join(configDir, 'observability.yml'), yaml.dump(observabilityState), 'utf-8');
39
+ };
40
+ /**
41
+ * @param configDir - Filesystem path to the directory containing the `observability.yml` state file.
42
+ */
43
+ export const getObservabilityGroup = async (configDir) => {
44
+ const observabilityState = await getObservabilityState(configDir);
45
+ return observabilityState.group;
46
+ };
47
+ /**
48
+ * @param configDir - Filesystem path to the directory containing the `observability.yml` state file.
49
+ */
50
+ export const storeObservabilityGroup = async (configDir, value) => {
51
+ const observabilityState = await getObservabilityState(configDir);
52
+ observabilityState.group = value;
53
+ await writeFile(join(configDir, 'observability.yml'), yaml.dump(observabilityState), 'utf-8');
54
+ };
55
+ const getObservabilityState = async (configDir) => {
28
56
  // check whether configDir exists and if it's a directory
29
57
  if (existsSync(configDir)) {
30
58
  if (!statSync(configDir).isDirectory()) {
@@ -46,8 +74,8 @@ const initializeState = async (idPath) => {
46
74
  // TODO(nf): read initial values from config or seed file
47
75
  const observabilityState = {
48
76
  installationId: uuid(),
77
+ disabled: process.env.DX_DISABLE_OBSERVABILITY ? true : false,
49
78
  group: process.env.DX_OBSERVABILITY_GROUP ?? undefined,
50
- mode: (process.env.DX_DISABLE_OBSERVABILITY ? 'disabled' : (process.env.DX_OBSERVABILITY_MODE ?? 'basic')),
51
79
  };
52
80
  await writeFile(idPath, '# This file is automatically generated by the @dxos/cli.\n' + yaml.dump(observabilityState), 'utf-8');
53
81
  return observabilityState;
@@ -57,41 +85,8 @@ const validate = (contextString) => {
57
85
  if (Boolean(context.installationId) && validateUuid(context.installationId)) {
58
86
  return {
59
87
  ...context,
60
- mode: process.env.DX_DISABLE_OBSERVABILITY ? 'disabled' : (context.mode ?? 'basic'),
88
+ disabled: process.env.DX_DISABLE_OBSERVABILITY ? true : (context.disabled ?? false),
61
89
  };
62
90
  }
63
91
  };
64
- export const initializeNodeObservability = async ({ namespace, version, config, installationId, group, mode = 'basic', tracingEnable = true, replayEnable = true, }) => {
65
- log('initializeCliObservability', { config });
66
- // TODO(nf): make CLI build populate runtime.app.build config?
67
- const release = `${namespace}@${version}`;
68
- const environment = process.env.DX_ENVIRONMENT ?? 'unknown';
69
- const observability = new Observability({
70
- mode,
71
- namespace,
72
- release,
73
- environment,
74
- group,
75
- errorLog: {
76
- sentryInitOptions: {
77
- environment,
78
- release,
79
- // TODO(wittjosiah): Configure this.
80
- sampleRate: 1.0,
81
- },
82
- },
83
- });
84
- observability.setTag('installationId', installationId);
85
- // TODO(nf): cache ipdata to avoid repeated requests
86
- const IPDATA_API_KEY = config.get('runtime.app.env.DX_IPDATA_API_KEY');
87
- try {
88
- const res = await fetch(`https://api.ipdata.co/?api-key=${IPDATA_API_KEY}`);
89
- const ipData = await res.json();
90
- ipData && observability.setIPDataTelemetryTags(ipData);
91
- }
92
- catch (err) {
93
- observability?.captureException(err);
94
- }
95
- return observability;
96
- };
97
- //# sourceMappingURL=node-observability.js.map
92
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../../src/storage/node.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,EAAE;AACF,0BAA0B;AAC1B,EAAE;AACF,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;AAE5D;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,SAAiB,EAAE,QAAiC,EAAE,EAAE;IACpG,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,+BAA+B,CAAC,CAAC;IAC9D,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IACD,QAAQ,CACN;;;oFAGgF,CACjF,CAAC;IAEF,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,SAAiB,EAAoB,EAAE;IACnF,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAClE,OAAO,kBAAkB,CAAC,QAAQ,CAAC;AACrC,CAAC,CAAC;AAEF;;GAEG;AACH,wFAAwF;AACxF,uFAAuF;AACvF,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,EAAE,SAAiB,EAAE,KAAc,EAAE,EAAE;IACpF,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAClE,kBAAkB,CAAC,QAAQ,GAAG,KAAK,CAAC;IACpC,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC,CAAC;AAChG,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,SAAiB,EAA+B,EAAE;IAC5F,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAClE,OAAO,kBAAkB,CAAC,KAAK,CAAC;AAClC,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAAE,SAAiB,EAAE,KAAa,EAAE,EAAE;IAChF,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAClE,kBAAkB,CAAC,KAAK,GAAG,KAAK,CAAC;IACjC,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC,CAAC;AAChG,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,KAAK,EAAE,SAAiB,EAAyC,EAAE;IAC/F,yDAAyD;IAEzD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,gCAAgC,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACpD,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC,CAAC;AAQF,4FAA4F;AAC5F,MAAM,eAAe,GAAG,KAAK,EAAE,MAAc,EAAyC,EAAE;IACtF,yDAAyD;IACzD,MAAM,kBAAkB,GAAG;QACzB,cAAc,EAAE,IAAI,EAAE;QACtB,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK;QAC7D,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,SAAS;KACvD,CAAC;IAEF,MAAM,SAAS,CACb,MAAM,EACN,4DAA4D,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAC5F,OAAO,CACR,CAAC;IAEF,OAAO,kBAAkB,CAAC;AAC5B,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,CAAC,aAAqB,EAAE,EAAE;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAiC,CAAC;IACzE,IAAI,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,cAAe,CAAC,EAAE,CAAC;QAC7E,OAAO;YACL,GAAG,OAAO;YACV,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC;SACpF,CAAC;IACJ,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=node.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.test.d.ts","sourceRoot":"","sources":["../../../../src/storage/node.test.ts"],"names":[],"mappings":""}