@geekmidas/telescope 10.0.0-alpha.2 → 10.0.0-alpha.21

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 (391) hide show
  1. package/dist/{MetricsAggregator-4SqelGcG.d.cts → MetricsAggregator-BxBLQUPj.d.cts} +3 -6
  2. package/dist/MetricsAggregator-BxBLQUPj.d.cts.map +1 -0
  3. package/dist/{MetricsAggregator-DZrW8ls6.d.mts → MetricsAggregator-j9wmZ0K_.d.mts} +3 -6
  4. package/dist/MetricsAggregator-j9wmZ0K_.d.mts.map +1 -0
  5. package/dist/{Telescope-D4nmwDRA.d.cts → Telescope-BcrWTaar.d.mts} +4 -7
  6. package/dist/Telescope-BcrWTaar.d.mts.map +1 -0
  7. package/dist/{Telescope-Dl6VSfxd.d.mts → Telescope-DnCMZT7V.d.cts} +4 -7
  8. package/dist/Telescope-DnCMZT7V.d.cts.map +1 -0
  9. package/dist/Telescope.cjs +385 -4
  10. package/dist/Telescope.cjs.map +1 -0
  11. package/dist/Telescope.d.cts +1 -3
  12. package/dist/Telescope.d.mts +1 -3
  13. package/dist/Telescope.mjs +384 -4
  14. package/dist/Telescope.mjs.map +1 -0
  15. package/dist/adapters/index.d.cts +2 -2
  16. package/dist/adapters/index.d.mts +2 -2
  17. package/dist/adapters/index.mjs +1 -0
  18. package/dist/adapters/lambda.cjs +9 -10
  19. package/dist/adapters/lambda.cjs.map +1 -1
  20. package/dist/adapters/lambda.d.cts +9 -13
  21. package/dist/adapters/lambda.d.cts.map +1 -1
  22. package/dist/adapters/lambda.d.mts +9 -13
  23. package/dist/adapters/lambda.d.mts.map +1 -1
  24. package/dist/adapters/lambda.mjs +3 -4
  25. package/dist/adapters/lambda.mjs.map +1 -1
  26. package/dist/adapters/middy.cjs +236 -4
  27. package/dist/adapters/middy.cjs.map +1 -0
  28. package/dist/adapters/middy.d.cts +60 -5
  29. package/dist/adapters/middy.d.cts.map +1 -0
  30. package/dist/adapters/middy.d.mts +60 -5
  31. package/dist/adapters/middy.d.mts.map +1 -0
  32. package/dist/adapters/middy.mjs +234 -3
  33. package/dist/adapters/middy.mjs.map +1 -0
  34. package/dist/adapters/types.d.cts +162 -2
  35. package/dist/adapters/types.d.cts.map +1 -0
  36. package/dist/adapters/types.d.mts +162 -2
  37. package/dist/adapters/types.d.mts.map +1 -0
  38. package/dist/adapters/types.mjs +1 -0
  39. package/dist/core.cjs +22 -22
  40. package/dist/core.d.cts +4 -4
  41. package/dist/core.d.mts +4 -4
  42. package/dist/core.mjs +3 -4
  43. package/dist/index.cjs +8 -9
  44. package/dist/index.d.cts +5 -6
  45. package/dist/index.d.mts +5 -6
  46. package/dist/index.mjs +5 -7
  47. package/dist/instrumentation/core.cjs +147 -11
  48. package/dist/instrumentation/core.cjs.map +1 -0
  49. package/dist/instrumentation/core.d.cts +74 -3
  50. package/dist/instrumentation/core.d.cts.map +1 -0
  51. package/dist/instrumentation/core.d.mts +74 -3
  52. package/dist/instrumentation/core.d.mts.map +1 -0
  53. package/dist/instrumentation/core.mjs +137 -2
  54. package/dist/instrumentation/core.mjs.map +1 -0
  55. package/dist/instrumentation/hono.cjs +134 -6
  56. package/dist/instrumentation/hono.cjs.map +1 -0
  57. package/dist/instrumentation/hono.d.cts +67 -2
  58. package/dist/instrumentation/hono.d.cts.map +1 -0
  59. package/dist/instrumentation/hono.d.mts +67 -2
  60. package/dist/instrumentation/hono.d.mts.map +1 -0
  61. package/dist/instrumentation/hono.mjs +130 -3
  62. package/dist/instrumentation/hono.mjs.map +1 -0
  63. package/dist/instrumentation/http.cjs +164 -11
  64. package/dist/instrumentation/http.cjs.map +1 -0
  65. package/dist/instrumentation/http.d.cts +103 -2
  66. package/dist/instrumentation/http.d.cts.map +1 -0
  67. package/dist/instrumentation/http.d.mts +103 -2
  68. package/dist/instrumentation/http.d.mts.map +1 -0
  69. package/dist/instrumentation/http.mjs +154 -2
  70. package/dist/instrumentation/http.mjs.map +1 -0
  71. package/dist/instrumentation/index.cjs +47 -47
  72. package/dist/instrumentation/index.d.cts +9 -9
  73. package/dist/instrumentation/index.d.mts +9 -9
  74. package/dist/instrumentation/index.mjs +8 -9
  75. package/dist/instrumentation/middleware.cjs +162 -6
  76. package/dist/instrumentation/middleware.cjs.map +1 -0
  77. package/dist/instrumentation/middleware.d.cts +70 -2
  78. package/dist/instrumentation/middleware.d.cts.map +1 -0
  79. package/dist/instrumentation/middleware.d.mts +70 -2
  80. package/dist/instrumentation/middleware.d.mts.map +1 -0
  81. package/dist/instrumentation/middleware.mjs +158 -3
  82. package/dist/instrumentation/middleware.mjs.map +1 -0
  83. package/dist/instrumentation/otel.cjs +137 -3
  84. package/dist/instrumentation/otel.cjs.map +1 -0
  85. package/dist/instrumentation/otel.d.cts +97 -2
  86. package/dist/instrumentation/otel.d.cts.map +1 -0
  87. package/dist/instrumentation/otel.d.mts +97 -2
  88. package/dist/instrumentation/otel.d.mts.map +1 -0
  89. package/dist/instrumentation/otel.mjs +136 -3
  90. package/dist/instrumentation/otel.mjs.map +1 -0
  91. package/dist/instrumentation/setup.cjs +100 -4
  92. package/dist/instrumentation/setup.cjs.map +1 -0
  93. package/dist/instrumentation/setup.d.cts +83 -3
  94. package/dist/instrumentation/setup.d.cts.map +1 -0
  95. package/dist/instrumentation/setup.d.mts +83 -3
  96. package/dist/instrumentation/setup.d.mts.map +1 -0
  97. package/dist/instrumentation/setup.mjs +98 -3
  98. package/dist/instrumentation/setup.mjs.map +1 -0
  99. package/dist/instrumentation/tracing.cjs +114 -10
  100. package/dist/instrumentation/tracing.cjs.map +1 -0
  101. package/dist/instrumentation/tracing.d.cts +49 -2
  102. package/dist/instrumentation/tracing.d.cts.map +1 -0
  103. package/dist/instrumentation/tracing.d.mts +49 -2
  104. package/dist/instrumentation/tracing.d.mts.map +1 -0
  105. package/dist/instrumentation/tracing.mjs +105 -2
  106. package/dist/instrumentation/tracing.mjs.map +1 -0
  107. package/dist/logger/console.cjs +18 -12
  108. package/dist/logger/console.cjs.map +1 -1
  109. package/dist/logger/console.d.cts +7 -10
  110. package/dist/logger/console.d.cts.map +1 -1
  111. package/dist/logger/console.d.mts +7 -10
  112. package/dist/logger/console.d.mts.map +1 -1
  113. package/dist/logger/console.mjs +17 -11
  114. package/dist/logger/console.mjs.map +1 -1
  115. package/dist/logger/pino.cjs +6 -5
  116. package/dist/logger/pino.cjs.map +1 -1
  117. package/dist/logger/pino.d.cts +6 -10
  118. package/dist/logger/pino.d.cts.map +1 -1
  119. package/dist/logger/pino.d.mts +6 -10
  120. package/dist/logger/pino.d.mts.map +1 -1
  121. package/dist/logger/pino.mjs +2 -3
  122. package/dist/logger/pino.mjs.map +1 -1
  123. package/dist/metrics/MetricsAggregator.cjs +354 -2
  124. package/dist/metrics/MetricsAggregator.cjs.map +1 -0
  125. package/dist/metrics/MetricsAggregator.d.cts +1 -2
  126. package/dist/metrics/MetricsAggregator.d.mts +1 -2
  127. package/dist/metrics/MetricsAggregator.mjs +353 -2
  128. package/dist/metrics/MetricsAggregator.mjs.map +1 -0
  129. package/dist/metrics/index.cjs +3 -4
  130. package/dist/metrics/index.d.cts +2 -4
  131. package/dist/metrics/index.d.mts +2 -4
  132. package/dist/metrics/index.mjs +2 -4
  133. package/dist/metrics/storage/InMemoryMetricsStorage.cjs +240 -3
  134. package/dist/metrics/storage/InMemoryMetricsStorage.cjs.map +1 -0
  135. package/dist/metrics/storage/InMemoryMetricsStorage.d.cts +43 -4
  136. package/dist/metrics/storage/InMemoryMetricsStorage.d.cts.map +1 -0
  137. package/dist/metrics/storage/InMemoryMetricsStorage.d.mts +43 -4
  138. package/dist/metrics/storage/InMemoryMetricsStorage.d.mts.map +1 -0
  139. package/dist/metrics/storage/InMemoryMetricsStorage.mjs +239 -3
  140. package/dist/metrics/storage/InMemoryMetricsStorage.mjs.map +1 -0
  141. package/dist/metrics/storage/MetricsStorage.cjs +0 -1
  142. package/dist/metrics/storage/MetricsStorage.d.cts +56 -3
  143. package/dist/metrics/storage/MetricsStorage.d.cts.map +1 -0
  144. package/dist/metrics/storage/MetricsStorage.d.mts +56 -3
  145. package/dist/metrics/storage/MetricsStorage.d.mts.map +1 -0
  146. package/dist/metrics/storage/MetricsStorage.mjs +1 -1
  147. package/dist/metrics/storage/index.cjs +6 -6
  148. package/dist/metrics/storage/index.d.cts +3 -3
  149. package/dist/metrics/storage/index.d.mts +3 -3
  150. package/dist/metrics/storage/index.mjs +4 -5
  151. package/dist/metrics/storage/types.cjs +34 -2
  152. package/dist/metrics/storage/types.cjs.map +1 -0
  153. package/dist/metrics/storage/types.d.cts +207 -2
  154. package/dist/metrics/storage/types.d.cts.map +1 -0
  155. package/dist/metrics/storage/types.d.mts +207 -2
  156. package/dist/metrics/storage/types.d.mts.map +1 -0
  157. package/dist/metrics/storage/types.mjs +33 -2
  158. package/dist/metrics/storage/types.mjs.map +1 -0
  159. package/dist/otlp/hono.cjs +9 -15
  160. package/dist/otlp/hono.cjs.map +1 -1
  161. package/dist/otlp/hono.d.cts +3 -13
  162. package/dist/otlp/hono.d.cts.map +1 -1
  163. package/dist/otlp/hono.d.mts +3 -13
  164. package/dist/otlp/hono.d.mts.map +1 -1
  165. package/dist/otlp/hono.mjs +5 -11
  166. package/dist/otlp/hono.mjs.map +1 -1
  167. package/dist/otlp/index.cjs +11 -11
  168. package/dist/otlp/index.d.cts +4 -7
  169. package/dist/otlp/index.d.mts +4 -7
  170. package/dist/otlp/index.mjs +4 -5
  171. package/dist/otlp/receiver.cjs +88 -4
  172. package/dist/otlp/receiver.cjs.map +1 -0
  173. package/dist/otlp/receiver.d.cts +59 -7
  174. package/dist/otlp/receiver.d.cts.map +1 -0
  175. package/dist/otlp/receiver.d.mts +59 -7
  176. package/dist/otlp/receiver.d.mts.map +1 -0
  177. package/dist/otlp/receiver.mjs +87 -4
  178. package/dist/otlp/receiver.mjs.map +1 -0
  179. package/dist/otlp/transformer.cjs +214 -5
  180. package/dist/otlp/transformer.cjs.map +1 -0
  181. package/dist/otlp/transformer.d.cts +1 -3
  182. package/dist/otlp/transformer.d.mts +1 -3
  183. package/dist/otlp/transformer.mjs +211 -3
  184. package/dist/otlp/transformer.mjs.map +1 -0
  185. package/dist/otlp/types.cjs +57 -5
  186. package/dist/otlp/types.cjs.map +1 -0
  187. package/dist/otlp/types.d.cts +1 -1
  188. package/dist/otlp/types.d.mts +1 -1
  189. package/dist/otlp/types.mjs +53 -2
  190. package/dist/otlp/types.mjs.map +1 -0
  191. package/dist/redact.cjs +84 -3
  192. package/dist/redact.cjs.map +1 -0
  193. package/dist/redact.d.cts +4 -8
  194. package/dist/redact.d.cts.map +1 -1
  195. package/dist/redact.d.mts +4 -8
  196. package/dist/redact.d.mts.map +1 -1
  197. package/dist/redact.mjs +80 -2
  198. package/dist/redact.mjs.map +1 -0
  199. package/dist/{chunk-CUT6urMc.cjs → rolldown-runtime-VH7oDXx4.cjs} +8 -10
  200. package/dist/server/hono.cjs +24 -33
  201. package/dist/server/hono.cjs.map +1 -1
  202. package/dist/server/hono.d.cts +10 -13
  203. package/dist/server/hono.d.cts.map +1 -1
  204. package/dist/server/hono.d.mts +10 -13
  205. package/dist/server/hono.d.mts.map +1 -1
  206. package/dist/server/hono.mjs +22 -31
  207. package/dist/server/hono.mjs.map +1 -1
  208. package/dist/storage/kysely.cjs +34 -32
  209. package/dist/storage/kysely.cjs.map +1 -1
  210. package/dist/storage/kysely.d.cts +8 -12
  211. package/dist/storage/kysely.d.cts.map +1 -1
  212. package/dist/storage/kysely.d.mts +8 -12
  213. package/dist/storage/kysely.d.mts.map +1 -1
  214. package/dist/storage/kysely.mjs +33 -31
  215. package/dist/storage/kysely.mjs.map +1 -1
  216. package/dist/storage/memory.cjs +122 -2
  217. package/dist/storage/memory.cjs.map +1 -0
  218. package/dist/storage/memory.d.cts +36 -3
  219. package/dist/storage/memory.d.cts.map +1 -0
  220. package/dist/storage/memory.d.mts +36 -3
  221. package/dist/storage/memory.d.mts.map +1 -0
  222. package/dist/storage/memory.mjs +121 -2
  223. package/dist/storage/memory.mjs.map +1 -0
  224. package/dist/{transformer-CTGsaVfV.d.mts → transformer-BBBXCjHP.d.mts} +4 -8
  225. package/dist/transformer-BBBXCjHP.d.mts.map +1 -0
  226. package/dist/{transformer-ICEbxpFf.d.cts → transformer-DlESim6Q.d.cts} +4 -8
  227. package/dist/transformer-DlESim6Q.d.cts.map +1 -0
  228. package/dist/{types-CmOB7CLO.d.cts → types-DVETVdpa.d.cts} +6 -7
  229. package/dist/types-DVETVdpa.d.cts.map +1 -0
  230. package/dist/{types-DBc0q5KD.d.mts → types-DVETVdpa.d.mts} +6 -7
  231. package/dist/types-DVETVdpa.d.mts.map +1 -0
  232. package/dist/{types-B1EIa_cQ.d.mts → types-a9Vistj1.d.cts} +2 -3
  233. package/dist/types-a9Vistj1.d.cts.map +1 -0
  234. package/dist/{types-l7Rlb5Mg.d.cts → types-a9Vistj1.d.mts} +2 -3
  235. package/dist/types-a9Vistj1.d.mts.map +1 -0
  236. package/dist/types.d.cts +1 -1
  237. package/dist/types.d.mts +1 -1
  238. package/dist/types.mjs +1 -0
  239. package/dist/ui-assets.cjs +31 -4
  240. package/dist/ui-assets.cjs.map +1 -0
  241. package/dist/ui-assets.d.cts +4 -6
  242. package/dist/ui-assets.d.cts.map +1 -1
  243. package/dist/ui-assets.d.mts +4 -6
  244. package/dist/ui-assets.d.mts.map +1 -1
  245. package/dist/ui-assets.mjs +28 -2
  246. package/dist/ui-assets.mjs.map +1 -0
  247. package/package.json +39 -37
  248. package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts +0 -47
  249. package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts.map +0 -1
  250. package/dist/InMemoryMetricsStorage-C4drxT7G.mjs +0 -247
  251. package/dist/InMemoryMetricsStorage-C4drxT7G.mjs.map +0 -1
  252. package/dist/InMemoryMetricsStorage-D0njWUSi.cjs +0 -252
  253. package/dist/InMemoryMetricsStorage-D0njWUSi.cjs.map +0 -1
  254. package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts +0 -47
  255. package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts.map +0 -1
  256. package/dist/MetricsAggregator-4SqelGcG.d.cts.map +0 -1
  257. package/dist/MetricsAggregator-B7lUICdH.cjs +0 -363
  258. package/dist/MetricsAggregator-B7lUICdH.cjs.map +0 -1
  259. package/dist/MetricsAggregator-DZrW8ls6.d.mts.map +0 -1
  260. package/dist/MetricsAggregator-S3DQWNas.mjs +0 -357
  261. package/dist/MetricsAggregator-S3DQWNas.mjs.map +0 -1
  262. package/dist/MetricsStorage-B86e4131.d.cts +0 -60
  263. package/dist/MetricsStorage-B86e4131.d.cts.map +0 -1
  264. package/dist/MetricsStorage-BWyP2_12.d.mts +0 -60
  265. package/dist/MetricsStorage-BWyP2_12.d.mts.map +0 -1
  266. package/dist/MetricsStorage-BypQXWiv.mjs +0 -0
  267. package/dist/MetricsStorage-Or8pVCe4.cjs +0 -0
  268. package/dist/Telescope-Cs3fv8jt.cjs +0 -395
  269. package/dist/Telescope-Cs3fv8jt.cjs.map +0 -1
  270. package/dist/Telescope-D4nmwDRA.d.cts.map +0 -1
  271. package/dist/Telescope-Dh5av3FC.mjs +0 -389
  272. package/dist/Telescope-Dh5av3FC.mjs.map +0 -1
  273. package/dist/Telescope-Dl6VSfxd.d.mts.map +0 -1
  274. package/dist/core--quSp5Qr.d.mts +0 -78
  275. package/dist/core--quSp5Qr.d.mts.map +0 -1
  276. package/dist/core-B4Jpia5H.d.cts +0 -78
  277. package/dist/core-B4Jpia5H.d.cts.map +0 -1
  278. package/dist/core-CtVHRJGv.cjs +0 -199
  279. package/dist/core-CtVHRJGv.cjs.map +0 -1
  280. package/dist/core-D6hJ6exL.mjs +0 -139
  281. package/dist/core-D6hJ6exL.mjs.map +0 -1
  282. package/dist/hono--uKQ7Jgi.d.mts +0 -71
  283. package/dist/hono--uKQ7Jgi.d.mts.map +0 -1
  284. package/dist/hono-Bw-ey6CT.mjs +0 -136
  285. package/dist/hono-Bw-ey6CT.mjs.map +0 -1
  286. package/dist/hono-CPHX7FAm.cjs +0 -160
  287. package/dist/hono-CPHX7FAm.cjs.map +0 -1
  288. package/dist/hono-CemCKU87.d.cts +0 -71
  289. package/dist/hono-CemCKU87.d.cts.map +0 -1
  290. package/dist/http-BIvr0YdI.mjs +0 -159
  291. package/dist/http-BIvr0YdI.mjs.map +0 -1
  292. package/dist/http-BiNtg85L.d.mts +0 -107
  293. package/dist/http-BiNtg85L.d.mts.map +0 -1
  294. package/dist/http-BsqmhurZ.cjs +0 -219
  295. package/dist/http-BsqmhurZ.cjs.map +0 -1
  296. package/dist/http-D1oTbfap.d.cts +0 -107
  297. package/dist/http-D1oTbfap.d.cts.map +0 -1
  298. package/dist/index-BL32-cvv.d.cts +0 -1
  299. package/dist/index-CsuikFeJ.d.mts +0 -1
  300. package/dist/memory--BK4iWiv.d.cts +0 -40
  301. package/dist/memory--BK4iWiv.d.cts.map +0 -1
  302. package/dist/memory-6S9H-IF5.mjs +0 -123
  303. package/dist/memory-6S9H-IF5.mjs.map +0 -1
  304. package/dist/memory-B0d_n1g5.cjs +0 -129
  305. package/dist/memory-B0d_n1g5.cjs.map +0 -1
  306. package/dist/memory-DCirEVFW.d.mts +0 -40
  307. package/dist/memory-DCirEVFW.d.mts.map +0 -1
  308. package/dist/metrics-D5YT-Rnq.mjs +0 -0
  309. package/dist/metrics-fhD3l3C3.cjs +0 -0
  310. package/dist/middleware-Bcq6XXGG.cjs +0 -184
  311. package/dist/middleware-Bcq6XXGG.cjs.map +0 -1
  312. package/dist/middleware-D1XEHvyy.mjs +0 -160
  313. package/dist/middleware-D1XEHvyy.mjs.map +0 -1
  314. package/dist/middleware-PeyS-9Ny.d.cts +0 -74
  315. package/dist/middleware-PeyS-9Ny.d.cts.map +0 -1
  316. package/dist/middleware-oHvo_ZgU.d.mts +0 -74
  317. package/dist/middleware-oHvo_ZgU.d.mts.map +0 -1
  318. package/dist/middy-B6Btl8XE.d.mts +0 -64
  319. package/dist/middy-B6Btl8XE.d.mts.map +0 -1
  320. package/dist/middy-Bq0defVg.d.cts +0 -64
  321. package/dist/middy-Bq0defVg.d.cts.map +0 -1
  322. package/dist/middy-DHWLmUAD.mjs +0 -236
  323. package/dist/middy-DHWLmUAD.mjs.map +0 -1
  324. package/dist/middy-DlWnZilH.cjs +0 -247
  325. package/dist/middy-DlWnZilH.cjs.map +0 -1
  326. package/dist/otel-B9bNoeZ2.mjs +0 -130
  327. package/dist/otel-B9bNoeZ2.mjs.map +0 -1
  328. package/dist/otel-Bk89b1lX.d.cts +0 -101
  329. package/dist/otel-Bk89b1lX.d.cts.map +0 -1
  330. package/dist/otel-BzjOtVxZ.cjs +0 -136
  331. package/dist/otel-BzjOtVxZ.cjs.map +0 -1
  332. package/dist/otel-lPMsM26e.d.mts +0 -101
  333. package/dist/otel-lPMsM26e.d.mts.map +0 -1
  334. package/dist/receiver-D46dfkYI.mjs +0 -89
  335. package/dist/receiver-D46dfkYI.mjs.map +0 -1
  336. package/dist/receiver-DLICx5uU.d.cts +0 -63
  337. package/dist/receiver-DLICx5uU.d.cts.map +0 -1
  338. package/dist/receiver-UeZT-H8u.d.mts +0 -63
  339. package/dist/receiver-UeZT-H8u.d.mts.map +0 -1
  340. package/dist/receiver-slCoAFat.cjs +0 -94
  341. package/dist/receiver-slCoAFat.cjs.map +0 -1
  342. package/dist/redact-BzkITCNW.mjs +0 -83
  343. package/dist/redact-BzkITCNW.mjs.map +0 -1
  344. package/dist/redact-DVaSSPZT.cjs +0 -95
  345. package/dist/redact-DVaSSPZT.cjs.map +0 -1
  346. package/dist/setup-Bkxm4g6b.d.mts +0 -87
  347. package/dist/setup-Bkxm4g6b.d.mts.map +0 -1
  348. package/dist/setup-D58N1f9O.d.cts +0 -87
  349. package/dist/setup-D58N1f9O.d.cts.map +0 -1
  350. package/dist/setup-DC9JMEYZ.mjs +0 -98
  351. package/dist/setup-DC9JMEYZ.mjs.map +0 -1
  352. package/dist/setup-DufxQpi9.cjs +0 -110
  353. package/dist/setup-DufxQpi9.cjs.map +0 -1
  354. package/dist/tracing-BX8uY2nR.d.cts +0 -53
  355. package/dist/tracing-BX8uY2nR.d.cts.map +0 -1
  356. package/dist/tracing-Bt1zWRlb.cjs +0 -167
  357. package/dist/tracing-Bt1zWRlb.cjs.map +0 -1
  358. package/dist/tracing-Cijm_5NI.mjs +0 -113
  359. package/dist/tracing-Cijm_5NI.mjs.map +0 -1
  360. package/dist/tracing-PnECEbEu.d.mts +0 -53
  361. package/dist/tracing-PnECEbEu.d.mts.map +0 -1
  362. package/dist/transformer-CFQ4WFk6.mjs +0 -215
  363. package/dist/transformer-CFQ4WFk6.mjs.map +0 -1
  364. package/dist/transformer-CTGsaVfV.d.mts.map +0 -1
  365. package/dist/transformer-Csl6fbgv.cjs +0 -232
  366. package/dist/transformer-Csl6fbgv.cjs.map +0 -1
  367. package/dist/transformer-ICEbxpFf.d.cts.map +0 -1
  368. package/dist/types-B1EIa_cQ.d.mts.map +0 -1
  369. package/dist/types-BMiHgsi4.cjs +0 -78
  370. package/dist/types-BMiHgsi4.cjs.map +0 -1
  371. package/dist/types-BRzW1NM8.d.cts +0 -166
  372. package/dist/types-BRzW1NM8.d.cts.map +0 -1
  373. package/dist/types-BS3Rx8Sk.d.cts +0 -209
  374. package/dist/types-BS3Rx8Sk.d.cts.map +0 -1
  375. package/dist/types-BzQ78Efw.d.mts +0 -166
  376. package/dist/types-BzQ78Efw.d.mts.map +0 -1
  377. package/dist/types-CbNGXnJE.d.mts +0 -209
  378. package/dist/types-CbNGXnJE.d.mts.map +0 -1
  379. package/dist/types-Cj59nqy7.mjs +0 -54
  380. package/dist/types-Cj59nqy7.mjs.map +0 -1
  381. package/dist/types-CmOB7CLO.d.cts.map +0 -1
  382. package/dist/types-DBc0q5KD.d.mts.map +0 -1
  383. package/dist/types-ZW-nfWf6.cjs +0 -40
  384. package/dist/types-ZW-nfWf6.cjs.map +0 -1
  385. package/dist/types-l7Rlb5Mg.d.cts.map +0 -1
  386. package/dist/types-ojhnLdwz.mjs +0 -34
  387. package/dist/types-ojhnLdwz.mjs.map +0 -1
  388. package/dist/ui-assets-BEXqOQLe.cjs +0 -48
  389. package/dist/ui-assets-BEXqOQLe.cjs.map +0 -1
  390. package/dist/ui-assets-BhTDUsrM.mjs +0 -30
  391. package/dist/ui-assets-BhTDUsrM.mjs.map +0 -1
@@ -1,4 +1,241 @@
1
- require('../../types-ZW-nfWf6.cjs');
2
- const require_InMemoryMetricsStorage = require('../../InMemoryMetricsStorage-D0njWUSi.cjs');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_metrics_storage_types = require("./types.cjs");
3
+ //#region src/metrics/storage/InMemoryMetricsStorage.ts
4
+ /**
5
+ * In-memory metrics storage for development and testing.
6
+ *
7
+ * Features:
8
+ * - Buffered writes with configurable flush interval
9
+ * - Time-bucketed aggregation
10
+ * - Basic percentile calculation (reservoir sampling)
11
+ * - Automatic pruning based on retention
12
+ *
13
+ * Not suitable for production - use a proper time-series database.
14
+ */
15
+ var InMemoryMetricsStorage = class {
16
+ config;
17
+ buffer = [];
18
+ buckets = /* @__PURE__ */ new Map();
19
+ samples = /* @__PURE__ */ new Map();
20
+ flushTimer = null;
21
+ constructor(config = {}) {
22
+ this.config = {
23
+ ...require_metrics_storage_types.DEFAULT_METRICS_CONFIG,
24
+ ...config
25
+ };
26
+ if (this.config.flushInterval > 0) this.flushTimer = setInterval(() => {
27
+ this.flush().catch(console.error);
28
+ }, this.config.flushInterval);
29
+ }
30
+ async write(points) {
31
+ this.buffer.push(...points);
32
+ if (this.buffer.length >= this.config.maxBatchSize) await this.flush();
33
+ }
34
+ async flush() {
35
+ if (this.buffer.length === 0) return;
36
+ const points = this.buffer.splice(0);
37
+ for (const point of points) this.aggregatePoint(point);
38
+ if (this.config.autoRollup) await this.prune();
39
+ }
40
+ aggregatePoint(point) {
41
+ const bucketTime = this.getBucketTime(point.timestamp, "1m");
42
+ const key = this.getBucketKey(point, bucketTime);
43
+ const existing = this.buckets.get(key);
44
+ if (existing) {
45
+ existing.count += 1;
46
+ existing.sum += point.value;
47
+ existing.min = Math.min(existing.min, point.value);
48
+ existing.max = Math.max(existing.max, point.value);
49
+ } else this.buckets.set(key, {
50
+ bucket: bucketTime,
51
+ projectId: point.projectId,
52
+ service: point.service,
53
+ environment: point.environment,
54
+ name: point.name,
55
+ labelsHash: this.hashLabels(point.labels),
56
+ labels: { ...point.labels },
57
+ count: 1,
58
+ sum: point.value,
59
+ min: point.value,
60
+ max: point.value
61
+ });
62
+ const sampleKey = `${point.projectId}:${point.name}:${bucketTime.getTime()}`;
63
+ const samples = this.samples.get(sampleKey) ?? [];
64
+ if (samples.length < 1e3) samples.push(point.value);
65
+ else {
66
+ const idx = Math.floor(Math.random() * (samples.length + 1));
67
+ if (idx < samples.length) samples[idx] = point.value;
68
+ }
69
+ this.samples.set(sampleKey, samples);
70
+ }
71
+ async query(query) {
72
+ await this.flush();
73
+ const results = /* @__PURE__ */ new Map();
74
+ const startTime = query.range.start.getTime();
75
+ const endTime = query.range.end.getTime();
76
+ const interval = query.interval ?? "1m";
77
+ const intervalMs = this.getIntervalMs(interval);
78
+ for (const [, bucket] of this.buckets) {
79
+ if (bucket.projectId !== query.projectId) continue;
80
+ if (query.service && bucket.service !== query.service) continue;
81
+ if (query.environment && bucket.environment !== query.environment) continue;
82
+ if (query.name && !this.matchesPattern(bucket.name, query.name)) continue;
83
+ if (query.labels && !this.matchesLabels(bucket.labels, query.labels)) continue;
84
+ const bucketTime = bucket.bucket.getTime();
85
+ if (bucketTime < startTime || bucketTime > endTime) continue;
86
+ const groupKey = query.groupBy ? this.getGroupKey(bucket, query.groupBy) : bucket.name;
87
+ let result = results.get(groupKey);
88
+ if (!result) {
89
+ result = {
90
+ name: bucket.name,
91
+ labels: query.groupBy ? this.filterLabels(bucket.labels, query.groupBy) : bucket.labels,
92
+ timeSeries: [],
93
+ stats: {
94
+ count: 0,
95
+ sum: 0,
96
+ avg: 0,
97
+ min: Infinity,
98
+ max: -Infinity,
99
+ p50: 0,
100
+ p95: 0,
101
+ p99: 0
102
+ }
103
+ };
104
+ results.set(groupKey, result);
105
+ }
106
+ const tsIndex = Math.floor((bucketTime - startTime) / intervalMs);
107
+ while (result.timeSeries.length <= tsIndex) result.timeSeries.push({
108
+ timestamp: new Date(startTime + result.timeSeries.length * intervalMs),
109
+ count: 0,
110
+ sum: 0,
111
+ avg: 0,
112
+ min: Infinity,
113
+ max: -Infinity
114
+ });
115
+ const tsPoint = result.timeSeries[tsIndex];
116
+ if (tsPoint) {
117
+ tsPoint.count += bucket.count;
118
+ tsPoint.sum += bucket.sum;
119
+ tsPoint.min = Math.min(tsPoint.min, bucket.min);
120
+ tsPoint.max = Math.max(tsPoint.max, bucket.max);
121
+ tsPoint.avg = tsPoint.sum / tsPoint.count;
122
+ }
123
+ result.stats.count += bucket.count;
124
+ result.stats.sum += bucket.sum;
125
+ result.stats.min = Math.min(result.stats.min, bucket.min);
126
+ result.stats.max = Math.max(result.stats.max, bucket.max);
127
+ }
128
+ for (const result of results.values()) {
129
+ if (result.stats.count > 0) {
130
+ result.stats.avg = result.stats.sum / result.stats.count;
131
+ const allSamples = [];
132
+ for (const [key, samples] of this.samples) if (key.startsWith(`${query.projectId}:${result.name}:`)) allSamples.push(...samples);
133
+ if (allSamples.length > 0) {
134
+ allSamples.sort((a, b) => a - b);
135
+ result.stats.p50 = this.percentile(allSamples, 50);
136
+ result.stats.p95 = this.percentile(allSamples, 95);
137
+ result.stats.p99 = this.percentile(allSamples, 99);
138
+ }
139
+ }
140
+ if (result.stats.min === Infinity) result.stats.min = 0;
141
+ if (result.stats.max === -Infinity) result.stats.max = 0;
142
+ for (const point of result.timeSeries) {
143
+ if (point.min === Infinity) point.min = 0;
144
+ if (point.max === -Infinity) point.max = 0;
145
+ }
146
+ }
147
+ const resultArray = Array.from(results.values());
148
+ if (query.limit) return resultArray.slice(0, query.limit);
149
+ return resultArray;
150
+ }
151
+ async getBucket(projectId, name, bucket) {
152
+ await this.flush();
153
+ for (const [, b] of this.buckets) if (b.projectId === projectId && b.name === name && b.bucket.getTime() === bucket.getTime()) return b;
154
+ return null;
155
+ }
156
+ async rollup(_options) {
157
+ return 0;
158
+ }
159
+ async prune() {
160
+ const now = Date.now();
161
+ let deleted = 0;
162
+ const retentionMs = Math.min(...this.config.tiers.filter((t) => t.retention > 0).map((t) => t.retention));
163
+ if (retentionMs === Infinity) return 0;
164
+ const cutoff = now - retentionMs;
165
+ for (const [key, bucket] of this.buckets) if (bucket.bucket.getTime() < cutoff) {
166
+ this.buckets.delete(key);
167
+ deleted++;
168
+ }
169
+ for (const [key] of this.samples) if (parseInt(key.split(":").pop() ?? "0", 10) < cutoff) this.samples.delete(key);
170
+ return deleted;
171
+ }
172
+ async listPartitions(_tier) {
173
+ return [];
174
+ }
175
+ getConfig() {
176
+ return this.config;
177
+ }
178
+ async close() {
179
+ if (this.flushTimer) {
180
+ clearInterval(this.flushTimer);
181
+ this.flushTimer = null;
182
+ }
183
+ await this.flush();
184
+ this.buckets.clear();
185
+ this.samples.clear();
186
+ }
187
+ getBucketTime(timestamp, interval) {
188
+ const ms = this.getIntervalMs(interval);
189
+ return new Date(Math.floor(timestamp.getTime() / ms) * ms);
190
+ }
191
+ getBucketKey(point, bucketTime) {
192
+ return [
193
+ point.projectId,
194
+ point.service,
195
+ point.environment,
196
+ point.name,
197
+ this.hashLabels(point.labels),
198
+ bucketTime.getTime()
199
+ ].join(":");
200
+ }
201
+ hashLabels(labels) {
202
+ return Object.keys(labels).sort().map((k) => `${k}=${labels[k]}`).join(",") || "_empty_";
203
+ }
204
+ getIntervalMs(interval) {
205
+ return {
206
+ "1m": 6e4,
207
+ "5m": 3e5,
208
+ "15m": 9e5,
209
+ "1h": 36e5,
210
+ "6h": 216e5,
211
+ "1d": 864e5
212
+ }[interval];
213
+ }
214
+ matchesPattern(name, pattern) {
215
+ if (!pattern.includes("*")) return name === pattern;
216
+ return new RegExp(`^${pattern.replace(/\./g, "\\.").replace(/\*/g, ".*")}$`).test(name);
217
+ }
218
+ matchesLabels(labels, filter) {
219
+ for (const [key, value] of Object.entries(filter)) if (labels[key] !== value) return false;
220
+ return true;
221
+ }
222
+ getGroupKey(bucket, groupBy) {
223
+ const parts = [bucket.name];
224
+ for (const key of groupBy) parts.push(`${key}=${bucket.labels[key] ?? ""}`);
225
+ return parts.join(":");
226
+ }
227
+ filterLabels(labels, keys) {
228
+ const result = {};
229
+ for (const key of keys) if (labels[key] !== void 0) result[key] = labels[key];
230
+ return result;
231
+ }
232
+ percentile(sorted, p) {
233
+ if (sorted.length === 0) return 0;
234
+ const index = Math.ceil(p / 100 * sorted.length) - 1;
235
+ return sorted[Math.max(0, index)] ?? 0;
236
+ }
237
+ };
238
+ //#endregion
239
+ exports.InMemoryMetricsStorage = InMemoryMetricsStorage;
3
240
 
4
- exports.InMemoryMetricsStorage = require_InMemoryMetricsStorage.InMemoryMetricsStorage;
241
+ //# sourceMappingURL=InMemoryMetricsStorage.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryMetricsStorage.cjs","names":["DEFAULT_METRICS_CONFIG"],"sources":["../../../src/metrics/storage/InMemoryMetricsStorage.ts"],"sourcesContent":["import type { MetricsStorage } from './MetricsStorage';\nimport {\n\ttype AggregationInterval,\n\tDEFAULT_METRICS_CONFIG,\n\ttype MetricBucket,\n\ttype MetricLabels,\n\ttype MetricPoint,\n\ttype MetricQuery,\n\ttype MetricResult,\n\ttype MetricsStorageConfig,\n\ttype PartitionInfo,\n\ttype RollupOptions,\n} from './types';\n\n/**\n * In-memory metrics storage for development and testing.\n *\n * Features:\n * - Buffered writes with configurable flush interval\n * - Time-bucketed aggregation\n * - Basic percentile calculation (reservoir sampling)\n * - Automatic pruning based on retention\n *\n * Not suitable for production - use a proper time-series database.\n */\nexport class InMemoryMetricsStorage implements MetricsStorage {\n\tprivate config: MetricsStorageConfig;\n\tprivate buffer: MetricPoint[] = [];\n\tprivate buckets: Map<string, MetricBucket> = new Map();\n\tprivate samples: Map<string, number[]> = new Map(); // For percentile calculations\n\tprivate flushTimer: ReturnType<typeof setInterval> | null = null;\n\n\tconstructor(config: Partial<MetricsStorageConfig> = {}) {\n\t\tthis.config = { ...DEFAULT_METRICS_CONFIG, ...config };\n\n\t\tif (this.config.flushInterval > 0) {\n\t\t\tthis.flushTimer = setInterval(() => {\n\t\t\t\tthis.flush().catch(console.error);\n\t\t\t}, this.config.flushInterval);\n\t\t}\n\t}\n\n\tasync write(points: MetricPoint[]): Promise<void> {\n\t\tthis.buffer.push(...points);\n\n\t\tif (this.buffer.length >= this.config.maxBatchSize) {\n\t\t\tawait this.flush();\n\t\t}\n\t}\n\n\tasync flush(): Promise<void> {\n\t\tif (this.buffer.length === 0) return;\n\n\t\tconst points = this.buffer.splice(0);\n\n\t\tfor (const point of points) {\n\t\t\tthis.aggregatePoint(point);\n\t\t}\n\n\t\t// Prune if auto-rollup is enabled\n\t\tif (this.config.autoRollup) {\n\t\t\tawait this.prune();\n\t\t}\n\t}\n\n\tprivate aggregatePoint(point: MetricPoint): void {\n\t\tconst bucketTime = this.getBucketTime(point.timestamp, '1m');\n\t\tconst key = this.getBucketKey(point, bucketTime);\n\n\t\tconst existing = this.buckets.get(key);\n\n\t\tif (existing) {\n\t\t\texisting.count += 1;\n\t\t\texisting.sum += point.value;\n\t\t\texisting.min = Math.min(existing.min, point.value);\n\t\t\texisting.max = Math.max(existing.max, point.value);\n\t\t} else {\n\t\t\tthis.buckets.set(key, {\n\t\t\t\tbucket: bucketTime,\n\t\t\t\tprojectId: point.projectId,\n\t\t\t\tservice: point.service,\n\t\t\t\tenvironment: point.environment,\n\t\t\t\tname: point.name,\n\t\t\t\tlabelsHash: this.hashLabels(point.labels),\n\t\t\t\tlabels: { ...point.labels },\n\t\t\t\tcount: 1,\n\t\t\t\tsum: point.value,\n\t\t\t\tmin: point.value,\n\t\t\t\tmax: point.value,\n\t\t\t});\n\t\t}\n\n\t\t// Store samples for percentile calculations (reservoir sampling)\n\t\tconst sampleKey = `${point.projectId}:${point.name}:${bucketTime.getTime()}`;\n\t\tconst samples = this.samples.get(sampleKey) ?? [];\n\t\tif (samples.length < 1000) {\n\t\t\tsamples.push(point.value);\n\t\t} else {\n\t\t\t// Reservoir sampling\n\t\t\tconst idx = Math.floor(Math.random() * (samples.length + 1));\n\t\t\tif (idx < samples.length) {\n\t\t\t\tsamples[idx] = point.value;\n\t\t\t}\n\t\t}\n\t\tthis.samples.set(sampleKey, samples);\n\t}\n\n\tasync query(query: MetricQuery): Promise<MetricResult[]> {\n\t\tawait this.flush();\n\n\t\tconst results = new Map<string, MetricResult>();\n\t\tconst startTime = query.range.start.getTime();\n\t\tconst endTime = query.range.end.getTime();\n\t\tconst interval = query.interval ?? '1m';\n\t\tconst intervalMs = this.getIntervalMs(interval);\n\n\t\tfor (const [, bucket] of this.buckets) {\n\t\t\tif (bucket.projectId !== query.projectId) continue;\n\t\t\tif (query.service && bucket.service !== query.service) continue;\n\t\t\tif (query.environment && bucket.environment !== query.environment)\n\t\t\t\tcontinue;\n\t\t\tif (query.name && !this.matchesPattern(bucket.name, query.name)) continue;\n\t\t\tif (query.labels && !this.matchesLabels(bucket.labels, query.labels))\n\t\t\t\tcontinue;\n\n\t\t\tconst bucketTime = bucket.bucket.getTime();\n\t\t\tif (bucketTime < startTime || bucketTime > endTime) continue;\n\n\t\t\t// Group by metric name + labels\n\t\t\tconst groupKey = query.groupBy\n\t\t\t\t? this.getGroupKey(bucket, query.groupBy)\n\t\t\t\t: bucket.name;\n\n\t\t\tlet result = results.get(groupKey);\n\t\t\tif (!result) {\n\t\t\t\tresult = {\n\t\t\t\t\tname: bucket.name,\n\t\t\t\t\tlabels: query.groupBy\n\t\t\t\t\t\t? this.filterLabels(bucket.labels, query.groupBy)\n\t\t\t\t\t\t: bucket.labels,\n\t\t\t\t\ttimeSeries: [],\n\t\t\t\t\tstats: {\n\t\t\t\t\t\tcount: 0,\n\t\t\t\t\t\tsum: 0,\n\t\t\t\t\t\tavg: 0,\n\t\t\t\t\t\tmin: Infinity,\n\t\t\t\t\t\tmax: -Infinity,\n\t\t\t\t\t\tp50: 0,\n\t\t\t\t\t\tp95: 0,\n\t\t\t\t\t\tp99: 0,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tresults.set(groupKey, result);\n\t\t\t}\n\n\t\t\t// Aggregate into time series\n\t\t\tconst tsIndex = Math.floor((bucketTime - startTime) / intervalMs);\n\t\t\twhile (result.timeSeries.length <= tsIndex) {\n\t\t\t\tresult.timeSeries.push({\n\t\t\t\t\ttimestamp: new Date(\n\t\t\t\t\t\tstartTime + result.timeSeries.length * intervalMs,\n\t\t\t\t\t),\n\t\t\t\t\tcount: 0,\n\t\t\t\t\tsum: 0,\n\t\t\t\t\tavg: 0,\n\t\t\t\t\tmin: Infinity,\n\t\t\t\t\tmax: -Infinity,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst tsPoint = result.timeSeries[tsIndex];\n\t\t\tif (tsPoint) {\n\t\t\t\ttsPoint.count += bucket.count;\n\t\t\t\ttsPoint.sum += bucket.sum;\n\t\t\t\ttsPoint.min = Math.min(tsPoint.min, bucket.min);\n\t\t\t\ttsPoint.max = Math.max(tsPoint.max, bucket.max);\n\t\t\t\ttsPoint.avg = tsPoint.sum / tsPoint.count;\n\t\t\t}\n\n\t\t\t// Update overall stats\n\t\t\tresult.stats.count += bucket.count;\n\t\t\tresult.stats.sum += bucket.sum;\n\t\t\tresult.stats.min = Math.min(result.stats.min, bucket.min);\n\t\t\tresult.stats.max = Math.max(result.stats.max, bucket.max);\n\t\t}\n\n\t\t// Calculate percentiles and finalize\n\t\tfor (const result of results.values()) {\n\t\t\tif (result.stats.count > 0) {\n\t\t\t\tresult.stats.avg = result.stats.sum / result.stats.count;\n\n\t\t\t\t// Gather all samples for this result\n\t\t\t\tconst allSamples: number[] = [];\n\t\t\t\tfor (const [key, samples] of this.samples) {\n\t\t\t\t\tif (key.startsWith(`${query.projectId}:${result.name}:`)) {\n\t\t\t\t\t\tallSamples.push(...samples);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (allSamples.length > 0) {\n\t\t\t\t\tallSamples.sort((a, b) => a - b);\n\t\t\t\t\tresult.stats.p50 = this.percentile(allSamples, 50);\n\t\t\t\t\tresult.stats.p95 = this.percentile(allSamples, 95);\n\t\t\t\t\tresult.stats.p99 = this.percentile(allSamples, 99);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fix infinity values\n\t\t\tif (result.stats.min === Infinity) result.stats.min = 0;\n\t\t\tif (result.stats.max === -Infinity) result.stats.max = 0;\n\n\t\t\tfor (const point of result.timeSeries) {\n\t\t\t\tif (point.min === Infinity) point.min = 0;\n\t\t\t\tif (point.max === -Infinity) point.max = 0;\n\t\t\t}\n\t\t}\n\n\t\tconst resultArray = Array.from(results.values());\n\n\t\tif (query.limit) {\n\t\t\treturn resultArray.slice(0, query.limit);\n\t\t}\n\n\t\treturn resultArray;\n\t}\n\n\tasync getBucket(\n\t\tprojectId: string,\n\t\tname: string,\n\t\tbucket: Date,\n\t): Promise<MetricBucket | null> {\n\t\tawait this.flush();\n\n\t\tfor (const [, b] of this.buckets) {\n\t\t\tif (\n\t\t\t\tb.projectId === projectId &&\n\t\t\t\tb.name === name &&\n\t\t\t\tb.bucket.getTime() === bucket.getTime()\n\t\t\t) {\n\t\t\t\treturn b;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tasync rollup(_options: RollupOptions): Promise<number> {\n\t\t// In-memory storage doesn't need rollup - data is already aggregated\n\t\treturn 0;\n\t}\n\n\tasync prune(): Promise<number> {\n\t\tconst now = Date.now();\n\t\tlet deleted = 0;\n\n\t\t// Use the shortest retention from tiers\n\t\tconst retentionMs = Math.min(\n\t\t\t...this.config.tiers\n\t\t\t\t.filter((t) => t.retention > 0)\n\t\t\t\t.map((t) => t.retention),\n\t\t);\n\n\t\tif (retentionMs === Infinity) return 0;\n\n\t\tconst cutoff = now - retentionMs;\n\n\t\tfor (const [key, bucket] of this.buckets) {\n\t\t\tif (bucket.bucket.getTime() < cutoff) {\n\t\t\t\tthis.buckets.delete(key);\n\t\t\t\tdeleted++;\n\t\t\t}\n\t\t}\n\n\t\t// Also prune samples\n\t\tfor (const [key] of this.samples) {\n\t\t\tconst timestamp = parseInt(key.split(':').pop() ?? '0', 10);\n\t\t\tif (timestamp < cutoff) {\n\t\t\t\tthis.samples.delete(key);\n\t\t\t}\n\t\t}\n\n\t\treturn deleted;\n\t}\n\n\tasync listPartitions(_tier?: string): Promise<PartitionInfo[]> {\n\t\t// In-memory storage doesn't use partitions\n\t\treturn [];\n\t}\n\n\tgetConfig(): MetricsStorageConfig {\n\t\treturn this.config;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.flushTimer) {\n\t\t\tclearInterval(this.flushTimer);\n\t\t\tthis.flushTimer = null;\n\t\t}\n\t\tawait this.flush();\n\t\tthis.buckets.clear();\n\t\tthis.samples.clear();\n\t}\n\n\t// Helper methods\n\n\tprivate getBucketTime(timestamp: Date, interval: AggregationInterval): Date {\n\t\tconst ms = this.getIntervalMs(interval);\n\t\treturn new Date(Math.floor(timestamp.getTime() / ms) * ms);\n\t}\n\n\tprivate getBucketKey(point: MetricPoint, bucketTime: Date): string {\n\t\treturn [\n\t\t\tpoint.projectId,\n\t\t\tpoint.service,\n\t\t\tpoint.environment,\n\t\t\tpoint.name,\n\t\t\tthis.hashLabels(point.labels),\n\t\t\tbucketTime.getTime(),\n\t\t].join(':');\n\t}\n\n\tprivate hashLabels(labels: MetricLabels): string {\n\t\tconst sorted = Object.keys(labels)\n\t\t\t.sort()\n\t\t\t.map((k) => `${k}=${labels[k]}`)\n\t\t\t.join(',');\n\t\treturn sorted || '_empty_';\n\t}\n\n\tprivate getIntervalMs(interval: AggregationInterval): number {\n\t\tconst map: Record<AggregationInterval, number> = {\n\t\t\t'1m': 60_000,\n\t\t\t'5m': 300_000,\n\t\t\t'15m': 900_000,\n\t\t\t'1h': 3_600_000,\n\t\t\t'6h': 21_600_000,\n\t\t\t'1d': 86_400_000,\n\t\t};\n\t\treturn map[interval];\n\t}\n\n\tprivate matchesPattern(name: string, pattern: string): boolean {\n\t\tif (!pattern.includes('*')) return name === pattern;\n\t\tconst regex = new RegExp(\n\t\t\t`^${pattern.replace(/\\./g, '\\\\.').replace(/\\*/g, '.*')}$`,\n\t\t);\n\t\treturn regex.test(name);\n\t}\n\n\tprivate matchesLabels(labels: MetricLabels, filter: MetricLabels): boolean {\n\t\tfor (const [key, value] of Object.entries(filter)) {\n\t\t\tif (labels[key] !== value) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate getGroupKey(bucket: MetricBucket, groupBy: string[]): string {\n\t\tconst parts = [bucket.name];\n\t\tfor (const key of groupBy) {\n\t\t\tparts.push(`${key}=${bucket.labels[key] ?? ''}`);\n\t\t}\n\t\treturn parts.join(':');\n\t}\n\n\tprivate filterLabels(labels: MetricLabels, keys: string[]): MetricLabels {\n\t\tconst result: MetricLabels = {};\n\t\tfor (const key of keys) {\n\t\t\tif (labels[key] !== undefined) {\n\t\t\t\tresult[key] = labels[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate percentile(sorted: number[], p: number): number {\n\t\tif (sorted.length === 0) return 0;\n\t\tconst index = Math.ceil((p / 100) * sorted.length) - 1;\n\t\treturn sorted[Math.max(0, index)] ?? 0;\n\t}\n}\n"],"mappings":"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"}
@@ -1,4 +1,43 @@
1
- import "../../types-BS3Rx8Sk.cjs";
2
- import "../../MetricsStorage-B86e4131.cjs";
3
- import { InMemoryMetricsStorage } from "../../InMemoryMetricsStorage-TvPdZjL0.cjs";
4
- export { InMemoryMetricsStorage };
1
+ import { MetricBucket, MetricPoint, MetricQuery, MetricResult, MetricsStorageConfig, PartitionInfo, RollupOptions } from "./types.cjs";
2
+ import { MetricsStorage } from "./MetricsStorage.cjs";
3
+ //#region src/metrics/storage/InMemoryMetricsStorage.d.ts
4
+ /**
5
+ * In-memory metrics storage for development and testing.
6
+ *
7
+ * Features:
8
+ * - Buffered writes with configurable flush interval
9
+ * - Time-bucketed aggregation
10
+ * - Basic percentile calculation (reservoir sampling)
11
+ * - Automatic pruning based on retention
12
+ *
13
+ * Not suitable for production - use a proper time-series database.
14
+ */
15
+ export declare class InMemoryMetricsStorage implements MetricsStorage {
16
+ private config;
17
+ private buffer;
18
+ private buckets;
19
+ private samples;
20
+ private flushTimer;
21
+ constructor(config?: Partial<MetricsStorageConfig>);
22
+ write(points: MetricPoint[]): Promise<void>;
23
+ flush(): Promise<void>;
24
+ private aggregatePoint;
25
+ query(query: MetricQuery): Promise<MetricResult[]>;
26
+ getBucket(projectId: string, name: string, bucket: Date): Promise<MetricBucket | null>;
27
+ rollup(_options: RollupOptions): Promise<number>;
28
+ prune(): Promise<number>;
29
+ listPartitions(_tier?: string): Promise<PartitionInfo[]>;
30
+ getConfig(): MetricsStorageConfig;
31
+ close(): Promise<void>;
32
+ private getBucketTime;
33
+ private getBucketKey;
34
+ private hashLabels;
35
+ private getIntervalMs;
36
+ private matchesPattern;
37
+ private matchesLabels;
38
+ private getGroupKey;
39
+ private filterLabels;
40
+ private percentile;
41
+ }
42
+ //#endregion
43
+ //# sourceMappingURL=InMemoryMetricsStorage.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryMetricsStorage.d.cts","names":[],"sources":["../../../src/metrics/storage/InMemoryMetricsStorage.ts"],"mappings":";;;;;;;;;;;;;;qBAyBa,kCAAkC;UACtC;UACA;UACA;UACA;UACA;EAER,YAAY,SAAQ,QAAQ;EAUtB,MAAM,QAAQ,gBAAgB;EAQ9B,SAAS;UAeP;EA0CF,MAAM,OAAO,cAAc,QAAQ;EAuHnC,UACL,mBACA,cACA,QAAQ,OACN,QAAQ;EAgBL,OAAO,UAAU,gBAAgB;EAKjC,SAAS;EAiCT,eAAe,iBAAiB,QAAQ;EAK9C,aAAa;EAIP,SAAS;UAYP;UAKA;UAWA;UAQA;UAYA;UAQA;UAOA;UAQA;UAUA"}
@@ -1,4 +1,43 @@
1
- import "../../types-CbNGXnJE.mjs";
2
- import "../../MetricsStorage-BWyP2_12.mjs";
3
- import { InMemoryMetricsStorage } from "../../InMemoryMetricsStorage-BbKCL3YL.mjs";
4
- export { InMemoryMetricsStorage };
1
+ import { MetricBucket, MetricPoint, MetricQuery, MetricResult, MetricsStorageConfig, PartitionInfo, RollupOptions } from "./types.mjs";
2
+ import { MetricsStorage } from "./MetricsStorage.mjs";
3
+ //#region src/metrics/storage/InMemoryMetricsStorage.d.ts
4
+ /**
5
+ * In-memory metrics storage for development and testing.
6
+ *
7
+ * Features:
8
+ * - Buffered writes with configurable flush interval
9
+ * - Time-bucketed aggregation
10
+ * - Basic percentile calculation (reservoir sampling)
11
+ * - Automatic pruning based on retention
12
+ *
13
+ * Not suitable for production - use a proper time-series database.
14
+ */
15
+ export declare class InMemoryMetricsStorage implements MetricsStorage {
16
+ private config;
17
+ private buffer;
18
+ private buckets;
19
+ private samples;
20
+ private flushTimer;
21
+ constructor(config?: Partial<MetricsStorageConfig>);
22
+ write(points: MetricPoint[]): Promise<void>;
23
+ flush(): Promise<void>;
24
+ private aggregatePoint;
25
+ query(query: MetricQuery): Promise<MetricResult[]>;
26
+ getBucket(projectId: string, name: string, bucket: Date): Promise<MetricBucket | null>;
27
+ rollup(_options: RollupOptions): Promise<number>;
28
+ prune(): Promise<number>;
29
+ listPartitions(_tier?: string): Promise<PartitionInfo[]>;
30
+ getConfig(): MetricsStorageConfig;
31
+ close(): Promise<void>;
32
+ private getBucketTime;
33
+ private getBucketKey;
34
+ private hashLabels;
35
+ private getIntervalMs;
36
+ private matchesPattern;
37
+ private matchesLabels;
38
+ private getGroupKey;
39
+ private filterLabels;
40
+ private percentile;
41
+ }
42
+ //#endregion
43
+ //# sourceMappingURL=InMemoryMetricsStorage.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryMetricsStorage.d.mts","names":[],"sources":["../../../src/metrics/storage/InMemoryMetricsStorage.ts"],"mappings":";;;;;;;;;;;;;;qBAyBa,kCAAkC;UACtC;UACA;UACA;UACA;UACA;EAER,YAAY,SAAQ,QAAQ;EAUtB,MAAM,QAAQ,gBAAgB;EAQ9B,SAAS;UAeP;EA0CF,MAAM,OAAO,cAAc,QAAQ;EAuHnC,UACL,mBACA,cACA,QAAQ,OACN,QAAQ;EAgBL,OAAO,UAAU,gBAAgB;EAKjC,SAAS;EAiCT,eAAe,iBAAiB,QAAQ;EAK9C,aAAa;EAIP,SAAS;UAYP;UAKA;UAWA;UAQA;UAYA;UAQA;UAOA;UAQA;UAUA"}
@@ -1,4 +1,240 @@
1
- import "../../types-ojhnLdwz.mjs";
2
- import { InMemoryMetricsStorage } from "../../InMemoryMetricsStorage-C4drxT7G.mjs";
1
+ import { DEFAULT_METRICS_CONFIG } from "./types.mjs";
2
+ //#region src/metrics/storage/InMemoryMetricsStorage.ts
3
+ /**
4
+ * In-memory metrics storage for development and testing.
5
+ *
6
+ * Features:
7
+ * - Buffered writes with configurable flush interval
8
+ * - Time-bucketed aggregation
9
+ * - Basic percentile calculation (reservoir sampling)
10
+ * - Automatic pruning based on retention
11
+ *
12
+ * Not suitable for production - use a proper time-series database.
13
+ */
14
+ var InMemoryMetricsStorage = class {
15
+ config;
16
+ buffer = [];
17
+ buckets = /* @__PURE__ */ new Map();
18
+ samples = /* @__PURE__ */ new Map();
19
+ flushTimer = null;
20
+ constructor(config = {}) {
21
+ this.config = {
22
+ ...DEFAULT_METRICS_CONFIG,
23
+ ...config
24
+ };
25
+ if (this.config.flushInterval > 0) this.flushTimer = setInterval(() => {
26
+ this.flush().catch(console.error);
27
+ }, this.config.flushInterval);
28
+ }
29
+ async write(points) {
30
+ this.buffer.push(...points);
31
+ if (this.buffer.length >= this.config.maxBatchSize) await this.flush();
32
+ }
33
+ async flush() {
34
+ if (this.buffer.length === 0) return;
35
+ const points = this.buffer.splice(0);
36
+ for (const point of points) this.aggregatePoint(point);
37
+ if (this.config.autoRollup) await this.prune();
38
+ }
39
+ aggregatePoint(point) {
40
+ const bucketTime = this.getBucketTime(point.timestamp, "1m");
41
+ const key = this.getBucketKey(point, bucketTime);
42
+ const existing = this.buckets.get(key);
43
+ if (existing) {
44
+ existing.count += 1;
45
+ existing.sum += point.value;
46
+ existing.min = Math.min(existing.min, point.value);
47
+ existing.max = Math.max(existing.max, point.value);
48
+ } else this.buckets.set(key, {
49
+ bucket: bucketTime,
50
+ projectId: point.projectId,
51
+ service: point.service,
52
+ environment: point.environment,
53
+ name: point.name,
54
+ labelsHash: this.hashLabels(point.labels),
55
+ labels: { ...point.labels },
56
+ count: 1,
57
+ sum: point.value,
58
+ min: point.value,
59
+ max: point.value
60
+ });
61
+ const sampleKey = `${point.projectId}:${point.name}:${bucketTime.getTime()}`;
62
+ const samples = this.samples.get(sampleKey) ?? [];
63
+ if (samples.length < 1e3) samples.push(point.value);
64
+ else {
65
+ const idx = Math.floor(Math.random() * (samples.length + 1));
66
+ if (idx < samples.length) samples[idx] = point.value;
67
+ }
68
+ this.samples.set(sampleKey, samples);
69
+ }
70
+ async query(query) {
71
+ await this.flush();
72
+ const results = /* @__PURE__ */ new Map();
73
+ const startTime = query.range.start.getTime();
74
+ const endTime = query.range.end.getTime();
75
+ const interval = query.interval ?? "1m";
76
+ const intervalMs = this.getIntervalMs(interval);
77
+ for (const [, bucket] of this.buckets) {
78
+ if (bucket.projectId !== query.projectId) continue;
79
+ if (query.service && bucket.service !== query.service) continue;
80
+ if (query.environment && bucket.environment !== query.environment) continue;
81
+ if (query.name && !this.matchesPattern(bucket.name, query.name)) continue;
82
+ if (query.labels && !this.matchesLabels(bucket.labels, query.labels)) continue;
83
+ const bucketTime = bucket.bucket.getTime();
84
+ if (bucketTime < startTime || bucketTime > endTime) continue;
85
+ const groupKey = query.groupBy ? this.getGroupKey(bucket, query.groupBy) : bucket.name;
86
+ let result = results.get(groupKey);
87
+ if (!result) {
88
+ result = {
89
+ name: bucket.name,
90
+ labels: query.groupBy ? this.filterLabels(bucket.labels, query.groupBy) : bucket.labels,
91
+ timeSeries: [],
92
+ stats: {
93
+ count: 0,
94
+ sum: 0,
95
+ avg: 0,
96
+ min: Infinity,
97
+ max: -Infinity,
98
+ p50: 0,
99
+ p95: 0,
100
+ p99: 0
101
+ }
102
+ };
103
+ results.set(groupKey, result);
104
+ }
105
+ const tsIndex = Math.floor((bucketTime - startTime) / intervalMs);
106
+ while (result.timeSeries.length <= tsIndex) result.timeSeries.push({
107
+ timestamp: new Date(startTime + result.timeSeries.length * intervalMs),
108
+ count: 0,
109
+ sum: 0,
110
+ avg: 0,
111
+ min: Infinity,
112
+ max: -Infinity
113
+ });
114
+ const tsPoint = result.timeSeries[tsIndex];
115
+ if (tsPoint) {
116
+ tsPoint.count += bucket.count;
117
+ tsPoint.sum += bucket.sum;
118
+ tsPoint.min = Math.min(tsPoint.min, bucket.min);
119
+ tsPoint.max = Math.max(tsPoint.max, bucket.max);
120
+ tsPoint.avg = tsPoint.sum / tsPoint.count;
121
+ }
122
+ result.stats.count += bucket.count;
123
+ result.stats.sum += bucket.sum;
124
+ result.stats.min = Math.min(result.stats.min, bucket.min);
125
+ result.stats.max = Math.max(result.stats.max, bucket.max);
126
+ }
127
+ for (const result of results.values()) {
128
+ if (result.stats.count > 0) {
129
+ result.stats.avg = result.stats.sum / result.stats.count;
130
+ const allSamples = [];
131
+ for (const [key, samples] of this.samples) if (key.startsWith(`${query.projectId}:${result.name}:`)) allSamples.push(...samples);
132
+ if (allSamples.length > 0) {
133
+ allSamples.sort((a, b) => a - b);
134
+ result.stats.p50 = this.percentile(allSamples, 50);
135
+ result.stats.p95 = this.percentile(allSamples, 95);
136
+ result.stats.p99 = this.percentile(allSamples, 99);
137
+ }
138
+ }
139
+ if (result.stats.min === Infinity) result.stats.min = 0;
140
+ if (result.stats.max === -Infinity) result.stats.max = 0;
141
+ for (const point of result.timeSeries) {
142
+ if (point.min === Infinity) point.min = 0;
143
+ if (point.max === -Infinity) point.max = 0;
144
+ }
145
+ }
146
+ const resultArray = Array.from(results.values());
147
+ if (query.limit) return resultArray.slice(0, query.limit);
148
+ return resultArray;
149
+ }
150
+ async getBucket(projectId, name, bucket) {
151
+ await this.flush();
152
+ for (const [, b] of this.buckets) if (b.projectId === projectId && b.name === name && b.bucket.getTime() === bucket.getTime()) return b;
153
+ return null;
154
+ }
155
+ async rollup(_options) {
156
+ return 0;
157
+ }
158
+ async prune() {
159
+ const now = Date.now();
160
+ let deleted = 0;
161
+ const retentionMs = Math.min(...this.config.tiers.filter((t) => t.retention > 0).map((t) => t.retention));
162
+ if (retentionMs === Infinity) return 0;
163
+ const cutoff = now - retentionMs;
164
+ for (const [key, bucket] of this.buckets) if (bucket.bucket.getTime() < cutoff) {
165
+ this.buckets.delete(key);
166
+ deleted++;
167
+ }
168
+ for (const [key] of this.samples) if (parseInt(key.split(":").pop() ?? "0", 10) < cutoff) this.samples.delete(key);
169
+ return deleted;
170
+ }
171
+ async listPartitions(_tier) {
172
+ return [];
173
+ }
174
+ getConfig() {
175
+ return this.config;
176
+ }
177
+ async close() {
178
+ if (this.flushTimer) {
179
+ clearInterval(this.flushTimer);
180
+ this.flushTimer = null;
181
+ }
182
+ await this.flush();
183
+ this.buckets.clear();
184
+ this.samples.clear();
185
+ }
186
+ getBucketTime(timestamp, interval) {
187
+ const ms = this.getIntervalMs(interval);
188
+ return new Date(Math.floor(timestamp.getTime() / ms) * ms);
189
+ }
190
+ getBucketKey(point, bucketTime) {
191
+ return [
192
+ point.projectId,
193
+ point.service,
194
+ point.environment,
195
+ point.name,
196
+ this.hashLabels(point.labels),
197
+ bucketTime.getTime()
198
+ ].join(":");
199
+ }
200
+ hashLabels(labels) {
201
+ return Object.keys(labels).sort().map((k) => `${k}=${labels[k]}`).join(",") || "_empty_";
202
+ }
203
+ getIntervalMs(interval) {
204
+ return {
205
+ "1m": 6e4,
206
+ "5m": 3e5,
207
+ "15m": 9e5,
208
+ "1h": 36e5,
209
+ "6h": 216e5,
210
+ "1d": 864e5
211
+ }[interval];
212
+ }
213
+ matchesPattern(name, pattern) {
214
+ if (!pattern.includes("*")) return name === pattern;
215
+ return new RegExp(`^${pattern.replace(/\./g, "\\.").replace(/\*/g, ".*")}$`).test(name);
216
+ }
217
+ matchesLabels(labels, filter) {
218
+ for (const [key, value] of Object.entries(filter)) if (labels[key] !== value) return false;
219
+ return true;
220
+ }
221
+ getGroupKey(bucket, groupBy) {
222
+ const parts = [bucket.name];
223
+ for (const key of groupBy) parts.push(`${key}=${bucket.labels[key] ?? ""}`);
224
+ return parts.join(":");
225
+ }
226
+ filterLabels(labels, keys) {
227
+ const result = {};
228
+ for (const key of keys) if (labels[key] !== void 0) result[key] = labels[key];
229
+ return result;
230
+ }
231
+ percentile(sorted, p) {
232
+ if (sorted.length === 0) return 0;
233
+ const index = Math.ceil(p / 100 * sorted.length) - 1;
234
+ return sorted[Math.max(0, index)] ?? 0;
235
+ }
236
+ };
237
+ //#endregion
238
+ export { InMemoryMetricsStorage };
3
239
 
4
- export { InMemoryMetricsStorage };
240
+ //# sourceMappingURL=InMemoryMetricsStorage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryMetricsStorage.mjs","names":[],"sources":["../../../src/metrics/storage/InMemoryMetricsStorage.ts"],"sourcesContent":["import type { MetricsStorage } from './MetricsStorage';\nimport {\n\ttype AggregationInterval,\n\tDEFAULT_METRICS_CONFIG,\n\ttype MetricBucket,\n\ttype MetricLabels,\n\ttype MetricPoint,\n\ttype MetricQuery,\n\ttype MetricResult,\n\ttype MetricsStorageConfig,\n\ttype PartitionInfo,\n\ttype RollupOptions,\n} from './types';\n\n/**\n * In-memory metrics storage for development and testing.\n *\n * Features:\n * - Buffered writes with configurable flush interval\n * - Time-bucketed aggregation\n * - Basic percentile calculation (reservoir sampling)\n * - Automatic pruning based on retention\n *\n * Not suitable for production - use a proper time-series database.\n */\nexport class InMemoryMetricsStorage implements MetricsStorage {\n\tprivate config: MetricsStorageConfig;\n\tprivate buffer: MetricPoint[] = [];\n\tprivate buckets: Map<string, MetricBucket> = new Map();\n\tprivate samples: Map<string, number[]> = new Map(); // For percentile calculations\n\tprivate flushTimer: ReturnType<typeof setInterval> | null = null;\n\n\tconstructor(config: Partial<MetricsStorageConfig> = {}) {\n\t\tthis.config = { ...DEFAULT_METRICS_CONFIG, ...config };\n\n\t\tif (this.config.flushInterval > 0) {\n\t\t\tthis.flushTimer = setInterval(() => {\n\t\t\t\tthis.flush().catch(console.error);\n\t\t\t}, this.config.flushInterval);\n\t\t}\n\t}\n\n\tasync write(points: MetricPoint[]): Promise<void> {\n\t\tthis.buffer.push(...points);\n\n\t\tif (this.buffer.length >= this.config.maxBatchSize) {\n\t\t\tawait this.flush();\n\t\t}\n\t}\n\n\tasync flush(): Promise<void> {\n\t\tif (this.buffer.length === 0) return;\n\n\t\tconst points = this.buffer.splice(0);\n\n\t\tfor (const point of points) {\n\t\t\tthis.aggregatePoint(point);\n\t\t}\n\n\t\t// Prune if auto-rollup is enabled\n\t\tif (this.config.autoRollup) {\n\t\t\tawait this.prune();\n\t\t}\n\t}\n\n\tprivate aggregatePoint(point: MetricPoint): void {\n\t\tconst bucketTime = this.getBucketTime(point.timestamp, '1m');\n\t\tconst key = this.getBucketKey(point, bucketTime);\n\n\t\tconst existing = this.buckets.get(key);\n\n\t\tif (existing) {\n\t\t\texisting.count += 1;\n\t\t\texisting.sum += point.value;\n\t\t\texisting.min = Math.min(existing.min, point.value);\n\t\t\texisting.max = Math.max(existing.max, point.value);\n\t\t} else {\n\t\t\tthis.buckets.set(key, {\n\t\t\t\tbucket: bucketTime,\n\t\t\t\tprojectId: point.projectId,\n\t\t\t\tservice: point.service,\n\t\t\t\tenvironment: point.environment,\n\t\t\t\tname: point.name,\n\t\t\t\tlabelsHash: this.hashLabels(point.labels),\n\t\t\t\tlabels: { ...point.labels },\n\t\t\t\tcount: 1,\n\t\t\t\tsum: point.value,\n\t\t\t\tmin: point.value,\n\t\t\t\tmax: point.value,\n\t\t\t});\n\t\t}\n\n\t\t// Store samples for percentile calculations (reservoir sampling)\n\t\tconst sampleKey = `${point.projectId}:${point.name}:${bucketTime.getTime()}`;\n\t\tconst samples = this.samples.get(sampleKey) ?? [];\n\t\tif (samples.length < 1000) {\n\t\t\tsamples.push(point.value);\n\t\t} else {\n\t\t\t// Reservoir sampling\n\t\t\tconst idx = Math.floor(Math.random() * (samples.length + 1));\n\t\t\tif (idx < samples.length) {\n\t\t\t\tsamples[idx] = point.value;\n\t\t\t}\n\t\t}\n\t\tthis.samples.set(sampleKey, samples);\n\t}\n\n\tasync query(query: MetricQuery): Promise<MetricResult[]> {\n\t\tawait this.flush();\n\n\t\tconst results = new Map<string, MetricResult>();\n\t\tconst startTime = query.range.start.getTime();\n\t\tconst endTime = query.range.end.getTime();\n\t\tconst interval = query.interval ?? '1m';\n\t\tconst intervalMs = this.getIntervalMs(interval);\n\n\t\tfor (const [, bucket] of this.buckets) {\n\t\t\tif (bucket.projectId !== query.projectId) continue;\n\t\t\tif (query.service && bucket.service !== query.service) continue;\n\t\t\tif (query.environment && bucket.environment !== query.environment)\n\t\t\t\tcontinue;\n\t\t\tif (query.name && !this.matchesPattern(bucket.name, query.name)) continue;\n\t\t\tif (query.labels && !this.matchesLabels(bucket.labels, query.labels))\n\t\t\t\tcontinue;\n\n\t\t\tconst bucketTime = bucket.bucket.getTime();\n\t\t\tif (bucketTime < startTime || bucketTime > endTime) continue;\n\n\t\t\t// Group by metric name + labels\n\t\t\tconst groupKey = query.groupBy\n\t\t\t\t? this.getGroupKey(bucket, query.groupBy)\n\t\t\t\t: bucket.name;\n\n\t\t\tlet result = results.get(groupKey);\n\t\t\tif (!result) {\n\t\t\t\tresult = {\n\t\t\t\t\tname: bucket.name,\n\t\t\t\t\tlabels: query.groupBy\n\t\t\t\t\t\t? this.filterLabels(bucket.labels, query.groupBy)\n\t\t\t\t\t\t: bucket.labels,\n\t\t\t\t\ttimeSeries: [],\n\t\t\t\t\tstats: {\n\t\t\t\t\t\tcount: 0,\n\t\t\t\t\t\tsum: 0,\n\t\t\t\t\t\tavg: 0,\n\t\t\t\t\t\tmin: Infinity,\n\t\t\t\t\t\tmax: -Infinity,\n\t\t\t\t\t\tp50: 0,\n\t\t\t\t\t\tp95: 0,\n\t\t\t\t\t\tp99: 0,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tresults.set(groupKey, result);\n\t\t\t}\n\n\t\t\t// Aggregate into time series\n\t\t\tconst tsIndex = Math.floor((bucketTime - startTime) / intervalMs);\n\t\t\twhile (result.timeSeries.length <= tsIndex) {\n\t\t\t\tresult.timeSeries.push({\n\t\t\t\t\ttimestamp: new Date(\n\t\t\t\t\t\tstartTime + result.timeSeries.length * intervalMs,\n\t\t\t\t\t),\n\t\t\t\t\tcount: 0,\n\t\t\t\t\tsum: 0,\n\t\t\t\t\tavg: 0,\n\t\t\t\t\tmin: Infinity,\n\t\t\t\t\tmax: -Infinity,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst tsPoint = result.timeSeries[tsIndex];\n\t\t\tif (tsPoint) {\n\t\t\t\ttsPoint.count += bucket.count;\n\t\t\t\ttsPoint.sum += bucket.sum;\n\t\t\t\ttsPoint.min = Math.min(tsPoint.min, bucket.min);\n\t\t\t\ttsPoint.max = Math.max(tsPoint.max, bucket.max);\n\t\t\t\ttsPoint.avg = tsPoint.sum / tsPoint.count;\n\t\t\t}\n\n\t\t\t// Update overall stats\n\t\t\tresult.stats.count += bucket.count;\n\t\t\tresult.stats.sum += bucket.sum;\n\t\t\tresult.stats.min = Math.min(result.stats.min, bucket.min);\n\t\t\tresult.stats.max = Math.max(result.stats.max, bucket.max);\n\t\t}\n\n\t\t// Calculate percentiles and finalize\n\t\tfor (const result of results.values()) {\n\t\t\tif (result.stats.count > 0) {\n\t\t\t\tresult.stats.avg = result.stats.sum / result.stats.count;\n\n\t\t\t\t// Gather all samples for this result\n\t\t\t\tconst allSamples: number[] = [];\n\t\t\t\tfor (const [key, samples] of this.samples) {\n\t\t\t\t\tif (key.startsWith(`${query.projectId}:${result.name}:`)) {\n\t\t\t\t\t\tallSamples.push(...samples);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (allSamples.length > 0) {\n\t\t\t\t\tallSamples.sort((a, b) => a - b);\n\t\t\t\t\tresult.stats.p50 = this.percentile(allSamples, 50);\n\t\t\t\t\tresult.stats.p95 = this.percentile(allSamples, 95);\n\t\t\t\t\tresult.stats.p99 = this.percentile(allSamples, 99);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fix infinity values\n\t\t\tif (result.stats.min === Infinity) result.stats.min = 0;\n\t\t\tif (result.stats.max === -Infinity) result.stats.max = 0;\n\n\t\t\tfor (const point of result.timeSeries) {\n\t\t\t\tif (point.min === Infinity) point.min = 0;\n\t\t\t\tif (point.max === -Infinity) point.max = 0;\n\t\t\t}\n\t\t}\n\n\t\tconst resultArray = Array.from(results.values());\n\n\t\tif (query.limit) {\n\t\t\treturn resultArray.slice(0, query.limit);\n\t\t}\n\n\t\treturn resultArray;\n\t}\n\n\tasync getBucket(\n\t\tprojectId: string,\n\t\tname: string,\n\t\tbucket: Date,\n\t): Promise<MetricBucket | null> {\n\t\tawait this.flush();\n\n\t\tfor (const [, b] of this.buckets) {\n\t\t\tif (\n\t\t\t\tb.projectId === projectId &&\n\t\t\t\tb.name === name &&\n\t\t\t\tb.bucket.getTime() === bucket.getTime()\n\t\t\t) {\n\t\t\t\treturn b;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tasync rollup(_options: RollupOptions): Promise<number> {\n\t\t// In-memory storage doesn't need rollup - data is already aggregated\n\t\treturn 0;\n\t}\n\n\tasync prune(): Promise<number> {\n\t\tconst now = Date.now();\n\t\tlet deleted = 0;\n\n\t\t// Use the shortest retention from tiers\n\t\tconst retentionMs = Math.min(\n\t\t\t...this.config.tiers\n\t\t\t\t.filter((t) => t.retention > 0)\n\t\t\t\t.map((t) => t.retention),\n\t\t);\n\n\t\tif (retentionMs === Infinity) return 0;\n\n\t\tconst cutoff = now - retentionMs;\n\n\t\tfor (const [key, bucket] of this.buckets) {\n\t\t\tif (bucket.bucket.getTime() < cutoff) {\n\t\t\t\tthis.buckets.delete(key);\n\t\t\t\tdeleted++;\n\t\t\t}\n\t\t}\n\n\t\t// Also prune samples\n\t\tfor (const [key] of this.samples) {\n\t\t\tconst timestamp = parseInt(key.split(':').pop() ?? '0', 10);\n\t\t\tif (timestamp < cutoff) {\n\t\t\t\tthis.samples.delete(key);\n\t\t\t}\n\t\t}\n\n\t\treturn deleted;\n\t}\n\n\tasync listPartitions(_tier?: string): Promise<PartitionInfo[]> {\n\t\t// In-memory storage doesn't use partitions\n\t\treturn [];\n\t}\n\n\tgetConfig(): MetricsStorageConfig {\n\t\treturn this.config;\n\t}\n\n\tasync close(): Promise<void> {\n\t\tif (this.flushTimer) {\n\t\t\tclearInterval(this.flushTimer);\n\t\t\tthis.flushTimer = null;\n\t\t}\n\t\tawait this.flush();\n\t\tthis.buckets.clear();\n\t\tthis.samples.clear();\n\t}\n\n\t// Helper methods\n\n\tprivate getBucketTime(timestamp: Date, interval: AggregationInterval): Date {\n\t\tconst ms = this.getIntervalMs(interval);\n\t\treturn new Date(Math.floor(timestamp.getTime() / ms) * ms);\n\t}\n\n\tprivate getBucketKey(point: MetricPoint, bucketTime: Date): string {\n\t\treturn [\n\t\t\tpoint.projectId,\n\t\t\tpoint.service,\n\t\t\tpoint.environment,\n\t\t\tpoint.name,\n\t\t\tthis.hashLabels(point.labels),\n\t\t\tbucketTime.getTime(),\n\t\t].join(':');\n\t}\n\n\tprivate hashLabels(labels: MetricLabels): string {\n\t\tconst sorted = Object.keys(labels)\n\t\t\t.sort()\n\t\t\t.map((k) => `${k}=${labels[k]}`)\n\t\t\t.join(',');\n\t\treturn sorted || '_empty_';\n\t}\n\n\tprivate getIntervalMs(interval: AggregationInterval): number {\n\t\tconst map: Record<AggregationInterval, number> = {\n\t\t\t'1m': 60_000,\n\t\t\t'5m': 300_000,\n\t\t\t'15m': 900_000,\n\t\t\t'1h': 3_600_000,\n\t\t\t'6h': 21_600_000,\n\t\t\t'1d': 86_400_000,\n\t\t};\n\t\treturn map[interval];\n\t}\n\n\tprivate matchesPattern(name: string, pattern: string): boolean {\n\t\tif (!pattern.includes('*')) return name === pattern;\n\t\tconst regex = new RegExp(\n\t\t\t`^${pattern.replace(/\\./g, '\\\\.').replace(/\\*/g, '.*')}$`,\n\t\t);\n\t\treturn regex.test(name);\n\t}\n\n\tprivate matchesLabels(labels: MetricLabels, filter: MetricLabels): boolean {\n\t\tfor (const [key, value] of Object.entries(filter)) {\n\t\t\tif (labels[key] !== value) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\tprivate getGroupKey(bucket: MetricBucket, groupBy: string[]): string {\n\t\tconst parts = [bucket.name];\n\t\tfor (const key of groupBy) {\n\t\t\tparts.push(`${key}=${bucket.labels[key] ?? ''}`);\n\t\t}\n\t\treturn parts.join(':');\n\t}\n\n\tprivate filterLabels(labels: MetricLabels, keys: string[]): MetricLabels {\n\t\tconst result: MetricLabels = {};\n\t\tfor (const key of keys) {\n\t\t\tif (labels[key] !== undefined) {\n\t\t\t\tresult[key] = labels[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate percentile(sorted: number[], p: number): number {\n\t\tif (sorted.length === 0) return 0;\n\t\tconst index = Math.ceil((p / 100) * sorted.length) - 1;\n\t\treturn sorted[Math.max(0, index)] ?? 0;\n\t}\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- require('../../MetricsStorage-Or8pVCe4.cjs');