@dxos/observability 0.8.4-main.fd6878d → 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/{otel → extensions/otel}/metrics.d.ts +0 -1
  49. package/dist/types/src/extensions/otel/metrics.d.ts.map +1 -0
  50. package/dist/types/src/{otel → extensions/otel}/metrics.js +4 -13
  51. package/dist/types/src/extensions/otel/metrics.js.map +1 -0
  52. package/dist/types/src/extensions/otel/otel.d.ts +19 -0
  53. package/dist/types/src/extensions/otel/otel.d.ts.map +1 -0
  54. package/dist/types/src/extensions/otel/otel.js +23 -0
  55. package/dist/types/src/extensions/otel/otel.js.map +1 -0
  56. package/dist/types/src/extensions/otel/span-processors.d.ts +25 -0
  57. package/dist/types/src/extensions/otel/span-processors.d.ts.map +1 -0
  58. package/dist/types/src/extensions/otel/span-processors.js +41 -0
  59. package/dist/types/src/extensions/otel/span-processors.js.map +1 -0
  60. package/dist/types/src/extensions/otel/traces-browser.d.ts +25 -0
  61. package/dist/types/src/extensions/otel/traces-browser.d.ts.map +1 -0
  62. package/dist/types/src/extensions/otel/traces-browser.js +105 -0
  63. package/dist/types/src/extensions/otel/traces-browser.js.map +1 -0
  64. package/dist/types/src/extensions/otel/traces.d.ts +25 -0
  65. package/dist/types/src/extensions/otel/traces.d.ts.map +1 -0
  66. package/dist/types/src/extensions/otel/traces.js +88 -0
  67. package/dist/types/src/extensions/otel/traces.js.map +1 -0
  68. package/dist/types/src/extensions/posthog/extension.d.ts +28 -0
  69. package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -0
  70. package/dist/types/src/extensions/posthog/extension.js +156 -0
  71. package/dist/types/src/extensions/posthog/extension.js.map +1 -0
  72. package/dist/types/src/extensions/posthog/index.d.ts +2 -0
  73. package/dist/types/src/extensions/posthog/index.d.ts.map +1 -0
  74. package/dist/types/src/extensions/posthog/index.js +5 -0
  75. package/dist/types/src/extensions/posthog/index.js.map +1 -0
  76. package/dist/types/src/extensions/posthog/log-processor.d.ts +3 -0
  77. package/dist/types/src/extensions/posthog/log-processor.d.ts.map +1 -0
  78. package/dist/types/src/extensions/posthog/log-processor.js +45 -0
  79. package/dist/types/src/extensions/posthog/log-processor.js.map +1 -0
  80. package/dist/types/src/extensions/posthog/log-processor.test.d.ts +2 -0
  81. package/dist/types/src/extensions/posthog/log-processor.test.d.ts.map +1 -0
  82. package/dist/types/src/extensions/posthog/log-processor.test.js +146 -0
  83. package/dist/types/src/extensions/posthog/log-processor.test.js.map +1 -0
  84. package/dist/types/src/extensions/stub.d.ts +3 -0
  85. package/dist/types/src/extensions/stub.d.ts.map +1 -0
  86. package/dist/types/src/extensions/stub.js +16 -0
  87. package/dist/types/src/extensions/stub.js.map +1 -0
  88. package/dist/types/src/index.d.ts +3 -2
  89. package/dist/types/src/index.d.ts.map +1 -1
  90. package/dist/types/src/index.js +4 -3
  91. package/dist/types/src/index.js.map +1 -1
  92. package/dist/types/src/observability-extension.d.ts +74 -0
  93. package/dist/types/src/observability-extension.d.ts.map +1 -0
  94. package/dist/types/src/observability-extension.js +5 -0
  95. package/dist/types/src/observability-extension.js.map +1 -0
  96. package/dist/types/src/observability.d.ts +32 -110
  97. package/dist/types/src/observability.d.ts.map +1 -1
  98. package/dist/types/src/observability.js +179 -465
  99. package/dist/types/src/observability.js.map +1 -1
  100. package/dist/types/src/observability.test.d.ts +2 -0
  101. package/dist/types/src/observability.test.d.ts.map +1 -0
  102. package/dist/types/src/observability.test.js +312 -0
  103. package/dist/types/src/observability.test.js.map +1 -0
  104. package/dist/types/src/providers/client-observability.d.ts +11 -0
  105. package/dist/types/src/providers/client-observability.d.ts.map +1 -0
  106. package/dist/types/src/providers/client-observability.js +202 -0
  107. package/dist/types/src/providers/client-observability.js.map +1 -0
  108. package/dist/types/src/providers/index.d.ts +4 -0
  109. package/dist/types/src/providers/index.d.ts.map +1 -0
  110. package/dist/types/src/providers/index.js +7 -0
  111. package/dist/types/src/providers/index.js.map +1 -0
  112. package/dist/types/src/providers/ip-data.d.ts +5 -0
  113. package/dist/types/src/providers/ip-data.d.ts.map +1 -0
  114. package/dist/types/src/providers/ip-data.js +65 -0
  115. package/dist/types/src/providers/ip-data.js.map +1 -0
  116. package/dist/types/src/providers/storage.d.ts +3 -0
  117. package/dist/types/src/providers/storage.d.ts.map +1 -0
  118. package/dist/types/src/providers/storage.js +19 -0
  119. package/dist/types/src/providers/storage.js.map +1 -0
  120. package/dist/types/src/storage/browser.d.ts +27 -0
  121. package/dist/types/src/storage/browser.d.ts.map +1 -0
  122. package/dist/types/src/storage/browser.js +98 -0
  123. package/dist/types/src/storage/browser.js.map +1 -0
  124. package/dist/types/src/storage/index.d.ts +2 -0
  125. package/dist/types/src/storage/index.d.ts.map +1 -0
  126. package/dist/types/src/storage/index.js.map +1 -0
  127. package/dist/types/src/storage/node.d.ts +30 -0
  128. package/dist/types/src/storage/node.d.ts.map +1 -0
  129. package/dist/types/src/storage/node.js +96 -0
  130. package/dist/types/src/storage/node.js.map +1 -0
  131. package/dist/types/src/storage/node.test.d.ts +2 -0
  132. package/dist/types/src/storage/node.test.d.ts.map +1 -0
  133. package/dist/types/src/storage/node.test.js +103 -0
  134. package/dist/types/src/storage/node.test.js.map +1 -0
  135. package/dist/types/tsconfig.tsbuildinfo +1 -1
  136. package/package.json +46 -69
  137. package/src/cli-observability-secrets.json +3 -4
  138. package/src/extensions/index.ts +6 -0
  139. package/src/extensions/otel/extension.ts +282 -0
  140. package/src/extensions/otel/index.ts +5 -0
  141. package/src/extensions/otel/logs.ts +137 -0
  142. package/src/{otel → extensions/otel}/metrics.ts +5 -22
  143. package/src/extensions/otel/otel.ts +34 -0
  144. package/src/extensions/otel/span-processors.ts +45 -0
  145. package/src/extensions/otel/traces-browser.ts +139 -0
  146. package/src/extensions/otel/traces.ts +113 -0
  147. package/src/extensions/posthog/extension.ts +199 -0
  148. package/src/extensions/posthog/index.ts +5 -0
  149. package/src/extensions/posthog/log-processor.test.ts +186 -0
  150. package/src/extensions/posthog/log-processor.ts +53 -0
  151. package/src/extensions/stub.ts +19 -0
  152. package/src/index.ts +4 -3
  153. package/src/observability-extension.ts +94 -0
  154. package/src/observability.test.ts +531 -0
  155. package/src/observability.ts +238 -577
  156. package/src/providers/client-observability.ts +255 -0
  157. package/src/providers/index.ts +7 -0
  158. package/src/providers/ip-data.ts +100 -0
  159. package/src/providers/storage.ts +23 -0
  160. package/src/storage/browser.ts +99 -0
  161. package/src/{segment → storage}/index.ts +0 -1
  162. package/src/storage/node.test.ts +129 -0
  163. package/src/{helpers/node-observability.ts → storage/node.ts} +47 -71
  164. package/src/vite-import-meta.d.ts +14 -0
  165. package/dist/lib/browser/chunk-4PRNMJKD.mjs +0 -148
  166. package/dist/lib/browser/chunk-4PRNMJKD.mjs.map +0 -7
  167. package/dist/lib/browser/chunk-5ICT2XF2.mjs +0 -1
  168. package/dist/lib/browser/chunk-I5VYFJ6C.mjs +0 -1019
  169. package/dist/lib/browser/chunk-I5VYFJ6C.mjs.map +0 -7
  170. package/dist/lib/browser/chunk-LJO63BXO.mjs +0 -164
  171. package/dist/lib/browser/chunk-LJO63BXO.mjs.map +0 -7
  172. package/dist/lib/browser/observability-VMNREW6G.mjs +0 -10
  173. package/dist/lib/browser/otel-VKOLQDIM.mjs +0 -286
  174. package/dist/lib/browser/otel-VKOLQDIM.mjs.map +0 -7
  175. package/dist/lib/browser/segment/index.mjs +0 -11
  176. package/dist/lib/browser/segment/index.mjs.map +0 -7
  177. package/dist/lib/browser/sentry/index.mjs +0 -24
  178. package/dist/lib/browser/sentry/index.mjs.map +0 -7
  179. package/dist/lib/browser/sentry-log-processor-JLBMJ2SF.mjs +0 -146
  180. package/dist/lib/browser/sentry-log-processor-JLBMJ2SF.mjs.map +0 -7
  181. package/dist/lib/node-esm/chunk-4BWYXXFK.mjs +0 -1020
  182. package/dist/lib/node-esm/chunk-4BWYXXFK.mjs.map +0 -7
  183. package/dist/lib/node-esm/chunk-QK5IUYVA.mjs +0 -135
  184. package/dist/lib/node-esm/chunk-QK5IUYVA.mjs.map +0 -7
  185. package/dist/lib/node-esm/chunk-QUZL7LKE.mjs +0 -2
  186. package/dist/lib/node-esm/chunk-QUZL7LKE.mjs.map +0 -7
  187. package/dist/lib/node-esm/chunk-RM3E3H7X.mjs +0 -204
  188. package/dist/lib/node-esm/chunk-RM3E3H7X.mjs.map +0 -7
  189. package/dist/lib/node-esm/observability-LKATG37M.mjs +0 -11
  190. package/dist/lib/node-esm/observability-LKATG37M.mjs.map +0 -7
  191. package/dist/lib/node-esm/otel-SDH2ZRXT.mjs +0 -269
  192. package/dist/lib/node-esm/otel-SDH2ZRXT.mjs.map +0 -7
  193. package/dist/lib/node-esm/segment/index.mjs +0 -12
  194. package/dist/lib/node-esm/segment/index.mjs.map +0 -7
  195. package/dist/lib/node-esm/sentry/index.mjs +0 -25
  196. package/dist/lib/node-esm/sentry/index.mjs.map +0 -7
  197. package/dist/lib/node-esm/sentry-log-processor-C4UGMAMV.mjs +0 -147
  198. package/dist/lib/node-esm/sentry-log-processor-C4UGMAMV.mjs.map +0 -7
  199. package/dist/types/src/helpers/browser-observability.d.ts +0 -17
  200. package/dist/types/src/helpers/browser-observability.d.ts.map +0 -1
  201. package/dist/types/src/helpers/browser-observability.js +0 -138
  202. package/dist/types/src/helpers/browser-observability.js.map +0 -1
  203. package/dist/types/src/helpers/common.d.ts +0 -12
  204. package/dist/types/src/helpers/common.d.ts.map +0 -1
  205. package/dist/types/src/helpers/common.js +0 -23
  206. package/dist/types/src/helpers/common.js.map +0 -1
  207. package/dist/types/src/helpers/index.d.ts +0 -6
  208. package/dist/types/src/helpers/index.d.ts.map +0 -1
  209. package/dist/types/src/helpers/index.js +0 -9
  210. package/dist/types/src/helpers/index.js.map +0 -1
  211. package/dist/types/src/helpers/map-spaces.d.ts +0 -18
  212. package/dist/types/src/helpers/map-spaces.d.ts.map +0 -1
  213. package/dist/types/src/helpers/map-spaces.js +0 -36
  214. package/dist/types/src/helpers/map-spaces.js.map +0 -1
  215. package/dist/types/src/helpers/node-observability.d.ts +0 -24
  216. package/dist/types/src/helpers/node-observability.d.ts.map +0 -1
  217. package/dist/types/src/helpers/node-observability.js +0 -97
  218. package/dist/types/src/helpers/node-observability.js.map +0 -1
  219. package/dist/types/src/helpers/setup-telemetry-listeners.d.ts +0 -4
  220. package/dist/types/src/helpers/setup-telemetry-listeners.d.ts.map +0 -1
  221. package/dist/types/src/helpers/setup-telemetry-listeners.js +0 -94
  222. package/dist/types/src/helpers/setup-telemetry-listeners.js.map +0 -1
  223. package/dist/types/src/otel/index.d.ts +0 -5
  224. package/dist/types/src/otel/index.d.ts.map +0 -1
  225. package/dist/types/src/otel/index.js +0 -8
  226. package/dist/types/src/otel/index.js.map +0 -1
  227. package/dist/types/src/otel/logs.d.ts.map +0 -1
  228. package/dist/types/src/otel/logs.js +0 -72
  229. package/dist/types/src/otel/logs.js.map +0 -1
  230. package/dist/types/src/otel/metrics.d.ts.map +0 -1
  231. package/dist/types/src/otel/metrics.js.map +0 -1
  232. package/dist/types/src/otel/otel.d.ts +0 -12
  233. package/dist/types/src/otel/otel.d.ts.map +0 -1
  234. package/dist/types/src/otel/otel.js +0 -11
  235. package/dist/types/src/otel/otel.js.map +0 -1
  236. package/dist/types/src/otel/traces-browser.d.ts +0 -8
  237. package/dist/types/src/otel/traces-browser.d.ts.map +0 -1
  238. package/dist/types/src/otel/traces-browser.js +0 -49
  239. package/dist/types/src/otel/traces-browser.js.map +0 -1
  240. package/dist/types/src/otel/traces.d.ts +0 -8
  241. package/dist/types/src/otel/traces.d.ts.map +0 -1
  242. package/dist/types/src/otel/traces.js +0 -42
  243. package/dist/types/src/otel/traces.js.map +0 -1
  244. package/dist/types/src/segment/base.d.ts +0 -15
  245. package/dist/types/src/segment/base.d.ts.map +0 -1
  246. package/dist/types/src/segment/base.js +0 -51
  247. package/dist/types/src/segment/base.js.map +0 -1
  248. package/dist/types/src/segment/browser.d.ts +0 -15
  249. package/dist/types/src/segment/browser.d.ts.map +0 -1
  250. package/dist/types/src/segment/browser.js +0 -63
  251. package/dist/types/src/segment/browser.js.map +0 -1
  252. package/dist/types/src/segment/index.d.ts +0 -3
  253. package/dist/types/src/segment/index.d.ts.map +0 -1
  254. package/dist/types/src/segment/index.js +0 -6
  255. package/dist/types/src/segment/index.js.map +0 -1
  256. package/dist/types/src/segment/node.d.ts +0 -16
  257. package/dist/types/src/segment/node.d.ts.map +0 -1
  258. package/dist/types/src/segment/node.js +0 -84
  259. package/dist/types/src/segment/node.js.map +0 -1
  260. package/dist/types/src/segment/types.d.ts +0 -52
  261. package/dist/types/src/segment/types.d.ts.map +0 -1
  262. package/dist/types/src/segment/types.js +0 -18
  263. package/dist/types/src/segment/types.js.map +0 -1
  264. package/dist/types/src/sentry/browser.d.ts +0 -32
  265. package/dist/types/src/sentry/browser.d.ts.map +0 -1
  266. package/dist/types/src/sentry/browser.js +0 -110
  267. package/dist/types/src/sentry/browser.js.map +0 -1
  268. package/dist/types/src/sentry/index.d.ts +0 -3
  269. package/dist/types/src/sentry/index.d.ts.map +0 -1
  270. package/dist/types/src/sentry/index.js.map +0 -1
  271. package/dist/types/src/sentry/node.d.ts +0 -32
  272. package/dist/types/src/sentry/node.d.ts.map +0 -1
  273. package/dist/types/src/sentry/node.js +0 -106
  274. package/dist/types/src/sentry/node.js.map +0 -1
  275. package/dist/types/src/sentry/node.node.test.d.ts +0 -2
  276. package/dist/types/src/sentry/node.node.test.d.ts.map +0 -1
  277. package/dist/types/src/sentry/node.node.test.js +0 -32
  278. package/dist/types/src/sentry/node.node.test.js.map +0 -1
  279. package/dist/types/src/sentry/sentry-log-processor.d.ts +0 -9
  280. package/dist/types/src/sentry/sentry-log-processor.d.ts.map +0 -1
  281. package/dist/types/src/sentry/sentry-log-processor.js +0 -144
  282. package/dist/types/src/sentry/sentry-log-processor.js.map +0 -1
  283. package/dist/types/src/sentry/sentry.node.test.d.ts +0 -2
  284. package/dist/types/src/sentry/sentry.node.test.d.ts.map +0 -1
  285. package/dist/types/src/sentry/sentry.node.test.js +0 -28
  286. package/dist/types/src/sentry/sentry.node.test.js.map +0 -1
  287. package/dist/types/src/sentry/types.d.ts +0 -18
  288. package/dist/types/src/sentry/types.d.ts.map +0 -1
  289. package/dist/types/src/sentry/types.js +0 -4
  290. package/dist/types/src/sentry/types.js.map +0 -1
  291. package/dist/types/src/testing/index.d.ts +0 -2
  292. package/dist/types/src/testing/index.d.ts.map +0 -1
  293. package/dist/types/src/testing/index.js +0 -5
  294. package/dist/types/src/testing/index.js.map +0 -1
  295. package/dist/types/src/testing/testkit/browser.d.ts +0 -2
  296. package/dist/types/src/testing/testkit/browser.d.ts.map +0 -1
  297. package/dist/types/src/testing/testkit/browser.js +0 -7
  298. package/dist/types/src/testing/testkit/browser.js.map +0 -1
  299. package/dist/types/src/testing/testkit/index.d.ts +0 -2
  300. package/dist/types/src/testing/testkit/index.d.ts.map +0 -1
  301. package/dist/types/src/testing/testkit/index.js +0 -6
  302. package/dist/types/src/testing/testkit/index.js.map +0 -1
  303. package/src/helpers/browser-observability.ts +0 -178
  304. package/src/helpers/common.ts +0 -38
  305. package/src/helpers/index.ts +0 -9
  306. package/src/helpers/map-spaces.ts +0 -48
  307. package/src/helpers/setup-telemetry-listeners.ts +0 -109
  308. package/src/otel/index.ts +0 -8
  309. package/src/otel/logs.ts +0 -100
  310. package/src/otel/otel.ts +0 -21
  311. package/src/otel/traces-browser.ts +0 -59
  312. package/src/otel/traces.ts +0 -57
  313. package/src/segment/base.ts +0 -69
  314. package/src/segment/browser.ts +0 -69
  315. package/src/segment/node.ts +0 -95
  316. package/src/segment/types.ts +0 -57
  317. package/src/sentry/browser.ts +0 -133
  318. package/src/sentry/index.ts +0 -6
  319. package/src/sentry/node.node.test.ts +0 -40
  320. package/src/sentry/node.ts +0 -126
  321. package/src/sentry/sentry-log-processor.ts +0 -174
  322. package/src/sentry/sentry.node.test.ts +0 -35
  323. package/src/sentry/types.ts +0 -22
  324. package/src/testing/index.ts +0 -5
  325. package/src/testing/testkit/browser.ts +0 -8
  326. package/src/testing/testkit/index.ts +0 -7
  327. package/src/testing/testkit/shims.d.ts +0 -5
  328. /package/dist/lib/browser/{chunk-5ICT2XF2.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  329. /package/dist/lib/{browser/observability-VMNREW6G.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
  330. /package/dist/types/src/{sentry → storage}/index.js +0 -0
@@ -0,0 +1,186 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { beforeEach, describe, expect, test, vi } from 'vitest';
6
+
7
+ import { InvariantViolation } from '@dxos/invariant';
8
+ import { type LogConfig, LogEntry, type LogEntryInit, LogLevel } from '@dxos/log';
9
+
10
+ // Replace the posthog-js module with a stub so log-processor's top-level import resolves to our mock.
11
+ // Dynamic imports are used so that both the mock and log-processor are loaded after vi.mock is hoisted.
12
+ vi.mock('posthog-js', () => ({
13
+ default: {
14
+ captureException: vi.fn(),
15
+ },
16
+ }));
17
+ const { default: posthog } = await import('posthog-js');
18
+ const { logProcessor } = await import('./log-processor');
19
+
20
+ const baseConfig: LogConfig = {
21
+ options: {},
22
+ captureFilters: [{ level: LogLevel.WARN }],
23
+ processors: [],
24
+ };
25
+
26
+ const createEntry = (overrides: Partial<LogEntryInit> = {}): LogEntry =>
27
+ new LogEntry({
28
+ level: LogLevel.ERROR,
29
+ message: 'test error',
30
+ ...overrides,
31
+ });
32
+
33
+ describe('logProcessor', () => {
34
+ beforeEach(() => {
35
+ vi.clearAllMocks();
36
+ });
37
+
38
+ test('skips entries that do not pass capture filters', () => {
39
+ const entry = createEntry({ level: LogLevel.DEBUG });
40
+ logProcessor(baseConfig, entry);
41
+ expect(posthog.captureException).not.toHaveBeenCalled();
42
+ });
43
+
44
+ test('skips entries from remote sessions', () => {
45
+ const entry = createEntry({
46
+ error: new Error('test'),
47
+ meta: { F: 'test.ts', L: 1, S: { remoteSessionId: 'remote-123' } },
48
+ });
49
+ logProcessor(baseConfig, entry);
50
+ expect(posthog.captureException).not.toHaveBeenCalled();
51
+ });
52
+
53
+ test('skips entries without errors', () => {
54
+ const entry = createEntry({ error: undefined, context: {} });
55
+ logProcessor(baseConfig, entry);
56
+ expect(posthog.captureException).not.toHaveBeenCalled();
57
+ });
58
+
59
+ test('captures error from entry.error', () => {
60
+ const error = new Error('direct error');
61
+ const entry = createEntry({
62
+ error,
63
+ meta: { F: 'packages/sdk/observability/src/test.ts', L: 42, S: undefined },
64
+ });
65
+ logProcessor(baseConfig, entry);
66
+ expect(posthog.captureException).toHaveBeenCalledWith(
67
+ error,
68
+ expect.objectContaining({
69
+ transaction: 'packages/sdk/observability/src/test.ts:42',
70
+ }),
71
+ );
72
+ });
73
+
74
+ test('captures error from context when level is ERROR but no entry.error', () => {
75
+ const contextError = new Error('context error');
76
+ const entry = createEntry({
77
+ level: LogLevel.ERROR,
78
+ error: undefined,
79
+ context: { someKey: contextError },
80
+ meta: { F: 'test.ts', L: 10, S: undefined },
81
+ });
82
+ logProcessor(baseConfig, entry);
83
+ expect(posthog.captureException).toHaveBeenCalledWith(contextError, expect.any(Object));
84
+ });
85
+
86
+ test('sets transaction from file:line metadata', () => {
87
+ const entry = createEntry({
88
+ error: new Error('err'),
89
+ meta: { F: '/home/user/project/packages/sdk/observability/src/index.ts', L: 99, S: undefined },
90
+ });
91
+ logProcessor(baseConfig, entry);
92
+ expect(posthog.captureException).toHaveBeenCalledWith(
93
+ expect.any(Error),
94
+ expect.objectContaining({
95
+ transaction: 'packages/sdk/observability/src/index.ts:99',
96
+ }),
97
+ );
98
+ });
99
+
100
+ test('sets service_host_issue/session for worker entries', () => {
101
+ const entry = createEntry({
102
+ error: new Error('worker err'),
103
+ meta: { F: 'test.ts', L: 1, S: { hostSessionId: 'host-abc' } },
104
+ });
105
+ logProcessor(baseConfig, entry);
106
+ expect(posthog.captureException).toHaveBeenCalledWith(
107
+ expect.any(Error),
108
+ expect.objectContaining({
109
+ service_host_issue: true,
110
+ service_host_session: 'host-abc',
111
+ }),
112
+ );
113
+ });
114
+
115
+ test('sets uptime_seconds from metadata', () => {
116
+ const entry = createEntry({
117
+ error: new Error('err'),
118
+ meta: { F: 'test.ts', L: 1, S: { uptimeSeconds: 123 } },
119
+ });
120
+ logProcessor(baseConfig, entry);
121
+ expect(posthog.captureException).toHaveBeenCalledWith(
122
+ expect.any(Error),
123
+ expect.objectContaining({
124
+ uptime_seconds: 123,
125
+ }),
126
+ );
127
+ });
128
+
129
+ test('sets invariant_violation flag for InvariantViolation errors', () => {
130
+ const error = new InvariantViolation('broken invariant');
131
+ const entry = createEntry({
132
+ error,
133
+ meta: { F: 'test.ts', L: 1, S: undefined },
134
+ });
135
+ logProcessor(baseConfig, entry);
136
+ expect(posthog.captureException).toHaveBeenCalledWith(
137
+ error,
138
+ expect.objectContaining({
139
+ invariant_violation: true,
140
+ }),
141
+ );
142
+ });
143
+
144
+ test('does not set invariant_violation for normal errors', () => {
145
+ const error = new Error('normal error');
146
+ const entry = createEntry({
147
+ error,
148
+ meta: { F: 'test.ts', L: 1, S: undefined },
149
+ });
150
+ logProcessor(baseConfig, entry);
151
+ const callArgs = vi.mocked(posthog.captureException).mock.calls[0];
152
+ expect(callArgs[1]).not.toHaveProperty('invariant_violation');
153
+ });
154
+ });
155
+
156
+ describe('getRelativeFilename', () => {
157
+ // We test this indirectly through the transaction property set by logProcessor.
158
+
159
+ test('extracts relative path from absolute path containing packages/', () => {
160
+ const entry = createEntry({
161
+ error: new Error('err'),
162
+ meta: { F: '/home/user/code/packages/sdk/observability/src/file.ts', L: 5, S: undefined },
163
+ });
164
+ logProcessor(baseConfig, entry);
165
+ expect(posthog.captureException).toHaveBeenCalledWith(
166
+ expect.any(Error),
167
+ expect.objectContaining({
168
+ transaction: 'packages/sdk/observability/src/file.ts:5',
169
+ }),
170
+ );
171
+ });
172
+
173
+ test('returns original filename if no match', () => {
174
+ const entry = createEntry({
175
+ error: new Error('err'),
176
+ meta: { F: 'no-packages-here.ts', L: 1, S: undefined },
177
+ });
178
+ logProcessor(baseConfig, entry);
179
+ expect(posthog.captureException).toHaveBeenCalledWith(
180
+ expect.any(Error),
181
+ expect.objectContaining({
182
+ transaction: 'no-packages-here.ts:1',
183
+ }),
184
+ );
185
+ });
186
+ });
@@ -0,0 +1,53 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import posthog from 'posthog-js';
6
+
7
+ import { InvariantViolation } from '@dxos/invariant';
8
+ import { type LogConfig, type LogEntry, LogLevel, type LogProcessor, getContextFromEntry, shouldLog } from '@dxos/log';
9
+
10
+ export const logProcessor: LogProcessor = (config: LogConfig, entry: LogEntry) => {
11
+ // Don't forward logs from remote sessions.
12
+ if (!shouldLog(entry, config.captureFilters) || entry.meta?.S?.remoteSessionId) {
13
+ return;
14
+ }
15
+
16
+ let capturedError = entry.error;
17
+ if (capturedError == null && entry.level === LogLevel.ERROR) {
18
+ capturedError = Object.values(entry.context ?? {}).find((v): v is Error => v instanceof Error);
19
+ }
20
+
21
+ if (!capturedError) {
22
+ return;
23
+ }
24
+
25
+ const additionalProperties: Record<string, string | boolean | number> = {};
26
+ const { filename, line } = entry.computedMeta;
27
+ if (filename !== undefined && line !== undefined) {
28
+ additionalProperties.transaction = `${filename}:${line}`;
29
+ }
30
+ if (entry.meta?.S?.hostSessionId) {
31
+ additionalProperties.service_host_issue = true;
32
+ additionalProperties.service_host_session = entry.meta.S.hostSessionId;
33
+ }
34
+ if (entry.meta?.S?.uptimeSeconds != null) {
35
+ additionalProperties.uptime_seconds = entry.meta.S.uptimeSeconds;
36
+ }
37
+
38
+ if (capturedError instanceof InvariantViolation) {
39
+ additionalProperties.invariant_violation = true;
40
+ }
41
+
42
+ // Forward primitive context values so callers can attach queryable attributes (e.g. fatal_dialog: true).
43
+ const context = getContextFromEntry(entry);
44
+ if (context) {
45
+ for (const [key, value] of Object.entries(context)) {
46
+ if (typeof value === 'string' || typeof value === 'boolean' || typeof value === 'number') {
47
+ additionalProperties[key] = value;
48
+ }
49
+ }
50
+ }
51
+
52
+ posthog.captureException(capturedError, additionalProperties);
53
+ };
@@ -0,0 +1,19 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { type Extension } from '../observability-extension';
8
+
9
+ export const stubExtension: Extension = {
10
+ initialize: () => Effect.succeed(undefined),
11
+ enable: () => Effect.succeed(undefined),
12
+ disable: () => Effect.succeed(undefined),
13
+ flush: () => Effect.succeed(undefined),
14
+ setTags: () => undefined,
15
+ get enabled() {
16
+ return true;
17
+ },
18
+ apis: [],
19
+ };
package/src/index.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './helpers';
6
- export * from './observability';
5
+ export * as Observability from './observability';
6
+ export * as ObservabilityExtension from './observability-extension';
7
+ export * as ObservabilityProvider from './providers';
@@ -0,0 +1,94 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import type * as Effect from 'effect/Effect';
6
+
7
+ export * from './extensions';
8
+
9
+ /**
10
+ * Kind of observability extension.
11
+ *
12
+ * - errors: Error tracking (e.g., PostHog)
13
+ * - events: Product usage event tracking (e.g., PostHog)
14
+ * - feedback: User feedback submission (e.g., PostHog)
15
+ * - logs: Structured logging (e.g., OTEL)
16
+ * - metrics: Metric data (e.g., OTEL)
17
+ * - traces: Distributed tracing (e.g., OTEL)
18
+ */
19
+ export type Kind = 'errors' | 'events' | 'feedback' | 'logs' | 'metrics' | 'traces';
20
+
21
+ /**
22
+ * Base for every extension API variant. All kinds implement availability the same way.
23
+ */
24
+ export type ExtensionApiBase<K extends Kind = Kind> = {
25
+ kind: K;
26
+ isAvailable(): Effect.Effect<boolean>;
27
+ };
28
+
29
+ /**
30
+ * Metrics extension API (kind-specific methods only).
31
+ */
32
+ export type Metrics = {
33
+ gauge(name: string, value: number, tags?: Attributes): void;
34
+ increment(name: string, value?: number, tags?: Attributes): void;
35
+ distribution(name: string, value: number, tags?: Attributes): void;
36
+ };
37
+
38
+ /**
39
+ * Errors extension API (kind-specific methods only).
40
+ */
41
+ export type Errors = {
42
+ captureException(error: Error, attributes?: Attributes): void;
43
+ };
44
+
45
+ /**
46
+ * Events extension API (kind-specific methods only).
47
+ */
48
+ export type Events = {
49
+ captureEvent(event: string, attributes?: Attributes): void;
50
+ };
51
+
52
+ /**
53
+ * Feedback extension API (kind-specific methods only).
54
+ */
55
+ export type Feedback = {
56
+ captureUserFeedback(form: FeedbackForm): Promise<string | undefined>;
57
+ };
58
+
59
+ export type ExtensionApi =
60
+ | (ExtensionApiBase<'errors'> & Errors)
61
+ | (ExtensionApiBase<'events'> & Events)
62
+ | (ExtensionApiBase<'feedback'> & Feedback)
63
+ // TODO(wittjosiah): Direct logs api?
64
+ | ExtensionApiBase<'logs'>
65
+ | (ExtensionApiBase<'metrics'> & Metrics)
66
+ // TODO(wittjosiah): Direct traces api?
67
+ | ExtensionApiBase<'traces'>;
68
+
69
+ /**
70
+ * Feedback form to be captured by the feedback extension.
71
+ */
72
+ // TODO(wittjosiah): Support more form fields (e.g., PostHog custom surveys).
73
+ export type FeedbackForm = { message: string; includeLogs?: boolean };
74
+
75
+ /**
76
+ * Attributes to be attached to observability events.
77
+ */
78
+ export type Attributes = Record<string, string | number | boolean | undefined>;
79
+
80
+ /**
81
+ * Implementation of an observability extension API.
82
+ */
83
+ export type Extension = {
84
+ initialize?(): Effect.Effect<void, Error>;
85
+ close?(): Effect.Effect<void>;
86
+ enable?(): Effect.Effect<void>;
87
+ disable?(): Effect.Effect<void>;
88
+ flush?(): Effect.Effect<void>;
89
+ identify?(distinctId: string, attributes?: Attributes, setOnceAttributes?: Attributes): void;
90
+ alias?(distinctId: string, previousId?: string): void;
91
+ setTags?(tags: Record<string, string>): void;
92
+ enabled: boolean;
93
+ apis: ExtensionApi[];
94
+ };