@geekmidas/telescope 10.0.0-alpha.99 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +79 -0
- package/README.md +18 -28
- package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts +47 -0
- package/dist/InMemoryMetricsStorage-BbKCL3YL.d.mts.map +1 -0
- package/dist/InMemoryMetricsStorage-C4drxT7G.mjs +247 -0
- package/dist/InMemoryMetricsStorage-C4drxT7G.mjs.map +1 -0
- package/dist/InMemoryMetricsStorage-D0njWUSi.cjs +252 -0
- package/dist/InMemoryMetricsStorage-D0njWUSi.cjs.map +1 -0
- package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts +47 -0
- package/dist/InMemoryMetricsStorage-TvPdZjL0.d.cts.map +1 -0
- package/dist/{MetricsAggregator-BJdIvfEv.d.mts → MetricsAggregator-4SqelGcG.d.cts} +6 -3
- package/dist/MetricsAggregator-4SqelGcG.d.cts.map +1 -0
- package/dist/MetricsAggregator-B7lUICdH.cjs +363 -0
- package/dist/MetricsAggregator-B7lUICdH.cjs.map +1 -0
- package/dist/{MetricsAggregator-CnC3oT5q.d.cts → MetricsAggregator-DZrW8ls6.d.mts} +6 -3
- package/dist/MetricsAggregator-DZrW8ls6.d.mts.map +1 -0
- package/dist/MetricsAggregator-S3DQWNas.mjs +357 -0
- package/dist/MetricsAggregator-S3DQWNas.mjs.map +1 -0
- package/dist/MetricsStorage-B86e4131.d.cts +60 -0
- package/dist/MetricsStorage-B86e4131.d.cts.map +1 -0
- package/dist/MetricsStorage-BWyP2_12.d.mts +60 -0
- package/dist/MetricsStorage-BWyP2_12.d.mts.map +1 -0
- package/dist/MetricsStorage-BypQXWiv.mjs +0 -0
- package/dist/MetricsStorage-Or8pVCe4.cjs +0 -0
- package/dist/Telescope-Cs3fv8jt.cjs +395 -0
- package/dist/Telescope-Cs3fv8jt.cjs.map +1 -0
- package/dist/{Telescope-BVfDvVvY.d.mts → Telescope-D4nmwDRA.d.cts} +7 -4
- package/dist/Telescope-D4nmwDRA.d.cts.map +1 -0
- package/dist/Telescope-Dh5av3FC.mjs +389 -0
- package/dist/Telescope-Dh5av3FC.mjs.map +1 -0
- package/dist/{Telescope-DeqSHfuB.d.cts → Telescope-Dl6VSfxd.d.mts} +7 -4
- package/dist/Telescope-Dl6VSfxd.d.mts.map +1 -0
- package/dist/Telescope.cjs +4 -385
- package/dist/Telescope.d.cts +3 -1
- package/dist/Telescope.d.mts +3 -1
- package/dist/Telescope.mjs +4 -384
- package/dist/adapters/index.d.cts +2 -2
- package/dist/adapters/index.d.mts +2 -2
- package/dist/adapters/index.mjs +0 -1
- package/dist/adapters/lambda.cjs +10 -9
- package/dist/adapters/lambda.cjs.map +1 -1
- package/dist/adapters/lambda.d.cts +13 -9
- package/dist/adapters/lambda.d.cts.map +1 -1
- package/dist/adapters/lambda.d.mts +13 -9
- package/dist/adapters/lambda.d.mts.map +1 -1
- package/dist/adapters/lambda.mjs +4 -3
- package/dist/adapters/lambda.mjs.map +1 -1
- package/dist/adapters/middy.cjs +4 -236
- package/dist/adapters/middy.d.cts +5 -60
- package/dist/adapters/middy.d.mts +5 -60
- package/dist/adapters/middy.mjs +3 -234
- package/dist/adapters/types.d.cts +2 -162
- package/dist/adapters/types.d.mts +2 -162
- package/dist/adapters/types.mjs +0 -1
- package/dist/{rolldown-runtime-VH7oDXx4.cjs → chunk-CUT6urMc.cjs} +10 -8
- package/dist/core--quSp5Qr.d.mts +78 -0
- package/dist/core--quSp5Qr.d.mts.map +1 -0
- package/dist/core-B4Jpia5H.d.cts +78 -0
- package/dist/core-B4Jpia5H.d.cts.map +1 -0
- package/dist/core-CtVHRJGv.cjs +199 -0
- package/dist/core-CtVHRJGv.cjs.map +1 -0
- package/dist/core-D6hJ6exL.mjs +139 -0
- package/dist/core-D6hJ6exL.mjs.map +1 -0
- package/dist/core.cjs +22 -22
- package/dist/core.d.cts +4 -4
- package/dist/core.d.mts +4 -4
- package/dist/core.mjs +4 -3
- package/dist/hono--uKQ7Jgi.d.mts +71 -0
- package/dist/hono--uKQ7Jgi.d.mts.map +1 -0
- package/dist/hono-C4EgpbKQ.cjs +160 -0
- package/dist/hono-C4EgpbKQ.cjs.map +1 -0
- package/dist/hono-CemCKU87.d.cts +71 -0
- package/dist/hono-CemCKU87.d.cts.map +1 -0
- package/dist/hono-DxhvnVbF.mjs +136 -0
- package/dist/hono-DxhvnVbF.mjs.map +1 -0
- package/dist/http-BiNtg85L.d.mts +107 -0
- package/dist/http-BiNtg85L.d.mts.map +1 -0
- package/dist/http-DQzgLczm.mjs +159 -0
- package/dist/http-DQzgLczm.mjs.map +1 -0
- package/dist/http-D_Z8sYXZ.cjs +219 -0
- package/dist/http-D_Z8sYXZ.cjs.map +1 -0
- package/dist/http-Dvca6fC3.d.cts +107 -0
- package/dist/http-Dvca6fC3.d.cts.map +1 -0
- package/dist/index-BL32-cvv.d.cts +1 -0
- package/dist/index-CsuikFeJ.d.mts +1 -0
- package/dist/index.cjs +9 -8
- package/dist/index.d.cts +6 -5
- package/dist/index.d.mts +6 -5
- package/dist/index.mjs +7 -5
- package/dist/instrumentation/core.cjs +11 -147
- package/dist/instrumentation/core.d.cts +3 -74
- package/dist/instrumentation/core.d.mts +3 -74
- package/dist/instrumentation/core.mjs +2 -137
- package/dist/instrumentation/hono.cjs +6 -174
- package/dist/instrumentation/hono.d.cts +2 -86
- package/dist/instrumentation/hono.d.mts +2 -86
- package/dist/instrumentation/hono.mjs +3 -170
- package/dist/instrumentation/http.cjs +11 -189
- package/dist/instrumentation/http.d.cts +2 -119
- package/dist/instrumentation/http.d.mts +2 -119
- package/dist/instrumentation/http.mjs +2 -178
- package/dist/instrumentation/index.cjs +47 -56
- package/dist/instrumentation/index.d.cts +9 -11
- package/dist/instrumentation/index.d.mts +9 -11
- package/dist/instrumentation/index.mjs +9 -10
- package/dist/instrumentation/middleware.cjs +6 -164
- package/dist/instrumentation/middleware.d.cts +2 -83
- package/dist/instrumentation/middleware.d.mts +2 -83
- package/dist/instrumentation/middleware.mjs +3 -160
- package/dist/instrumentation/otel.cjs +3 -137
- package/dist/instrumentation/otel.d.cts +2 -97
- package/dist/instrumentation/otel.d.mts +2 -97
- package/dist/instrumentation/otel.mjs +3 -136
- package/dist/instrumentation/setup.cjs +4 -142
- package/dist/instrumentation/setup.d.cts +3 -139
- package/dist/instrumentation/setup.d.mts +3 -139
- package/dist/instrumentation/setup.mjs +3 -139
- package/dist/instrumentation/tracing.cjs +10 -114
- package/dist/instrumentation/tracing.d.cts +2 -49
- package/dist/instrumentation/tracing.d.mts +2 -49
- package/dist/instrumentation/tracing.mjs +2 -105
- package/dist/logger/console.cjs +12 -18
- package/dist/logger/console.cjs.map +1 -1
- package/dist/logger/console.d.cts +10 -7
- package/dist/logger/console.d.cts.map +1 -1
- package/dist/logger/console.d.mts +10 -7
- package/dist/logger/console.d.mts.map +1 -1
- package/dist/logger/console.mjs +11 -17
- package/dist/logger/console.mjs.map +1 -1
- package/dist/logger/pino.cjs +5 -6
- package/dist/logger/pino.cjs.map +1 -1
- package/dist/logger/pino.d.cts +10 -6
- package/dist/logger/pino.d.cts.map +1 -1
- package/dist/logger/pino.d.mts +10 -6
- package/dist/logger/pino.d.mts.map +1 -1
- package/dist/logger/pino.mjs +3 -2
- package/dist/logger/pino.mjs.map +1 -1
- package/dist/memory--BK4iWiv.d.cts +40 -0
- package/dist/memory--BK4iWiv.d.cts.map +1 -0
- package/dist/memory-6S9H-IF5.mjs +123 -0
- package/dist/memory-6S9H-IF5.mjs.map +1 -0
- package/dist/memory-B0d_n1g5.cjs +129 -0
- package/dist/memory-B0d_n1g5.cjs.map +1 -0
- package/dist/memory-DCirEVFW.d.mts +40 -0
- package/dist/memory-DCirEVFW.d.mts.map +1 -0
- package/dist/metrics/MetricsAggregator.cjs +2 -354
- package/dist/metrics/MetricsAggregator.d.cts +2 -1
- package/dist/metrics/MetricsAggregator.d.mts +2 -1
- package/dist/metrics/MetricsAggregator.mjs +2 -353
- package/dist/metrics/index.cjs +4 -3
- package/dist/metrics/index.d.cts +4 -2
- package/dist/metrics/index.d.mts +4 -2
- package/dist/metrics/index.mjs +4 -2
- package/dist/metrics/storage/InMemoryMetricsStorage.cjs +3 -240
- package/dist/metrics/storage/InMemoryMetricsStorage.d.cts +4 -43
- package/dist/metrics/storage/InMemoryMetricsStorage.d.mts +4 -43
- package/dist/metrics/storage/InMemoryMetricsStorage.mjs +3 -239
- package/dist/metrics/storage/MetricsStorage.cjs +1 -0
- package/dist/metrics/storage/MetricsStorage.d.cts +3 -56
- package/dist/metrics/storage/MetricsStorage.d.mts +3 -56
- package/dist/metrics/storage/MetricsStorage.mjs +1 -1
- package/dist/metrics/storage/index.cjs +6 -6
- package/dist/metrics/storage/index.d.cts +3 -3
- package/dist/metrics/storage/index.d.mts +3 -3
- package/dist/metrics/storage/index.mjs +5 -4
- package/dist/metrics/storage/types.cjs +2 -34
- package/dist/metrics/storage/types.d.cts +2 -207
- package/dist/metrics/storage/types.d.mts +2 -207
- package/dist/metrics/storage/types.mjs +2 -33
- package/dist/metrics-D5YT-Rnq.mjs +0 -0
- package/dist/metrics-fhD3l3C3.cjs +0 -0
- package/dist/middleware-B2jFUukM.cjs +184 -0
- package/dist/middleware-B2jFUukM.cjs.map +1 -0
- package/dist/middleware-BTDncHwm.mjs +160 -0
- package/dist/middleware-BTDncHwm.mjs.map +1 -0
- package/dist/middleware-CA84nsNN.d.cts +74 -0
- package/dist/middleware-CA84nsNN.d.cts.map +1 -0
- package/dist/middleware-DAceVpfw.d.mts +74 -0
- package/dist/middleware-DAceVpfw.d.mts.map +1 -0
- package/dist/middy-B6Btl8XE.d.mts +64 -0
- package/dist/middy-B6Btl8XE.d.mts.map +1 -0
- package/dist/middy-BTR3cyvk.mjs +236 -0
- package/dist/middy-BTR3cyvk.mjs.map +1 -0
- package/dist/middy-Bq0defVg.d.cts +64 -0
- package/dist/middy-Bq0defVg.d.cts.map +1 -0
- package/dist/middy-y5Zp27eG.cjs +247 -0
- package/dist/middy-y5Zp27eG.cjs.map +1 -0
- package/dist/otel-1bJPb2Z7.d.mts +101 -0
- package/dist/otel-1bJPb2Z7.d.mts.map +1 -0
- package/dist/otel-C1HqHA2O.cjs +136 -0
- package/dist/otel-C1HqHA2O.cjs.map +1 -0
- package/dist/otel-SBVoVEHr.d.cts +101 -0
- package/dist/otel-SBVoVEHr.d.cts.map +1 -0
- package/dist/otel-wulj5B-X.mjs +130 -0
- package/dist/otel-wulj5B-X.mjs.map +1 -0
- package/dist/otlp/hono.cjs +15 -9
- package/dist/otlp/hono.cjs.map +1 -1
- package/dist/otlp/hono.d.cts +13 -3
- package/dist/otlp/hono.d.cts.map +1 -1
- package/dist/otlp/hono.d.mts +13 -3
- package/dist/otlp/hono.d.mts.map +1 -1
- package/dist/otlp/hono.mjs +11 -5
- package/dist/otlp/hono.mjs.map +1 -1
- package/dist/otlp/index.cjs +11 -11
- package/dist/otlp/index.d.cts +7 -4
- package/dist/otlp/index.d.mts +7 -4
- package/dist/otlp/index.mjs +5 -4
- package/dist/otlp/receiver.cjs +4 -88
- package/dist/otlp/receiver.d.cts +7 -59
- package/dist/otlp/receiver.d.mts +7 -59
- package/dist/otlp/receiver.mjs +4 -87
- package/dist/otlp/transformer.cjs +5 -214
- package/dist/otlp/transformer.d.cts +3 -1
- package/dist/otlp/transformer.d.mts +3 -1
- package/dist/otlp/transformer.mjs +3 -211
- package/dist/otlp/types.cjs +5 -57
- package/dist/otlp/types.d.cts +1 -1
- package/dist/otlp/types.d.mts +1 -1
- package/dist/otlp/types.mjs +2 -53
- package/dist/receiver-Cj1lbAOO.cjs +94 -0
- package/dist/receiver-Cj1lbAOO.cjs.map +1 -0
- package/dist/receiver-CxVd_9CB.mjs +89 -0
- package/dist/receiver-CxVd_9CB.mjs.map +1 -0
- package/dist/receiver-DLICx5uU.d.cts +63 -0
- package/dist/receiver-DLICx5uU.d.cts.map +1 -0
- package/dist/receiver-UeZT-H8u.d.mts +63 -0
- package/dist/receiver-UeZT-H8u.d.mts.map +1 -0
- package/dist/redact-BzkITCNW.mjs +83 -0
- package/dist/redact-BzkITCNW.mjs.map +1 -0
- package/dist/redact-DVaSSPZT.cjs +95 -0
- package/dist/redact-DVaSSPZT.cjs.map +1 -0
- package/dist/redact.cjs +3 -84
- package/dist/redact.d.cts +8 -4
- package/dist/redact.d.cts.map +1 -1
- package/dist/redact.d.mts +8 -4
- package/dist/redact.d.mts.map +1 -1
- package/dist/redact.mjs +2 -80
- package/dist/server/hono.cjs +54 -33
- package/dist/server/hono.cjs.map +1 -1
- package/dist/server/hono.d.cts +14 -19
- package/dist/server/hono.d.cts.map +1 -1
- package/dist/server/hono.d.mts +14 -19
- package/dist/server/hono.d.mts.map +1 -1
- package/dist/server/hono.mjs +52 -31
- package/dist/server/hono.mjs.map +1 -1
- package/dist/setup-B9jM77Qk.mjs +98 -0
- package/dist/setup-B9jM77Qk.mjs.map +1 -0
- package/dist/setup-Bkxm4g6b.d.mts +87 -0
- package/dist/setup-Bkxm4g6b.d.mts.map +1 -0
- package/dist/setup-CYpff5B9.cjs +110 -0
- package/dist/setup-CYpff5B9.cjs.map +1 -0
- package/dist/setup-D58N1f9O.d.cts +87 -0
- package/dist/setup-D58N1f9O.d.cts.map +1 -0
- package/dist/storage/kysely.cjs +70 -82
- package/dist/storage/kysely.cjs.map +1 -1
- package/dist/storage/kysely.d.cts +20 -36
- package/dist/storage/kysely.d.cts.map +1 -1
- package/dist/storage/kysely.d.mts +20 -36
- package/dist/storage/kysely.d.mts.map +1 -1
- package/dist/storage/kysely.mjs +69 -81
- package/dist/storage/kysely.mjs.map +1 -1
- package/dist/storage/memory.cjs +2 -122
- package/dist/storage/memory.d.cts +3 -36
- package/dist/storage/memory.d.mts +3 -36
- package/dist/storage/memory.mjs +2 -121
- package/dist/tracing-BX8uY2nR.d.cts +53 -0
- package/dist/tracing-BX8uY2nR.d.cts.map +1 -0
- package/dist/tracing-Bt1zWRlb.cjs +167 -0
- package/dist/tracing-Bt1zWRlb.cjs.map +1 -0
- package/dist/tracing-Cijm_5NI.mjs +113 -0
- package/dist/tracing-Cijm_5NI.mjs.map +1 -0
- package/dist/tracing-PnECEbEu.d.mts +53 -0
- package/dist/tracing-PnECEbEu.d.mts.map +1 -0
- package/dist/transformer-BXQPhzql.mjs +215 -0
- package/dist/transformer-BXQPhzql.mjs.map +1 -0
- package/dist/transformer-CLGZ0EQc.cjs +232 -0
- package/dist/transformer-CLGZ0EQc.cjs.map +1 -0
- package/dist/{transformer-BtqjAs0b.d.cts → transformer-CTGsaVfV.d.mts} +8 -4
- package/dist/transformer-CTGsaVfV.d.mts.map +1 -0
- package/dist/{transformer-DI6t8-YA.d.mts → transformer-ICEbxpFf.d.cts} +8 -4
- package/dist/transformer-ICEbxpFf.d.cts.map +1 -0
- package/dist/{types-BVujq4zd.d.mts → types-B1EIa_cQ.d.mts} +4 -3
- package/dist/types-B1EIa_cQ.d.mts.map +1 -0
- package/dist/types-BRzW1NM8.d.cts +166 -0
- package/dist/types-BRzW1NM8.d.cts.map +1 -0
- package/dist/types-BS3Rx8Sk.d.cts +209 -0
- package/dist/types-BS3Rx8Sk.d.cts.map +1 -0
- package/dist/types-Bwm_jNU7.mjs +54 -0
- package/dist/types-Bwm_jNU7.mjs.map +1 -0
- package/dist/types-BzQ78Efw.d.mts +166 -0
- package/dist/types-BzQ78Efw.d.mts.map +1 -0
- package/dist/types-CbNGXnJE.d.mts +209 -0
- package/dist/types-CbNGXnJE.d.mts.map +1 -0
- package/dist/{types-DVETVdpa.d.cts → types-CmOB7CLO.d.cts} +7 -6
- package/dist/types-CmOB7CLO.d.cts.map +1 -0
- package/dist/{types-DVETVdpa.d.mts → types-DBc0q5KD.d.mts} +7 -6
- package/dist/types-DBc0q5KD.d.mts.map +1 -0
- package/dist/types-Dsh-DIO_.cjs +78 -0
- package/dist/types-Dsh-DIO_.cjs.map +1 -0
- package/dist/types-ZW-nfWf6.cjs +40 -0
- package/dist/types-ZW-nfWf6.cjs.map +1 -0
- package/dist/{types-BVujq4zd.d.cts → types-l7Rlb5Mg.d.cts} +4 -3
- package/dist/types-l7Rlb5Mg.d.cts.map +1 -0
- package/dist/types-ojhnLdwz.mjs +34 -0
- package/dist/types-ojhnLdwz.mjs.map +1 -0
- package/dist/types.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/types.mjs +0 -1
- package/dist/ui-assets-BEXqOQLe.cjs +48 -0
- package/dist/ui-assets-BEXqOQLe.cjs.map +1 -0
- package/dist/ui-assets-BhTDUsrM.mjs +30 -0
- package/dist/ui-assets-BhTDUsrM.mjs.map +1 -0
- package/dist/ui-assets.cjs +5 -0
- package/dist/ui-assets.d.cts +13 -0
- package/dist/ui-assets.d.cts.map +1 -0
- package/dist/ui-assets.d.mts +13 -0
- package/dist/ui-assets.d.mts.map +1 -0
- package/dist/ui-assets.mjs +3 -0
- package/package.json +46 -46
- package/src/Telescope.ts +561 -0
- package/src/__tests__/Telescope.spec.ts +438 -0
- package/src/__tests__/pino-transport.spec.ts +115 -0
- package/src/__tests__/redact.spec.ts +336 -0
- package/src/adapters/__tests__/lambda.spec.ts +318 -0
- package/src/adapters/__tests__/middy.spec.ts +741 -0
- package/src/adapters/index.ts +22 -0
- package/src/adapters/lambda.ts +432 -0
- package/src/adapters/middy.ts +402 -0
- package/src/adapters/types.ts +181 -0
- package/src/core.ts +51 -0
- package/src/index.ts +34 -0
- package/src/instrumentation/__tests__/core.spec.ts +248 -0
- package/src/instrumentation/__tests__/hono.spec.ts +348 -0
- package/src/instrumentation/__tests__/middleware.spec.ts +528 -0
- package/src/instrumentation/__tests__/otel.spec.ts +291 -0
- package/src/instrumentation/__tests__/tracing.spec.ts +208 -0
- package/src/instrumentation/core.ts +228 -0
- package/src/instrumentation/hono.ts +270 -0
- package/src/instrumentation/http.ts +306 -0
- package/src/instrumentation/index.ts +90 -0
- package/src/instrumentation/middleware.ts +297 -0
- package/src/instrumentation/otel.ts +271 -0
- package/src/instrumentation/setup.ts +246 -0
- package/src/instrumentation/tracing.ts +145 -0
- package/src/logger/__tests__/console.spec.ts +366 -0
- package/src/logger/__tests__/pino.spec.ts +217 -0
- package/src/logger/console.ts +230 -0
- package/src/logger/pino.ts +201 -0
- package/src/metrics/MetricsAggregator.ts +555 -0
- package/src/metrics/__tests__/MetricsAggregator.spec.ts +298 -0
- package/src/metrics/index.ts +2 -0
- package/src/metrics/storage/InMemoryMetricsStorage.ts +380 -0
- package/src/metrics/storage/MetricsStorage.ts +74 -0
- package/src/metrics/storage/index.ts +3 -0
- package/src/metrics/storage/types.ts +243 -0
- package/src/otlp/__tests__/receiver.spec.ts +367 -0
- package/src/otlp/__tests__/transformer.spec.ts +455 -0
- package/src/otlp/hono.ts +120 -0
- package/src/otlp/index.ts +22 -0
- package/src/otlp/receiver.ts +162 -0
- package/src/otlp/transformer.ts +367 -0
- package/src/otlp/types.ts +364 -0
- package/src/redact.ts +116 -0
- package/src/server/__tests__/hono.spec.ts +814 -0
- package/src/server/hono.ts +442 -0
- package/src/storage/__tests__/kysely.spec.ts +715 -0
- package/src/storage/__tests__/memory.spec.ts +694 -0
- package/src/storage/kysely.ts +599 -0
- package/src/storage/memory.ts +204 -0
- package/src/types.ts +447 -0
- package/src/ui-assets.ts +40 -0
- package/tsconfig.json +9 -0
- package/ui/CHANGELOG.md +7 -0
- package/ui/index.html +12 -0
- package/ui/node_modules/.bin/tsc +21 -0
- package/ui/node_modules/.bin/tsserver +21 -0
- package/ui/node_modules/.bin/vite +21 -0
- package/ui/package.json +24 -0
- package/ui/src/App.tsx +595 -0
- package/ui/src/api.ts +88 -0
- package/ui/src/components/ExceptionDetail.tsx +100 -0
- package/ui/src/components/FilterBar.tsx +162 -0
- package/ui/src/components/LogDetail.tsx +91 -0
- package/ui/src/components/RequestDetail.tsx +143 -0
- package/ui/src/main.tsx +10 -0
- package/ui/src/styles.css +11 -0
- package/ui/src/types.ts +63 -0
- package/ui/src/vite-env.d.ts +1 -0
- package/ui/src/vite-plugin-gkm-config.ts +54 -0
- package/ui/tsconfig.json +20 -0
- package/ui/tsconfig.tsbuildinfo +1 -0
- package/ui/vite.config.ts +13 -0
- package/dist/MetricsAggregator-BJdIvfEv.d.mts.map +0 -1
- package/dist/MetricsAggregator-CnC3oT5q.d.cts.map +0 -1
- package/dist/Telescope-BVfDvVvY.d.mts.map +0 -1
- package/dist/Telescope-DeqSHfuB.d.cts.map +0 -1
- package/dist/Telescope.cjs.map +0 -1
- package/dist/Telescope.mjs.map +0 -1
- package/dist/adapters/middy.cjs.map +0 -1
- package/dist/adapters/middy.d.cts.map +0 -1
- package/dist/adapters/middy.d.mts.map +0 -1
- package/dist/adapters/middy.mjs.map +0 -1
- package/dist/adapters/types.d.cts.map +0 -1
- package/dist/adapters/types.d.mts.map +0 -1
- package/dist/instrumentation/core.cjs.map +0 -1
- package/dist/instrumentation/core.d.cts.map +0 -1
- package/dist/instrumentation/core.d.mts.map +0 -1
- package/dist/instrumentation/core.mjs.map +0 -1
- package/dist/instrumentation/hono.cjs.map +0 -1
- package/dist/instrumentation/hono.d.cts.map +0 -1
- package/dist/instrumentation/hono.d.mts.map +0 -1
- package/dist/instrumentation/hono.mjs.map +0 -1
- package/dist/instrumentation/http.cjs.map +0 -1
- package/dist/instrumentation/http.d.cts.map +0 -1
- package/dist/instrumentation/http.d.mts.map +0 -1
- package/dist/instrumentation/http.mjs.map +0 -1
- package/dist/instrumentation/middleware.cjs.map +0 -1
- package/dist/instrumentation/middleware.d.cts.map +0 -1
- package/dist/instrumentation/middleware.d.mts.map +0 -1
- package/dist/instrumentation/middleware.mjs.map +0 -1
- package/dist/instrumentation/otel.cjs.map +0 -1
- package/dist/instrumentation/otel.d.cts.map +0 -1
- package/dist/instrumentation/otel.d.mts.map +0 -1
- package/dist/instrumentation/otel.mjs.map +0 -1
- package/dist/instrumentation/sampler.cjs +0 -54
- package/dist/instrumentation/sampler.cjs.map +0 -1
- package/dist/instrumentation/sampler.d.cts +0 -38
- package/dist/instrumentation/sampler.d.cts.map +0 -1
- package/dist/instrumentation/sampler.d.mts +0 -38
- package/dist/instrumentation/sampler.d.mts.map +0 -1
- package/dist/instrumentation/sampler.mjs +0 -52
- package/dist/instrumentation/sampler.mjs.map +0 -1
- package/dist/instrumentation/setup.cjs.map +0 -1
- package/dist/instrumentation/setup.d.cts.map +0 -1
- package/dist/instrumentation/setup.d.mts.map +0 -1
- package/dist/instrumentation/setup.mjs.map +0 -1
- package/dist/instrumentation/tracing.cjs.map +0 -1
- package/dist/instrumentation/tracing.d.cts.map +0 -1
- package/dist/instrumentation/tracing.d.mts.map +0 -1
- package/dist/instrumentation/tracing.mjs.map +0 -1
- package/dist/instrumentation/trust.cjs +0 -107
- package/dist/instrumentation/trust.cjs.map +0 -1
- package/dist/instrumentation/trust.d.cts +0 -57
- package/dist/instrumentation/trust.d.cts.map +0 -1
- package/dist/instrumentation/trust.d.mts +0 -57
- package/dist/instrumentation/trust.d.mts.map +0 -1
- package/dist/instrumentation/trust.mjs +0 -104
- package/dist/instrumentation/trust.mjs.map +0 -1
- package/dist/metrics/MetricsAggregator.cjs.map +0 -1
- package/dist/metrics/MetricsAggregator.mjs.map +0 -1
- package/dist/metrics/storage/InMemoryMetricsStorage.cjs.map +0 -1
- package/dist/metrics/storage/InMemoryMetricsStorage.d.cts.map +0 -1
- package/dist/metrics/storage/InMemoryMetricsStorage.d.mts.map +0 -1
- package/dist/metrics/storage/InMemoryMetricsStorage.mjs.map +0 -1
- package/dist/metrics/storage/MetricsStorage.d.cts.map +0 -1
- package/dist/metrics/storage/MetricsStorage.d.mts.map +0 -1
- package/dist/metrics/storage/types.cjs.map +0 -1
- package/dist/metrics/storage/types.d.cts.map +0 -1
- package/dist/metrics/storage/types.d.mts.map +0 -1
- package/dist/metrics/storage/types.mjs.map +0 -1
- package/dist/otlp/receiver.cjs.map +0 -1
- package/dist/otlp/receiver.d.cts.map +0 -1
- package/dist/otlp/receiver.d.mts.map +0 -1
- package/dist/otlp/receiver.mjs.map +0 -1
- package/dist/otlp/transformer.cjs.map +0 -1
- package/dist/otlp/transformer.mjs.map +0 -1
- package/dist/otlp/types.cjs.map +0 -1
- package/dist/otlp/types.mjs.map +0 -1
- package/dist/redact.cjs.map +0 -1
- package/dist/redact.mjs.map +0 -1
- package/dist/storage/memory.cjs.map +0 -1
- package/dist/storage/memory.d.cts.map +0 -1
- package/dist/storage/memory.d.mts.map +0 -1
- package/dist/storage/memory.mjs.map +0 -1
- package/dist/transformer-BtqjAs0b.d.cts.map +0 -1
- package/dist/transformer-DI6t8-YA.d.mts.map +0 -1
- package/dist/types-BVujq4zd.d.cts.map +0 -1
- package/dist/types-BVujq4zd.d.mts.map +0 -1
- package/dist/types-DVETVdpa.d.cts.map +0 -1
- 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
|
|
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 {
|
|
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
|
|
32
|
-
app.route('/__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
|
-
|
|
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**:
|
|
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:
|
|
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(
|
|
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 {
|
|
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
|
-
#### `
|
|
348
|
+
#### `createUI(telescope)`
|
|
359
349
|
|
|
360
|
-
Returns a Hono app
|
|
350
|
+
Returns a Hono app with dashboard UI and API routes.
|
|
361
351
|
|
|
362
352
|
```typescript
|
|
363
|
-
app.route('/__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(
|
|
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
|
-
##
|
|
535
|
+
## Dashboard API
|
|
546
536
|
|
|
547
|
-
|
|
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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"}
|