@geekmidas/telescope 10.0.0-alpha.99 → 10.0.0

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 (480) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/README.md +18 -28
  3. package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts +47 -0
  4. package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts.map +1 -0
  5. package/dist/InMemoryMetricsStorage-C4drxT7G.mjs +247 -0
  6. package/dist/InMemoryMetricsStorage-C4drxT7G.mjs.map +1 -0
  7. package/dist/InMemoryMetricsStorage-D0njWUSi.cjs +252 -0
  8. package/dist/InMemoryMetricsStorage-D0njWUSi.cjs.map +1 -0
  9. package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts +47 -0
  10. package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts.map +1 -0
  11. package/dist/{MetricsAggregator-BJdIvfEv.d.mts → MetricsAggregator-4SqelGcG.d.cts} +6 -3
  12. package/dist/MetricsAggregator-4SqelGcG.d.cts.map +1 -0
  13. package/dist/MetricsAggregator-B7lUICdH.cjs +363 -0
  14. package/dist/MetricsAggregator-B7lUICdH.cjs.map +1 -0
  15. package/dist/{MetricsAggregator-CnC3oT5q.d.cts → MetricsAggregator-DZrW8ls6.d.mts} +6 -3
  16. package/dist/MetricsAggregator-DZrW8ls6.d.mts.map +1 -0
  17. package/dist/MetricsAggregator-S3DQWNas.mjs +357 -0
  18. package/dist/MetricsAggregator-S3DQWNas.mjs.map +1 -0
  19. package/dist/MetricsStorage-B86e4131.d.cts +60 -0
  20. package/dist/MetricsStorage-B86e4131.d.cts.map +1 -0
  21. package/dist/MetricsStorage-BWyP2_12.d.mts +60 -0
  22. package/dist/MetricsStorage-BWyP2_12.d.mts.map +1 -0
  23. package/dist/MetricsStorage-BypQXWiv.mjs +0 -0
  24. package/dist/MetricsStorage-Or8pVCe4.cjs +0 -0
  25. package/dist/Telescope-Cs3fv8jt.cjs +395 -0
  26. package/dist/Telescope-Cs3fv8jt.cjs.map +1 -0
  27. package/dist/{Telescope-BVfDvVvY.d.mts → Telescope-D4nmwDRA.d.cts} +7 -4
  28. package/dist/Telescope-D4nmwDRA.d.cts.map +1 -0
  29. package/dist/Telescope-Dh5av3FC.mjs +389 -0
  30. package/dist/Telescope-Dh5av3FC.mjs.map +1 -0
  31. package/dist/{Telescope-DeqSHfuB.d.cts → Telescope-Dl6VSfxd.d.mts} +7 -4
  32. package/dist/Telescope-Dl6VSfxd.d.mts.map +1 -0
  33. package/dist/Telescope.cjs +4 -385
  34. package/dist/Telescope.d.cts +3 -1
  35. package/dist/Telescope.d.mts +3 -1
  36. package/dist/Telescope.mjs +4 -384
  37. package/dist/adapters/index.d.cts +2 -2
  38. package/dist/adapters/index.d.mts +2 -2
  39. package/dist/adapters/index.mjs +0 -1
  40. package/dist/adapters/lambda.cjs +10 -9
  41. package/dist/adapters/lambda.cjs.map +1 -1
  42. package/dist/adapters/lambda.d.cts +13 -9
  43. package/dist/adapters/lambda.d.cts.map +1 -1
  44. package/dist/adapters/lambda.d.mts +13 -9
  45. package/dist/adapters/lambda.d.mts.map +1 -1
  46. package/dist/adapters/lambda.mjs +4 -3
  47. package/dist/adapters/lambda.mjs.map +1 -1
  48. package/dist/adapters/middy.cjs +4 -236
  49. package/dist/adapters/middy.d.cts +5 -60
  50. package/dist/adapters/middy.d.mts +5 -60
  51. package/dist/adapters/middy.mjs +3 -234
  52. package/dist/adapters/types.d.cts +2 -162
  53. package/dist/adapters/types.d.mts +2 -162
  54. package/dist/adapters/types.mjs +0 -1
  55. package/dist/{rolldown-runtime-VH7oDXx4.cjs → chunk-CUT6urMc.cjs} +10 -8
  56. package/dist/core--quSp5Qr.d.mts +78 -0
  57. package/dist/core--quSp5Qr.d.mts.map +1 -0
  58. package/dist/core-B4Jpia5H.d.cts +78 -0
  59. package/dist/core-B4Jpia5H.d.cts.map +1 -0
  60. package/dist/core-CtVHRJGv.cjs +199 -0
  61. package/dist/core-CtVHRJGv.cjs.map +1 -0
  62. package/dist/core-D6hJ6exL.mjs +139 -0
  63. package/dist/core-D6hJ6exL.mjs.map +1 -0
  64. package/dist/core.cjs +22 -22
  65. package/dist/core.d.cts +4 -4
  66. package/dist/core.d.mts +4 -4
  67. package/dist/core.mjs +4 -3
  68. package/dist/hono--uKQ7Jgi.d.mts +71 -0
  69. package/dist/hono--uKQ7Jgi.d.mts.map +1 -0
  70. package/dist/hono-C4EgpbKQ.cjs +160 -0
  71. package/dist/hono-C4EgpbKQ.cjs.map +1 -0
  72. package/dist/hono-CemCKU87.d.cts +71 -0
  73. package/dist/hono-CemCKU87.d.cts.map +1 -0
  74. package/dist/hono-DxhvnVbF.mjs +136 -0
  75. package/dist/hono-DxhvnVbF.mjs.map +1 -0
  76. package/dist/http-BiNtg85L.d.mts +107 -0
  77. package/dist/http-BiNtg85L.d.mts.map +1 -0
  78. package/dist/http-DQzgLczm.mjs +159 -0
  79. package/dist/http-DQzgLczm.mjs.map +1 -0
  80. package/dist/http-D_Z8sYXZ.cjs +219 -0
  81. package/dist/http-D_Z8sYXZ.cjs.map +1 -0
  82. package/dist/http-Dvca6fC3.d.cts +107 -0
  83. package/dist/http-Dvca6fC3.d.cts.map +1 -0
  84. package/dist/index-BL32-cvv.d.cts +1 -0
  85. package/dist/index-CsuikFeJ.d.mts +1 -0
  86. package/dist/index.cjs +9 -8
  87. package/dist/index.d.cts +6 -5
  88. package/dist/index.d.mts +6 -5
  89. package/dist/index.mjs +7 -5
  90. package/dist/instrumentation/core.cjs +11 -147
  91. package/dist/instrumentation/core.d.cts +3 -74
  92. package/dist/instrumentation/core.d.mts +3 -74
  93. package/dist/instrumentation/core.mjs +2 -137
  94. package/dist/instrumentation/hono.cjs +6 -174
  95. package/dist/instrumentation/hono.d.cts +2 -86
  96. package/dist/instrumentation/hono.d.mts +2 -86
  97. package/dist/instrumentation/hono.mjs +3 -170
  98. package/dist/instrumentation/http.cjs +11 -189
  99. package/dist/instrumentation/http.d.cts +2 -119
  100. package/dist/instrumentation/http.d.mts +2 -119
  101. package/dist/instrumentation/http.mjs +2 -178
  102. package/dist/instrumentation/index.cjs +47 -56
  103. package/dist/instrumentation/index.d.cts +9 -11
  104. package/dist/instrumentation/index.d.mts +9 -11
  105. package/dist/instrumentation/index.mjs +9 -10
  106. package/dist/instrumentation/middleware.cjs +6 -164
  107. package/dist/instrumentation/middleware.d.cts +2 -83
  108. package/dist/instrumentation/middleware.d.mts +2 -83
  109. package/dist/instrumentation/middleware.mjs +3 -160
  110. package/dist/instrumentation/otel.cjs +3 -137
  111. package/dist/instrumentation/otel.d.cts +2 -97
  112. package/dist/instrumentation/otel.d.mts +2 -97
  113. package/dist/instrumentation/otel.mjs +3 -136
  114. package/dist/instrumentation/setup.cjs +4 -142
  115. package/dist/instrumentation/setup.d.cts +3 -139
  116. package/dist/instrumentation/setup.d.mts +3 -139
  117. package/dist/instrumentation/setup.mjs +3 -139
  118. package/dist/instrumentation/tracing.cjs +10 -114
  119. package/dist/instrumentation/tracing.d.cts +2 -49
  120. package/dist/instrumentation/tracing.d.mts +2 -49
  121. package/dist/instrumentation/tracing.mjs +2 -105
  122. package/dist/logger/console.cjs +12 -18
  123. package/dist/logger/console.cjs.map +1 -1
  124. package/dist/logger/console.d.cts +10 -7
  125. package/dist/logger/console.d.cts.map +1 -1
  126. package/dist/logger/console.d.mts +10 -7
  127. package/dist/logger/console.d.mts.map +1 -1
  128. package/dist/logger/console.mjs +11 -17
  129. package/dist/logger/console.mjs.map +1 -1
  130. package/dist/logger/pino.cjs +5 -6
  131. package/dist/logger/pino.cjs.map +1 -1
  132. package/dist/logger/pino.d.cts +10 -6
  133. package/dist/logger/pino.d.cts.map +1 -1
  134. package/dist/logger/pino.d.mts +10 -6
  135. package/dist/logger/pino.d.mts.map +1 -1
  136. package/dist/logger/pino.mjs +3 -2
  137. package/dist/logger/pino.mjs.map +1 -1
  138. package/dist/memory--BK4iWiv.d.cts +40 -0
  139. package/dist/memory--BK4iWiv.d.cts.map +1 -0
  140. package/dist/memory-6S9H-IF5.mjs +123 -0
  141. package/dist/memory-6S9H-IF5.mjs.map +1 -0
  142. package/dist/memory-B0d_n1g5.cjs +129 -0
  143. package/dist/memory-B0d_n1g5.cjs.map +1 -0
  144. package/dist/memory-DCirEVFW.d.mts +40 -0
  145. package/dist/memory-DCirEVFW.d.mts.map +1 -0
  146. package/dist/metrics/MetricsAggregator.cjs +2 -354
  147. package/dist/metrics/MetricsAggregator.d.cts +2 -1
  148. package/dist/metrics/MetricsAggregator.d.mts +2 -1
  149. package/dist/metrics/MetricsAggregator.mjs +2 -353
  150. package/dist/metrics/index.cjs +4 -3
  151. package/dist/metrics/index.d.cts +4 -2
  152. package/dist/metrics/index.d.mts +4 -2
  153. package/dist/metrics/index.mjs +4 -2
  154. package/dist/metrics/storage/InMemoryMetricsStorage.cjs +3 -240
  155. package/dist/metrics/storage/InMemoryMetricsStorage.d.cts +4 -43
  156. package/dist/metrics/storage/InMemoryMetricsStorage.d.mts +4 -43
  157. package/dist/metrics/storage/InMemoryMetricsStorage.mjs +3 -239
  158. package/dist/metrics/storage/MetricsStorage.cjs +1 -0
  159. package/dist/metrics/storage/MetricsStorage.d.cts +3 -56
  160. package/dist/metrics/storage/MetricsStorage.d.mts +3 -56
  161. package/dist/metrics/storage/MetricsStorage.mjs +1 -1
  162. package/dist/metrics/storage/index.cjs +6 -6
  163. package/dist/metrics/storage/index.d.cts +3 -3
  164. package/dist/metrics/storage/index.d.mts +3 -3
  165. package/dist/metrics/storage/index.mjs +5 -4
  166. package/dist/metrics/storage/types.cjs +2 -34
  167. package/dist/metrics/storage/types.d.cts +2 -207
  168. package/dist/metrics/storage/types.d.mts +2 -207
  169. package/dist/metrics/storage/types.mjs +2 -33
  170. package/dist/metrics-D5YT-Rnq.mjs +0 -0
  171. package/dist/metrics-fhD3l3C3.cjs +0 -0
  172. package/dist/middleware-B2jFUukM.cjs +184 -0
  173. package/dist/middleware-B2jFUukM.cjs.map +1 -0
  174. package/dist/middleware-BTDncHwm.mjs +160 -0
  175. package/dist/middleware-BTDncHwm.mjs.map +1 -0
  176. package/dist/middleware-CA84nsNN.d.cts +74 -0
  177. package/dist/middleware-CA84nsNN.d.cts.map +1 -0
  178. package/dist/middleware-DAceVpfw.d.mts +74 -0
  179. package/dist/middleware-DAceVpfw.d.mts.map +1 -0
  180. package/dist/middy-B6Btl8XE.d.mts +64 -0
  181. package/dist/middy-B6Btl8XE.d.mts.map +1 -0
  182. package/dist/middy-BTR3cyvk.mjs +236 -0
  183. package/dist/middy-BTR3cyvk.mjs.map +1 -0
  184. package/dist/middy-Bq0defVg.d.cts +64 -0
  185. package/dist/middy-Bq0defVg.d.cts.map +1 -0
  186. package/dist/middy-y5Zp27eG.cjs +247 -0
  187. package/dist/middy-y5Zp27eG.cjs.map +1 -0
  188. package/dist/otel-1bJPb2Z7.d.mts +101 -0
  189. package/dist/otel-1bJPb2Z7.d.mts.map +1 -0
  190. package/dist/otel-C1HqHA2O.cjs +136 -0
  191. package/dist/otel-C1HqHA2O.cjs.map +1 -0
  192. package/dist/otel-SBVoVEHr.d.cts +101 -0
  193. package/dist/otel-SBVoVEHr.d.cts.map +1 -0
  194. package/dist/otel-wulj5B-X.mjs +130 -0
  195. package/dist/otel-wulj5B-X.mjs.map +1 -0
  196. package/dist/otlp/hono.cjs +15 -9
  197. package/dist/otlp/hono.cjs.map +1 -1
  198. package/dist/otlp/hono.d.cts +13 -3
  199. package/dist/otlp/hono.d.cts.map +1 -1
  200. package/dist/otlp/hono.d.mts +13 -3
  201. package/dist/otlp/hono.d.mts.map +1 -1
  202. package/dist/otlp/hono.mjs +11 -5
  203. package/dist/otlp/hono.mjs.map +1 -1
  204. package/dist/otlp/index.cjs +11 -11
  205. package/dist/otlp/index.d.cts +7 -4
  206. package/dist/otlp/index.d.mts +7 -4
  207. package/dist/otlp/index.mjs +5 -4
  208. package/dist/otlp/receiver.cjs +4 -88
  209. package/dist/otlp/receiver.d.cts +7 -59
  210. package/dist/otlp/receiver.d.mts +7 -59
  211. package/dist/otlp/receiver.mjs +4 -87
  212. package/dist/otlp/transformer.cjs +5 -214
  213. package/dist/otlp/transformer.d.cts +3 -1
  214. package/dist/otlp/transformer.d.mts +3 -1
  215. package/dist/otlp/transformer.mjs +3 -211
  216. package/dist/otlp/types.cjs +5 -57
  217. package/dist/otlp/types.d.cts +1 -1
  218. package/dist/otlp/types.d.mts +1 -1
  219. package/dist/otlp/types.mjs +2 -53
  220. package/dist/receiver-Cj1lbAOO.cjs +94 -0
  221. package/dist/receiver-Cj1lbAOO.cjs.map +1 -0
  222. package/dist/receiver-CxVd_9CB.mjs +89 -0
  223. package/dist/receiver-CxVd_9CB.mjs.map +1 -0
  224. package/dist/receiver-DLICx5uU.d.cts +63 -0
  225. package/dist/receiver-DLICx5uU.d.cts.map +1 -0
  226. package/dist/receiver-UeZT-H8u.d.mts +63 -0
  227. package/dist/receiver-UeZT-H8u.d.mts.map +1 -0
  228. package/dist/redact-BzkITCNW.mjs +83 -0
  229. package/dist/redact-BzkITCNW.mjs.map +1 -0
  230. package/dist/redact-DVaSSPZT.cjs +95 -0
  231. package/dist/redact-DVaSSPZT.cjs.map +1 -0
  232. package/dist/redact.cjs +3 -84
  233. package/dist/redact.d.cts +8 -4
  234. package/dist/redact.d.cts.map +1 -1
  235. package/dist/redact.d.mts +8 -4
  236. package/dist/redact.d.mts.map +1 -1
  237. package/dist/redact.mjs +2 -80
  238. package/dist/server/hono.cjs +54 -33
  239. package/dist/server/hono.cjs.map +1 -1
  240. package/dist/server/hono.d.cts +14 -19
  241. package/dist/server/hono.d.cts.map +1 -1
  242. package/dist/server/hono.d.mts +14 -19
  243. package/dist/server/hono.d.mts.map +1 -1
  244. package/dist/server/hono.mjs +52 -31
  245. package/dist/server/hono.mjs.map +1 -1
  246. package/dist/setup-B9jM77Qk.mjs +98 -0
  247. package/dist/setup-B9jM77Qk.mjs.map +1 -0
  248. package/dist/setup-Bkxm4g6b.d.mts +87 -0
  249. package/dist/setup-Bkxm4g6b.d.mts.map +1 -0
  250. package/dist/setup-CYpff5B9.cjs +110 -0
  251. package/dist/setup-CYpff5B9.cjs.map +1 -0
  252. package/dist/setup-D58N1f9O.d.cts +87 -0
  253. package/dist/setup-D58N1f9O.d.cts.map +1 -0
  254. package/dist/storage/kysely.cjs +70 -82
  255. package/dist/storage/kysely.cjs.map +1 -1
  256. package/dist/storage/kysely.d.cts +20 -36
  257. package/dist/storage/kysely.d.cts.map +1 -1
  258. package/dist/storage/kysely.d.mts +20 -36
  259. package/dist/storage/kysely.d.mts.map +1 -1
  260. package/dist/storage/kysely.mjs +69 -81
  261. package/dist/storage/kysely.mjs.map +1 -1
  262. package/dist/storage/memory.cjs +2 -122
  263. package/dist/storage/memory.d.cts +3 -36
  264. package/dist/storage/memory.d.mts +3 -36
  265. package/dist/storage/memory.mjs +2 -121
  266. package/dist/tracing-BX8uY2nR.d.cts +53 -0
  267. package/dist/tracing-BX8uY2nR.d.cts.map +1 -0
  268. package/dist/tracing-Bt1zWRlb.cjs +167 -0
  269. package/dist/tracing-Bt1zWRlb.cjs.map +1 -0
  270. package/dist/tracing-Cijm_5NI.mjs +113 -0
  271. package/dist/tracing-Cijm_5NI.mjs.map +1 -0
  272. package/dist/tracing-PnECEbEu.d.mts +53 -0
  273. package/dist/tracing-PnECEbEu.d.mts.map +1 -0
  274. package/dist/transformer-BXQPhzql.mjs +215 -0
  275. package/dist/transformer-BXQPhzql.mjs.map +1 -0
  276. package/dist/transformer-CLGZ0EQc.cjs +232 -0
  277. package/dist/transformer-CLGZ0EQc.cjs.map +1 -0
  278. package/dist/{transformer-BtqjAs0b.d.cts → transformer-CTGsaVfV.d.mts} +8 -4
  279. package/dist/transformer-CTGsaVfV.d.mts.map +1 -0
  280. package/dist/{transformer-DI6t8-YA.d.mts → transformer-ICEbxpFf.d.cts} +8 -4
  281. package/dist/transformer-ICEbxpFf.d.cts.map +1 -0
  282. package/dist/{types-BVujq4zd.d.mts → types-B1EIa_cQ.d.mts} +4 -3
  283. package/dist/types-B1EIa_cQ.d.mts.map +1 -0
  284. package/dist/types-BRzW1NM8.d.cts +166 -0
  285. package/dist/types-BRzW1NM8.d.cts.map +1 -0
  286. package/dist/types-BS3Rx8Sk.d.cts +209 -0
  287. package/dist/types-BS3Rx8Sk.d.cts.map +1 -0
  288. package/dist/types-Bwm_jNU7.mjs +54 -0
  289. package/dist/types-Bwm_jNU7.mjs.map +1 -0
  290. package/dist/types-BzQ78Efw.d.mts +166 -0
  291. package/dist/types-BzQ78Efw.d.mts.map +1 -0
  292. package/dist/types-CbNGXnJE.d.mts +209 -0
  293. package/dist/types-CbNGXnJE.d.mts.map +1 -0
  294. package/dist/{types-DVETVdpa.d.cts → types-CmOB7CLO.d.cts} +7 -6
  295. package/dist/types-CmOB7CLO.d.cts.map +1 -0
  296. package/dist/{types-DVETVdpa.d.mts → types-DBc0q5KD.d.mts} +7 -6
  297. package/dist/types-DBc0q5KD.d.mts.map +1 -0
  298. package/dist/types-Dsh-DIO_.cjs +78 -0
  299. package/dist/types-Dsh-DIO_.cjs.map +1 -0
  300. package/dist/types-ZW-nfWf6.cjs +40 -0
  301. package/dist/types-ZW-nfWf6.cjs.map +1 -0
  302. package/dist/{types-BVujq4zd.d.cts → types-l7Rlb5Mg.d.cts} +4 -3
  303. package/dist/types-l7Rlb5Mg.d.cts.map +1 -0
  304. package/dist/types-ojhnLdwz.mjs +34 -0
  305. package/dist/types-ojhnLdwz.mjs.map +1 -0
  306. package/dist/types.d.cts +1 -1
  307. package/dist/types.d.mts +1 -1
  308. package/dist/types.mjs +0 -1
  309. package/dist/ui-assets-BEXqOQLe.cjs +48 -0
  310. package/dist/ui-assets-BEXqOQLe.cjs.map +1 -0
  311. package/dist/ui-assets-BhTDUsrM.mjs +30 -0
  312. package/dist/ui-assets-BhTDUsrM.mjs.map +1 -0
  313. package/dist/ui-assets.cjs +5 -0
  314. package/dist/ui-assets.d.cts +13 -0
  315. package/dist/ui-assets.d.cts.map +1 -0
  316. package/dist/ui-assets.d.mts +13 -0
  317. package/dist/ui-assets.d.mts.map +1 -0
  318. package/dist/ui-assets.mjs +3 -0
  319. package/package.json +46 -46
  320. package/src/Telescope.ts +561 -0
  321. package/src/__tests__/Telescope.spec.ts +438 -0
  322. package/src/__tests__/pino-transport.spec.ts +115 -0
  323. package/src/__tests__/redact.spec.ts +336 -0
  324. package/src/adapters/__tests__/lambda.spec.ts +318 -0
  325. package/src/adapters/__tests__/middy.spec.ts +741 -0
  326. package/src/adapters/index.ts +22 -0
  327. package/src/adapters/lambda.ts +432 -0
  328. package/src/adapters/middy.ts +402 -0
  329. package/src/adapters/types.ts +181 -0
  330. package/src/core.ts +51 -0
  331. package/src/index.ts +34 -0
  332. package/src/instrumentation/__tests__/core.spec.ts +248 -0
  333. package/src/instrumentation/__tests__/hono.spec.ts +348 -0
  334. package/src/instrumentation/__tests__/middleware.spec.ts +528 -0
  335. package/src/instrumentation/__tests__/otel.spec.ts +291 -0
  336. package/src/instrumentation/__tests__/tracing.spec.ts +208 -0
  337. package/src/instrumentation/core.ts +228 -0
  338. package/src/instrumentation/hono.ts +270 -0
  339. package/src/instrumentation/http.ts +306 -0
  340. package/src/instrumentation/index.ts +90 -0
  341. package/src/instrumentation/middleware.ts +297 -0
  342. package/src/instrumentation/otel.ts +271 -0
  343. package/src/instrumentation/setup.ts +246 -0
  344. package/src/instrumentation/tracing.ts +145 -0
  345. package/src/logger/__tests__/console.spec.ts +366 -0
  346. package/src/logger/__tests__/pino.spec.ts +217 -0
  347. package/src/logger/console.ts +230 -0
  348. package/src/logger/pino.ts +201 -0
  349. package/src/metrics/MetricsAggregator.ts +555 -0
  350. package/src/metrics/__tests__/MetricsAggregator.spec.ts +298 -0
  351. package/src/metrics/index.ts +2 -0
  352. package/src/metrics/storage/InMemoryMetricsStorage.ts +380 -0
  353. package/src/metrics/storage/MetricsStorage.ts +74 -0
  354. package/src/metrics/storage/index.ts +3 -0
  355. package/src/metrics/storage/types.ts +243 -0
  356. package/src/otlp/__tests__/receiver.spec.ts +367 -0
  357. package/src/otlp/__tests__/transformer.spec.ts +455 -0
  358. package/src/otlp/hono.ts +120 -0
  359. package/src/otlp/index.ts +22 -0
  360. package/src/otlp/receiver.ts +162 -0
  361. package/src/otlp/transformer.ts +367 -0
  362. package/src/otlp/types.ts +364 -0
  363. package/src/redact.ts +116 -0
  364. package/src/server/__tests__/hono.spec.ts +814 -0
  365. package/src/server/hono.ts +442 -0
  366. package/src/storage/__tests__/kysely.spec.ts +715 -0
  367. package/src/storage/__tests__/memory.spec.ts +694 -0
  368. package/src/storage/kysely.ts +599 -0
  369. package/src/storage/memory.ts +204 -0
  370. package/src/types.ts +447 -0
  371. package/src/ui-assets.ts +40 -0
  372. package/tsconfig.json +9 -0
  373. package/ui/CHANGELOG.md +7 -0
  374. package/ui/index.html +12 -0
  375. package/ui/node_modules/.bin/tsc +21 -0
  376. package/ui/node_modules/.bin/tsserver +21 -0
  377. package/ui/node_modules/.bin/vite +21 -0
  378. package/ui/package.json +24 -0
  379. package/ui/src/App.tsx +595 -0
  380. package/ui/src/api.ts +88 -0
  381. package/ui/src/components/ExceptionDetail.tsx +100 -0
  382. package/ui/src/components/FilterBar.tsx +162 -0
  383. package/ui/src/components/LogDetail.tsx +91 -0
  384. package/ui/src/components/RequestDetail.tsx +143 -0
  385. package/ui/src/main.tsx +10 -0
  386. package/ui/src/styles.css +11 -0
  387. package/ui/src/types.ts +63 -0
  388. package/ui/src/vite-env.d.ts +1 -0
  389. package/ui/src/vite-plugin-gkm-config.ts +54 -0
  390. package/ui/tsconfig.json +20 -0
  391. package/ui/tsconfig.tsbuildinfo +1 -0
  392. package/ui/vite.config.ts +13 -0
  393. package/dist/MetricsAggregator-BJdIvfEv.d.mts.map +0 -1
  394. package/dist/MetricsAggregator-CnC3oT5q.d.cts.map +0 -1
  395. package/dist/Telescope-BVfDvVvY.d.mts.map +0 -1
  396. package/dist/Telescope-DeqSHfuB.d.cts.map +0 -1
  397. package/dist/Telescope.cjs.map +0 -1
  398. package/dist/Telescope.mjs.map +0 -1
  399. package/dist/adapters/middy.cjs.map +0 -1
  400. package/dist/adapters/middy.d.cts.map +0 -1
  401. package/dist/adapters/middy.d.mts.map +0 -1
  402. package/dist/adapters/middy.mjs.map +0 -1
  403. package/dist/adapters/types.d.cts.map +0 -1
  404. package/dist/adapters/types.d.mts.map +0 -1
  405. package/dist/instrumentation/core.cjs.map +0 -1
  406. package/dist/instrumentation/core.d.cts.map +0 -1
  407. package/dist/instrumentation/core.d.mts.map +0 -1
  408. package/dist/instrumentation/core.mjs.map +0 -1
  409. package/dist/instrumentation/hono.cjs.map +0 -1
  410. package/dist/instrumentation/hono.d.cts.map +0 -1
  411. package/dist/instrumentation/hono.d.mts.map +0 -1
  412. package/dist/instrumentation/hono.mjs.map +0 -1
  413. package/dist/instrumentation/http.cjs.map +0 -1
  414. package/dist/instrumentation/http.d.cts.map +0 -1
  415. package/dist/instrumentation/http.d.mts.map +0 -1
  416. package/dist/instrumentation/http.mjs.map +0 -1
  417. package/dist/instrumentation/middleware.cjs.map +0 -1
  418. package/dist/instrumentation/middleware.d.cts.map +0 -1
  419. package/dist/instrumentation/middleware.d.mts.map +0 -1
  420. package/dist/instrumentation/middleware.mjs.map +0 -1
  421. package/dist/instrumentation/otel.cjs.map +0 -1
  422. package/dist/instrumentation/otel.d.cts.map +0 -1
  423. package/dist/instrumentation/otel.d.mts.map +0 -1
  424. package/dist/instrumentation/otel.mjs.map +0 -1
  425. package/dist/instrumentation/sampler.cjs +0 -54
  426. package/dist/instrumentation/sampler.cjs.map +0 -1
  427. package/dist/instrumentation/sampler.d.cts +0 -38
  428. package/dist/instrumentation/sampler.d.cts.map +0 -1
  429. package/dist/instrumentation/sampler.d.mts +0 -38
  430. package/dist/instrumentation/sampler.d.mts.map +0 -1
  431. package/dist/instrumentation/sampler.mjs +0 -52
  432. package/dist/instrumentation/sampler.mjs.map +0 -1
  433. package/dist/instrumentation/setup.cjs.map +0 -1
  434. package/dist/instrumentation/setup.d.cts.map +0 -1
  435. package/dist/instrumentation/setup.d.mts.map +0 -1
  436. package/dist/instrumentation/setup.mjs.map +0 -1
  437. package/dist/instrumentation/tracing.cjs.map +0 -1
  438. package/dist/instrumentation/tracing.d.cts.map +0 -1
  439. package/dist/instrumentation/tracing.d.mts.map +0 -1
  440. package/dist/instrumentation/tracing.mjs.map +0 -1
  441. package/dist/instrumentation/trust.cjs +0 -107
  442. package/dist/instrumentation/trust.cjs.map +0 -1
  443. package/dist/instrumentation/trust.d.cts +0 -57
  444. package/dist/instrumentation/trust.d.cts.map +0 -1
  445. package/dist/instrumentation/trust.d.mts +0 -57
  446. package/dist/instrumentation/trust.d.mts.map +0 -1
  447. package/dist/instrumentation/trust.mjs +0 -104
  448. package/dist/instrumentation/trust.mjs.map +0 -1
  449. package/dist/metrics/MetricsAggregator.cjs.map +0 -1
  450. package/dist/metrics/MetricsAggregator.mjs.map +0 -1
  451. package/dist/metrics/storage/InMemoryMetricsStorage.cjs.map +0 -1
  452. package/dist/metrics/storage/InMemoryMetricsStorage.d.cts.map +0 -1
  453. package/dist/metrics/storage/InMemoryMetricsStorage.d.mts.map +0 -1
  454. package/dist/metrics/storage/InMemoryMetricsStorage.mjs.map +0 -1
  455. package/dist/metrics/storage/MetricsStorage.d.cts.map +0 -1
  456. package/dist/metrics/storage/MetricsStorage.d.mts.map +0 -1
  457. package/dist/metrics/storage/types.cjs.map +0 -1
  458. package/dist/metrics/storage/types.d.cts.map +0 -1
  459. package/dist/metrics/storage/types.d.mts.map +0 -1
  460. package/dist/metrics/storage/types.mjs.map +0 -1
  461. package/dist/otlp/receiver.cjs.map +0 -1
  462. package/dist/otlp/receiver.d.cts.map +0 -1
  463. package/dist/otlp/receiver.d.mts.map +0 -1
  464. package/dist/otlp/receiver.mjs.map +0 -1
  465. package/dist/otlp/transformer.cjs.map +0 -1
  466. package/dist/otlp/transformer.mjs.map +0 -1
  467. package/dist/otlp/types.cjs.map +0 -1
  468. package/dist/otlp/types.mjs.map +0 -1
  469. package/dist/redact.cjs.map +0 -1
  470. package/dist/redact.mjs.map +0 -1
  471. package/dist/storage/memory.cjs.map +0 -1
  472. package/dist/storage/memory.d.cts.map +0 -1
  473. package/dist/storage/memory.d.mts.map +0 -1
  474. package/dist/storage/memory.mjs.map +0 -1
  475. package/dist/transformer-BtqjAs0b.d.cts.map +0 -1
  476. package/dist/transformer-DI6t8-YA.d.mts.map +0 -1
  477. package/dist/types-BVujq4zd.d.cts.map +0 -1
  478. package/dist/types-BVujq4zd.d.mts.map +0 -1
  479. package/dist/types-DVETVdpa.d.cts.map +0 -1
  480. package/dist/types-DVETVdpa.d.mts.map +0 -1
@@ -0,0 +1,357 @@
1
+ //#region src/metrics/MetricsAggregator.ts
2
+ const DEFAULT_OPTIONS = {
3
+ bucketSize: 6e4,
4
+ maxBuckets: 1440,
5
+ maxSamplesPerBucket: 1e3
6
+ };
7
+ var MetricsAggregator = class {
8
+ options;
9
+ buckets = /* @__PURE__ */ new Map();
10
+ endpoints = /* @__PURE__ */ new Map();
11
+ endpointTimeBuckets = /* @__PURE__ */ new Map();
12
+ constructor(options = {}) {
13
+ this.options = {
14
+ ...DEFAULT_OPTIONS,
15
+ ...options
16
+ };
17
+ }
18
+ /**
19
+ * Record a request for metrics aggregation
20
+ */
21
+ record(entry) {
22
+ const timestamp = entry.timestamp.getTime();
23
+ const bucketTs = this.getBucketTimestamp(timestamp);
24
+ this.updateBucket(bucketTs, entry);
25
+ this.updateEndpoint(entry);
26
+ this.pruneBuckets();
27
+ }
28
+ /**
29
+ * Get aggregated request metrics
30
+ */
31
+ getMetrics(options = {}) {
32
+ const range = options.range ?? this.getDefaultRange();
33
+ const bucketSize = options.bucketSize ?? this.options.bucketSize;
34
+ const bucketsInRange = this.getBucketsInRange(range);
35
+ if (bucketsInRange.length === 0) return this.emptyMetrics();
36
+ const allDurations = [];
37
+ let totalRequests = 0;
38
+ let totalDuration = 0;
39
+ let totalErrors = 0;
40
+ for (const bucket of bucketsInRange) {
41
+ totalRequests += bucket.count;
42
+ totalDuration += bucket.durationSum;
43
+ totalErrors += bucket.errorCount;
44
+ allDurations.push(...bucket.durationSamples);
45
+ }
46
+ allDurations.sort((a, b) => a - b);
47
+ const p50 = this.percentile(allDurations, 50);
48
+ const p95 = this.percentile(allDurations, 95);
49
+ const p99 = this.percentile(allDurations, 99);
50
+ const rangeMs = range.end.getTime() - range.start.getTime();
51
+ const rangeSeconds = rangeMs / 1e3;
52
+ const avgDuration = totalRequests > 0 ? totalDuration / totalRequests : 0;
53
+ const errorRate = totalRequests > 0 ? totalErrors / totalRequests * 100 : 0;
54
+ const timeSeries = this.buildTimeSeries(bucketsInRange, range, bucketSize);
55
+ return {
56
+ totalRequests,
57
+ avgDuration,
58
+ p50Duration: p50,
59
+ p95Duration: p95,
60
+ p99Duration: p99,
61
+ errorRate,
62
+ successRate: 100 - errorRate,
63
+ requestsPerSecond: rangeSeconds > 0 ? totalRequests / rangeSeconds : 0,
64
+ timeSeries
65
+ };
66
+ }
67
+ /**
68
+ * Get metrics for individual endpoints
69
+ */
70
+ getEndpointMetrics(options = {}) {
71
+ const limit = options.limit ?? 50;
72
+ const results = [];
73
+ for (const [, bucket] of this.endpoints) {
74
+ const avgDuration = bucket.count > 0 ? bucket.durationSum / bucket.count : 0;
75
+ bucket.durationSamples.sort((a, b) => a - b);
76
+ const p95 = this.percentile(bucket.durationSamples, 95);
77
+ const errorRate = bucket.count > 0 ? bucket.errorCount / bucket.count * 100 : 0;
78
+ results.push({
79
+ method: bucket.method,
80
+ path: bucket.path,
81
+ count: bucket.count,
82
+ avgDuration,
83
+ p95Duration: p95,
84
+ errorRate,
85
+ lastSeen: bucket.lastSeen
86
+ });
87
+ }
88
+ results.sort((a, b) => b.count - a.count);
89
+ return results.slice(0, limit);
90
+ }
91
+ /**
92
+ * Get status code distribution
93
+ */
94
+ getStatusDistribution(options = {}) {
95
+ const range = options.range ?? this.getDefaultRange();
96
+ const bucketsInRange = this.getBucketsInRange(range);
97
+ const distribution = {
98
+ "2xx": 0,
99
+ "3xx": 0,
100
+ "4xx": 0,
101
+ "5xx": 0
102
+ };
103
+ for (const bucket of bucketsInRange) {
104
+ distribution["2xx"] += bucket.statusDistribution["2xx"];
105
+ distribution["3xx"] += bucket.statusDistribution["3xx"];
106
+ distribution["4xx"] += bucket.statusDistribution["4xx"];
107
+ distribution["5xx"] += bucket.statusDistribution["5xx"];
108
+ }
109
+ return distribution;
110
+ }
111
+ /**
112
+ * Get detailed metrics for a specific endpoint
113
+ */
114
+ getEndpointDetails(method, path, options = {}) {
115
+ const key = `${method}:${path}`;
116
+ const endpoint = this.endpoints.get(key);
117
+ if (!endpoint) return null;
118
+ const samples = [...endpoint.durationSamples].sort((a, b) => a - b);
119
+ const p50 = this.percentile(samples, 50);
120
+ const p95 = this.percentile(samples, 95);
121
+ const p99 = this.percentile(samples, 99);
122
+ const avgDuration = endpoint.count > 0 ? endpoint.durationSum / endpoint.count : 0;
123
+ const errorRate = endpoint.count > 0 ? endpoint.errorCount / endpoint.count * 100 : 0;
124
+ const endpointBuckets = this.endpointTimeBuckets.get(key);
125
+ const timeSeries = [];
126
+ const statusDistribution = {
127
+ "2xx": 0,
128
+ "3xx": 0,
129
+ "4xx": 0,
130
+ "5xx": 0
131
+ };
132
+ if (endpointBuckets) {
133
+ const range = options.range ?? this.getDefaultRange();
134
+ const startTs = range.start.getTime();
135
+ const endTs = range.end.getTime();
136
+ for (const [ts, bucket] of endpointBuckets) if (ts >= startTs && ts <= endTs) {
137
+ timeSeries.push({
138
+ timestamp: bucket.timestamp,
139
+ count: bucket.count,
140
+ avgDuration: bucket.count > 0 ? bucket.durationSum / bucket.count : 0,
141
+ errorCount: bucket.errorCount
142
+ });
143
+ statusDistribution["2xx"] += bucket.statusDistribution["2xx"];
144
+ statusDistribution["3xx"] += bucket.statusDistribution["3xx"];
145
+ statusDistribution["4xx"] += bucket.statusDistribution["4xx"];
146
+ statusDistribution["5xx"] += bucket.statusDistribution["5xx"];
147
+ }
148
+ timeSeries.sort((a, b) => a.timestamp - b.timestamp);
149
+ }
150
+ return {
151
+ method: endpoint.method,
152
+ path: endpoint.path,
153
+ count: endpoint.count,
154
+ avgDuration,
155
+ p50Duration: p50,
156
+ p95Duration: p95,
157
+ p99Duration: p99,
158
+ errorRate,
159
+ successRate: 100 - errorRate,
160
+ lastSeen: endpoint.lastSeen,
161
+ statusDistribution,
162
+ timeSeries
163
+ };
164
+ }
165
+ /**
166
+ * Reset all metrics
167
+ */
168
+ reset() {
169
+ this.buckets.clear();
170
+ this.endpoints.clear();
171
+ this.endpointTimeBuckets.clear();
172
+ }
173
+ getBucketTimestamp(timestamp) {
174
+ return Math.floor(timestamp / this.options.bucketSize) * this.options.bucketSize;
175
+ }
176
+ updateBucket(bucketTs, entry) {
177
+ let bucket = this.buckets.get(bucketTs);
178
+ if (!bucket) {
179
+ bucket = this.createEmptyBucket(bucketTs);
180
+ this.buckets.set(bucketTs, bucket);
181
+ }
182
+ bucket.count++;
183
+ bucket.durationSum += entry.duration;
184
+ bucket.durationMin = Math.min(bucket.durationMin, entry.duration);
185
+ bucket.durationMax = Math.max(bucket.durationMax, entry.duration);
186
+ if (bucket.durationSamples.length < this.options.maxSamplesPerBucket) bucket.durationSamples.push(entry.duration);
187
+ else {
188
+ const idx = Math.floor(Math.random() * bucket.count);
189
+ if (idx < this.options.maxSamplesPerBucket) bucket.durationSamples[idx] = entry.duration;
190
+ }
191
+ const isError = entry.status >= 400;
192
+ if (isError) bucket.errorCount++;
193
+ if (entry.status >= 200 && entry.status < 300) bucket.statusDistribution["2xx"]++;
194
+ else if (entry.status >= 300 && entry.status < 400) bucket.statusDistribution["3xx"]++;
195
+ else if (entry.status >= 400 && entry.status < 500) bucket.statusDistribution["4xx"]++;
196
+ else if (entry.status >= 500) bucket.statusDistribution["5xx"]++;
197
+ }
198
+ updateEndpoint(entry) {
199
+ const key = `${entry.method}:${entry.path}`;
200
+ let endpoint = this.endpoints.get(key);
201
+ if (!endpoint) {
202
+ endpoint = {
203
+ method: entry.method,
204
+ path: entry.path,
205
+ count: 0,
206
+ durationSum: 0,
207
+ durationSamples: [],
208
+ errorCount: 0,
209
+ lastSeen: 0
210
+ };
211
+ this.endpoints.set(key, endpoint);
212
+ }
213
+ endpoint.count++;
214
+ endpoint.durationSum += entry.duration;
215
+ endpoint.lastSeen = entry.timestamp.getTime();
216
+ if (entry.status >= 400) endpoint.errorCount++;
217
+ if (endpoint.durationSamples.length < this.options.maxSamplesPerBucket) endpoint.durationSamples.push(entry.duration);
218
+ else {
219
+ const idx = Math.floor(Math.random() * endpoint.count);
220
+ if (idx < this.options.maxSamplesPerBucket) endpoint.durationSamples[idx] = entry.duration;
221
+ }
222
+ this.updateEndpointTimeBucket(key, entry);
223
+ }
224
+ updateEndpointTimeBucket(key, entry) {
225
+ const timestamp = entry.timestamp.getTime();
226
+ const bucketTs = this.getBucketTimestamp(timestamp);
227
+ let endpointBuckets = this.endpointTimeBuckets.get(key);
228
+ if (!endpointBuckets) {
229
+ endpointBuckets = /* @__PURE__ */ new Map();
230
+ this.endpointTimeBuckets.set(key, endpointBuckets);
231
+ }
232
+ let bucket = endpointBuckets.get(bucketTs);
233
+ if (!bucket) {
234
+ bucket = {
235
+ timestamp: bucketTs,
236
+ count: 0,
237
+ durationSum: 0,
238
+ errorCount: 0,
239
+ statusDistribution: {
240
+ "2xx": 0,
241
+ "3xx": 0,
242
+ "4xx": 0,
243
+ "5xx": 0
244
+ }
245
+ };
246
+ endpointBuckets.set(bucketTs, bucket);
247
+ }
248
+ bucket.count++;
249
+ bucket.durationSum += entry.duration;
250
+ if (entry.status >= 400) bucket.errorCount++;
251
+ if (entry.status >= 200 && entry.status < 300) bucket.statusDistribution["2xx"]++;
252
+ else if (entry.status >= 300 && entry.status < 400) bucket.statusDistribution["3xx"]++;
253
+ else if (entry.status >= 400 && entry.status < 500) bucket.statusDistribution["4xx"]++;
254
+ else if (entry.status >= 500) bucket.statusDistribution["5xx"]++;
255
+ if (endpointBuckets.size > this.options.maxBuckets) {
256
+ const timestamps = Array.from(endpointBuckets.keys()).sort((a, b) => a - b);
257
+ const toRemove = timestamps.slice(0, timestamps.length - this.options.maxBuckets);
258
+ for (const ts of toRemove) endpointBuckets.delete(ts);
259
+ }
260
+ }
261
+ createEmptyBucket(timestamp) {
262
+ return {
263
+ timestamp,
264
+ bucketSize: this.options.bucketSize,
265
+ count: 0,
266
+ durationSum: 0,
267
+ durationMin: Infinity,
268
+ durationMax: 0,
269
+ durationSamples: [],
270
+ errorCount: 0,
271
+ statusDistribution: {
272
+ "2xx": 0,
273
+ "3xx": 0,
274
+ "4xx": 0,
275
+ "5xx": 0
276
+ }
277
+ };
278
+ }
279
+ pruneBuckets() {
280
+ if (this.buckets.size <= this.options.maxBuckets) return;
281
+ const timestamps = Array.from(this.buckets.keys()).sort((a, b) => a - b);
282
+ const toRemove = timestamps.slice(0, timestamps.length - this.options.maxBuckets);
283
+ for (const ts of toRemove) this.buckets.delete(ts);
284
+ }
285
+ getDefaultRange() {
286
+ const now = /* @__PURE__ */ new Date();
287
+ const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1e3);
288
+ return {
289
+ start: oneHourAgo,
290
+ end: now
291
+ };
292
+ }
293
+ getBucketsInRange(range) {
294
+ const startTs = range.start.getTime();
295
+ const endTs = range.end.getTime();
296
+ const results = [];
297
+ for (const [ts, bucket] of this.buckets) if (ts >= startTs && ts <= endTs) results.push(bucket);
298
+ return results.sort((a, b) => a.timestamp - b.timestamp);
299
+ }
300
+ buildTimeSeries(buckets, _range, targetBucketSize) {
301
+ if (buckets.length === 0) return [];
302
+ if (targetBucketSize === this.options.bucketSize) return buckets.map((b) => ({
303
+ timestamp: b.timestamp,
304
+ count: b.count,
305
+ avgDuration: b.count > 0 ? b.durationSum / b.count : 0,
306
+ errorCount: b.errorCount
307
+ }));
308
+ const points = /* @__PURE__ */ new Map();
309
+ for (const bucket of buckets) {
310
+ const targetTs = Math.floor(bucket.timestamp / targetBucketSize) * targetBucketSize;
311
+ let point = points.get(targetTs);
312
+ if (!point) {
313
+ point = {
314
+ timestamp: targetTs,
315
+ count: 0,
316
+ avgDuration: 0,
317
+ errorCount: 0
318
+ };
319
+ points.set(targetTs, point);
320
+ }
321
+ const totalCount = point.count + bucket.count;
322
+ if (totalCount > 0) point.avgDuration = (point.avgDuration * point.count + (bucket.count > 0 ? bucket.durationSum / bucket.count : 0) * bucket.count) / totalCount;
323
+ point.count = totalCount;
324
+ point.errorCount += bucket.errorCount;
325
+ }
326
+ return Array.from(points.values()).sort((a, b) => a.timestamp - b.timestamp);
327
+ }
328
+ percentile(sortedValues, p) {
329
+ if (sortedValues.length === 0) return 0;
330
+ if (sortedValues.length === 1) return sortedValues[0];
331
+ const index = p / 100 * (sortedValues.length - 1);
332
+ const lower = Math.floor(index);
333
+ const upper = Math.ceil(index);
334
+ if (lower === upper) return sortedValues[lower];
335
+ const weight = index - lower;
336
+ const lowerVal = sortedValues[lower];
337
+ const upperVal = sortedValues[upper];
338
+ return lowerVal * (1 - weight) + upperVal * weight;
339
+ }
340
+ emptyMetrics() {
341
+ return {
342
+ totalRequests: 0,
343
+ avgDuration: 0,
344
+ p50Duration: 0,
345
+ p95Duration: 0,
346
+ p99Duration: 0,
347
+ errorRate: 0,
348
+ successRate: 100,
349
+ requestsPerSecond: 0,
350
+ timeSeries: []
351
+ };
352
+ }
353
+ };
354
+
355
+ //#endregion
356
+ export { MetricsAggregator };
357
+ //# sourceMappingURL=MetricsAggregator-S3DQWNas.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricsAggregator-S3DQWNas.mjs","names":["DEFAULT_OPTIONS: Required<MetricsAggregatorOptions>","options: MetricsAggregatorOptions","entry: RequestEntry","options: MetricsQueryOptions","allDurations: number[]","results: EndpointMetrics[]","distribution: StatusDistribution","method: string","path: string","timeSeries: TimeSeriesPoint[]","statusDistribution: StatusDistribution","timestamp: number","bucketTs: number","key: string","range: TimeRange","results: MetricsBucket[]","buckets: MetricsBucket[]","_range: TimeRange","targetBucketSize: number","points: Map<number, TimeSeriesPoint>","sortedValues: number[]","p: number"],"sources":["../src/metrics/MetricsAggregator.ts"],"sourcesContent":["import type {\n\tEndpointBucket,\n\tEndpointDetails,\n\tEndpointMetrics,\n\tMetricsBucket,\n\tMetricsQueryOptions,\n\tRequestEntry,\n\tRequestMetrics,\n\tStatusDistribution,\n\tTimeRange,\n\tTimeSeriesPoint,\n} from '../types';\n\n/**\n * Configuration for MetricsAggregator\n */\nexport interface MetricsAggregatorOptions {\n\t/** Bucket size in milliseconds (default: 60000 = 1 minute) */\n\tbucketSize?: number;\n\t/** Maximum number of buckets to retain (default: 1440 = 24 hours at 1 min buckets) */\n\tmaxBuckets?: number;\n\t/** Maximum duration samples to keep per bucket for percentiles (default: 1000) */\n\tmaxSamplesPerBucket?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<MetricsAggregatorOptions> = {\n\tbucketSize: 60_000, // 1 minute\n\tmaxBuckets: 1440, // 24 hours\n\tmaxSamplesPerBucket: 1000,\n};\n\n/**\n * In-memory metrics aggregator for Telescope.\n * Aggregates request data into time-bucketed metrics for efficient querying.\n */\n/**\n * Endpoint time bucket for per-endpoint time series\n */\ninterface EndpointTimeBucket {\n\ttimestamp: number;\n\tcount: number;\n\tdurationSum: number;\n\terrorCount: number;\n\tstatusDistribution: StatusDistribution;\n}\n\nexport class MetricsAggregator {\n\tprivate options: Required<MetricsAggregatorOptions>;\n\tprivate buckets: Map<number, MetricsBucket> = new Map();\n\tprivate endpoints: Map<string, EndpointBucket> = new Map();\n\t// Map of endpoint key -> Map of timestamp -> bucket\n\tprivate endpointTimeBuckets: Map<string, Map<number, EndpointTimeBucket>> =\n\t\tnew Map();\n\n\tconstructor(options: MetricsAggregatorOptions = {}) {\n\t\tthis.options = { ...DEFAULT_OPTIONS, ...options };\n\t}\n\n\t/**\n\t * Record a request for metrics aggregation\n\t */\n\trecord(entry: RequestEntry): void {\n\t\tconst timestamp = entry.timestamp.getTime();\n\t\tconst bucketTs = this.getBucketTimestamp(timestamp);\n\n\t\t// Update time bucket\n\t\tthis.updateBucket(bucketTs, entry);\n\n\t\t// Update endpoint metrics\n\t\tthis.updateEndpoint(entry);\n\n\t\t// Prune old buckets\n\t\tthis.pruneBuckets();\n\t}\n\n\t/**\n\t * Get aggregated request metrics\n\t */\n\tgetMetrics(options: MetricsQueryOptions = {}): RequestMetrics {\n\t\tconst range = options.range ?? this.getDefaultRange();\n\t\tconst bucketSize = options.bucketSize ?? this.options.bucketSize;\n\n\t\t// Get buckets in range\n\t\tconst bucketsInRange = this.getBucketsInRange(range);\n\n\t\tif (bucketsInRange.length === 0) {\n\t\t\treturn this.emptyMetrics();\n\t\t}\n\n\t\t// Aggregate all durations for percentile calculations\n\t\tconst allDurations: number[] = [];\n\t\tlet totalRequests = 0;\n\t\tlet totalDuration = 0;\n\t\tlet totalErrors = 0;\n\n\t\tfor (const bucket of bucketsInRange) {\n\t\t\ttotalRequests += bucket.count;\n\t\t\ttotalDuration += bucket.durationSum;\n\t\t\ttotalErrors += bucket.errorCount;\n\t\t\tallDurations.push(...bucket.durationSamples);\n\t\t}\n\n\t\t// Calculate percentiles\n\t\tallDurations.sort((a, b) => a - b);\n\t\tconst p50 = this.percentile(allDurations, 50);\n\t\tconst p95 = this.percentile(allDurations, 95);\n\t\tconst p99 = this.percentile(allDurations, 99);\n\n\t\t// Calculate rates\n\t\tconst rangeMs = range.end.getTime() - range.start.getTime();\n\t\tconst rangeSeconds = rangeMs / 1000;\n\t\tconst avgDuration = totalRequests > 0 ? totalDuration / totalRequests : 0;\n\t\tconst errorRate =\n\t\t\ttotalRequests > 0 ? (totalErrors / totalRequests) * 100 : 0;\n\n\t\t// Build time series (re-bucket if needed)\n\t\tconst timeSeries = this.buildTimeSeries(bucketsInRange, range, bucketSize);\n\n\t\treturn {\n\t\t\ttotalRequests,\n\t\t\tavgDuration,\n\t\t\tp50Duration: p50,\n\t\t\tp95Duration: p95,\n\t\t\tp99Duration: p99,\n\t\t\terrorRate,\n\t\t\tsuccessRate: 100 - errorRate,\n\t\t\trequestsPerSecond: rangeSeconds > 0 ? totalRequests / rangeSeconds : 0,\n\t\t\ttimeSeries,\n\t\t};\n\t}\n\n\t/**\n\t * Get metrics for individual endpoints\n\t */\n\tgetEndpointMetrics(options: MetricsQueryOptions = {}): EndpointMetrics[] {\n\t\tconst limit = options.limit ?? 50;\n\n\t\tconst results: EndpointMetrics[] = [];\n\n\t\tfor (const [, bucket] of this.endpoints) {\n\t\t\tconst avgDuration =\n\t\t\t\tbucket.count > 0 ? bucket.durationSum / bucket.count : 0;\n\t\t\tbucket.durationSamples.sort((a, b) => a - b);\n\t\t\tconst p95 = this.percentile(bucket.durationSamples, 95);\n\t\t\tconst errorRate =\n\t\t\t\tbucket.count > 0 ? (bucket.errorCount / bucket.count) * 100 : 0;\n\n\t\t\tresults.push({\n\t\t\t\tmethod: bucket.method,\n\t\t\t\tpath: bucket.path,\n\t\t\t\tcount: bucket.count,\n\t\t\t\tavgDuration,\n\t\t\t\tp95Duration: p95,\n\t\t\t\terrorRate,\n\t\t\t\tlastSeen: bucket.lastSeen,\n\t\t\t});\n\t\t}\n\n\t\t// Sort by count descending\n\t\tresults.sort((a, b) => b.count - a.count);\n\n\t\treturn results.slice(0, limit);\n\t}\n\n\t/**\n\t * Get status code distribution\n\t */\n\tgetStatusDistribution(options: MetricsQueryOptions = {}): StatusDistribution {\n\t\tconst range = options.range ?? this.getDefaultRange();\n\t\tconst bucketsInRange = this.getBucketsInRange(range);\n\n\t\tconst distribution: StatusDistribution = {\n\t\t\t'2xx': 0,\n\t\t\t'3xx': 0,\n\t\t\t'4xx': 0,\n\t\t\t'5xx': 0,\n\t\t};\n\n\t\tfor (const bucket of bucketsInRange) {\n\t\t\tdistribution['2xx'] += bucket.statusDistribution['2xx'];\n\t\t\tdistribution['3xx'] += bucket.statusDistribution['3xx'];\n\t\t\tdistribution['4xx'] += bucket.statusDistribution['4xx'];\n\t\t\tdistribution['5xx'] += bucket.statusDistribution['5xx'];\n\t\t}\n\n\t\treturn distribution;\n\t}\n\n\t/**\n\t * Get detailed metrics for a specific endpoint\n\t */\n\tgetEndpointDetails(\n\t\tmethod: string,\n\t\tpath: string,\n\t\toptions: MetricsQueryOptions = {},\n\t): EndpointDetails | null {\n\t\tconst key = `${method}:${path}`;\n\t\tconst endpoint = this.endpoints.get(key);\n\n\t\tif (!endpoint) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Calculate percentiles\n\t\tconst samples = [...endpoint.durationSamples].sort((a, b) => a - b);\n\t\tconst p50 = this.percentile(samples, 50);\n\t\tconst p95 = this.percentile(samples, 95);\n\t\tconst p99 = this.percentile(samples, 99);\n\n\t\tconst avgDuration =\n\t\t\tendpoint.count > 0 ? endpoint.durationSum / endpoint.count : 0;\n\t\tconst errorRate =\n\t\t\tendpoint.count > 0 ? (endpoint.errorCount / endpoint.count) * 100 : 0;\n\n\t\t// Get time series for this endpoint\n\t\tconst endpointBuckets = this.endpointTimeBuckets.get(key);\n\t\tconst timeSeries: TimeSeriesPoint[] = [];\n\t\tconst statusDistribution: StatusDistribution = {\n\t\t\t'2xx': 0,\n\t\t\t'3xx': 0,\n\t\t\t'4xx': 0,\n\t\t\t'5xx': 0,\n\t\t};\n\n\t\tif (endpointBuckets) {\n\t\t\tconst range = options.range ?? this.getDefaultRange();\n\t\t\tconst startTs = range.start.getTime();\n\t\t\tconst endTs = range.end.getTime();\n\n\t\t\tfor (const [ts, bucket] of endpointBuckets) {\n\t\t\t\tif (ts >= startTs && ts <= endTs) {\n\t\t\t\t\ttimeSeries.push({\n\t\t\t\t\t\ttimestamp: bucket.timestamp,\n\t\t\t\t\t\tcount: bucket.count,\n\t\t\t\t\t\tavgDuration:\n\t\t\t\t\t\t\tbucket.count > 0 ? bucket.durationSum / bucket.count : 0,\n\t\t\t\t\t\terrorCount: bucket.errorCount,\n\t\t\t\t\t});\n\n\t\t\t\t\tstatusDistribution['2xx'] += bucket.statusDistribution['2xx'];\n\t\t\t\t\tstatusDistribution['3xx'] += bucket.statusDistribution['3xx'];\n\t\t\t\t\tstatusDistribution['4xx'] += bucket.statusDistribution['4xx'];\n\t\t\t\t\tstatusDistribution['5xx'] += bucket.statusDistribution['5xx'];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttimeSeries.sort((a, b) => a.timestamp - b.timestamp);\n\t\t}\n\n\t\treturn {\n\t\t\tmethod: endpoint.method,\n\t\t\tpath: endpoint.path,\n\t\t\tcount: endpoint.count,\n\t\t\tavgDuration,\n\t\t\tp50Duration: p50,\n\t\t\tp95Duration: p95,\n\t\t\tp99Duration: p99,\n\t\t\terrorRate,\n\t\t\tsuccessRate: 100 - errorRate,\n\t\t\tlastSeen: endpoint.lastSeen,\n\t\t\tstatusDistribution,\n\t\t\ttimeSeries,\n\t\t};\n\t}\n\n\t/**\n\t * Reset all metrics\n\t */\n\treset(): void {\n\t\tthis.buckets.clear();\n\t\tthis.endpoints.clear();\n\t\tthis.endpointTimeBuckets.clear();\n\t}\n\n\t// ============================================\n\t// Private Methods\n\t// ============================================\n\n\tprivate getBucketTimestamp(timestamp: number): number {\n\t\treturn (\n\t\t\tMath.floor(timestamp / this.options.bucketSize) * this.options.bucketSize\n\t\t);\n\t}\n\n\tprivate updateBucket(bucketTs: number, entry: RequestEntry): void {\n\t\tlet bucket = this.buckets.get(bucketTs);\n\n\t\tif (!bucket) {\n\t\t\tbucket = this.createEmptyBucket(bucketTs);\n\t\t\tthis.buckets.set(bucketTs, bucket);\n\t\t}\n\n\t\tbucket.count++;\n\t\tbucket.durationSum += entry.duration;\n\t\tbucket.durationMin = Math.min(bucket.durationMin, entry.duration);\n\t\tbucket.durationMax = Math.max(bucket.durationMax, entry.duration);\n\n\t\t// Keep samples for percentile calculations (with reservoir sampling if needed)\n\t\tif (bucket.durationSamples.length < this.options.maxSamplesPerBucket) {\n\t\t\tbucket.durationSamples.push(entry.duration);\n\t\t} else {\n\t\t\t// Reservoir sampling: replace random element\n\t\t\tconst idx = Math.floor(Math.random() * bucket.count);\n\t\t\tif (idx < this.options.maxSamplesPerBucket) {\n\t\t\t\tbucket.durationSamples[idx] = entry.duration;\n\t\t\t}\n\t\t}\n\n\t\t// Update status distribution\n\t\tconst isError = entry.status >= 400;\n\t\tif (isError) bucket.errorCount++;\n\n\t\tif (entry.status >= 200 && entry.status < 300) {\n\t\t\tbucket.statusDistribution['2xx']++;\n\t\t} else if (entry.status >= 300 && entry.status < 400) {\n\t\t\tbucket.statusDistribution['3xx']++;\n\t\t} else if (entry.status >= 400 && entry.status < 500) {\n\t\t\tbucket.statusDistribution['4xx']++;\n\t\t} else if (entry.status >= 500) {\n\t\t\tbucket.statusDistribution['5xx']++;\n\t\t}\n\t}\n\n\tprivate updateEndpoint(entry: RequestEntry): void {\n\t\tconst key = `${entry.method}:${entry.path}`;\n\t\tlet endpoint = this.endpoints.get(key);\n\n\t\tif (!endpoint) {\n\t\t\tendpoint = {\n\t\t\t\tmethod: entry.method,\n\t\t\t\tpath: entry.path,\n\t\t\t\tcount: 0,\n\t\t\t\tdurationSum: 0,\n\t\t\t\tdurationSamples: [],\n\t\t\t\terrorCount: 0,\n\t\t\t\tlastSeen: 0,\n\t\t\t};\n\t\t\tthis.endpoints.set(key, endpoint);\n\t\t}\n\n\t\tendpoint.count++;\n\t\tendpoint.durationSum += entry.duration;\n\t\tendpoint.lastSeen = entry.timestamp.getTime();\n\n\t\tif (entry.status >= 400) {\n\t\t\tendpoint.errorCount++;\n\t\t}\n\n\t\t// Keep samples for percentiles\n\t\tif (endpoint.durationSamples.length < this.options.maxSamplesPerBucket) {\n\t\t\tendpoint.durationSamples.push(entry.duration);\n\t\t} else {\n\t\t\tconst idx = Math.floor(Math.random() * endpoint.count);\n\t\t\tif (idx < this.options.maxSamplesPerBucket) {\n\t\t\t\tendpoint.durationSamples[idx] = entry.duration;\n\t\t\t}\n\t\t}\n\n\t\t// Update endpoint time bucket\n\t\tthis.updateEndpointTimeBucket(key, entry);\n\t}\n\n\tprivate updateEndpointTimeBucket(key: string, entry: RequestEntry): void {\n\t\tconst timestamp = entry.timestamp.getTime();\n\t\tconst bucketTs = this.getBucketTimestamp(timestamp);\n\n\t\tlet endpointBuckets = this.endpointTimeBuckets.get(key);\n\t\tif (!endpointBuckets) {\n\t\t\tendpointBuckets = new Map();\n\t\t\tthis.endpointTimeBuckets.set(key, endpointBuckets);\n\t\t}\n\n\t\tlet bucket = endpointBuckets.get(bucketTs);\n\t\tif (!bucket) {\n\t\t\tbucket = {\n\t\t\t\ttimestamp: bucketTs,\n\t\t\t\tcount: 0,\n\t\t\t\tdurationSum: 0,\n\t\t\t\terrorCount: 0,\n\t\t\t\tstatusDistribution: { '2xx': 0, '3xx': 0, '4xx': 0, '5xx': 0 },\n\t\t\t};\n\t\t\tendpointBuckets.set(bucketTs, bucket);\n\t\t}\n\n\t\tbucket.count++;\n\t\tbucket.durationSum += entry.duration;\n\n\t\tif (entry.status >= 400) {\n\t\t\tbucket.errorCount++;\n\t\t}\n\n\t\tif (entry.status >= 200 && entry.status < 300) {\n\t\t\tbucket.statusDistribution['2xx']++;\n\t\t} else if (entry.status >= 300 && entry.status < 400) {\n\t\t\tbucket.statusDistribution['3xx']++;\n\t\t} else if (entry.status >= 400 && entry.status < 500) {\n\t\t\tbucket.statusDistribution['4xx']++;\n\t\t} else if (entry.status >= 500) {\n\t\t\tbucket.statusDistribution['5xx']++;\n\t\t}\n\n\t\t// Prune old endpoint buckets (keep max buckets per endpoint)\n\t\tif (endpointBuckets.size > this.options.maxBuckets) {\n\t\t\tconst timestamps = Array.from(endpointBuckets.keys()).sort(\n\t\t\t\t(a, b) => a - b,\n\t\t\t);\n\t\t\tconst toRemove = timestamps.slice(\n\t\t\t\t0,\n\t\t\t\ttimestamps.length - this.options.maxBuckets,\n\t\t\t);\n\t\t\tfor (const ts of toRemove) {\n\t\t\t\tendpointBuckets.delete(ts);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate createEmptyBucket(timestamp: number): MetricsBucket {\n\t\treturn {\n\t\t\ttimestamp,\n\t\t\tbucketSize: this.options.bucketSize,\n\t\t\tcount: 0,\n\t\t\tdurationSum: 0,\n\t\t\tdurationMin: Infinity,\n\t\t\tdurationMax: 0,\n\t\t\tdurationSamples: [],\n\t\t\terrorCount: 0,\n\t\t\tstatusDistribution: {\n\t\t\t\t'2xx': 0,\n\t\t\t\t'3xx': 0,\n\t\t\t\t'4xx': 0,\n\t\t\t\t'5xx': 0,\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate pruneBuckets(): void {\n\t\tif (this.buckets.size <= this.options.maxBuckets) return;\n\n\t\t// Get sorted timestamps\n\t\tconst timestamps = Array.from(this.buckets.keys()).sort((a, b) => a - b);\n\n\t\t// Remove oldest buckets\n\t\tconst toRemove = timestamps.slice(\n\t\t\t0,\n\t\t\ttimestamps.length - this.options.maxBuckets,\n\t\t);\n\t\tfor (const ts of toRemove) {\n\t\t\tthis.buckets.delete(ts);\n\t\t}\n\t}\n\n\tprivate getDefaultRange(): TimeRange {\n\t\tconst now = new Date();\n\t\tconst oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000);\n\t\treturn { start: oneHourAgo, end: now };\n\t}\n\n\tprivate getBucketsInRange(range: TimeRange): MetricsBucket[] {\n\t\tconst startTs = range.start.getTime();\n\t\tconst endTs = range.end.getTime();\n\n\t\tconst results: MetricsBucket[] = [];\n\t\tfor (const [ts, bucket] of this.buckets) {\n\t\t\tif (ts >= startTs && ts <= endTs) {\n\t\t\t\tresults.push(bucket);\n\t\t\t}\n\t\t}\n\n\t\treturn results.sort((a, b) => a.timestamp - b.timestamp);\n\t}\n\n\tprivate buildTimeSeries(\n\t\tbuckets: MetricsBucket[],\n\t\t_range: TimeRange,\n\t\ttargetBucketSize: number,\n\t): TimeSeriesPoint[] {\n\t\tif (buckets.length === 0) return [];\n\n\t\t// If target bucket size matches, just convert\n\t\tif (targetBucketSize === this.options.bucketSize) {\n\t\t\treturn buckets.map((b) => ({\n\t\t\t\ttimestamp: b.timestamp,\n\t\t\t\tcount: b.count,\n\t\t\t\tavgDuration: b.count > 0 ? b.durationSum / b.count : 0,\n\t\t\t\terrorCount: b.errorCount,\n\t\t\t}));\n\t\t}\n\n\t\t// Re-bucket into target size\n\t\tconst points: Map<number, TimeSeriesPoint> = new Map();\n\n\t\tfor (const bucket of buckets) {\n\t\t\tconst targetTs =\n\t\t\t\tMath.floor(bucket.timestamp / targetBucketSize) * targetBucketSize;\n\t\t\tlet point = points.get(targetTs);\n\n\t\t\tif (!point) {\n\t\t\t\tpoint = {\n\t\t\t\t\ttimestamp: targetTs,\n\t\t\t\t\tcount: 0,\n\t\t\t\t\tavgDuration: 0,\n\t\t\t\t\terrorCount: 0,\n\t\t\t\t};\n\t\t\t\tpoints.set(targetTs, point);\n\t\t\t}\n\n\t\t\t// Weighted average for duration\n\t\t\tconst totalCount = point.count + bucket.count;\n\t\t\tif (totalCount > 0) {\n\t\t\t\tpoint.avgDuration =\n\t\t\t\t\t(point.avgDuration * point.count +\n\t\t\t\t\t\t(bucket.count > 0 ? bucket.durationSum / bucket.count : 0) *\n\t\t\t\t\t\t\tbucket.count) /\n\t\t\t\t\ttotalCount;\n\t\t\t}\n\t\t\tpoint.count = totalCount;\n\t\t\tpoint.errorCount += bucket.errorCount;\n\t\t}\n\n\t\treturn Array.from(points.values()).sort(\n\t\t\t(a, b) => a.timestamp - b.timestamp,\n\t\t);\n\t}\n\n\tprivate percentile(sortedValues: number[], p: number): number {\n\t\tif (sortedValues.length === 0) return 0;\n\t\tif (sortedValues.length === 1) return sortedValues[0]!;\n\n\t\tconst index = (p / 100) * (sortedValues.length - 1);\n\t\tconst lower = Math.floor(index);\n\t\tconst upper = Math.ceil(index);\n\n\t\tif (lower === upper) return sortedValues[lower]!;\n\n\t\t// Linear interpolation\n\t\tconst weight = index - lower;\n\t\tconst lowerVal = sortedValues[lower]!;\n\t\tconst upperVal = sortedValues[upper]!;\n\t\treturn lowerVal * (1 - weight) + upperVal * weight;\n\t}\n\n\tprivate emptyMetrics(): RequestMetrics {\n\t\treturn {\n\t\t\ttotalRequests: 0,\n\t\t\tavgDuration: 0,\n\t\t\tp50Duration: 0,\n\t\t\tp95Duration: 0,\n\t\t\tp99Duration: 0,\n\t\t\terrorRate: 0,\n\t\t\tsuccessRate: 100,\n\t\t\trequestsPerSecond: 0,\n\t\t\ttimeSeries: [],\n\t\t};\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { MetricBucket, MetricPoint, MetricQuery, MetricResult, MetricsStorageConfig, PartitionInfo, RollupOptions } from "./types-BS3Rx8Sk.cjs";
2
+
3
+ //#region src/metrics/storage/MetricsStorage.d.ts
4
+
5
+ /**
6
+ * Interface for metrics storage backends.
7
+ *
8
+ * Implementations can use different storage technologies:
9
+ * - In-memory (development/testing)
10
+ * - PostgreSQL with TimescaleDB
11
+ * - ClickHouse
12
+ * - InfluxDB
13
+ */
14
+ interface MetricsStorage {
15
+ /**
16
+ * Write raw metric points to storage.
17
+ * Points are typically buffered and flushed in batches.
18
+ */
19
+ write(points: MetricPoint[]): Promise<void>;
20
+ /**
21
+ * Query metrics with aggregation.
22
+ * Returns time series data with statistics.
23
+ */
24
+ query(query: MetricQuery): Promise<MetricResult[]>;
25
+ /**
26
+ * Get a single aggregated bucket for a specific time range.
27
+ * Useful for dashboards showing current values.
28
+ */
29
+ getBucket(projectId: string, name: string, bucket: Date): Promise<MetricBucket | null>;
30
+ /**
31
+ * Roll up data from one tier to another.
32
+ * Aggregates fine-grained data into coarser buckets.
33
+ */
34
+ rollup(options: RollupOptions): Promise<number>;
35
+ /**
36
+ * Prune old data based on retention policies.
37
+ * Returns the number of records deleted.
38
+ */
39
+ prune(): Promise<number>;
40
+ /**
41
+ * List partitions for management and monitoring.
42
+ */
43
+ listPartitions(tier?: string): Promise<PartitionInfo[]>;
44
+ /**
45
+ * Get storage configuration.
46
+ */
47
+ getConfig(): MetricsStorageConfig;
48
+ /**
49
+ * Flush any buffered data to storage.
50
+ */
51
+ flush(): Promise<void>;
52
+ /**
53
+ * Close the storage connection and clean up resources.
54
+ */
55
+ close(): Promise<void>;
56
+ }
57
+ //# sourceMappingURL=MetricsStorage.d.ts.map
58
+ //#endregion
59
+ export { MetricsStorage };
60
+ //# sourceMappingURL=MetricsStorage-B86e4131.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricsStorage-B86e4131.d.cts","names":[],"sources":["../src/metrics/storage/MetricsStorage.ts"],"sourcesContent":[],"mappings":";;;;;;AAmBA;;;;;;;AAoBU,UApBO,cAAA,CAoBP;EAAI;;;;EAO0B,KAM9B,CAAA,MAAA,EA5BK,WA4BL,EAAA,CAAA,EA5BqB,OA4BrB,CAAA,IAAA,CAAA;EAAO;;;;EAeA,KAKP,CAAA,KAAA,EA1CI,WA0CJ,CAAA,EA1CkB,OA0ClB,CA1C0B,YA0C1B,EAAA,CAAA;EAAO;;;;qDAjCP,OACN,QAAQ;;;;;kBAMK,gBAAgB;;;;;WAMvB;;;;iCAKsB,QAAQ;;;;eAK1B;;;;WAKJ;;;;WAKA"}
@@ -0,0 +1,60 @@
1
+ import { MetricBucket, MetricPoint, MetricQuery, MetricResult, MetricsStorageConfig, PartitionInfo, RollupOptions } from "./types-CbNGXnJE.mjs";
2
+
3
+ //#region src/metrics/storage/MetricsStorage.d.ts
4
+
5
+ /**
6
+ * Interface for metrics storage backends.
7
+ *
8
+ * Implementations can use different storage technologies:
9
+ * - In-memory (development/testing)
10
+ * - PostgreSQL with TimescaleDB
11
+ * - ClickHouse
12
+ * - InfluxDB
13
+ */
14
+ interface MetricsStorage {
15
+ /**
16
+ * Write raw metric points to storage.
17
+ * Points are typically buffered and flushed in batches.
18
+ */
19
+ write(points: MetricPoint[]): Promise<void>;
20
+ /**
21
+ * Query metrics with aggregation.
22
+ * Returns time series data with statistics.
23
+ */
24
+ query(query: MetricQuery): Promise<MetricResult[]>;
25
+ /**
26
+ * Get a single aggregated bucket for a specific time range.
27
+ * Useful for dashboards showing current values.
28
+ */
29
+ getBucket(projectId: string, name: string, bucket: Date): Promise<MetricBucket | null>;
30
+ /**
31
+ * Roll up data from one tier to another.
32
+ * Aggregates fine-grained data into coarser buckets.
33
+ */
34
+ rollup(options: RollupOptions): Promise<number>;
35
+ /**
36
+ * Prune old data based on retention policies.
37
+ * Returns the number of records deleted.
38
+ */
39
+ prune(): Promise<number>;
40
+ /**
41
+ * List partitions for management and monitoring.
42
+ */
43
+ listPartitions(tier?: string): Promise<PartitionInfo[]>;
44
+ /**
45
+ * Get storage configuration.
46
+ */
47
+ getConfig(): MetricsStorageConfig;
48
+ /**
49
+ * Flush any buffered data to storage.
50
+ */
51
+ flush(): Promise<void>;
52
+ /**
53
+ * Close the storage connection and clean up resources.
54
+ */
55
+ close(): Promise<void>;
56
+ }
57
+ //# sourceMappingURL=MetricsStorage.d.ts.map
58
+ //#endregion
59
+ export { MetricsStorage };
60
+ //# sourceMappingURL=MetricsStorage-BWyP2_12.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricsStorage-BWyP2_12.d.mts","names":[],"sources":["../src/metrics/storage/MetricsStorage.ts"],"sourcesContent":[],"mappings":";;;;;;AAmBA;;;;;;;AAoBU,UApBO,cAAA,CAoBP;EAAI;;;;EAO0B,KAM9B,CAAA,MAAA,EA5BK,WA4BL,EAAA,CAAA,EA5BqB,OA4BrB,CAAA,IAAA,CAAA;EAAO;;;;EAeA,KAKP,CAAA,KAAA,EA1CI,WA0CJ,CAAA,EA1CkB,OA0ClB,CA1C0B,YA0C1B,EAAA,CAAA;EAAO;;;;qDAjCP,OACN,QAAQ;;;;;kBAMK,gBAAgB;;;;;WAMvB;;;;iCAKsB,QAAQ;;;;eAK1B;;;;WAKJ;;;;WAKA"}
File without changes
File without changes