@geekmidas/telescope 10.0.0-alpha.98 → 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
package/CHANGELOG.md ADDED
@@ -0,0 +1,79 @@
1
+ # @geekmidas/telescope
2
+
3
+ ## 10.0.0
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies []:
8
+ - @geekmidas/logger@10.0.0
9
+
10
+ ## 9.0.2
11
+
12
+ ### Patch Changes
13
+
14
+ - [#12](https://github.com/geekmidas/toolbox/pull/12) [`d53863a`](https://github.com/geekmidas/toolbox/commit/d53863a84db2e4ab5420e08f79128b637043fc42) Thanks [@geekmidas](https://github.com/geekmidas)! - Align every published package on a single version and keep them in step.
15
+
16
+ All packages now share one version, enforced by a changesets `fixed` group. The
17
+ baseline is 9.0.1 — @geekmidas/client's published version — so nothing moves
18
+ backwards; this release takes the whole set to 9.0.2 together.
19
+
20
+ Independent versions made "which version of the docs applies to me"
21
+ unanswerable: a reader on constructs@7 and cli@2 was on no version at all. One
22
+ number per release makes versioned documentation possible, and lets 9 freeze as
23
+ the current paradigm while the constructs rework is developed against it.
24
+
25
+ Every release now publishes every package, and a major anywhere is a major
26
+ everywhere. Peer ranges get simpler in return.
27
+
28
+ - Updated dependencies [[`d53863a`](https://github.com/geekmidas/toolbox/commit/d53863a84db2e4ab5420e08f79128b637043fc42)]:
29
+ - @geekmidas/logger@9.0.2
30
+
31
+ ## 1.1.1
32
+
33
+ ### Patch Changes
34
+
35
+ - 🐛 [#11](https://github.com/geekmidas/toolbox/pull/11) [`40f4dc0`](https://github.com/geekmidas/toolbox/commit/40f4dc095911b2223a255029d8f776caf7781309) Thanks [@geekmidas](https://github.com/geekmidas)! - Patch release across all packages to realign published versions with the
36
+ registry. The previous release only published the four packages that had
37
+ version bumps; the remaining packages failed with "cannot publish over the
38
+ previously published versions" because their versions were unchanged.
39
+ - Updated dependencies [[`40f4dc0`](https://github.com/geekmidas/toolbox/commit/40f4dc095911b2223a255029d8f776caf7781309)]:
40
+ - @geekmidas/logger@1.0.3
41
+
42
+ ## 1.1.0
43
+
44
+ ### Minor Changes
45
+
46
+ - [#9](https://github.com/geekmidas/toolbox/pull/9) [`e31a60a`](https://github.com/geekmidas/toolbox/commit/e31a60a971366180a0e7bec6e7da56d8f36aa21f) Thanks [@geekmidas](https://github.com/geekmidas)! - Support kysely 0.29.
47
+
48
+ kysely 0.29 moved `Migrator` and `FileMigrationProvider` from the root barrel
49
+ (`'kysely'`) to the `'kysely/migration'` subpath. `@geekmidas/testkit`'s
50
+ `PostgresKyselyMigrator` now imports `Migrator` from `'kysely/migration'` and
51
+ its kysely peer becomes `~0.29.4` — consumers must be on kysely 0.29+.
52
+
53
+ The library packages that only declare a kysely _peer_ (`db`, `audit`, `studio`,
54
+ `telescope`) don't touch the moved symbols, so their peer range is _widened_ to
55
+ `>=0.28.2 <0.30.0` — they now support both 0.28 and 0.29 (non-breaking).
56
+
57
+ `@geekmidas/cli`'s scaffolded `test/globalSetup.ts` template now imports
58
+ `FileMigrationProvider` from `'kysely/migration'` so generated projects work on
59
+ kysely 0.29.
60
+
61
+ ## 1.0.1
62
+
63
+ ### Patch Changes
64
+
65
+ - 🐛 [`d70c6c0`](https://github.com/geekmidas/toolbox/commit/d70c6c0aeb8a79da2473ac77dbd8255a4a2f5651) Thanks [@geekmidas](https://github.com/geekmidas)! - Fix `package.json` exports so TypeScript declarations resolve correctly under NodeNext/Bundler module resolution. Each subpath export now nests `types` inside its `import`/`require` condition, pointing at the `.d.mts` and `.d.cts` files that `tsdown` actually emits (previously the exports referenced non-existent `.d.ts` files, causing type-resolution failures for consumers). Both ESM (`.mjs`) and CJS (`.cjs`) runtime entry points are preserved. Additionally, `@geekmidas/ui` had `import` paths pointing at `.js` files that were never emitted — those are corrected to `.mjs`.
66
+
67
+ - Updated dependencies [[`d70c6c0`](https://github.com/geekmidas/toolbox/commit/d70c6c0aeb8a79da2473ac77dbd8255a4a2f5651)]:
68
+ - @geekmidas/logger@1.0.2
69
+
70
+ ## 1.0.0
71
+
72
+ ### Major Changes
73
+
74
+ - [`ff7b115`](https://github.com/geekmidas/toolbox/commit/ff7b11599f60f84ac6cdc73714c853ecf786b2e8) Thanks [@geekmidas](https://github.com/geekmidas)! - Version 1 Stable release
75
+
76
+ ### Patch Changes
77
+
78
+ - Updated dependencies [[`ff7b115`](https://github.com/geekmidas/toolbox/commit/ff7b11599f60f84ac6cdc73714c853ecf786b2e8)]:
79
+ - @geekmidas/logger@1.0.0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @geekmidas/telescope
2
2
 
3
- Laravel Telescope-style debugging and monitoring for web applications. Capture HTTP requests, exceptions and logs, and read them back as a JSON API with a WebSocket feed. Headless: there is no dashboard — build whatever UI you want on the JSON.
3
+ Laravel Telescope-style debugging and monitoring for web applications. Capture and inspect HTTP requests, exceptions, and logs in real-time.
4
4
 
5
5
  **Framework-agnostic core** with adapters for Hono, AWS Lambda, and more.
6
6
 
@@ -17,7 +17,7 @@ pnpm add @geekmidas/telescope
17
17
  ```typescript
18
18
  import { Hono } from 'hono';
19
19
  import { Telescope, InMemoryStorage } from '@geekmidas/telescope';
20
- import { createApi, createMiddleware } from '@geekmidas/telescope/server/hono';
20
+ import { createMiddleware, createUI } from '@geekmidas/telescope/server/hono';
21
21
 
22
22
  const telescope = new Telescope({
23
23
  storage: new InMemoryStorage(),
@@ -28,8 +28,8 @@ const app = new Hono();
28
28
  // Add middleware to capture requests
29
29
  app.use('*', createMiddleware(telescope));
30
30
 
31
- // Mount the JSON API
32
- app.route('/__telescope', createApi(telescope));
31
+ // Mount the dashboard
32
+ app.route('/__telescope', createUI(telescope));
33
33
 
34
34
  // Your routes
35
35
  app.get('/users', (c) => c.json({ users: [] }));
@@ -37,7 +37,7 @@ app.get('/users', (c) => c.json({ users: [] }));
37
37
  export default app;
38
38
  ```
39
39
 
40
- Read the data at `http://localhost:3000/__telescope/api/requests` (and `/api/exceptions`, `/api/logs`, …).
40
+ Visit `http://localhost:3000/__telescope` to view the dashboard.
41
41
 
42
42
  ### Framework-Agnostic Core
43
43
 
@@ -80,7 +80,7 @@ try {
80
80
  - **Request Recording**: Capture HTTP requests with headers, body, query params, and response
81
81
  - **Exception Tracking**: Record exceptions with stack traces and source context
82
82
  - **Log Aggregation**: Collect application logs with context
83
- - **Real-time Updates**: a WebSocket feed of new entries
83
+ - **Real-time Updates**: WebSocket-powered live dashboard
84
84
  - **Storage Agnostic**: Use in-memory for dev, database for production
85
85
  - **Hono Integration**: First-class middleware and route mounting
86
86
  - **Lambda Integration**: Wrapper and Middy middleware for AWS Lambda with auto-flush
@@ -95,7 +95,7 @@ const telescope = new Telescope({
95
95
  // Optional: Enable/disable telescope (default: true)
96
96
  enabled: true,
97
97
 
98
- // Optional: where the JSON API is mounted (default: '/__telescope')
98
+ // Optional: Dashboard path (default: '/__telescope')
99
99
  path: '/__telescope',
100
100
 
101
101
  // Optional: Record request/response bodies (default: true)
@@ -220,26 +220,16 @@ const storage = new InMemoryStorage({
220
220
  });
221
221
  ```
222
222
 
223
- ### KyselyStorage
223
+ ### KyselyStorage (Coming Soon)
224
224
 
225
225
  For production use with database persistence.
226
226
 
227
227
  ```typescript
228
228
  import { KyselyStorage } from '@geekmidas/telescope/storage/kysely';
229
229
 
230
- const storage = new KyselyStorage({ db });
231
- ```
232
-
233
- The tables are `requests`, `logs` and `exceptions` — unqualified. A telescope
234
- derived from a database is a schema tenant with a role whose `search_path` is
235
- pinned to it, so an unqualified name already resolves there, and
236
- `DROP SCHEMA telescope CASCADE` is the whole cleanup.
237
-
238
- Pass `schema` only when the connection is *not* pinned — a shared pool, or a
239
- migration run as an owner whose `search_path` finds `public` first:
240
-
241
- ```typescript
242
- const storage = new KyselyStorage({ db, schema: 'telescope' });
230
+ const storage = new KyselyStorage(db, {
231
+ tablePrefix: 'telescope_', // Table name prefix
232
+ });
243
233
  ```
244
234
 
245
235
  ### Custom Storage
@@ -344,7 +334,7 @@ telescope.destroy();
344
334
  Import from `@geekmidas/telescope/server/hono`:
345
335
 
346
336
  ```typescript
347
- import { createApi, createMiddleware, setupWebSocket, getRequestId } from '@geekmidas/telescope/server/hono';
337
+ import { createMiddleware, createUI, setupWebSocket, getRequestId } from '@geekmidas/telescope/server/hono';
348
338
  ```
349
339
 
350
340
  #### `createMiddleware(telescope)`
@@ -355,12 +345,12 @@ Returns Hono middleware that captures requests and responses.
355
345
  app.use('*', createMiddleware(telescope));
356
346
  ```
357
347
 
358
- #### `createApi(telescope)`
348
+ #### `createUI(telescope)`
359
349
 
360
- Returns a Hono app serving the JSON API under `/api`.
350
+ Returns a Hono app with dashboard UI and API routes.
361
351
 
362
352
  ```typescript
363
- app.route('/__telescope', createApi(telescope));
353
+ app.route('/__telescope', createUI(telescope));
364
354
  ```
365
355
 
366
356
  #### `setupWebSocket(app, telescope, upgradeWebSocket)`
@@ -371,7 +361,7 @@ Set up WebSocket routes for real-time updates.
371
361
  import { createNodeWebSocket } from '@hono/node-ws';
372
362
 
373
363
  const { upgradeWebSocket } = createNodeWebSocket({ app });
374
- setupWebSocket(createApi(telescope), telescope, upgradeWebSocket);
364
+ setupWebSocket(createUI(telescope), telescope, upgradeWebSocket);
375
365
  ```
376
366
 
377
367
  #### `getRequestId(c)`
@@ -542,9 +532,9 @@ const requestLogger = logger.withRequestId('req-abc123');
542
532
  requestLogger.info('Processing request');
543
533
  ```
544
534
 
545
- ## JSON API
535
+ ## Dashboard API
546
536
 
547
- `createApi` serves a read API at the path it is mounted on:
537
+ The dashboard UI is served at the configured path. It also exposes a REST API:
548
538
 
549
539
  | Endpoint | Description |
550
540
  |----------|-------------|
@@ -0,0 +1,47 @@
1
+ import { MetricBucket, MetricPoint, MetricQuery, MetricResult, MetricsStorageConfig, PartitionInfo, RollupOptions } from "./types-CbNGXnJE.mjs";
2
+ import { MetricsStorage } from "./MetricsStorage-BWyP2_12.mjs";
3
+
4
+ //#region src/metrics/storage/InMemoryMetricsStorage.d.ts
5
+
6
+ /**
7
+ * In-memory metrics storage for development and testing.
8
+ *
9
+ * Features:
10
+ * - Buffered writes with configurable flush interval
11
+ * - Time-bucketed aggregation
12
+ * - Basic percentile calculation (reservoir sampling)
13
+ * - Automatic pruning based on retention
14
+ *
15
+ * Not suitable for production - use a proper time-series database.
16
+ */
17
+ declare class InMemoryMetricsStorage implements MetricsStorage {
18
+ private config;
19
+ private buffer;
20
+ private buckets;
21
+ private samples;
22
+ private flushTimer;
23
+ constructor(config?: Partial<MetricsStorageConfig>);
24
+ write(points: MetricPoint[]): Promise<void>;
25
+ flush(): Promise<void>;
26
+ private aggregatePoint;
27
+ query(query: MetricQuery): Promise<MetricResult[]>;
28
+ getBucket(projectId: string, name: string, bucket: Date): Promise<MetricBucket | null>;
29
+ rollup(_options: RollupOptions): Promise<number>;
30
+ prune(): Promise<number>;
31
+ listPartitions(_tier?: string): Promise<PartitionInfo[]>;
32
+ getConfig(): MetricsStorageConfig;
33
+ close(): Promise<void>;
34
+ private getBucketTime;
35
+ private getBucketKey;
36
+ private hashLabels;
37
+ private getIntervalMs;
38
+ private matchesPattern;
39
+ private matchesLabels;
40
+ private getGroupKey;
41
+ private filterLabels;
42
+ private percentile;
43
+ }
44
+ //# sourceMappingURL=InMemoryMetricsStorage.d.ts.map
45
+ //#endregion
46
+ export { InMemoryMetricsStorage };
47
+ //# sourceMappingURL=InMemoryMetricsStorage-BbKCL3YL.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryMetricsStorage-BbKCL3YL.d.mts","names":[],"sources":["../src/metrics/storage/InMemoryMetricsStorage.ts"],"sourcesContent":[],"mappings":";;;;;;;AAyBA;;;;;;;;;AAkFkC,cAlFrB,sBAAA,YAAkC,cAkFb,CAAA;EAAO,QA0H/B,MAAA;EAAI,QACF,MAAA;EAAY,QAApB,OAAA;EAAO,QAgBa,OAAA;EAAa,QAAG,UAAA;EAAO,WAK/B,CAAA,MAAA,CAAA,EA3NK,OA2NL,CA3Na,oBA2Nb,CAAA;EAAO,KAiCwB,CAAA,MAAA,EAlP1B,WAkP0B,EAAA,CAAA,EAlPV,OAkPU,CAAA,IAAA,CAAA;EAAa,KAArB,CAAA,CAAA,EA1OvB,OA0OuB,CAAA,IAAA,CAAA;EAAO,QAKhC,cAAA;EAAoB,KAIlB,CAAA,KAAA,EA1LI,WA0LJ,CAAA,EA1LkB,OA0LlB,CA1L0B,YA0L1B,EAAA,CAAA;EAAO,SA5QwB,CAAA,SAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EA4MrC,IA5MqC,CAAA,EA6M3C,OA7M2C,CA6MnC,YA7MmC,GAAA,IAAA,CAAA;EAAc,MAAA,CAAA,QAAA,EA6NrC,aA7NqC,CAAA,EA6NrB,OA7NqB,CAAA,MAAA,CAAA;WAkO7C;kCAiCuB,QAAQ;eAKjC;WAIE"}
@@ -0,0 +1,247 @@
1
+ import { DEFAULT_METRICS_CONFIG } from "./types-ojhnLdwz.mjs";
2
+
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
+ ...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) {
170
+ const timestamp = parseInt(key.split(":").pop() ?? "0", 10);
171
+ if (timestamp < cutoff) this.samples.delete(key);
172
+ }
173
+ return deleted;
174
+ }
175
+ async listPartitions(_tier) {
176
+ return [];
177
+ }
178
+ getConfig() {
179
+ return this.config;
180
+ }
181
+ async close() {
182
+ if (this.flushTimer) {
183
+ clearInterval(this.flushTimer);
184
+ this.flushTimer = null;
185
+ }
186
+ await this.flush();
187
+ this.buckets.clear();
188
+ this.samples.clear();
189
+ }
190
+ getBucketTime(timestamp, interval) {
191
+ const ms = this.getIntervalMs(interval);
192
+ return new Date(Math.floor(timestamp.getTime() / ms) * ms);
193
+ }
194
+ getBucketKey(point, bucketTime) {
195
+ return [
196
+ point.projectId,
197
+ point.service,
198
+ point.environment,
199
+ point.name,
200
+ this.hashLabels(point.labels),
201
+ bucketTime.getTime()
202
+ ].join(":");
203
+ }
204
+ hashLabels(labels) {
205
+ const sorted = Object.keys(labels).sort().map((k) => `${k}=${labels[k]}`).join(",");
206
+ return sorted || "_empty_";
207
+ }
208
+ getIntervalMs(interval) {
209
+ const map = {
210
+ "1m": 6e4,
211
+ "5m": 3e5,
212
+ "15m": 9e5,
213
+ "1h": 36e5,
214
+ "6h": 216e5,
215
+ "1d": 864e5
216
+ };
217
+ return map[interval];
218
+ }
219
+ matchesPattern(name, pattern) {
220
+ if (!pattern.includes("*")) return name === pattern;
221
+ const regex = new RegExp(`^${pattern.replace(/\./g, "\\.").replace(/\*/g, ".*")}$`);
222
+ return regex.test(name);
223
+ }
224
+ matchesLabels(labels, filter) {
225
+ for (const [key, value] of Object.entries(filter)) if (labels[key] !== value) return false;
226
+ return true;
227
+ }
228
+ getGroupKey(bucket, groupBy) {
229
+ const parts = [bucket.name];
230
+ for (const key of groupBy) parts.push(`${key}=${bucket.labels[key] ?? ""}`);
231
+ return parts.join(":");
232
+ }
233
+ filterLabels(labels, keys) {
234
+ const result = {};
235
+ for (const key of keys) if (labels[key] !== void 0) result[key] = labels[key];
236
+ return result;
237
+ }
238
+ percentile(sorted, p) {
239
+ if (sorted.length === 0) return 0;
240
+ const index = Math.ceil(p / 100 * sorted.length) - 1;
241
+ return sorted[Math.max(0, index)] ?? 0;
242
+ }
243
+ };
244
+
245
+ //#endregion
246
+ export { InMemoryMetricsStorage };
247
+ //# sourceMappingURL=InMemoryMetricsStorage-C4drxT7G.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryMetricsStorage-C4drxT7G.mjs","names":["config: Partial<MetricsStorageConfig>","points: MetricPoint[]","point: MetricPoint","query: MetricQuery","allSamples: number[]","projectId: string","name: string","bucket: Date","_options: RollupOptions","_tier?: string","timestamp: Date","interval: AggregationInterval","bucketTime: Date","labels: MetricLabels","map: Record<AggregationInterval, number>","pattern: string","filter: MetricLabels","bucket: MetricBucket","groupBy: string[]","keys: string[]","result: MetricLabels","sorted: number[]","p: number"],"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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"}