From 84de150f11e10bb7b35d506467d0adfc92c5ee2f Mon Sep 17 00:00:00 2001 From: ifLov Date: Wed, 2 Sep 2026 13:21:34 +0900 Subject: [PATCH] build(metrics): replace deprecated prom-client with @prometheus-io/client prom-client 15.1.3 is marked deprecated on npm in favour of the renamed @prometheus-io/client 0.16.1 from the same maintainers. The 0.16.0 breaking changes (MetricType enum removed, AggregatorRegistry deprecated, internal hashMap replaced, Node <22 dropped) touch nothing this repository uses; the Registry/Counter/Gauge/Histogram/collectDefaultMetrics surface is unchanged, so this is an import rename plus comment updates. Also bump @nestjs/swagger and @nestjs/typeorm to 12.0.1, and drop the unreferenced ts-loader and tsconfig-paths dev dependencies left over from the CommonJS era. ts-node stays because the TypeORM CLI runs through it. Verified: check:scaffold, lint, typecheck, build, test (317), test:e2e (20). Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01QXkjKrgep3qeXKza5ztu3r --- package.json | 8 +- pnpm-lock.yaml | 167 +++++++++++------- src/common/filters/all-exceptions.filter.ts | 2 +- src/health/health-metrics.service.spec.ts | 2 +- src/health/health-metrics.service.ts | 6 +- .../metrics/http-metrics.interceptor.spec.ts | 2 +- src/infra/metrics/http-metrics.interceptor.ts | 2 +- src/infra/metrics/metrics.service.spec.ts | 10 +- src/infra/metrics/metrics.service.ts | 2 +- .../queue/bullmq-metrics.service.spec.ts | 2 +- src/infra/queue/bullmq-metrics.service.ts | 2 +- 11 files changed, 123 insertions(+), 82 deletions(-) diff --git a/package.json b/package.json index f558982..c9d20dd 100644 --- a/package.json +++ b/package.json @@ -51,9 +51,10 @@ "@nestjs/cqrs": "^12.0.0", "@nestjs/mongoose": "^12.0.0", "@nestjs/platform-express": "^12.0.1", - "@nestjs/swagger": "^12.0.0", + "@nestjs/swagger": "^12.0.1", "@nestjs/throttler": "^6.4.0", - "@nestjs/typeorm": "^12.0.0", + "@nestjs/typeorm": "^12.0.1", + "@prometheus-io/client": "^0.16.1", "bullmq": "^5.70.4", "cache-manager": "^7.2.8", "cacheable": "^2.3.3", @@ -76,7 +77,6 @@ "pino-http": "^11.0.0", "pino-loki": "^2.6.0", "pino-pretty": "^13.1.1", - "prom-client": "^15.1.3", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.2", "swagger-ui-express": "^5.0.1", @@ -99,9 +99,7 @@ "ioredis-mock": "^8.13.1", "prettier": "^3.6.2", "supertest": "^7.1.1", - "ts-loader": "^9.5.4", "ts-node": "^10.9.2", - "tsconfig-paths": "^4.2.0", "tsx": "^4.23.12", "typescript": "^6.0.0", "typescript-eslint": "^8.68.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c09ceac..0651e00 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,14 +35,17 @@ importers: specifier: ^12.0.1 version: 12.0.1(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1)(supports-color@8.1.1) '@nestjs/swagger': - specifier: ^12.0.0 - version: 12.0.0(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2) + specifier: ^12.0.1 + version: 12.0.1(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2) '@nestjs/throttler': specifier: ^6.4.0 version: 6.5.0(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1)(reflect-metadata@0.2.2) '@nestjs/typeorm': - specifier: ^12.0.0 - version: 12.0.0(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.28(ioredis@5.10.0(supports-color@8.1.1))(pg@8.22.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@24.12.0)(typescript@6.0.3))) + specifier: ^12.0.1 + version: 12.0.1(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.28(ioredis@5.10.0(supports-color@8.1.1))(pg@8.22.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@24.12.0)(typescript@6.0.3))) + '@prometheus-io/client': + specifier: ^0.16.1 + version: 0.16.1 bullmq: specifier: ^5.70.4 version: 5.70.4(supports-color@8.1.1) @@ -109,9 +112,6 @@ importers: pino-pretty: specifier: ^13.1.1 version: 13.1.3 - prom-client: - specifier: ^15.1.3 - version: 15.1.3 reflect-metadata: specifier: ^0.2.2 version: 0.2.2 @@ -173,15 +173,9 @@ importers: supertest: specifier: ^7.1.1 version: 7.2.2(supports-color@8.1.1) - ts-loader: - specifier: ^9.5.4 - version: 9.5.4(typescript@6.0.3)(webpack@5.109.2(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)(uglify-js@3.19.3)) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@24.12.0)(typescript@6.0.3) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 tsx: specifier: ^4.23.12 version: 4.23.12 @@ -1322,10 +1316,10 @@ packages: prettier: optional: true - '@nestjs/swagger@12.0.0': + '@nestjs/swagger@12.0.1': resolution: { - integrity: sha512-FHl2VLSxDhKlOPFvUt3kzhGtVkYNuUiq9oDiEL3nsY3pQFReOEGFj+meySCWhj1rafOolmiBwUomQodIpJk8mg==, + integrity: sha512-fQ0WyutSSHedO9HzSkOFKFaRygYNGBno5EggcZljs+KL8tHzPPTO5oyJpaf3BoOKFGGsN/0B13EbIpH2pkPx8g==, } engines: { node: ^20.19.0 || >=22.12.0 } peerDependencies: @@ -1369,10 +1363,10 @@ packages: '@nestjs/core': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 reflect-metadata: ^0.1.13 || ^0.2.0 - '@nestjs/typeorm@12.0.0': + '@nestjs/typeorm@12.0.1': resolution: { - integrity: sha512-UnThkqS3qwXSyuoVrMvNaYy41BXT/E6wtZifOgmLnOOKVXGjct9504RT8mwSStkgSPgMVDJrFqlKP1mXto8knw==, + integrity: sha512-7dsdaD/PSiwCAAhv78+ScS3e6lW41BOMZ8LB7/v5p/hovSUc1wUH1DBXhLgqYx0ChXYLzDybBIADN6lvBhiM6w==, } engines: { node: '>=20.19.0' } peerDependencies: @@ -1421,6 +1415,13 @@ packages: } engines: { node: '>=14' } + '@prometheus-io/client@0.16.1': + resolution: + { + integrity: sha512-XkFPsGFGoSs/UMg/vh0QLDpanl/tsrOV5PLHdpGe8Ho+ir/Llhytr15j6y8ZwLrpIGzK9gTVVpIalA6C4UjUZw==, + } + engines: { node: ^22 || ^24 || >=26 } + '@redis/client@5.11.0': resolution: { @@ -3835,10 +3836,10 @@ packages: } hasBin: true - js-yaml@5.3.0: + js-yaml@5.4.1: resolution: { - integrity: sha512-muutsYr+e2+d3rTgUGslq5rxbBlUy3cJ61IsHag2QNDQV+7zXWjkUpmALIajhrlLlrgRUiymj6U3zUr/TMK84Q==, + integrity: sha512-28R/k+NAjeuf7+CKlTxWZVExJGwVVLwY06DgEnOMz2gEpfNkDcD7QvyiVPT0xy0XXhU8vHsd4Ot42OOPdJG7dQ==, } hasBin: true @@ -4871,14 +4872,6 @@ packages: integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==, } - prom-client@15.1.3: - resolution: - { - integrity: sha512-6ZiOBfCywsD4k1BN9IX0uZhF+tJkV8q8llP64G5Hajs4JOeVLPCwpPVcpXy3BwYiUGgyJzsJJQeOIv7+hDSq8g==, - } - engines: { node: ^16 || ^18 || >=20 } - deprecated: prom-client has been replaced by @prometheus-io/client - proxy-addr@2.0.7: resolution: { @@ -5429,10 +5422,10 @@ packages: integrity: sha512-nKZB0OuDvacB0s/lC2gbge+RigYvGRGpLLMWMFxaTUwfM+CfndVk9Th2IaTinqXiz6Mn26GK2zriCpv6/+5m3Q==, } - swagger-ui-dist@5.32.13: + swagger-ui-dist@5.32.14: resolution: { - integrity: sha512-qQobzb3DeC2LeK0j3E8812Ef4aIq1y9flJxvZkimkqUC/w4u7wS+yCc+VakqGJLweUUBrI24effhwo8OsAvNAw==, + integrity: sha512-nOA2pSQhcmODMUQZpJHYKNuwniDUqcOWGNaSCOoZv12FdOSJ9JxV95HtyRGNMqEBj6h6lCNTy20TgZDYTSuUIg==, } swagger-ui-express@5.0.1: @@ -6564,6 +6557,7 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 + optional: true '@jridgewell/resolve-uri@3.1.2': {} @@ -6571,6 +6565,7 @@ snapshots: dependencies: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 + optional: true '@jridgewell/sourcemap-codec@1.5.5': {} @@ -6760,7 +6755,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/swagger@12.0.0(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)': + '@nestjs/swagger@12.0.1(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1)(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)': dependencies: '@microsoft/tsdoc': 0.16.0 '@nestjs/common': 12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1) @@ -6768,10 +6763,10 @@ snapshots: '@nestjs/mapped-types': 12.0.0(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2) '@standard-schema/spec': 1.1.0 es-toolkit: 1.51.0 - js-yaml: 5.3.0 + js-yaml: 5.4.1 path-to-regexp: 8.4.2 reflect-metadata: 0.2.2 - swagger-ui-dist: 5.32.13 + swagger-ui-dist: 5.32.14 optionalDependencies: class-transformer: 0.5.1 class-validator: 0.14.4 @@ -6790,7 +6785,7 @@ snapshots: '@nestjs/core': 12.0.1(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/platform-express@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) reflect-metadata: 0.2.2 - '@nestjs/typeorm@12.0.0(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.28(ioredis@5.10.0(supports-color@8.1.1))(pg@8.22.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@24.12.0)(typescript@6.0.3)))': + '@nestjs/typeorm@12.0.1(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.28(ioredis@5.10.0(supports-color@8.1.1))(pg@8.22.0)(supports-color@8.1.1)(ts-node@10.9.2(@types/node@24.12.0)(typescript@6.0.3)))': dependencies: '@nestjs/common': 12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1) '@nestjs/core': 12.0.1(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/platform-express@12.0.1)(reflect-metadata@0.2.2)(rxjs@7.8.2) @@ -6813,6 +6808,11 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@prometheus-io/client@0.16.1': + dependencies: + '@opentelemetry/api': 1.9.0 + tdigest: 0.1.2 + '@redis/client@5.11.0': dependencies: cluster-key-slot: 1.1.2 @@ -7121,20 +7121,26 @@ snapshots: dependencies: '@webassemblyjs/helper-numbers': 1.13.2 '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + optional: true - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + '@webassemblyjs/floating-point-hex-parser@1.13.2': + optional: true - '@webassemblyjs/helper-api-error@1.13.2': {} + '@webassemblyjs/helper-api-error@1.13.2': + optional: true - '@webassemblyjs/helper-buffer@1.14.1': {} + '@webassemblyjs/helper-buffer@1.14.1': + optional: true '@webassemblyjs/helper-numbers@1.13.2': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.13.2 '@webassemblyjs/helper-api-error': 1.13.2 '@xtuc/long': 4.2.2 + optional: true - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + optional: true '@webassemblyjs/helper-wasm-section@1.14.1': dependencies: @@ -7142,16 +7148,20 @@ snapshots: '@webassemblyjs/helper-buffer': 1.14.1 '@webassemblyjs/helper-wasm-bytecode': 1.13.2 '@webassemblyjs/wasm-gen': 1.14.1 + optional: true '@webassemblyjs/ieee754@1.13.2': dependencies: '@xtuc/ieee754': 1.2.0 + optional: true '@webassemblyjs/leb128@1.13.2': dependencies: '@xtuc/long': 4.2.2 + optional: true - '@webassemblyjs/utf8@1.13.2': {} + '@webassemblyjs/utf8@1.13.2': + optional: true '@webassemblyjs/wasm-edit@1.14.1': dependencies: @@ -7163,6 +7173,7 @@ snapshots: '@webassemblyjs/wasm-opt': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 '@webassemblyjs/wast-printer': 1.14.1 + optional: true '@webassemblyjs/wasm-gen@1.14.1': dependencies: @@ -7171,6 +7182,7 @@ snapshots: '@webassemblyjs/ieee754': 1.13.2 '@webassemblyjs/leb128': 1.13.2 '@webassemblyjs/utf8': 1.13.2 + optional: true '@webassemblyjs/wasm-opt@1.14.1': dependencies: @@ -7178,6 +7190,7 @@ snapshots: '@webassemblyjs/helper-buffer': 1.14.1 '@webassemblyjs/wasm-gen': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 + optional: true '@webassemblyjs/wasm-parser@1.14.1': dependencies: @@ -7187,15 +7200,19 @@ snapshots: '@webassemblyjs/ieee754': 1.13.2 '@webassemblyjs/leb128': 1.13.2 '@webassemblyjs/utf8': 1.13.2 + optional: true '@webassemblyjs/wast-printer@1.14.1': dependencies: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 + optional: true - '@xtuc/ieee754@1.2.0': {} + '@xtuc/ieee754@1.2.0': + optional: true - '@xtuc/long@4.2.2': {} + '@xtuc/long@4.2.2': + optional: true accepts@2.0.0: dependencies: @@ -7215,6 +7232,7 @@ snapshots: ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 + optional: true ajv-formats@3.0.1(ajv@8.20.0): optionalDependencies: @@ -7229,6 +7247,7 @@ snapshots: dependencies: ajv: 8.20.0 fast-deep-equal: 3.1.3 + optional: true ajv@6.14.0: dependencies: @@ -7305,7 +7324,8 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.0: {} + baseline-browser-mapping@2.10.0: + optional: true bintrees@1.0.2: {} @@ -7347,6 +7367,7 @@ snapshots: electron-to-chromium: 1.5.307 node-releases: 2.0.36 update-browserslist-db: 1.2.3(browserslist@4.28.1) + optional: true bson@7.3.2: {} @@ -7407,7 +7428,8 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001777: {} + caniuse-lite@1.0.30001777: + optional: true chai@6.2.2: {} @@ -7431,7 +7453,8 @@ snapshots: dependencies: readdirp: 5.1.1 - chrome-trace-event@1.0.4: {} + chrome-trace-event@1.0.4: + optional: true class-transformer@0.5.1: {} @@ -7484,7 +7507,8 @@ snapshots: commander@15.0.0: {} - commander@2.20.3: {} + commander@2.20.3: + optional: true comment-json@5.0.0: dependencies: @@ -7637,7 +7661,8 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.307: {} + electron-to-chromium@1.5.307: + optional: true emoji-regex@10.6.0: {} @@ -7657,11 +7682,13 @@ snapshots: dependencies: graceful-fs: 4.2.11 tapable: 2.3.0 + optional: true enhanced-resolve@5.24.5: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 + optional: true env-paths@2.2.1: {} @@ -7743,6 +7770,7 @@ snapshots: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 + optional: true eslint-scope@8.4.0: dependencies: @@ -7812,7 +7840,8 @@ snapshots: dependencies: estraverse: 5.3.0 - estraverse@4.3.0: {} + estraverse@4.3.0: + optional: true estraverse@5.3.0: {} @@ -7826,7 +7855,8 @@ snapshots: eventemitter3@5.0.4: {} - events@3.3.0: {} + events@3.3.0: + optional: true expect-type@1.4.0: {} @@ -8050,7 +8080,8 @@ snapshots: gopd@1.2.0: {} - graceful-fs@4.2.11: {} + graceful-fs@4.2.11: + optional: true has-flag@4.0.0: {} @@ -8215,6 +8246,7 @@ snapshots: '@types/node': 24.12.0 merge-stream: 2.0.0 supports-color: 8.1.1 + optional: true jiti@2.6.1: {} @@ -8238,7 +8270,7 @@ snapshots: dependencies: argparse: 2.0.1 - js-yaml@5.3.0: + js-yaml@5.4.1: dependencies: argparse: 2.0.1 @@ -8429,7 +8461,8 @@ snapshots: merge-descriptors@2.0.0: {} - merge-stream@2.0.0: {} + merge-stream@2.0.0: + optional: true methods@1.1.2: {} @@ -8480,6 +8513,7 @@ snapshots: lightningcss: 1.33.0 postcss: 8.5.26 uglify-js: 3.19.3 + optional: true minipass@7.1.3: {} @@ -8549,7 +8583,8 @@ snapshots: negotiator@1.0.0: {} - neo-async@2.6.2: {} + neo-async@2.6.2: + optional: true nestjs-pino@4.6.0(@nestjs/common@12.0.1(class-transformer@0.5.1)(class-validator@0.14.4)(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(pino-http@11.0.0)(pino@10.3.1)(rxjs@7.8.2): dependencies: @@ -8572,7 +8607,8 @@ snapshots: detect-libc: 2.1.2 optional: true - node-releases@2.0.36: {} + node-releases@2.0.36: + optional: true object-assign@4.1.1: {} @@ -8772,11 +8808,6 @@ snapshots: process-warning@5.0.0: {} - prom-client@15.1.3: - dependencies: - '@opentelemetry/api': 1.9.0 - tdigest: 0.1.2 - proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -8900,6 +8931,7 @@ snapshots: ajv: 8.20.0 ajv-formats: 2.1.1(ajv@8.20.0) ajv-keywords: 5.1.0(ajv@8.20.0) + optional: true secure-json-parse@4.1.0: {} @@ -9011,8 +9043,10 @@ snapshots: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + optional: true - source-map@0.6.1: {} + source-map@0.6.1: + optional: true source-map@0.7.6: {} @@ -9114,12 +9148,13 @@ snapshots: supports-color@8.1.1: dependencies: has-flag: 4.0.0 + optional: true swagger-ui-dist@5.32.0: dependencies: '@scarf/scarf': 1.4.0 - swagger-ui-dist@5.32.13: + swagger-ui-dist@5.32.14: dependencies: '@scarf/scarf': 1.4.0 @@ -9128,9 +9163,11 @@ snapshots: express: 5.2.1(supports-color@8.1.1) swagger-ui-dist: 5.32.0 - tapable@2.3.0: {} + tapable@2.3.0: + optional: true - tapable@2.3.3: {} + tapable@2.3.3: + optional: true tdigest@0.1.2: dependencies: @@ -9142,6 +9179,7 @@ snapshots: acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 + optional: true thread-stream@4.0.0: dependencies: @@ -9200,6 +9238,7 @@ snapshots: source-map: 0.7.6 typescript: 6.0.3 webpack: 5.109.2(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)(uglify-js@3.19.3) + optional: true ts-node@10.9.2(@types/node@24.12.0)(typescript@6.0.3): dependencies: @@ -9325,6 +9364,7 @@ snapshots: browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 + optional: true uri-js@4.4.1: dependencies: @@ -9388,13 +9428,15 @@ snapshots: watchpack@2.5.2: dependencies: graceful-fs: 4.2.11 + optional: true webidl-conversions@7.0.0: {} webpack-node-externals@3.0.0: optional: true - webpack-sources@3.5.1: {} + webpack-sources@3.5.1: + optional: true webpack@5.109.2(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)(uglify-js@3.19.3): dependencies: @@ -9431,6 +9473,7 @@ snapshots: - lightningcss - postcss - uglify-js + optional: true whatwg-url@14.2.0: dependencies: diff --git a/src/common/filters/all-exceptions.filter.ts b/src/common/filters/all-exceptions.filter.ts index 0682e53..6a9a431 100644 --- a/src/common/filters/all-exceptions.filter.ts +++ b/src/common/filters/all-exceptions.filter.ts @@ -27,7 +27,7 @@ export class AllExceptionsFilter implements ExceptionFilter { // 응답이 이미 시작됐으면 손대지 않는다. // // HTTP 응답은 ① 상태코드+헤더 → ② 본문 순으로 나가고, ①이 나가면 되돌릴 수 없다. - // 스트리밍성 응답(예: /v1/system/metrics는 prom-client가 수집하면서 쓴다)에서 헤더가 + // 스트리밍성 응답(예: /v1/system/metrics는 @prometheus-io/client가 수집하면서 쓴다)에서 헤더가 // 먼저 나간 뒤 에러가 나면, 여기서 status()를 다시 부르는 순간 Node가 // ERR_HTTP_HEADERS_SENT를 던지고 **진짜 원인이 그 에러에 가려진다.** // 위에서 로그는 이미 남겼으므로 조용히 빠지는 것이 아니다. diff --git a/src/health/health-metrics.service.spec.ts b/src/health/health-metrics.service.spec.ts index dd9e681..04e2dac 100644 --- a/src/health/health-metrics.service.spec.ts +++ b/src/health/health-metrics.service.spec.ts @@ -1,5 +1,5 @@ import type { ModuleRef } from '@nestjs/core'; -import { Registry } from 'prom-client'; +import { Registry } from '@prometheus-io/client'; import { HealthMetricsService } from './health-metrics.service.js'; diff --git a/src/health/health-metrics.service.ts b/src/health/health-metrics.service.ts index a1dbded..b749cec 100644 --- a/src/health/health-metrics.service.ts +++ b/src/health/health-metrics.service.ts @@ -1,6 +1,6 @@ import { Injectable, type OnModuleInit } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; -import { Gauge } from 'prom-client'; +import { Gauge } from '@prometheus-io/client'; import { MetricsService } from '../infra/metrics/metrics.service.js'; import { HealthCoordinator } from './application/health.coordinator.js'; @@ -19,7 +19,7 @@ import { HealthCoordinator } from './application/health.coordinator.js'; * → preset metrics controller * → metricsService.render() * → registry.metrics() - * → prom-client가 이 Gauge의 collect 콜백 자동 실행 + * → @prometheus-io/client가 이 Gauge의 collect 콜백 자동 실행 * → gauge.reset() (이전 값 초기화) * → healthCoordinator.inspectIndicators() (DB, Redis 등 체크) * → gauge.set({ indicator: 'database' }, 1) 등 값 세팅 @@ -91,7 +91,7 @@ export class HealthMetricsService implements OnModuleInit { */ const gauge = new Gauge({ /** - * collect 콜백 = Prometheus 스크랩 시점에 prom-client가 자동 호출하는 훅 + * collect 콜백 = Prometheus 스크랩 시점에 @prometheus-io/client가 자동 호출하는 훅 * * setInterval로 주기적 업데이트하는 방식과 비교: * - setInterval: 스크랩과 타이밍 어긋나면 stale 데이터, 생명주기 관리 필요 diff --git a/src/infra/metrics/http-metrics.interceptor.spec.ts b/src/infra/metrics/http-metrics.interceptor.spec.ts index e512b16..03c4a68 100644 --- a/src/infra/metrics/http-metrics.interceptor.spec.ts +++ b/src/infra/metrics/http-metrics.interceptor.spec.ts @@ -1,6 +1,6 @@ import type { CallHandler, ExecutionContext } from '@nestjs/common'; import { HttpException } from '@nestjs/common'; -import { Registry } from 'prom-client'; +import { Registry } from '@prometheus-io/client'; import { lastValueFrom, of, Subject, throwError } from 'rxjs'; import { MetricsInterceptor } from './http-metrics.interceptor.js'; diff --git a/src/infra/metrics/http-metrics.interceptor.ts b/src/infra/metrics/http-metrics.interceptor.ts index 847f76d..19a953e 100644 --- a/src/infra/metrics/http-metrics.interceptor.ts +++ b/src/infra/metrics/http-metrics.interceptor.ts @@ -5,8 +5,8 @@ import { Injectable, NestInterceptor, } from '@nestjs/common'; +import { Gauge, Histogram } from '@prometheus-io/client'; import { Request, Response } from 'express'; -import { Gauge, Histogram } from 'prom-client'; import { Observable } from 'rxjs'; import { catchError, finalize, tap } from 'rxjs/operators'; diff --git a/src/infra/metrics/metrics.service.spec.ts b/src/infra/metrics/metrics.service.spec.ts index e9a9dbb..14a7be8 100644 --- a/src/infra/metrics/metrics.service.spec.ts +++ b/src/infra/metrics/metrics.service.spec.ts @@ -1,17 +1,17 @@ import type { ConfigService } from '@nestjs/config'; -import type * as PromClient from 'prom-client'; -import { collectDefaultMetrics } from 'prom-client'; +import type * as PromClient from '@prometheus-io/client'; +import { collectDefaultMetrics } from '@prometheus-io/client'; import { MetricsService } from './metrics.service.js'; -vi.mock('prom-client', async (): Promise => { - const actual = await vi.importActual('prom-client'); +vi.mock('@prometheus-io/client', async (): Promise => { + const actual = await vi.importActual('@prometheus-io/client'); const collectDefaultMetricsMock = vi.fn() as unknown as typeof actual.collectDefaultMetrics; collectDefaultMetricsMock.metricsList = []; // 서드파티 모듈 표면을 그대로 다시 내보내면서 하나만 교체한다. - // 여기서 필드를 명시할 수는 없다 — 우리가 정의한 구조가 아니라 prom-client의 것이고, + // 여기서 필드를 명시할 수는 없다 — 우리가 정의한 구조가 아니라 @prometheus-io/client의 것이고, // 손으로 나열하면 버전이 올라갈 때마다 조용히 빠진 export가 생긴다. // constitution A-5의 예외이며, 객체 spread 대신 Object.assign을 쓴다. return Object.assign({}, actual, { collectDefaultMetrics: collectDefaultMetricsMock }); diff --git a/src/infra/metrics/metrics.service.ts b/src/infra/metrics/metrics.service.ts index 828eca6..7b4a1ba 100644 --- a/src/infra/metrics/metrics.service.ts +++ b/src/infra/metrics/metrics.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; -import { collectDefaultMetrics, Gauge, Registry } from 'prom-client'; +import { collectDefaultMetrics, Gauge, Registry } from '@prometheus-io/client'; import { observabilityConfig } from '../../config/observability.config.js'; diff --git a/src/infra/queue/bullmq-metrics.service.spec.ts b/src/infra/queue/bullmq-metrics.service.spec.ts index 75dc68c..f7550c1 100644 --- a/src/infra/queue/bullmq-metrics.service.spec.ts +++ b/src/infra/queue/bullmq-metrics.service.spec.ts @@ -1,4 +1,4 @@ -import { Registry } from 'prom-client'; +import { Registry } from '@prometheus-io/client'; import { BullmqMetricsService } from './bullmq-metrics.service.js'; diff --git a/src/infra/queue/bullmq-metrics.service.ts b/src/infra/queue/bullmq-metrics.service.ts index ab95a2e..8498f04 100644 --- a/src/infra/queue/bullmq-metrics.service.ts +++ b/src/infra/queue/bullmq-metrics.service.ts @@ -1,7 +1,7 @@ import { InjectQueue } from '@nestjs/bullmq'; import { Injectable } from '@nestjs/common'; +import { Counter, Gauge, Histogram } from '@prometheus-io/client'; import type { Queue } from 'bullmq'; -import { Counter, Gauge, Histogram } from 'prom-client'; import { MetricsService } from '../metrics/metrics.service.js'; import { BACKGROUND_JOBS_QUEUE } from './background-jobs.constants.js';