@dxos/observability 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0

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 (314) hide show
  1. package/README.md +14 -11
  2. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  3. package/dist/lib/browser/chunk-K4VFBKST.mjs +13 -0
  4. package/dist/lib/browser/chunk-K4VFBKST.mjs.map +7 -0
  5. package/dist/lib/browser/index.mjs +1013 -34
  6. package/dist/lib/browser/index.mjs.map +4 -4
  7. package/dist/lib/browser/log-processor-FDLTDQEM.mjs +45 -0
  8. package/dist/lib/browser/log-processor-FDLTDQEM.mjs.map +7 -0
  9. package/dist/lib/browser/logs-ATTRIUTL.mjs +113 -0
  10. package/dist/lib/browser/logs-ATTRIUTL.mjs.map +7 -0
  11. package/dist/lib/browser/meta.json +1 -1
  12. package/dist/lib/browser/metrics-PKTV6IGF.mjs +130 -0
  13. package/dist/lib/browser/metrics-PKTV6IGF.mjs.map +7 -0
  14. package/dist/lib/browser/traces-browser-PUNCJ5KV.mjs +112 -0
  15. package/dist/lib/browser/traces-browser-PUNCJ5KV.mjs.map +7 -0
  16. package/dist/lib/node-esm/chunk-FEVP3MK4.mjs +15 -0
  17. package/dist/lib/node-esm/chunk-FEVP3MK4.mjs.map +7 -0
  18. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  19. package/dist/lib/node-esm/index.mjs +1016 -34
  20. package/dist/lib/node-esm/index.mjs.map +4 -4
  21. package/dist/lib/node-esm/log-processor-TKJVJJSJ.mjs +46 -0
  22. package/dist/lib/node-esm/log-processor-TKJVJJSJ.mjs.map +7 -0
  23. package/dist/lib/node-esm/logs-7J45KLM7.mjs +114 -0
  24. package/dist/lib/node-esm/logs-7J45KLM7.mjs.map +7 -0
  25. package/dist/lib/node-esm/meta.json +1 -1
  26. package/dist/lib/node-esm/metrics-H7DDLYSG.mjs +131 -0
  27. package/dist/lib/node-esm/metrics-H7DDLYSG.mjs.map +7 -0
  28. package/dist/lib/node-esm/traces-KMTHMYFX.mjs +44 -0
  29. package/dist/lib/node-esm/traces-KMTHMYFX.mjs.map +7 -0
  30. package/dist/types/src/cli-observability-secrets.json +3 -4
  31. package/dist/types/src/extensions/index.d.ts +3 -0
  32. package/dist/types/src/extensions/index.d.ts.map +1 -0
  33. package/dist/types/src/extensions/index.js +6 -0
  34. package/dist/types/src/extensions/index.js.map +1 -0
  35. package/dist/types/src/extensions/otel/extension.d.ts +23 -0
  36. package/dist/types/src/extensions/otel/extension.d.ts.map +1 -0
  37. package/dist/types/src/extensions/otel/extension.js +124 -0
  38. package/dist/types/src/extensions/otel/extension.js.map +1 -0
  39. package/dist/types/src/extensions/otel/index.d.ts +2 -0
  40. package/dist/types/src/extensions/otel/index.d.ts.map +1 -0
  41. package/dist/types/src/extensions/otel/index.js +5 -0
  42. package/dist/types/src/extensions/otel/index.js.map +1 -0
  43. package/dist/types/src/{otel → extensions/otel}/logs.d.ts +4 -3
  44. package/dist/types/src/extensions/otel/logs.d.ts.map +1 -0
  45. package/dist/types/src/{otel → extensions/otel}/logs.js +48 -18
  46. package/dist/types/src/extensions/otel/logs.js.map +1 -0
  47. package/dist/types/src/extensions/otel/metrics.d.ts.map +1 -0
  48. package/dist/types/src/{otel → extensions/otel}/metrics.js +2 -10
  49. package/dist/types/src/extensions/otel/metrics.js.map +1 -0
  50. package/dist/types/src/{otel → extensions/otel}/otel.d.ts +3 -3
  51. package/dist/types/src/extensions/otel/otel.d.ts.map +1 -0
  52. package/dist/types/src/extensions/otel/otel.js.map +1 -0
  53. package/dist/types/src/extensions/otel/traces-browser.d.ts.map +1 -0
  54. package/dist/types/src/extensions/otel/traces-browser.js +85 -0
  55. package/dist/types/src/extensions/otel/traces-browser.js.map +1 -0
  56. package/dist/types/src/extensions/otel/traces.d.ts.map +1 -0
  57. package/dist/types/src/{otel → extensions/otel}/traces.js +5 -13
  58. package/dist/types/src/extensions/otel/traces.js.map +1 -0
  59. package/dist/types/src/extensions/posthog/extension.d.ts +18 -0
  60. package/dist/types/src/extensions/posthog/extension.d.ts.map +1 -0
  61. package/dist/types/src/extensions/posthog/extension.js +144 -0
  62. package/dist/types/src/extensions/posthog/extension.js.map +1 -0
  63. package/dist/types/src/extensions/posthog/index.d.ts +2 -0
  64. package/dist/types/src/extensions/posthog/index.d.ts.map +1 -0
  65. package/dist/types/src/extensions/posthog/index.js +5 -0
  66. package/dist/types/src/extensions/posthog/index.js.map +1 -0
  67. package/dist/types/src/extensions/posthog/log-processor.d.ts +3 -0
  68. package/dist/types/src/extensions/posthog/log-processor.d.ts.map +1 -0
  69. package/dist/types/src/extensions/posthog/log-processor.js +45 -0
  70. package/dist/types/src/extensions/posthog/log-processor.js.map +1 -0
  71. package/dist/types/src/extensions/posthog/log-processor.test.d.ts +2 -0
  72. package/dist/types/src/extensions/posthog/log-processor.test.d.ts.map +1 -0
  73. package/dist/types/src/extensions/posthog/log-processor.test.js +146 -0
  74. package/dist/types/src/extensions/posthog/log-processor.test.js.map +1 -0
  75. package/dist/types/src/extensions/stub.d.ts +3 -0
  76. package/dist/types/src/extensions/stub.d.ts.map +1 -0
  77. package/dist/types/src/extensions/stub.js +16 -0
  78. package/dist/types/src/extensions/stub.js.map +1 -0
  79. package/dist/types/src/index.d.ts +3 -2
  80. package/dist/types/src/index.d.ts.map +1 -1
  81. package/dist/types/src/index.js +4 -3
  82. package/dist/types/src/index.js.map +1 -1
  83. package/dist/types/src/observability-extension.d.ts +74 -0
  84. package/dist/types/src/observability-extension.d.ts.map +1 -0
  85. package/dist/types/src/observability-extension.js +5 -0
  86. package/dist/types/src/observability-extension.js.map +1 -0
  87. package/dist/types/src/observability.d.ts +32 -110
  88. package/dist/types/src/observability.d.ts.map +1 -1
  89. package/dist/types/src/observability.js +177 -465
  90. package/dist/types/src/observability.js.map +1 -1
  91. package/dist/types/src/observability.test.d.ts +2 -0
  92. package/dist/types/src/observability.test.d.ts.map +1 -0
  93. package/dist/types/src/observability.test.js +312 -0
  94. package/dist/types/src/observability.test.js.map +1 -0
  95. package/dist/types/src/providers/client-observability.d.ts +11 -0
  96. package/dist/types/src/providers/client-observability.d.ts.map +1 -0
  97. package/dist/types/src/providers/client-observability.js +200 -0
  98. package/dist/types/src/providers/client-observability.js.map +1 -0
  99. package/dist/types/src/providers/index.d.ts +4 -0
  100. package/dist/types/src/providers/index.d.ts.map +1 -0
  101. package/dist/types/src/providers/index.js +7 -0
  102. package/dist/types/src/providers/index.js.map +1 -0
  103. package/dist/types/src/providers/ip-data.d.ts +5 -0
  104. package/dist/types/src/providers/ip-data.d.ts.map +1 -0
  105. package/dist/types/src/providers/ip-data.js +57 -0
  106. package/dist/types/src/providers/ip-data.js.map +1 -0
  107. package/dist/types/src/providers/storage.d.ts +3 -0
  108. package/dist/types/src/providers/storage.d.ts.map +1 -0
  109. package/dist/types/src/providers/storage.js +19 -0
  110. package/dist/types/src/providers/storage.js.map +1 -0
  111. package/dist/types/src/storage/browser.d.ts +19 -0
  112. package/dist/types/src/storage/browser.d.ts.map +1 -0
  113. package/dist/types/src/storage/browser.js +59 -0
  114. package/dist/types/src/storage/browser.js.map +1 -0
  115. package/dist/types/src/storage/index.d.ts +2 -0
  116. package/dist/types/src/storage/index.d.ts.map +1 -0
  117. package/dist/types/src/storage/index.js.map +1 -0
  118. package/dist/types/src/storage/node.d.ts +26 -0
  119. package/dist/types/src/storage/node.d.ts.map +1 -0
  120. package/dist/types/src/{helpers/node-observability.js → storage/node.js} +38 -43
  121. package/dist/types/src/storage/node.js.map +1 -0
  122. package/dist/types/src/storage/node.test.d.ts +2 -0
  123. package/dist/types/src/storage/node.test.d.ts.map +1 -0
  124. package/dist/types/src/storage/node.test.js +103 -0
  125. package/dist/types/src/storage/node.test.js.map +1 -0
  126. package/dist/types/tsconfig.tsbuildinfo +1 -1
  127. package/package.json +32 -52
  128. package/src/cli-observability-secrets.json +3 -4
  129. package/src/extensions/index.ts +6 -0
  130. package/src/extensions/otel/extension.ts +178 -0
  131. package/src/extensions/otel/index.ts +5 -0
  132. package/src/{otel → extensions/otel}/logs.ts +55 -23
  133. package/src/{otel → extensions/otel}/metrics.ts +2 -12
  134. package/src/{otel → extensions/otel}/otel.ts +3 -3
  135. package/src/extensions/otel/traces-browser.ts +110 -0
  136. package/src/{otel → extensions/otel}/traces.ts +10 -21
  137. package/src/extensions/posthog/extension.ts +176 -0
  138. package/src/extensions/posthog/index.ts +5 -0
  139. package/src/extensions/posthog/log-processor.test.ts +185 -0
  140. package/src/extensions/posthog/log-processor.ts +54 -0
  141. package/src/extensions/stub.ts +19 -0
  142. package/src/index.ts +4 -3
  143. package/src/observability-extension.ts +94 -0
  144. package/src/observability.test.ts +531 -0
  145. package/src/observability.ts +236 -577
  146. package/src/providers/client-observability.ts +253 -0
  147. package/src/providers/index.ts +7 -0
  148. package/src/providers/ip-data.ts +91 -0
  149. package/src/providers/storage.ts +23 -0
  150. package/src/storage/browser.ts +62 -0
  151. package/src/{segment → storage}/index.ts +0 -1
  152. package/src/storage/node.test.ts +129 -0
  153. package/src/{helpers/node-observability.ts → storage/node.ts} +41 -71
  154. package/src/vite-import-meta.d.ts +14 -0
  155. package/dist/lib/browser/chunk-5ICT2XF2.mjs +0 -1
  156. package/dist/lib/browser/chunk-VIGEEYDR.mjs +0 -1019
  157. package/dist/lib/browser/chunk-VIGEEYDR.mjs.map +0 -7
  158. package/dist/lib/browser/chunk-XNAF22QM.mjs +0 -148
  159. package/dist/lib/browser/chunk-XNAF22QM.mjs.map +0 -7
  160. package/dist/lib/browser/chunk-ZI3ZS3PA.mjs +0 -164
  161. package/dist/lib/browser/chunk-ZI3ZS3PA.mjs.map +0 -7
  162. package/dist/lib/browser/observability-I65SW7NE.mjs +0 -10
  163. package/dist/lib/browser/otel-UH7ZRWC2.mjs +0 -287
  164. package/dist/lib/browser/otel-UH7ZRWC2.mjs.map +0 -7
  165. package/dist/lib/browser/segment/index.mjs +0 -11
  166. package/dist/lib/browser/segment/index.mjs.map +0 -7
  167. package/dist/lib/browser/sentry/index.mjs +0 -24
  168. package/dist/lib/browser/sentry/index.mjs.map +0 -7
  169. package/dist/lib/browser/sentry-log-processor-5VGDTKZN.mjs +0 -146
  170. package/dist/lib/browser/sentry-log-processor-5VGDTKZN.mjs.map +0 -7
  171. package/dist/lib/node-esm/chunk-MTKIPRBH.mjs +0 -1020
  172. package/dist/lib/node-esm/chunk-MTKIPRBH.mjs.map +0 -7
  173. package/dist/lib/node-esm/chunk-OJV247NY.mjs +0 -204
  174. package/dist/lib/node-esm/chunk-OJV247NY.mjs.map +0 -7
  175. package/dist/lib/node-esm/chunk-QK5IUYVA.mjs +0 -135
  176. package/dist/lib/node-esm/chunk-QK5IUYVA.mjs.map +0 -7
  177. package/dist/lib/node-esm/chunk-QUZL7LKE.mjs +0 -2
  178. package/dist/lib/node-esm/chunk-QUZL7LKE.mjs.map +0 -7
  179. package/dist/lib/node-esm/observability-5KKD7B6J.mjs +0 -11
  180. package/dist/lib/node-esm/observability-5KKD7B6J.mjs.map +0 -7
  181. package/dist/lib/node-esm/otel-7PUCFSTY.mjs +0 -270
  182. package/dist/lib/node-esm/otel-7PUCFSTY.mjs.map +0 -7
  183. package/dist/lib/node-esm/segment/index.mjs +0 -12
  184. package/dist/lib/node-esm/segment/index.mjs.map +0 -7
  185. package/dist/lib/node-esm/sentry/index.mjs +0 -25
  186. package/dist/lib/node-esm/sentry/index.mjs.map +0 -7
  187. package/dist/lib/node-esm/sentry-log-processor-A2EV7P3Y.mjs +0 -147
  188. package/dist/lib/node-esm/sentry-log-processor-A2EV7P3Y.mjs.map +0 -7
  189. package/dist/types/src/helpers/browser-observability.d.ts +0 -17
  190. package/dist/types/src/helpers/browser-observability.d.ts.map +0 -1
  191. package/dist/types/src/helpers/browser-observability.js +0 -138
  192. package/dist/types/src/helpers/browser-observability.js.map +0 -1
  193. package/dist/types/src/helpers/common.d.ts +0 -12
  194. package/dist/types/src/helpers/common.d.ts.map +0 -1
  195. package/dist/types/src/helpers/common.js +0 -23
  196. package/dist/types/src/helpers/common.js.map +0 -1
  197. package/dist/types/src/helpers/index.d.ts +0 -6
  198. package/dist/types/src/helpers/index.d.ts.map +0 -1
  199. package/dist/types/src/helpers/index.js +0 -9
  200. package/dist/types/src/helpers/index.js.map +0 -1
  201. package/dist/types/src/helpers/map-spaces.d.ts +0 -18
  202. package/dist/types/src/helpers/map-spaces.d.ts.map +0 -1
  203. package/dist/types/src/helpers/map-spaces.js +0 -36
  204. package/dist/types/src/helpers/map-spaces.js.map +0 -1
  205. package/dist/types/src/helpers/node-observability.d.ts +0 -24
  206. package/dist/types/src/helpers/node-observability.d.ts.map +0 -1
  207. package/dist/types/src/helpers/node-observability.js.map +0 -1
  208. package/dist/types/src/helpers/setup-telemetry-listeners.d.ts +0 -4
  209. package/dist/types/src/helpers/setup-telemetry-listeners.d.ts.map +0 -1
  210. package/dist/types/src/helpers/setup-telemetry-listeners.js +0 -94
  211. package/dist/types/src/helpers/setup-telemetry-listeners.js.map +0 -1
  212. package/dist/types/src/otel/index.d.ts +0 -5
  213. package/dist/types/src/otel/index.d.ts.map +0 -1
  214. package/dist/types/src/otel/index.js +0 -8
  215. package/dist/types/src/otel/index.js.map +0 -1
  216. package/dist/types/src/otel/logs.d.ts.map +0 -1
  217. package/dist/types/src/otel/logs.js.map +0 -1
  218. package/dist/types/src/otel/metrics.d.ts.map +0 -1
  219. package/dist/types/src/otel/metrics.js.map +0 -1
  220. package/dist/types/src/otel/otel.d.ts.map +0 -1
  221. package/dist/types/src/otel/otel.js.map +0 -1
  222. package/dist/types/src/otel/traces-browser.d.ts.map +0 -1
  223. package/dist/types/src/otel/traces-browser.js +0 -53
  224. package/dist/types/src/otel/traces-browser.js.map +0 -1
  225. package/dist/types/src/otel/traces.d.ts.map +0 -1
  226. package/dist/types/src/otel/traces.js.map +0 -1
  227. package/dist/types/src/segment/base.d.ts +0 -15
  228. package/dist/types/src/segment/base.d.ts.map +0 -1
  229. package/dist/types/src/segment/base.js +0 -51
  230. package/dist/types/src/segment/base.js.map +0 -1
  231. package/dist/types/src/segment/browser.d.ts +0 -15
  232. package/dist/types/src/segment/browser.d.ts.map +0 -1
  233. package/dist/types/src/segment/browser.js +0 -63
  234. package/dist/types/src/segment/browser.js.map +0 -1
  235. package/dist/types/src/segment/index.d.ts +0 -3
  236. package/dist/types/src/segment/index.d.ts.map +0 -1
  237. package/dist/types/src/segment/index.js +0 -6
  238. package/dist/types/src/segment/index.js.map +0 -1
  239. package/dist/types/src/segment/node.d.ts +0 -16
  240. package/dist/types/src/segment/node.d.ts.map +0 -1
  241. package/dist/types/src/segment/node.js +0 -84
  242. package/dist/types/src/segment/node.js.map +0 -1
  243. package/dist/types/src/segment/types.d.ts +0 -52
  244. package/dist/types/src/segment/types.d.ts.map +0 -1
  245. package/dist/types/src/segment/types.js +0 -18
  246. package/dist/types/src/segment/types.js.map +0 -1
  247. package/dist/types/src/sentry/browser.d.ts +0 -32
  248. package/dist/types/src/sentry/browser.d.ts.map +0 -1
  249. package/dist/types/src/sentry/browser.js +0 -110
  250. package/dist/types/src/sentry/browser.js.map +0 -1
  251. package/dist/types/src/sentry/index.d.ts +0 -3
  252. package/dist/types/src/sentry/index.d.ts.map +0 -1
  253. package/dist/types/src/sentry/index.js.map +0 -1
  254. package/dist/types/src/sentry/node.d.ts +0 -32
  255. package/dist/types/src/sentry/node.d.ts.map +0 -1
  256. package/dist/types/src/sentry/node.js +0 -106
  257. package/dist/types/src/sentry/node.js.map +0 -1
  258. package/dist/types/src/sentry/node.node.test.d.ts +0 -2
  259. package/dist/types/src/sentry/node.node.test.d.ts.map +0 -1
  260. package/dist/types/src/sentry/node.node.test.js +0 -32
  261. package/dist/types/src/sentry/node.node.test.js.map +0 -1
  262. package/dist/types/src/sentry/sentry-log-processor.d.ts +0 -9
  263. package/dist/types/src/sentry/sentry-log-processor.d.ts.map +0 -1
  264. package/dist/types/src/sentry/sentry-log-processor.js +0 -144
  265. package/dist/types/src/sentry/sentry-log-processor.js.map +0 -1
  266. package/dist/types/src/sentry/sentry.node.test.d.ts +0 -2
  267. package/dist/types/src/sentry/sentry.node.test.d.ts.map +0 -1
  268. package/dist/types/src/sentry/sentry.node.test.js +0 -28
  269. package/dist/types/src/sentry/sentry.node.test.js.map +0 -1
  270. package/dist/types/src/sentry/types.d.ts +0 -18
  271. package/dist/types/src/sentry/types.d.ts.map +0 -1
  272. package/dist/types/src/sentry/types.js +0 -4
  273. package/dist/types/src/sentry/types.js.map +0 -1
  274. package/dist/types/src/testing/index.d.ts +0 -2
  275. package/dist/types/src/testing/index.d.ts.map +0 -1
  276. package/dist/types/src/testing/index.js +0 -5
  277. package/dist/types/src/testing/index.js.map +0 -1
  278. package/dist/types/src/testing/testkit/browser.d.ts +0 -2
  279. package/dist/types/src/testing/testkit/browser.d.ts.map +0 -1
  280. package/dist/types/src/testing/testkit/browser.js +0 -7
  281. package/dist/types/src/testing/testkit/browser.js.map +0 -1
  282. package/dist/types/src/testing/testkit/index.d.ts +0 -2
  283. package/dist/types/src/testing/testkit/index.d.ts.map +0 -1
  284. package/dist/types/src/testing/testkit/index.js +0 -6
  285. package/dist/types/src/testing/testkit/index.js.map +0 -1
  286. package/src/helpers/browser-observability.ts +0 -178
  287. package/src/helpers/common.ts +0 -38
  288. package/src/helpers/index.ts +0 -9
  289. package/src/helpers/map-spaces.ts +0 -48
  290. package/src/helpers/setup-telemetry-listeners.ts +0 -109
  291. package/src/otel/index.ts +0 -8
  292. package/src/otel/traces-browser.ts +0 -62
  293. package/src/segment/base.ts +0 -69
  294. package/src/segment/browser.ts +0 -69
  295. package/src/segment/node.ts +0 -95
  296. package/src/segment/types.ts +0 -57
  297. package/src/sentry/browser.ts +0 -133
  298. package/src/sentry/index.ts +0 -6
  299. package/src/sentry/node.node.test.ts +0 -40
  300. package/src/sentry/node.ts +0 -126
  301. package/src/sentry/sentry-log-processor.ts +0 -176
  302. package/src/sentry/sentry.node.test.ts +0 -35
  303. package/src/sentry/types.ts +0 -22
  304. package/src/testing/index.ts +0 -5
  305. package/src/testing/testkit/browser.ts +0 -8
  306. package/src/testing/testkit/index.ts +0 -7
  307. package/src/testing/testkit/shims.d.ts +0 -5
  308. /package/dist/lib/browser/{chunk-5ICT2XF2.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  309. /package/dist/lib/{browser/observability-I65SW7NE.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
  310. /package/dist/types/src/{otel → extensions/otel}/metrics.d.ts +0 -0
  311. /package/dist/types/src/{otel → extensions/otel}/otel.js +0 -0
  312. /package/dist/types/src/{otel → extensions/otel}/traces-browser.d.ts +0 -0
  313. /package/dist/types/src/{otel → extensions/otel}/traces.d.ts +0 -0
  314. /package/dist/types/src/{sentry → storage}/index.js +0 -0
package/package.json CHANGED
@@ -1,50 +1,29 @@
1
1
  {
2
2
  "name": "@dxos/observability",
3
- "version": "0.8.4-main.72ec0f3",
3
+ "version": "0.8.4-main.74a063c4e0",
4
4
  "description": "Provides a common interface for app and platform observability",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/dxos/dxos"
10
+ },
7
11
  "license": "MIT",
8
12
  "author": "DXOS.org",
9
- "sideEffects": true,
13
+ "sideEffects": false,
10
14
  "type": "module",
11
15
  "exports": {
12
16
  ".": {
13
- "source": "./src/index.ts",
14
17
  "types": "./dist/types/src/index.d.ts",
15
18
  "browser": "./dist/lib/browser/index.mjs",
16
19
  "node": "./dist/lib/node-esm/index.mjs"
17
- },
18
- "./segment": {
19
- "source": "./src/segment/index.ts",
20
- "types": "./dist/types/src/segment/index.d.ts",
21
- "browser": "./dist/lib/browser/segment/index.mjs",
22
- "node": "./dist/lib/node-esm/segment/index.mjs"
23
- },
24
- "./sentry": {
25
- "source": "./src/sentry/index.ts",
26
- "types": "./dist/types/src/sentry/index.d.ts",
27
- "browser": "./dist/lib/browser/sentry/index.mjs",
28
- "node": "./dist/lib/node-esm/sentry/index.mjs"
29
20
  }
30
21
  },
31
22
  "browser": {
32
- "./src/segment/node.ts": "./src/segment/browser.ts",
33
- "./src/sentry/node.ts": "./src/sentry/browser.ts",
34
- "./testing/testkit/index.ts": "./testing/testkit/browser.ts",
35
- "./src/otel/traces.ts": "./src/otel/traces-browser.ts"
23
+ "./src/storage/node.ts": "./src/storage/browser.ts",
24
+ "./src/extensions/otel/traces.ts": "./src/extensions/otel/traces-browser.ts"
36
25
  },
37
26
  "types": "dist/types/src/index.d.ts",
38
- "typesVersions": {
39
- "*": {
40
- "segment": [
41
- "dist/types/src/segment/index.d.ts"
42
- ],
43
- "sentry": [
44
- "dist/types/src/sentry/index.d.ts"
45
- ]
46
- }
47
- },
48
27
  "files": [
49
28
  "dist",
50
29
  "src"
@@ -53,6 +32,7 @@
53
32
  "@opentelemetry/api": "^1.9.0",
54
33
  "@opentelemetry/api-logs": "^0.203.0",
55
34
  "@opentelemetry/auto-instrumentations-web": "^0.51.0",
35
+ "@opentelemetry/core": "^2.1.0",
56
36
  "@opentelemetry/exporter-logs-otlp-http": "^0.203.0",
57
37
  "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0",
58
38
  "@opentelemetry/exporter-trace-otlp-http": "^0.203.0",
@@ -63,35 +43,35 @@
63
43
  "@opentelemetry/sdk-trace-base": "^2.1.0",
64
44
  "@opentelemetry/sdk-trace-web": "^2.1.0",
65
45
  "@opentelemetry/semantic-conventions": "^1.37.0",
66
- "@segment/analytics-node": "^2.1.0",
67
- "@segment/snippet": "^4.15.3",
68
- "@sentry/browser": "^8.8.0",
69
- "@sentry/node": "^8.8.0",
70
46
  "debug": "^4.3.4",
71
- "js-yaml": "^4.1.0",
47
+ "js-yaml": "4.1.1",
72
48
  "localforage": "^1.10.0",
49
+ "posthog-js": "^1.353.0",
73
50
  "uuid": "^9.0.0",
74
- "@dxos/async": "0.8.4-main.72ec0f3",
75
- "@dxos/client-protocol": "0.8.4-main.72ec0f3",
76
- "@dxos/context": "0.8.4-main.72ec0f3",
77
- "@dxos/client": "0.8.4-main.72ec0f3",
78
- "@dxos/client-services": "0.8.4-main.72ec0f3",
79
- "@dxos/debug": "0.8.4-main.72ec0f3",
80
- "@dxos/invariant": "0.8.4-main.72ec0f3",
81
- "@dxos/config": "0.8.4-main.72ec0f3",
82
- "@dxos/log": "0.8.4-main.72ec0f3",
83
- "@dxos/protocols": "0.8.4-main.72ec0f3",
84
- "@dxos/node-std": "0.8.4-main.72ec0f3",
85
- "@dxos/tracing": "0.8.4-main.72ec0f3",
86
- "@dxos/util": "0.8.4-main.72ec0f3",
87
- "@dxos/network-manager": "0.8.4-main.72ec0f3"
51
+ "zone.js": "^0.15.0",
52
+ "@dxos/async": "0.8.4-main.74a063c4e0",
53
+ "@dxos/client": "0.8.4-main.74a063c4e0",
54
+ "@dxos/client-protocol": "0.8.4-main.74a063c4e0",
55
+ "@dxos/client-services": "0.8.4-main.74a063c4e0",
56
+ "@dxos/context": "0.8.4-main.74a063c4e0",
57
+ "@dxos/debug": "0.8.4-main.74a063c4e0",
58
+ "@dxos/invariant": "0.8.4-main.74a063c4e0",
59
+ "@dxos/config": "0.8.4-main.74a063c4e0",
60
+ "@dxos/log": "0.8.4-main.74a063c4e0",
61
+ "@dxos/node-std": "0.8.4-main.74a063c4e0",
62
+ "@dxos/network-manager": "0.8.4-main.74a063c4e0",
63
+ "@dxos/protocols": "0.8.4-main.74a063c4e0",
64
+ "@dxos/util": "0.8.4-main.74a063c4e0",
65
+ "@dxos/tracing": "0.8.4-main.74a063c4e0"
88
66
  },
89
67
  "devDependencies": {
90
- "@sentry/types": "^8.8.0",
68
+ "@effect/platform": "0.94.4",
91
69
  "@types/debug": "^4.1.10",
92
- "@types/js-yaml": "^4.0.5",
93
- "sentry-testkit": "^5.0.5",
94
- "zone.js": ">=0.11.4 <0.12.0-0 || >=0.13.0 <0.14.0-0 || >=0.14.0 <0.15.0-0"
70
+ "@types/js-yaml": "^4.0.5"
71
+ },
72
+ "peerDependencies": {
73
+ "@effect/platform": "0.94.4",
74
+ "effect": "3.20.0"
95
75
  },
96
76
  "publishConfig": {
97
77
  "access": "public"
@@ -1,7 +1,6 @@
1
1
  {
2
- "SENTRY_DESTINATION": "https://2647916221e643869965e78469479aa4@o4504012000067584.ingest.sentry.io/4504012027265029",
3
- "TELEMETRY_API_KEY": "B00QG6PtJJrJ0VVFe0H5a6bcUUShKyZM",
2
+ "POSTHOG_API_KEY": null,
4
3
  "IPDATA_API_KEY": "73dfdecdf979c18f07d50cf841bbdd9e589f237256326ac8cca23786",
5
- "OTEL_ENDPOINT": "https://otlp-proxy.dxos.workers.dev",
6
- "OTEL_AUTHORIZATION": "Basic OTA3MzIzOmdsY19leUp2SWpvaU1URXdNVEl6TnlJc0ltNGlPaUp6ZEdGamF5MDVNRGN6TWpNdGFXNTBaV2R5WVhScGIyNHRZMnh2ZFdSbWJHRnlaUzF2ZEd4d0xYQnliM2g1SWl3aWF5STZJalZ2Tkd4cFYydE5iRmszTlRNMGJUVXpTemRTVjNBeVNpSXNJbTBpT25zaWNpSTZJbkJ5YjJRdGRYTXRaV0Z6ZEMwd0luMTk="
4
+ "OTEL_ENDPOINT": "https://ingest.eu.signoz.cloud:443",
5
+ "OTEL_HEADERS": "signoz-ingestion-key: 5300e0c9-a5e8-4a10-9c61-f473e539c0b7"
7
6
  }
@@ -0,0 +1,6 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * as Otel from './otel';
6
+ export * as PostHog from './posthog';
@@ -0,0 +1,178 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { defaultResource, resourceFromAttributes } from '@opentelemetry/resources';
6
+ import { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
7
+ import * as Effect from 'effect/Effect';
8
+ import * as Match from 'effect/Match';
9
+ import * as Option from 'effect/Option';
10
+ import * as Ref from 'effect/Ref';
11
+
12
+ import { type Config } from '@dxos/config';
13
+ import { LogLevel, log } from '@dxos/log';
14
+ import { isNode, isNonNullable } from '@dxos/util';
15
+
16
+ import buildSecrets from '../../cli-observability-secrets.json';
17
+ import { type Extension, type ExtensionApi } from '../../observability-extension';
18
+ import { isObservabilityDisabled, storeObservabilityDisabled } from '../../storage';
19
+ import { stubExtension } from '../stub';
20
+
21
+ export type ExtensionsOptions = {
22
+ /** For the OTEL, the name of the entity for which signals (metrics or trace) are collected. */
23
+ serviceName: string;
24
+ /** For the OTEL, the version of the entity for which signals (metrics or trace) are collected. */
25
+ serviceVersion: string;
26
+ /** For the OTEL, the environment of the entity for which signals (metrics or trace) are collected. */
27
+ environment: string;
28
+ config: Config;
29
+ endpoint?: string;
30
+ headers?: Record<string, string>;
31
+ logs?: boolean;
32
+ /** Minimum log level to export. Defaults to INFO (i.e. info, warn, error). */
33
+ logLevel?: LogLevel;
34
+ metrics?: boolean;
35
+ traces?: boolean;
36
+ };
37
+
38
+ /** Create an OTEL-backed observability extension for logs, metrics, and/or traces. */
39
+ export const extensions: (options: ExtensionsOptions) => Effect.Effect<Extension> = Effect.fn(function* ({
40
+ serviceName,
41
+ serviceVersion,
42
+ environment,
43
+ config,
44
+ endpoint: _endpoint,
45
+ headers: _headers,
46
+ // TODO(wittjosiah): Logging integration.
47
+ // - logger should run even if observability is disabled
48
+ // - logs should be cached locally in a circular buffer
49
+ // - logs should be flushed to the server if user opts to include them in a bug report
50
+ logs: logsEnabled = false,
51
+ logLevel = LogLevel.INFO,
52
+ metrics: metricsEnabled = false,
53
+ traces: tracesEnabled = false,
54
+ }) {
55
+ const { OtelLogs } = yield* Effect.promise(() => import('./logs'));
56
+ const { OtelMetrics } = yield* Effect.promise(() => import('./metrics'));
57
+ const { OtelTraces } = yield* Effect.promise(() => import('./traces'));
58
+
59
+ const cachedDisabled = yield* Effect.promise(() => isObservabilityDisabled(serviceName));
60
+ const enabledRef = yield* Ref.make(!cachedDisabled);
61
+ const tags = new Map<string, string>();
62
+
63
+ const endpoint = isNode()
64
+ ? (process.env.DX_OTEL_ENDPOINT ?? _endpoint ?? buildSecrets.OTEL_ENDPOINT)
65
+ : config.values.runtime?.app?.env?.DX_OTEL_ENDPOINT;
66
+ const headers =
67
+ _headers ??
68
+ Match.value(isNode()).pipe(
69
+ Match.when(true, () => Option.fromNullable(process.env.DX_OTEL_HEADERS ?? buildSecrets.OTEL_HEADERS)),
70
+ Match.when(false, () => Option.fromNullable(config.values.runtime?.app?.env?.DX_OTEL_HEADERS)),
71
+ Match.exhaustive,
72
+ Option.map((raw) => parseHeaders(raw)),
73
+ Option.getOrElse(() => undefined),
74
+ );
75
+
76
+ if (!endpoint || !headers) {
77
+ log.info('Missing OTEL_ENDPOINT or OTEL_HEADERS');
78
+ return stubExtension;
79
+ }
80
+
81
+ const resource = defaultResource().merge(
82
+ resourceFromAttributes({
83
+ [ATTR_SERVICE_NAME]: serviceName,
84
+ [ATTR_SERVICE_VERSION]: serviceVersion,
85
+ 'deployment.environment': environment,
86
+ }),
87
+ );
88
+
89
+ const logs = logsEnabled
90
+ ? new OtelLogs({
91
+ endpoint,
92
+ headers,
93
+ resource,
94
+ getTags: () => Object.fromEntries(tags),
95
+ logLevel,
96
+ })
97
+ : undefined;
98
+
99
+ const metrics = metricsEnabled
100
+ ? new OtelMetrics({
101
+ endpoint,
102
+ headers,
103
+ resource,
104
+ getTags: () => Object.fromEntries(tags),
105
+ })
106
+ : undefined;
107
+
108
+ const traces = tracesEnabled
109
+ ? new OtelTraces({
110
+ endpoint,
111
+ headers,
112
+ resource,
113
+ getTags: () => Object.fromEntries(tags),
114
+ })
115
+ : undefined;
116
+
117
+ return {
118
+ initialize: () =>
119
+ Effect.sync(() => {
120
+ if (logs) {
121
+ log.runtimeConfig.processors.push(logs.logProcessor);
122
+ }
123
+ if (traces) {
124
+ traces.start();
125
+ }
126
+ }),
127
+ enable: Effect.fn(function* () {
128
+ yield* Effect.promise(() => storeObservabilityDisabled(serviceName, false));
129
+ yield* Ref.update(enabledRef, () => true);
130
+ }),
131
+ disable: Effect.fn(function* () {
132
+ yield* Effect.promise(() => storeObservabilityDisabled(serviceName, true));
133
+ yield* Ref.update(enabledRef, () => false);
134
+ }),
135
+ close: () =>
136
+ Effect.promise(async () => {
137
+ await logs?.close();
138
+ await metrics?.close();
139
+ }),
140
+ flush: () =>
141
+ Effect.promise(async () => {
142
+ await logs?.flush();
143
+ await metrics?.flush();
144
+ }),
145
+ setTags: (incomingTags) => {
146
+ for (const [key, value] of Object.entries(incomingTags)) {
147
+ tags.set(key, value);
148
+ }
149
+ },
150
+ get enabled() {
151
+ return Ref.get(enabledRef).pipe(Effect.runSync);
152
+ },
153
+ apis: [
154
+ { kind: 'logs', isAvailable: () => Effect.succeed(!!logs) } satisfies ExtensionApi,
155
+ metrics
156
+ ? ({
157
+ kind: 'metrics',
158
+ isAvailable: () => Effect.succeed(true),
159
+ gauge: (name, value, tags) => metrics.gauge(name, value, tags),
160
+ increment: (name, value, tags) => metrics.increment(name, value, tags),
161
+ distribution: (name, value, tags) => metrics.distribution(name, value, tags),
162
+ } satisfies ExtensionApi)
163
+ : undefined,
164
+ traces ? ({ kind: 'traces', isAvailable: () => Effect.succeed(true) } satisfies ExtensionApi) : undefined,
165
+ ].filter(isNonNullable),
166
+ };
167
+ });
168
+
169
+ const parseHeaders = (unparsedHeaders: string): Record<string, string> => {
170
+ return unparsedHeaders.split(';').reduce((acc: Record<string, string>, header) => {
171
+ const [key, ...rest] = header.split(':');
172
+ if (key && rest.length > 0) {
173
+ acc[key.trim().toLowerCase()] = rest.join(':').trim();
174
+ }
175
+
176
+ return acc;
177
+ }, {});
178
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './extension';
@@ -4,9 +4,8 @@
4
4
 
5
5
  import { SeverityNumber } from '@opentelemetry/api-logs';
6
6
  import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
7
- import { defaultResource, resourceFromAttributes } from '@opentelemetry/resources';
8
7
  import { BatchLogRecordProcessor, LoggerProvider } from '@opentelemetry/sdk-logs';
9
- import { SEMRESATTRS_SERVICE_NAME, SEMRESATTRS_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
8
+ import { ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
10
9
 
11
10
  import {
12
11
  type LogConfig,
@@ -16,44 +15,41 @@ import {
16
15
  getContextFromEntry,
17
16
  getRelativeFilename,
18
17
  } from '@dxos/log';
19
- import { jsonlogify } from '@dxos/util';
20
18
 
21
19
  import { type OtelOptions, setDiagLogger } from './otel';
22
20
 
21
+ const FLATTEN_DEPTH = 1;
22
+
23
23
  export type OtelLogOptions = OtelOptions & {
24
24
  logLevel: LogLevel;
25
25
  /**
26
- * Set `true` to capture logs sent through LoggingService from shared worker.
27
- * Better to set to `false` because shared worker is initializing its own logger.
26
+ * Include logs forwarded from the shared worker via LoggingService.
27
+ *
28
+ * @deprecated
28
29
  */
29
- includeSharedWorkerLogs: boolean;
30
+ includeSharedWorkerLogs?: boolean;
30
31
  };
31
32
 
32
33
  export class OtelLogs {
33
34
  private _loggerProvider: LoggerProvider;
34
35
  constructor(private readonly options: OtelLogOptions) {
35
36
  setDiagLogger(options.consoleDiagLogLevel);
36
- const resource = defaultResource().merge(
37
- resourceFromAttributes({
38
- [SEMRESATTRS_SERVICE_NAME]: this.options.serviceName,
39
- [SEMRESATTRS_SERVICE_VERSION]: this.options.serviceVersion,
40
- }),
41
- );
42
37
  const logExporter = new OTLPLogExporter({
43
38
  url: this.options.endpoint + '/v1/logs',
44
- headers: {
45
- Authorization: this.options.authorizationHeader,
46
- },
39
+ headers: this.options.headers,
47
40
  concurrencyLimit: 10, // an optional limit on pending requests
48
41
  });
49
42
  this._loggerProvider = new LoggerProvider({
50
- resource,
43
+ resource: this.options.resource,
51
44
  processors: [new BatchLogRecordProcessor(logExporter)],
52
45
  });
53
46
  }
54
47
 
55
- public readonly logProcessor: LogProcessor = (config: LogConfig, entry: LogEntry) => {
56
- const logger = this._loggerProvider.getLogger('dxos-observability', this.options.serviceVersion);
48
+ public readonly logProcessor: LogProcessor = (_config: LogConfig, entry: LogEntry) => {
49
+ const logger = this._loggerProvider.getLogger(
50
+ 'dxos-observability',
51
+ this.options.resource.attributes[ATTR_SERVICE_VERSION]?.toString(),
52
+ );
57
53
 
58
54
  if (
59
55
  entry.level < this.options.logLevel ||
@@ -62,16 +58,17 @@ export class OtelLogs {
62
58
  return;
63
59
  }
64
60
 
65
- const record = {
66
- ...entry,
61
+ const attributes = {
62
+ ...this.options.getTags(),
67
63
  ...(entry.meta ? { meta: { file: getRelativeFilename(entry.meta.F), line: entry.meta.L } } : {}),
68
- context: jsonlogify(getContextFromEntry(entry)),
64
+ ...(entry.error ? { error: entry.error.stack } : {}),
65
+ ...stringifyValues(getContextFromEntry(entry), 'ctx_'),
69
66
  };
70
67
 
71
68
  logger.emit({
72
69
  severityNumber: convertLevel(entry.level),
73
- body: JSON.stringify(record),
74
- attributes: this.options.getTags(),
70
+ body: entry.message,
71
+ attributes,
75
72
  });
76
73
  };
77
74
 
@@ -100,3 +97,38 @@ const convertLevel = (level: LogLevel): SeverityNumber => {
100
97
  return SeverityNumber.ERROR;
101
98
  }
102
99
  };
100
+
101
+ const safeStringify = (value: unknown): string => {
102
+ try {
103
+ return JSON.stringify(value);
104
+ } catch {
105
+ return '[Circular]';
106
+ }
107
+ };
108
+
109
+ // TODO(wittjosiah): Reconcile logging utils w/ EDGE.
110
+ const stringifyValues = (object: object | undefined, keyPrefix?: string, depth: number = 1) => {
111
+ if (!object) {
112
+ return {};
113
+ }
114
+ const result: Record<string, string> = {};
115
+ for (const [key, value] of Object.entries(object)) {
116
+ if (value === undefined) {
117
+ continue;
118
+ }
119
+ const newKey = keyPrefix ? `${keyPrefix}${key}` : key;
120
+ if (typeof value === 'object') {
121
+ if (!value || Array.isArray(value) || depth > FLATTEN_DEPTH) {
122
+ result[newKey] = safeStringify(value);
123
+ } else {
124
+ const flattened = stringifyValues(value, `${newKey}_`, depth + 1);
125
+ for (const [flattenedKey, flattenedValue] of Object.entries(flattened)) {
126
+ result[flattenedKey] = flattenedValue;
127
+ }
128
+ }
129
+ } else {
130
+ result[newKey] = String(value);
131
+ }
132
+ }
133
+ return result;
134
+ };
@@ -4,9 +4,7 @@
4
4
 
5
5
  import { type Meter } from '@opentelemetry/api';
6
6
  import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
7
- import { defaultResource, resourceFromAttributes } from '@opentelemetry/resources';
8
7
  import { MeterProvider, PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
9
- import { SEMRESATTRS_SERVICE_NAME, SEMRESATTRS_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
10
8
 
11
9
  import { log } from '@dxos/log';
12
10
  import { type MetricData, TRACE_PROCESSOR } from '@dxos/tracing';
@@ -23,25 +21,17 @@ export class OtelMetrics {
23
21
  // TODO: improve error handling/logging
24
22
  // https://github.com/open-telemetry/opentelemetry-js/issues/4823
25
23
  setDiagLogger(options.consoleDiagLogLevel);
26
- const resource = defaultResource().merge(
27
- resourceFromAttributes({
28
- [SEMRESATTRS_SERVICE_NAME]: this.options.serviceName,
29
- [SEMRESATTRS_SERVICE_VERSION]: this.options.serviceVersion,
30
- }),
31
- );
32
24
 
33
25
  const grafanaMetricReader = new PeriodicExportingMetricReader({
34
26
  exporter: new OTLPMetricExporter({
35
27
  url: this.options.endpoint + '/v1/metrics',
36
- headers: {
37
- Authorization: this.options.authorizationHeader,
38
- },
28
+ headers: this.options.headers,
39
29
  }),
40
30
  exportIntervalMillis: EXPORT_INTERVAL,
41
31
  });
42
32
 
43
33
  this._meterProvider = new MeterProvider({
44
- resource,
34
+ resource: this.options.resource,
45
35
  readers: [grafanaMetricReader],
46
36
  });
47
37
  this._meter = this._meterProvider.getMeter('dxos-observability');
@@ -3,12 +3,12 @@
3
3
  //
4
4
 
5
5
  import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api';
6
+ import { type Resource } from '@opentelemetry/resources';
6
7
 
7
8
  export type OtelOptions = {
8
9
  endpoint: string;
9
- authorizationHeader: string;
10
- serviceName: string; // For the Otel API, the name of the entity for which signals (metrics or trace) are collected.
11
- serviceVersion: string; // For the Otel API, The name of the entity for which signals (metrics or trace) are collected.
10
+ headers: Record<string, string>;
11
+ resource: Resource;
12
12
  getTags: () => { [key: string]: string };
13
13
  consoleDiagLogLevel?: string;
14
14
  };
@@ -0,0 +1,110 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type Context, type Tracer, context as otelContext, propagation, trace } from '@opentelemetry/api';
6
+ import { getWebAutoInstrumentations } from '@opentelemetry/auto-instrumentations-web';
7
+ import { W3CTraceContextPropagator } from '@opentelemetry/core';
8
+ import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
9
+ import { registerInstrumentations } from '@opentelemetry/instrumentation';
10
+ import {
11
+ AlwaysOnSampler,
12
+ BatchSpanProcessor,
13
+ ParentBasedSampler,
14
+ type ReadableSpan,
15
+ type SpanProcessor,
16
+ TraceIdRatioBasedSampler,
17
+ } from '@opentelemetry/sdk-trace-base';
18
+ import { WebTracerProvider } from '@opentelemetry/sdk-trace-web';
19
+ import { ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
20
+
21
+ import { log } from '@dxos/log';
22
+ import { type StartSpanOptions, TRACE_PROCESSOR } from '@dxos/tracing';
23
+
24
+ import { type OtelOptions } from './otel';
25
+
26
+ /**
27
+ * Injects dynamic tags (e.g. userId) as attributes on every span.
28
+ */
29
+ class TagInjectorSpanProcessor implements SpanProcessor {
30
+ constructor(private readonly _getTags: () => Record<string, string>) {}
31
+
32
+ onStart(span: { setAttribute: (key: string, value: string) => void }): void {
33
+ const tags = this._getTags();
34
+ for (const [key, value] of Object.entries(tags)) {
35
+ span.setAttribute(key, value);
36
+ }
37
+ }
38
+
39
+ onEnd(_span: ReadableSpan): void {}
40
+
41
+ async shutdown(): Promise<void> {}
42
+
43
+ async forceFlush(): Promise<void> {}
44
+ }
45
+
46
+ export class OtelTraces {
47
+ private _tracer: Tracer;
48
+
49
+ constructor(private readonly options: OtelOptions) {
50
+ propagation.setGlobalPropagator(new W3CTraceContextPropagator());
51
+
52
+ const forceTraceAll = typeof localStorage !== 'undefined' && localStorage.getItem('dxos.debug.traceAll') === 'true';
53
+
54
+ const tracerProvider = new WebTracerProvider({
55
+ resource: this.options.resource,
56
+ sampler: new ParentBasedSampler({
57
+ root: forceTraceAll ? new AlwaysOnSampler() : new TraceIdRatioBasedSampler(0.3),
58
+ }),
59
+ spanProcessors: [
60
+ new TagInjectorSpanProcessor(this.options.getTags),
61
+ new BatchSpanProcessor(
62
+ new OTLPTraceExporter({
63
+ url: this.options.endpoint + '/v1/traces',
64
+ headers: this.options.headers,
65
+ concurrencyLimit: 10,
66
+ }),
67
+ { scheduledDelayMillis: 5_000 },
68
+ ),
69
+ ],
70
+ });
71
+
72
+ trace.setGlobalTracerProvider(tracerProvider);
73
+
74
+ this._tracer = trace.getTracer(
75
+ 'dxos-observability',
76
+ this.options.resource.attributes[ATTR_SERVICE_VERSION]?.toString(),
77
+ );
78
+ }
79
+
80
+ public start(): void {
81
+ log('trace processor registered');
82
+
83
+ registerInstrumentations({
84
+ instrumentations: [
85
+ getWebAutoInstrumentations({
86
+ // Fetch is disabled in favor of explicit ctx on our call sites; if re-enabled, keep noisy
87
+ // third-party URLs out of traces (matches prior browser tracing setup).
88
+ '@opentelemetry/instrumentation-fetch': { enabled: false, ignoreUrls: [/api\.ipdata\.co/] },
89
+ '@opentelemetry/instrumentation-document-load': { enabled: false },
90
+ '@opentelemetry/instrumentation-xml-http-request': { enabled: false },
91
+ }),
92
+ ],
93
+ });
94
+
95
+ TRACE_PROCESSOR.remoteTracing.registerProcessor({
96
+ startSpan: (options: StartSpanOptions) => {
97
+ log('begin otel trace', { options });
98
+ const explicitParent = options.parentContext as Context | undefined;
99
+ const parentCtx = explicitParent ?? otelContext.active();
100
+ const span = this._tracer.startSpan(options.name, options, parentCtx);
101
+ const spanCtx = trace.setSpan(parentCtx, span);
102
+ return {
103
+ end: () => span.end(),
104
+ wrapExecution: <T>(fn: () => T): T => otelContext.with(spanCtx, fn),
105
+ spanContext: spanCtx,
106
+ };
107
+ },
108
+ });
109
+ }
110
+ }