@dxos/observability 0.8.4-main.84f28bd → 0.8.4-main.8baae0fced

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 +964 -34
  7. package/dist/lib/browser/index.mjs.map +4 -4
  8. package/dist/lib/browser/log-processor-HPHWNBOK.mjs +38 -0
  9. package/dist/lib/browser/log-processor-HPHWNBOK.mjs.map +7 -0
  10. package/dist/lib/browser/logs-UTNIFYHF.mjs +116 -0
  11. package/dist/lib/browser/logs-UTNIFYHF.mjs.map +7 -0
  12. package/dist/lib/browser/meta.json +1 -1
  13. package/dist/lib/browser/metrics-PRGSYAZJ.mjs +116 -0
  14. package/dist/lib/browser/metrics-PRGSYAZJ.mjs.map +7 -0
  15. package/dist/lib/browser/traces-browser-XRINKQUA.mjs +154 -0
  16. package/dist/lib/browser/traces-browser-XRINKQUA.mjs.map +7 -0
  17. package/dist/lib/node-esm/chunk-EDDZWPYV.mjs +22 -0
  18. package/dist/lib/node-esm/chunk-EDDZWPYV.mjs.map +7 -0
  19. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  20. package/dist/lib/node-esm/index.mjs +986 -34
  21. package/dist/lib/node-esm/index.mjs.map +4 -4
  22. package/dist/lib/node-esm/log-processor-ZODHERST.mjs +39 -0
  23. package/dist/lib/node-esm/log-processor-ZODHERST.mjs.map +7 -0
  24. package/dist/lib/node-esm/logs-ARJUVN3T.mjs +117 -0
  25. package/dist/lib/node-esm/logs-ARJUVN3T.mjs.map +7 -0
  26. package/dist/lib/node-esm/meta.json +1 -1
  27. package/dist/lib/node-esm/metrics-DREJOOAC.mjs +117 -0
  28. package/dist/lib/node-esm/metrics-DREJOOAC.mjs.map +7 -0
  29. package/dist/lib/node-esm/traces-74F7JUKF.mjs +125 -0
  30. package/dist/lib/node-esm/traces-74F7JUKF.mjs.map +7 -0
  31. package/dist/types/src/cli-observability-secrets.json +3 -4
  32. package/dist/types/src/extensions/index.d.ts +3 -0
  33. package/dist/types/src/extensions/index.d.ts.map +1 -0
  34. package/dist/types/src/extensions/index.js +6 -0
  35. package/dist/types/src/extensions/index.js.map +1 -0
  36. package/dist/types/src/extensions/otel/extension.d.ts +23 -0
  37. package/dist/types/src/extensions/otel/extension.d.ts.map +1 -0
  38. package/dist/types/src/extensions/otel/extension.js +220 -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 +8 -14
  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 +36 -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 +178 -455
  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 +57 -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 +19 -0
  121. package/dist/types/src/storage/browser.d.ts.map +1 -0
  122. package/dist/types/src/storage/browser.js +69 -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/{src/segment/index.ts → dist/types/src/storage/index.js} +1 -2
  127. package/dist/types/src/storage/index.js.map +1 -0
  128. package/dist/types/src/storage/node.d.ts +26 -0
  129. package/dist/types/src/storage/node.d.ts.map +1 -0
  130. package/dist/types/src/storage/node.js +92 -0
  131. package/dist/types/src/storage/node.js.map +1 -0
  132. package/dist/types/src/storage/node.test.d.ts +2 -0
  133. package/dist/types/src/storage/node.test.d.ts.map +1 -0
  134. package/dist/types/src/storage/node.test.js +103 -0
  135. package/dist/types/src/storage/node.test.js.map +1 -0
  136. package/dist/types/tsconfig.tsbuildinfo +1 -1
  137. package/package.json +48 -65
  138. package/src/cli-observability-secrets.json +3 -4
  139. package/src/extensions/index.ts +6 -0
  140. package/src/extensions/otel/extension.ts +279 -0
  141. package/src/extensions/otel/index.ts +5 -0
  142. package/src/extensions/otel/logs.ts +137 -0
  143. package/src/{otel → extensions/otel}/metrics.ts +6 -23
  144. package/src/extensions/otel/otel.ts +34 -0
  145. package/src/extensions/otel/span-processors.ts +45 -0
  146. package/src/extensions/otel/traces-browser.ts +139 -0
  147. package/src/extensions/otel/traces.ts +113 -0
  148. package/src/extensions/posthog/extension.ts +199 -0
  149. package/src/extensions/posthog/index.ts +5 -0
  150. package/src/extensions/posthog/log-processor.test.ts +186 -0
  151. package/src/extensions/posthog/log-processor.ts +43 -0
  152. package/src/extensions/stub.ts +19 -0
  153. package/src/index.ts +4 -3
  154. package/src/observability-extension.ts +94 -0
  155. package/src/observability.test.ts +531 -0
  156. package/src/observability.ts +238 -577
  157. package/src/providers/client-observability.ts +255 -0
  158. package/src/providers/index.ts +7 -0
  159. package/src/providers/ip-data.ts +91 -0
  160. package/src/providers/storage.ts +23 -0
  161. package/src/storage/browser.ts +71 -0
  162. package/src/{sentry → storage}/index.ts +0 -1
  163. package/src/storage/node.test.ts +129 -0
  164. package/src/{helpers/node-observability.ts → storage/node.ts} +41 -70
  165. package/src/vite-import-meta.d.ts +14 -0
  166. package/dist/lib/browser/chunk-33TCMAUB.mjs +0 -996
  167. package/dist/lib/browser/chunk-33TCMAUB.mjs.map +0 -7
  168. package/dist/lib/browser/chunk-5OQYI27L.mjs +0 -1
  169. package/dist/lib/browser/chunk-MWTIKIBZ.mjs +0 -147
  170. package/dist/lib/browser/chunk-MWTIKIBZ.mjs.map +0 -7
  171. package/dist/lib/browser/chunk-YEPQFAES.mjs +0 -164
  172. package/dist/lib/browser/chunk-YEPQFAES.mjs.map +0 -7
  173. package/dist/lib/browser/observability-EEM6BEY6.mjs +0 -10
  174. package/dist/lib/browser/otel-IRDZ7PES.mjs +0 -277
  175. package/dist/lib/browser/otel-IRDZ7PES.mjs.map +0 -7
  176. package/dist/lib/browser/segment/index.mjs +0 -11
  177. package/dist/lib/browser/segment/index.mjs.map +0 -7
  178. package/dist/lib/browser/sentry/index.mjs +0 -24
  179. package/dist/lib/browser/sentry/index.mjs.map +0 -7
  180. package/dist/lib/browser/sentry-log-processor-3F3SBJXM.mjs +0 -146
  181. package/dist/lib/browser/sentry-log-processor-3F3SBJXM.mjs.map +0 -7
  182. package/dist/lib/node-esm/chunk-552KLA6Z.mjs +0 -202
  183. package/dist/lib/node-esm/chunk-552KLA6Z.mjs.map +0 -7
  184. package/dist/lib/node-esm/chunk-EYW4X3O6.mjs +0 -997
  185. package/dist/lib/node-esm/chunk-EYW4X3O6.mjs.map +0 -7
  186. package/dist/lib/node-esm/chunk-MRAK2H7O.mjs +0 -2
  187. package/dist/lib/node-esm/chunk-MRAK2H7O.mjs.map +0 -7
  188. package/dist/lib/node-esm/chunk-TEH6VIKV.mjs +0 -135
  189. package/dist/lib/node-esm/chunk-TEH6VIKV.mjs.map +0 -7
  190. package/dist/lib/node-esm/observability-DAXZGOBS.mjs +0 -11
  191. package/dist/lib/node-esm/observability-DAXZGOBS.mjs.map +0 -7
  192. package/dist/lib/node-esm/otel-62HYJETM.mjs +0 -260
  193. package/dist/lib/node-esm/otel-62HYJETM.mjs.map +0 -7
  194. package/dist/lib/node-esm/segment/index.mjs +0 -12
  195. package/dist/lib/node-esm/segment/index.mjs.map +0 -7
  196. package/dist/lib/node-esm/sentry/index.mjs +0 -25
  197. package/dist/lib/node-esm/sentry/index.mjs.map +0 -7
  198. package/dist/lib/node-esm/sentry-log-processor-JAYRA23C.mjs +0 -147
  199. package/dist/lib/node-esm/sentry-log-processor-JAYRA23C.mjs.map +0 -7
  200. package/dist/types/src/helpers/browser-observability.d.ts +0 -17
  201. package/dist/types/src/helpers/browser-observability.d.ts.map +0 -1
  202. package/dist/types/src/helpers/browser-observability.js +0 -140
  203. package/dist/types/src/helpers/browser-observability.js.map +0 -1
  204. package/dist/types/src/helpers/common.d.ts +0 -12
  205. package/dist/types/src/helpers/common.d.ts.map +0 -1
  206. package/dist/types/src/helpers/common.js +0 -23
  207. package/dist/types/src/helpers/common.js.map +0 -1
  208. package/dist/types/src/helpers/index.d.ts +0 -6
  209. package/dist/types/src/helpers/index.d.ts.map +0 -1
  210. package/dist/types/src/helpers/index.js +0 -9
  211. package/dist/types/src/helpers/index.js.map +0 -1
  212. package/dist/types/src/helpers/map-spaces.d.ts +0 -18
  213. package/dist/types/src/helpers/map-spaces.d.ts.map +0 -1
  214. package/dist/types/src/helpers/map-spaces.js +0 -37
  215. package/dist/types/src/helpers/map-spaces.js.map +0 -1
  216. package/dist/types/src/helpers/node-observability.d.ts +0 -24
  217. package/dist/types/src/helpers/node-observability.d.ts.map +0 -1
  218. package/dist/types/src/helpers/node-observability.js +0 -101
  219. package/dist/types/src/helpers/node-observability.js.map +0 -1
  220. package/dist/types/src/helpers/setup-telemetry-listeners.d.ts +0 -4
  221. package/dist/types/src/helpers/setup-telemetry-listeners.d.ts.map +0 -1
  222. package/dist/types/src/helpers/setup-telemetry-listeners.js +0 -97
  223. package/dist/types/src/helpers/setup-telemetry-listeners.js.map +0 -1
  224. package/dist/types/src/otel/index.d.ts +0 -5
  225. package/dist/types/src/otel/index.d.ts.map +0 -1
  226. package/dist/types/src/otel/index.js +0 -8
  227. package/dist/types/src/otel/index.js.map +0 -1
  228. package/dist/types/src/otel/logs.d.ts.map +0 -1
  229. package/dist/types/src/otel/logs.js +0 -71
  230. package/dist/types/src/otel/logs.js.map +0 -1
  231. package/dist/types/src/otel/metrics.d.ts.map +0 -1
  232. package/dist/types/src/otel/metrics.js.map +0 -1
  233. package/dist/types/src/otel/otel.d.ts +0 -12
  234. package/dist/types/src/otel/otel.d.ts.map +0 -1
  235. package/dist/types/src/otel/otel.js +0 -11
  236. package/dist/types/src/otel/otel.js.map +0 -1
  237. package/dist/types/src/otel/traces-browser.d.ts +0 -8
  238. package/dist/types/src/otel/traces-browser.d.ts.map +0 -1
  239. package/dist/types/src/otel/traces-browser.js +0 -47
  240. package/dist/types/src/otel/traces-browser.js.map +0 -1
  241. package/dist/types/src/otel/traces.d.ts +0 -8
  242. package/dist/types/src/otel/traces.d.ts.map +0 -1
  243. package/dist/types/src/otel/traces.js +0 -40
  244. package/dist/types/src/otel/traces.js.map +0 -1
  245. package/dist/types/src/segment/base.d.ts +0 -15
  246. package/dist/types/src/segment/base.d.ts.map +0 -1
  247. package/dist/types/src/segment/base.js +0 -50
  248. package/dist/types/src/segment/base.js.map +0 -1
  249. package/dist/types/src/segment/browser.d.ts +0 -15
  250. package/dist/types/src/segment/browser.d.ts.map +0 -1
  251. package/dist/types/src/segment/browser.js +0 -67
  252. package/dist/types/src/segment/browser.js.map +0 -1
  253. package/dist/types/src/segment/index.d.ts +0 -3
  254. package/dist/types/src/segment/index.d.ts.map +0 -1
  255. package/dist/types/src/segment/index.js +0 -6
  256. package/dist/types/src/segment/index.js.map +0 -1
  257. package/dist/types/src/segment/node.d.ts +0 -16
  258. package/dist/types/src/segment/node.d.ts.map +0 -1
  259. package/dist/types/src/segment/node.js +0 -83
  260. package/dist/types/src/segment/node.js.map +0 -1
  261. package/dist/types/src/segment/types.d.ts +0 -52
  262. package/dist/types/src/segment/types.d.ts.map +0 -1
  263. package/dist/types/src/segment/types.js +0 -18
  264. package/dist/types/src/segment/types.js.map +0 -1
  265. package/dist/types/src/sentry/browser.d.ts +0 -32
  266. package/dist/types/src/sentry/browser.d.ts.map +0 -1
  267. package/dist/types/src/sentry/browser.js +0 -112
  268. package/dist/types/src/sentry/browser.js.map +0 -1
  269. package/dist/types/src/sentry/index.d.ts +0 -3
  270. package/dist/types/src/sentry/index.d.ts.map +0 -1
  271. package/dist/types/src/sentry/index.js +0 -6
  272. package/dist/types/src/sentry/index.js.map +0 -1
  273. package/dist/types/src/sentry/node.d.ts +0 -32
  274. package/dist/types/src/sentry/node.d.ts.map +0 -1
  275. package/dist/types/src/sentry/node.js +0 -111
  276. package/dist/types/src/sentry/node.js.map +0 -1
  277. package/dist/types/src/sentry/node.node.test.d.ts +0 -2
  278. package/dist/types/src/sentry/node.node.test.d.ts.map +0 -1
  279. package/dist/types/src/sentry/node.node.test.js +0 -34
  280. package/dist/types/src/sentry/node.node.test.js.map +0 -1
  281. package/dist/types/src/sentry/sentry-log-processor.d.ts +0 -9
  282. package/dist/types/src/sentry/sentry-log-processor.d.ts.map +0 -1
  283. package/dist/types/src/sentry/sentry-log-processor.js +0 -149
  284. package/dist/types/src/sentry/sentry-log-processor.js.map +0 -1
  285. package/dist/types/src/sentry/sentry.node.test.d.ts +0 -2
  286. package/dist/types/src/sentry/sentry.node.test.d.ts.map +0 -1
  287. package/dist/types/src/sentry/sentry.node.test.js +0 -28
  288. package/dist/types/src/sentry/sentry.node.test.js.map +0 -1
  289. package/dist/types/src/sentry/types.d.ts +0 -18
  290. package/dist/types/src/sentry/types.d.ts.map +0 -1
  291. package/dist/types/src/sentry/types.js +0 -4
  292. package/dist/types/src/sentry/types.js.map +0 -1
  293. package/dist/types/src/testing/index.d.ts +0 -2
  294. package/dist/types/src/testing/index.d.ts.map +0 -1
  295. package/dist/types/src/testing/index.js +0 -5
  296. package/dist/types/src/testing/index.js.map +0 -1
  297. package/dist/types/src/testing/testkit/browser.d.ts +0 -2
  298. package/dist/types/src/testing/testkit/browser.d.ts.map +0 -1
  299. package/dist/types/src/testing/testkit/browser.js +0 -7
  300. package/dist/types/src/testing/testkit/browser.js.map +0 -1
  301. package/dist/types/src/testing/testkit/index.d.ts +0 -2
  302. package/dist/types/src/testing/testkit/index.d.ts.map +0 -1
  303. package/dist/types/src/testing/testkit/index.js +0 -6
  304. package/dist/types/src/testing/testkit/index.js.map +0 -1
  305. package/src/helpers/browser-observability.ts +0 -177
  306. package/src/helpers/common.ts +0 -38
  307. package/src/helpers/index.ts +0 -9
  308. package/src/helpers/map-spaces.ts +0 -48
  309. package/src/helpers/setup-telemetry-listeners.ts +0 -108
  310. package/src/otel/index.ts +0 -8
  311. package/src/otel/logs.ts +0 -100
  312. package/src/otel/otel.ts +0 -21
  313. package/src/otel/traces-browser.ts +0 -59
  314. package/src/otel/traces.ts +0 -57
  315. package/src/segment/base.ts +0 -69
  316. package/src/segment/browser.ts +0 -68
  317. package/src/segment/node.ts +0 -94
  318. package/src/segment/types.ts +0 -57
  319. package/src/sentry/browser.ts +0 -133
  320. package/src/sentry/node.node.test.ts +0 -39
  321. package/src/sentry/node.ts +0 -126
  322. package/src/sentry/sentry-log-processor.ts +0 -166
  323. package/src/sentry/sentry.node.test.ts +0 -34
  324. package/src/sentry/types.ts +0 -22
  325. package/src/testing/index.ts +0 -5
  326. package/src/testing/testkit/browser.ts +0 -8
  327. package/src/testing/testkit/index.ts +0 -7
  328. package/src/testing/testkit/shims.d.ts +0 -5
  329. /package/dist/lib/browser/{chunk-5OQYI27L.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  330. /package/dist/lib/{browser/observability-EEM6BEY6.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +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,43 @@
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, 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
+ posthog.captureException(capturedError, additionalProperties);
43
+ };
@@ -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
+ };