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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) 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 +922 -278
  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 +939 -293
  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/{chunk-WAGGA7IT.mjs → traces-KMTHMYFX.mjs} +8 -16
  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 +142 -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} +37 -42
  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 +26 -47
  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 +174 -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 +130 -0
  153. package/src/{helpers/node-observability.ts → storage/node.ts} +40 -69
  154. package/dist/lib/browser/chunk-5ICT2XF2.mjs +0 -1
  155. package/dist/lib/browser/chunk-5LN7D6GM.mjs +0 -148
  156. package/dist/lib/browser/chunk-5LN7D6GM.mjs.map +0 -7
  157. package/dist/lib/browser/chunk-JJQT5TQH.mjs +0 -672
  158. package/dist/lib/browser/chunk-JJQT5TQH.mjs.map +0 -7
  159. package/dist/lib/browser/chunk-O4BG5MRL.mjs +0 -164
  160. package/dist/lib/browser/chunk-O4BG5MRL.mjs.map +0 -7
  161. package/dist/lib/browser/chunk-U6JWT3E2.mjs +0 -1
  162. package/dist/lib/browser/chunk-VL6LVQPU.mjs +0 -69
  163. package/dist/lib/browser/chunk-VL6LVQPU.mjs.map +0 -7
  164. package/dist/lib/browser/observability-XK652NZG.mjs +0 -11
  165. package/dist/lib/browser/observability-XK652NZG.mjs.map +0 -7
  166. package/dist/lib/browser/otel/traces-browser.mjs +0 -7
  167. package/dist/lib/browser/otel/traces-browser.mjs.map +0 -7
  168. package/dist/lib/browser/otel/traces.mjs +0 -7
  169. package/dist/lib/browser/otel/traces.mjs.map +0 -7
  170. package/dist/lib/browser/otel-DI4ASU7Y.mjs +0 -226
  171. package/dist/lib/browser/otel-DI4ASU7Y.mjs.map +0 -7
  172. package/dist/lib/browser/segment/browser.mjs +0 -9
  173. package/dist/lib/browser/segment/browser.mjs.map +0 -7
  174. package/dist/lib/browser/segment/index.mjs +0 -12
  175. package/dist/lib/browser/segment/index.mjs.map +0 -7
  176. package/dist/lib/browser/segment/node.mjs +0 -9
  177. package/dist/lib/browser/segment/node.mjs.map +0 -7
  178. package/dist/lib/browser/sentry/browser.mjs +0 -23
  179. package/dist/lib/browser/sentry/browser.mjs.map +0 -7
  180. package/dist/lib/browser/sentry/index.mjs +0 -24
  181. package/dist/lib/browser/sentry/index.mjs.map +0 -7
  182. package/dist/lib/browser/sentry/node.mjs +0 -23
  183. package/dist/lib/browser/sentry/node.mjs.map +0 -7
  184. package/dist/lib/browser/sentry-log-processor-W7LI6WXA.mjs +0 -146
  185. package/dist/lib/browser/sentry-log-processor-W7LI6WXA.mjs.map +0 -7
  186. package/dist/lib/node-esm/chunk-KKNY7TRV.mjs +0 -673
  187. package/dist/lib/node-esm/chunk-KKNY7TRV.mjs.map +0 -7
  188. package/dist/lib/node-esm/chunk-KLJGCUYA.mjs +0 -2
  189. package/dist/lib/node-esm/chunk-KLJGCUYA.mjs.map +0 -7
  190. package/dist/lib/node-esm/chunk-KVJTNW3F.mjs +0 -147
  191. package/dist/lib/node-esm/chunk-KVJTNW3F.mjs.map +0 -7
  192. package/dist/lib/node-esm/chunk-M4627SMT.mjs +0 -135
  193. package/dist/lib/node-esm/chunk-M4627SMT.mjs.map +0 -7
  194. package/dist/lib/node-esm/chunk-QUZL7LKE.mjs +0 -2
  195. package/dist/lib/node-esm/chunk-QUZL7LKE.mjs.map +0 -7
  196. package/dist/lib/node-esm/chunk-UIVXGEGJ.mjs +0 -62
  197. package/dist/lib/node-esm/chunk-UIVXGEGJ.mjs.map +0 -7
  198. package/dist/lib/node-esm/chunk-WAGGA7IT.mjs.map +0 -7
  199. package/dist/lib/node-esm/observability-CXQ3CZGB.mjs +0 -13
  200. package/dist/lib/node-esm/observability-CXQ3CZGB.mjs.map +0 -7
  201. package/dist/lib/node-esm/otel/traces-browser.mjs +0 -70
  202. package/dist/lib/node-esm/otel/traces-browser.mjs.map +0 -7
  203. package/dist/lib/node-esm/otel/traces.mjs +0 -8
  204. package/dist/lib/node-esm/otel/traces.mjs.map +0 -7
  205. package/dist/lib/node-esm/otel-JFXO22WD.mjs +0 -227
  206. package/dist/lib/node-esm/otel-JFXO22WD.mjs.map +0 -7
  207. package/dist/lib/node-esm/segment/browser.mjs +0 -92
  208. package/dist/lib/node-esm/segment/browser.mjs.map +0 -7
  209. package/dist/lib/node-esm/segment/index.mjs +0 -15
  210. package/dist/lib/node-esm/segment/index.mjs.map +0 -7
  211. package/dist/lib/node-esm/segment/node.mjs +0 -11
  212. package/dist/lib/node-esm/segment/node.mjs.map +0 -7
  213. package/dist/lib/node-esm/sentry/browser.mjs +0 -165
  214. package/dist/lib/node-esm/sentry/browser.mjs.map +0 -7
  215. package/dist/lib/node-esm/sentry/index.mjs +0 -25
  216. package/dist/lib/node-esm/sentry/index.mjs.map +0 -7
  217. package/dist/lib/node-esm/sentry/node.mjs +0 -24
  218. package/dist/lib/node-esm/sentry/node.mjs.map +0 -7
  219. package/dist/lib/node-esm/sentry-log-processor-W3SG4RQL.mjs +0 -147
  220. package/dist/lib/node-esm/sentry-log-processor-W3SG4RQL.mjs.map +0 -7
  221. package/dist/types/src/helpers/browser-observability.d.ts +0 -17
  222. package/dist/types/src/helpers/browser-observability.d.ts.map +0 -1
  223. package/dist/types/src/helpers/browser-observability.js +0 -138
  224. package/dist/types/src/helpers/browser-observability.js.map +0 -1
  225. package/dist/types/src/helpers/common.d.ts +0 -12
  226. package/dist/types/src/helpers/common.d.ts.map +0 -1
  227. package/dist/types/src/helpers/common.js +0 -23
  228. package/dist/types/src/helpers/common.js.map +0 -1
  229. package/dist/types/src/helpers/index.d.ts +0 -6
  230. package/dist/types/src/helpers/index.d.ts.map +0 -1
  231. package/dist/types/src/helpers/index.js +0 -9
  232. package/dist/types/src/helpers/index.js.map +0 -1
  233. package/dist/types/src/helpers/map-spaces.d.ts +0 -18
  234. package/dist/types/src/helpers/map-spaces.d.ts.map +0 -1
  235. package/dist/types/src/helpers/map-spaces.js +0 -36
  236. package/dist/types/src/helpers/map-spaces.js.map +0 -1
  237. package/dist/types/src/helpers/node-observability.d.ts +0 -24
  238. package/dist/types/src/helpers/node-observability.d.ts.map +0 -1
  239. package/dist/types/src/helpers/node-observability.js.map +0 -1
  240. package/dist/types/src/helpers/setup-telemetry-listeners.d.ts +0 -4
  241. package/dist/types/src/helpers/setup-telemetry-listeners.d.ts.map +0 -1
  242. package/dist/types/src/helpers/setup-telemetry-listeners.js +0 -94
  243. package/dist/types/src/helpers/setup-telemetry-listeners.js.map +0 -1
  244. package/dist/types/src/otel/index.d.ts +0 -5
  245. package/dist/types/src/otel/index.d.ts.map +0 -1
  246. package/dist/types/src/otel/index.js +0 -8
  247. package/dist/types/src/otel/index.js.map +0 -1
  248. package/dist/types/src/otel/logs.d.ts.map +0 -1
  249. package/dist/types/src/otel/logs.js.map +0 -1
  250. package/dist/types/src/otel/metrics.d.ts.map +0 -1
  251. package/dist/types/src/otel/metrics.js.map +0 -1
  252. package/dist/types/src/otel/otel.d.ts.map +0 -1
  253. package/dist/types/src/otel/otel.js.map +0 -1
  254. package/dist/types/src/otel/traces-browser.d.ts.map +0 -1
  255. package/dist/types/src/otel/traces-browser.js +0 -53
  256. package/dist/types/src/otel/traces-browser.js.map +0 -1
  257. package/dist/types/src/otel/traces.d.ts.map +0 -1
  258. package/dist/types/src/otel/traces.js.map +0 -1
  259. package/dist/types/src/segment/base.d.ts +0 -15
  260. package/dist/types/src/segment/base.d.ts.map +0 -1
  261. package/dist/types/src/segment/base.js +0 -51
  262. package/dist/types/src/segment/base.js.map +0 -1
  263. package/dist/types/src/segment/browser.d.ts +0 -15
  264. package/dist/types/src/segment/browser.d.ts.map +0 -1
  265. package/dist/types/src/segment/browser.js +0 -63
  266. package/dist/types/src/segment/browser.js.map +0 -1
  267. package/dist/types/src/segment/index.d.ts +0 -3
  268. package/dist/types/src/segment/index.d.ts.map +0 -1
  269. package/dist/types/src/segment/index.js +0 -6
  270. package/dist/types/src/segment/index.js.map +0 -1
  271. package/dist/types/src/segment/node.d.ts +0 -16
  272. package/dist/types/src/segment/node.d.ts.map +0 -1
  273. package/dist/types/src/segment/node.js +0 -84
  274. package/dist/types/src/segment/node.js.map +0 -1
  275. package/dist/types/src/segment/types.d.ts +0 -52
  276. package/dist/types/src/segment/types.d.ts.map +0 -1
  277. package/dist/types/src/segment/types.js +0 -18
  278. package/dist/types/src/segment/types.js.map +0 -1
  279. package/dist/types/src/sentry/browser.d.ts +0 -32
  280. package/dist/types/src/sentry/browser.d.ts.map +0 -1
  281. package/dist/types/src/sentry/browser.js +0 -110
  282. package/dist/types/src/sentry/browser.js.map +0 -1
  283. package/dist/types/src/sentry/index.d.ts +0 -3
  284. package/dist/types/src/sentry/index.d.ts.map +0 -1
  285. package/dist/types/src/sentry/index.js.map +0 -1
  286. package/dist/types/src/sentry/node.d.ts +0 -32
  287. package/dist/types/src/sentry/node.d.ts.map +0 -1
  288. package/dist/types/src/sentry/node.js +0 -106
  289. package/dist/types/src/sentry/node.js.map +0 -1
  290. package/dist/types/src/sentry/node.node.test.d.ts +0 -2
  291. package/dist/types/src/sentry/node.node.test.d.ts.map +0 -1
  292. package/dist/types/src/sentry/node.node.test.js +0 -32
  293. package/dist/types/src/sentry/node.node.test.js.map +0 -1
  294. package/dist/types/src/sentry/sentry-log-processor.d.ts +0 -9
  295. package/dist/types/src/sentry/sentry-log-processor.d.ts.map +0 -1
  296. package/dist/types/src/sentry/sentry-log-processor.js +0 -144
  297. package/dist/types/src/sentry/sentry-log-processor.js.map +0 -1
  298. package/dist/types/src/sentry/sentry.node.test.d.ts +0 -2
  299. package/dist/types/src/sentry/sentry.node.test.d.ts.map +0 -1
  300. package/dist/types/src/sentry/sentry.node.test.js +0 -28
  301. package/dist/types/src/sentry/sentry.node.test.js.map +0 -1
  302. package/dist/types/src/sentry/types.d.ts +0 -18
  303. package/dist/types/src/sentry/types.d.ts.map +0 -1
  304. package/dist/types/src/sentry/types.js +0 -4
  305. package/dist/types/src/sentry/types.js.map +0 -1
  306. package/dist/types/src/testing/index.d.ts +0 -2
  307. package/dist/types/src/testing/index.d.ts.map +0 -1
  308. package/dist/types/src/testing/index.js +0 -5
  309. package/dist/types/src/testing/index.js.map +0 -1
  310. package/dist/types/src/testing/testkit/browser.d.ts +0 -2
  311. package/dist/types/src/testing/testkit/browser.d.ts.map +0 -1
  312. package/dist/types/src/testing/testkit/browser.js +0 -7
  313. package/dist/types/src/testing/testkit/browser.js.map +0 -1
  314. package/dist/types/src/testing/testkit/index.d.ts +0 -2
  315. package/dist/types/src/testing/testkit/index.d.ts.map +0 -1
  316. package/dist/types/src/testing/testkit/index.js +0 -6
  317. package/dist/types/src/testing/testkit/index.js.map +0 -1
  318. package/src/helpers/browser-observability.ts +0 -178
  319. package/src/helpers/common.ts +0 -38
  320. package/src/helpers/index.ts +0 -9
  321. package/src/helpers/map-spaces.ts +0 -48
  322. package/src/helpers/setup-telemetry-listeners.ts +0 -109
  323. package/src/otel/index.ts +0 -8
  324. package/src/otel/traces-browser.ts +0 -62
  325. package/src/segment/base.ts +0 -69
  326. package/src/segment/browser.ts +0 -69
  327. package/src/segment/node.ts +0 -95
  328. package/src/segment/types.ts +0 -57
  329. package/src/sentry/browser.ts +0 -133
  330. package/src/sentry/index.ts +0 -6
  331. package/src/sentry/node.node.test.ts +0 -40
  332. package/src/sentry/node.ts +0 -126
  333. package/src/sentry/sentry-log-processor.ts +0 -176
  334. package/src/sentry/sentry.node.test.ts +0 -35
  335. package/src/sentry/types.ts +0 -22
  336. package/src/testing/index.ts +0 -5
  337. package/src/testing/testkit/browser.ts +0 -8
  338. package/src/testing/testkit/index.ts +0 -7
  339. package/src/testing/testkit/shims.d.ts +0 -5
  340. /package/dist/lib/browser/{chunk-5ICT2XF2.mjs.map → chunk-J5LGTIGS.mjs.map} +0 -0
  341. /package/dist/lib/{browser/chunk-U6JWT3E2.mjs.map → node-esm/chunk-HSLMI22Q.mjs.map} +0 -0
  342. /package/dist/types/src/{otel → extensions/otel}/metrics.d.ts +0 -0
  343. /package/dist/types/src/{otel → extensions/otel}/otel.js +0 -0
  344. /package/dist/types/src/{otel → extensions/otel}/traces-browser.d.ts +0 -0
  345. /package/dist/types/src/{otel → extensions/otel}/traces.d.ts +0 -0
  346. /package/dist/types/src/{sentry → storage}/index.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/observability",
3
- "version": "0.8.4-main.bc674ce",
3
+ "version": "0.8.4-main.bcb3aa67d6",
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",
@@ -17,35 +17,13 @@
17
17
  "types": "./dist/types/src/index.d.ts",
18
18
  "browser": "./dist/lib/browser/index.mjs",
19
19
  "node": "./dist/lib/node-esm/index.mjs"
20
- },
21
- "./segment": {
22
- "types": "./dist/types/src/segment/index.d.ts",
23
- "browser": "./dist/lib/browser/segment/index.mjs",
24
- "node": "./dist/lib/node-esm/segment/index.mjs"
25
- },
26
- "./sentry": {
27
- "types": "./dist/types/src/sentry/index.d.ts",
28
- "browser": "./dist/lib/browser/sentry/index.mjs",
29
- "node": "./dist/lib/node-esm/sentry/index.mjs"
30
20
  }
31
21
  },
32
22
  "browser": {
33
- "./src/segment/node.ts": "./src/segment/browser.ts",
34
- "./src/sentry/node.ts": "./src/sentry/browser.ts",
35
- "./src/otel/traces.ts": "./src/otel/traces-browser.ts",
36
- "./src/testing/testkit/index.ts": "./src/testing/testkit/browser.ts"
23
+ "./src/storage/node.ts": "./src/storage/browser.ts",
24
+ "./src/extensions/otel/traces.ts": "./src/extensions/otel/traces-browser.ts"
37
25
  },
38
26
  "types": "dist/types/src/index.d.ts",
39
- "typesVersions": {
40
- "*": {
41
- "segment": [
42
- "dist/types/src/segment/index.d.ts"
43
- ],
44
- "sentry": [
45
- "dist/types/src/sentry/index.d.ts"
46
- ]
47
- }
48
- },
49
27
  "files": [
50
28
  "dist",
51
29
  "src"
@@ -54,6 +32,7 @@
54
32
  "@opentelemetry/api": "^1.9.0",
55
33
  "@opentelemetry/api-logs": "^0.203.0",
56
34
  "@opentelemetry/auto-instrumentations-web": "^0.51.0",
35
+ "@opentelemetry/core": "^2.1.0",
57
36
  "@opentelemetry/exporter-logs-otlp-http": "^0.203.0",
58
37
  "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0",
59
38
  "@opentelemetry/exporter-trace-otlp-http": "^0.203.0",
@@ -64,35 +43,35 @@
64
43
  "@opentelemetry/sdk-trace-base": "^2.1.0",
65
44
  "@opentelemetry/sdk-trace-web": "^2.1.0",
66
45
  "@opentelemetry/semantic-conventions": "^1.37.0",
67
- "@segment/analytics-node": "^2.1.0",
68
- "@segment/snippet": "^4.15.3",
69
- "@sentry/browser": "^8.8.0",
70
- "@sentry/node": "^8.8.0",
71
46
  "debug": "^4.3.4",
72
47
  "js-yaml": "4.1.1",
73
48
  "localforage": "^1.10.0",
49
+ "posthog-js": "^1.353.0",
74
50
  "uuid": "^9.0.0",
75
- "@dxos/async": "0.8.4-main.bc674ce",
76
- "@dxos/client-protocol": "0.8.4-main.bc674ce",
77
- "@dxos/client": "0.8.4-main.bc674ce",
78
- "@dxos/config": "0.8.4-main.bc674ce",
79
- "@dxos/client-services": "0.8.4-main.bc674ce",
80
- "@dxos/context": "0.8.4-main.bc674ce",
81
- "@dxos/debug": "0.8.4-main.bc674ce",
82
- "@dxos/invariant": "0.8.4-main.bc674ce",
83
- "@dxos/log": "0.8.4-main.bc674ce",
84
- "@dxos/network-manager": "0.8.4-main.bc674ce",
85
- "@dxos/node-std": "0.8.4-main.bc674ce",
86
- "@dxos/protocols": "0.8.4-main.bc674ce",
87
- "@dxos/util": "0.8.4-main.bc674ce",
88
- "@dxos/tracing": "0.8.4-main.bc674ce"
51
+ "zone.js": "^0.15.0",
52
+ "@dxos/async": "0.8.4-main.bcb3aa67d6",
53
+ "@dxos/client-protocol": "0.8.4-main.bcb3aa67d6",
54
+ "@dxos/client": "0.8.4-main.bcb3aa67d6",
55
+ "@dxos/client-services": "0.8.4-main.bcb3aa67d6",
56
+ "@dxos/config": "0.8.4-main.bcb3aa67d6",
57
+ "@dxos/context": "0.8.4-main.bcb3aa67d6",
58
+ "@dxos/debug": "0.8.4-main.bcb3aa67d6",
59
+ "@dxos/network-manager": "0.8.4-main.bcb3aa67d6",
60
+ "@dxos/log": "0.8.4-main.bcb3aa67d6",
61
+ "@dxos/invariant": "0.8.4-main.bcb3aa67d6",
62
+ "@dxos/protocols": "0.8.4-main.bcb3aa67d6",
63
+ "@dxos/node-std": "0.8.4-main.bcb3aa67d6",
64
+ "@dxos/tracing": "0.8.4-main.bcb3aa67d6",
65
+ "@dxos/util": "0.8.4-main.bcb3aa67d6"
89
66
  },
90
67
  "devDependencies": {
91
- "@sentry/types": "^8.8.0",
68
+ "@effect/platform": "0.94.4",
92
69
  "@types/debug": "^4.1.10",
93
- "@types/js-yaml": "^4.0.5",
94
- "sentry-testkit": "^5.0.5",
95
- "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"
96
75
  },
97
76
  "publishConfig": {
98
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
+ }
@@ -4,14 +4,8 @@
4
4
 
5
5
  import { type Tracer, trace } from '@opentelemetry/api';
6
6
  import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
7
- import { defaultResource, resourceFromAttributes } from '@opentelemetry/resources';
8
- import {
9
- BasicTracerProvider,
10
- BatchSpanProcessor,
11
- ConsoleSpanExporter,
12
- SimpleSpanProcessor,
13
- } from '@opentelemetry/sdk-trace-base';
14
- import { SEMRESATTRS_SERVICE_NAME, SEMRESATTRS_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
7
+ import { BasicTracerProvider, BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';
8
+ import { ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';
15
9
  import { log } from 'debug';
16
10
 
17
11
  import { type StartSpanOptions, TRACE_PROCESSOR } from '@dxos/tracing';
@@ -20,24 +14,15 @@ import { type OtelOptions } from './otel';
20
14
 
21
15
  export class OtelTraces {
22
16
  private _tracer: Tracer;
23
- constructor(private readonly options: OtelOptions) {
24
- const resource = defaultResource().merge(
25
- resourceFromAttributes({
26
- [SEMRESATTRS_SERVICE_NAME]: this.options.serviceName,
27
- [SEMRESATTRS_SERVICE_VERSION]: this.options.serviceVersion,
28
- }),
29
- );
30
17
 
18
+ constructor(private readonly options: OtelOptions) {
31
19
  const tracerProvider = new BasicTracerProvider({
32
- resource,
20
+ resource: this.options.resource,
33
21
  spanProcessors: [
34
- new SimpleSpanProcessor(new ConsoleSpanExporter()),
35
22
  new BatchSpanProcessor(
36
23
  new OTLPTraceExporter({
37
24
  url: this.options.endpoint + '/v1/traces',
38
- headers: {
39
- Authorization: this.options.authorizationHeader,
40
- },
25
+ headers: this.options.headers,
41
26
  concurrencyLimit: 10, // an optional limit on pending requests
42
27
  }),
43
28
  ),
@@ -45,11 +30,15 @@ export class OtelTraces {
45
30
  });
46
31
 
47
32
  trace.setGlobalTracerProvider(tracerProvider);
48
- this._tracer = trace.getTracer('dxos-observability', this.options.serviceVersion);
33
+ this._tracer = trace.getTracer(
34
+ 'dxos-observability',
35
+ this.options.resource.attributes[ATTR_SERVICE_VERSION]?.toString(),
36
+ );
49
37
  }
50
38
 
51
39
  public start(): void {
52
40
  log('trace processor registered');
41
+
53
42
  TRACE_PROCESSOR.remoteTracing.registerProcessor({
54
43
  startSpan: (options: StartSpanOptions) => {
55
44
  log('begin otel trace', { options });