@dxos/observability 0.8.4-main.b97322e → 0.8.4-main.bcb3aa67d6

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