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