@dxos/observability 0.8.4-main.fffef41 → 0.8.4-staging.60fe92afc8

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