@nestjs-redisx/metrics 1.0.0 → 1.0.2

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/index.js CHANGED
@@ -306,30 +306,49 @@ var DEFAULT_METRICS_CONFIG = {
306
306
  pluginMetrics: true,
307
307
  collectInterval: 15e3
308
308
  };
309
- var MetricsPlugin = class {
309
+ var MetricsPlugin = class _MetricsPlugin {
310
310
  constructor(options = {}) {
311
311
  this.options = options;
312
312
  }
313
313
  name = "metrics";
314
314
  version = "0.1.0";
315
315
  description = "Prometheus metrics collection and export";
316
+ asyncOptions;
317
+ static registerAsync(asyncOptions) {
318
+ const plugin = new _MetricsPlugin();
319
+ plugin.asyncOptions = asyncOptions;
320
+ return plugin;
321
+ }
322
+ static mergeDefaults(options) {
323
+ return {
324
+ enabled: options.enabled ?? DEFAULT_METRICS_CONFIG.enabled,
325
+ prefix: options.prefix ?? DEFAULT_METRICS_CONFIG.prefix,
326
+ exposeEndpoint: options.exposeEndpoint ?? DEFAULT_METRICS_CONFIG.exposeEndpoint,
327
+ endpoint: options.endpoint ?? DEFAULT_METRICS_CONFIG.endpoint,
328
+ histogramBuckets: options.histogramBuckets ?? DEFAULT_METRICS_CONFIG.histogramBuckets,
329
+ collectDefaultMetrics: options.collectDefaultMetrics ?? DEFAULT_METRICS_CONFIG.collectDefaultMetrics,
330
+ commandMetrics: options.commandMetrics ?? DEFAULT_METRICS_CONFIG.commandMetrics,
331
+ pluginMetrics: options.pluginMetrics ?? DEFAULT_METRICS_CONFIG.pluginMetrics,
332
+ collectInterval: options.collectInterval ?? DEFAULT_METRICS_CONFIG.collectInterval,
333
+ defaultLabels: options.defaultLabels
334
+ };
335
+ }
336
+ getImports() {
337
+ return this.asyncOptions?.imports ?? [];
338
+ }
316
339
  getProviders() {
317
- const config = {
318
- enabled: this.options.enabled ?? DEFAULT_METRICS_CONFIG.enabled,
319
- prefix: this.options.prefix ?? DEFAULT_METRICS_CONFIG.prefix,
320
- exposeEndpoint: this.options.exposeEndpoint ?? DEFAULT_METRICS_CONFIG.exposeEndpoint,
321
- endpoint: this.options.endpoint ?? DEFAULT_METRICS_CONFIG.endpoint,
322
- histogramBuckets: this.options.histogramBuckets ?? DEFAULT_METRICS_CONFIG.histogramBuckets,
323
- collectDefaultMetrics: this.options.collectDefaultMetrics ?? DEFAULT_METRICS_CONFIG.collectDefaultMetrics,
324
- commandMetrics: this.options.commandMetrics ?? DEFAULT_METRICS_CONFIG.commandMetrics,
325
- pluginMetrics: this.options.pluginMetrics ?? DEFAULT_METRICS_CONFIG.pluginMetrics,
326
- collectInterval: this.options.collectInterval ?? DEFAULT_METRICS_CONFIG.collectInterval,
327
- defaultLabels: this.options.defaultLabels
340
+ const optionsProvider = this.asyncOptions ? {
341
+ provide: METRICS_PLUGIN_OPTIONS,
342
+ useFactory: async (...args) => {
343
+ const userOptions = await this.asyncOptions.useFactory(...args);
344
+ return _MetricsPlugin.mergeDefaults(userOptions);
345
+ },
346
+ inject: this.asyncOptions.inject || []
347
+ } : {
348
+ provide: METRICS_PLUGIN_OPTIONS,
349
+ useValue: _MetricsPlugin.mergeDefaults(this.options)
328
350
  };
329
- return [
330
- { provide: METRICS_PLUGIN_OPTIONS, useValue: config },
331
- { provide: METRICS_SERVICE, useClass: exports.MetricsService }
332
- ];
351
+ return [optionsProvider, { provide: METRICS_SERVICE, useClass: exports.MetricsService }];
333
352
  }
334
353
  getExports() {
335
354
  return [METRICS_SERVICE];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants/index.ts","../src/shared/errors/index.ts","../src/metrics/application/services/metrics.service.ts","../src/metrics/api/controllers/metrics.controller.ts","../src/metrics.plugin.ts"],"names":["RedisXError","ErrorCode","MetricsService","promClient","Injectable","MetricsController","Get","Header","Controller","Inject"],"mappings":"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","file":"index.js","sourcesContent":["export const METRICS_PLUGIN_OPTIONS = Symbol.for('METRICS_PLUGIN_OPTIONS');\nexport const METRICS_SERVICE = Symbol.for('METRICS_SERVICE');\nexport const METRICS_REGISTRY = Symbol.for('METRICS_REGISTRY');\n","import { RedisXError, ErrorCode } from '@nestjs-redisx/core';\n\nexport class MetricsError extends RedisXError {\n constructor(message: string, cause?: Error) {\n super(message, ErrorCode.OP_FAILED, cause);\n }\n}\n\nexport class MetricRegistrationError extends MetricsError {\n constructor(metricName: string, cause?: Error) {\n super(`Failed to register metric \"${metricName}\"`, cause);\n }\n}\n","import { Injectable, Inject, OnModuleInit, OnModuleDestroy } from '@nestjs/common';\nimport * as promClient from 'prom-client';\n\nimport { METRICS_PLUGIN_OPTIONS } from '../../../shared/constants';\nimport { MetricRegistrationError } from '../../../shared/errors';\nimport { IMetricsPluginOptions, IMetricsJson } from '../../../shared/types';\nimport { IMetricsService } from '../ports/metrics-service.port';\n\n@Injectable()\nexport class MetricsService implements IMetricsService, OnModuleInit, OnModuleDestroy {\n private readonly registry: promClient.Registry;\n private readonly counters = new Map<string, promClient.Counter>();\n private readonly histograms = new Map<string, promClient.Histogram>();\n private readonly gauges = new Map<string, promClient.Gauge>();\n private readonly prefix: string;\n private readonly defaultLabels: Record<string, string>;\n private readonly latencyBuckets: number[];\n private readonly enabled: boolean;\n private defaultMetricsInterval?: ReturnType<typeof setInterval>;\n\n constructor(\n @Inject(METRICS_PLUGIN_OPTIONS)\n private readonly config: IMetricsPluginOptions,\n ) {\n this.enabled = config.enabled !== false;\n this.prefix = config.prefix ?? 'redisx_';\n this.defaultLabels = config.defaultLabels ?? {};\n this.latencyBuckets = config.histogramBuckets ?? [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10];\n\n this.registry = new promClient.Registry();\n this.registry.setDefaultLabels(this.defaultLabels);\n }\n\n onModuleInit(): void {\n if (!this.enabled) {\n return;\n }\n\n this.registerStandardMetrics();\n\n if (this.config.collectDefaultMetrics !== false) {\n const collectInterval = this.config.collectInterval ?? 15000;\n promClient.collectDefaultMetrics({\n register: this.registry,\n prefix: this.prefix,\n ...(collectInterval > 0 ? { timeout: collectInterval } : {}),\n });\n }\n }\n\n onModuleDestroy(): void {\n this.registry.clear();\n }\n\n private registerStandardMetrics(): void {\n const commandMetrics = this.config.commandMetrics !== false;\n const pluginMetrics = this.config.pluginMetrics !== false;\n\n // Core metrics\n if (commandMetrics) {\n this.registerCounter(`${this.prefix}commands_total`, 'Total Redis commands executed', ['command', 'client', 'status']);\n\n this.registerHistogram(`${this.prefix}command_duration_seconds`, 'Redis command latency in seconds', ['command', 'client'], this.latencyBuckets);\n\n this.registerGauge(`${this.prefix}connections_active`, 'Number of active Redis connections', ['client']);\n\n this.registerCounter(`${this.prefix}errors_total`, 'Total Redis errors', ['client', 'error_type']);\n }\n\n // Plugin-specific metrics\n if (pluginMetrics) {\n // Cache metrics\n this.registerCounter(`${this.prefix}cache_hits_total`, 'Total cache hits', ['layer']);\n\n this.registerCounter(`${this.prefix}cache_misses_total`, 'Total cache misses', ['layer']);\n\n this.registerGauge(`${this.prefix}cache_hit_ratio`, 'Cache hit ratio (0-1)', ['layer']);\n\n this.registerGauge(`${this.prefix}cache_size`, 'Current cache size', ['layer']);\n\n this.registerCounter(`${this.prefix}cache_stampede_prevented_total`, 'Total cache stampede prevention activations');\n\n // Lock metrics\n this.registerCounter(`${this.prefix}lock_acquisitions_total`, 'Total lock acquisition attempts', ['status']);\n\n this.registerHistogram(`${this.prefix}lock_wait_duration_seconds`, 'Lock wait time in seconds', [], this.latencyBuckets);\n\n this.registerHistogram(`${this.prefix}lock_hold_duration_seconds`, 'Lock hold time in seconds', [], this.latencyBuckets);\n\n this.registerGauge(`${this.prefix}locks_active`, 'Number of currently held locks');\n\n // Rate limit metrics\n this.registerCounter(`${this.prefix}ratelimit_requests_total`, 'Total rate limit requests', ['status']);\n\n // Stream metrics\n this.registerCounter(`${this.prefix}stream_messages_published_total`, 'Total stream messages published', ['stream']);\n\n this.registerCounter(`${this.prefix}stream_messages_consumed_total`, 'Total stream messages consumed', ['stream', 'group', 'status']);\n\n this.registerHistogram(`${this.prefix}stream_publish_duration_seconds`, 'Stream publish latency in seconds', ['stream'], this.latencyBuckets);\n\n this.registerCounter(`${this.prefix}stream_publish_errors_total`, 'Total stream publish errors', ['stream']);\n\n this.registerHistogram(`${this.prefix}stream_processing_duration_seconds`, 'Stream message processing time in seconds', ['stream', 'group'], this.latencyBuckets);\n\n // Idempotency metrics\n this.registerCounter(`${this.prefix}idempotency_requests_total`, 'Total idempotency requests', ['status']);\n\n this.registerHistogram(`${this.prefix}idempotency_duration_seconds`, 'Idempotency check duration in seconds', [], this.latencyBuckets);\n }\n }\n\n incrementCounter(name: string, labels?: Record<string, string>, value = 1): void {\n if (!this.enabled) {\n return;\n }\n\n const counter = this.counters.get(name);\n if (!counter) {\n return;\n }\n\n if (labels) {\n counter.inc(labels, value);\n } else {\n counter.inc(value);\n }\n }\n\n observeHistogram(name: string, value: number, labels?: Record<string, string>): void {\n if (!this.enabled) {\n return;\n }\n\n const histogram = this.histograms.get(name);\n if (!histogram) {\n return;\n }\n\n if (labels) {\n histogram.observe(labels, value);\n } else {\n histogram.observe(value);\n }\n }\n\n startTimer(name: string, labels?: Record<string, string>): () => number {\n if (!this.enabled) {\n return () => 0;\n }\n\n const histogram = this.histograms.get(name);\n if (!histogram) {\n return () => 0;\n }\n\n const startTime = Date.now();\n\n return () => {\n const duration = (Date.now() - startTime) / 1000;\n this.observeHistogram(name, duration, labels);\n return duration;\n };\n }\n\n setGauge(name: string, value: number, labels?: Record<string, string>): void {\n if (!this.enabled) {\n return;\n }\n\n const gauge = this.gauges.get(name);\n if (!gauge) {\n return;\n }\n\n if (labels) {\n gauge.set(labels, value);\n } else {\n gauge.set(value);\n }\n }\n\n incrementGauge(name: string, labels?: Record<string, string>, value = 1): void {\n if (!this.enabled) {\n return;\n }\n\n const gauge = this.gauges.get(name);\n if (!gauge) {\n return;\n }\n\n if (labels) {\n gauge.inc(labels, value);\n } else {\n gauge.inc(value);\n }\n }\n\n decrementGauge(name: string, labels?: Record<string, string>, value = 1): void {\n if (!this.enabled) {\n return;\n }\n\n const gauge = this.gauges.get(name);\n if (!gauge) {\n return;\n }\n\n if (labels) {\n gauge.dec(labels, value);\n } else {\n gauge.dec(value);\n }\n }\n\n async getMetrics(): Promise<string> {\n if (!this.enabled) {\n return '';\n }\n\n return this.registry.metrics();\n }\n\n async getMetricsJson(): Promise<IMetricsJson[]> {\n if (!this.enabled) {\n return [];\n }\n\n const metrics = await this.registry.getMetricsAsJSON();\n\n return metrics.map((metric: promClient.MetricObjectWithValues<promClient.MetricValue<string>>) => ({\n name: metric.name,\n help: metric.help,\n type: String(metric.type),\n values: metric.values.map((v: promClient.MetricValue<string>) => ({\n labels: (v.labels as Record<string, string>) ?? {},\n value: v.value,\n })),\n }));\n }\n\n registerCounter(name: string, help: string, labelNames: string[] = []): void {\n if (!this.enabled) {\n return;\n }\n\n try {\n const counter = new promClient.Counter({\n name,\n help,\n labelNames,\n registers: [this.registry],\n });\n\n this.counters.set(name, counter);\n } catch (error) {\n throw new MetricRegistrationError(name, error instanceof Error ? error : undefined);\n }\n }\n\n registerHistogram(name: string, help: string, labelNames: string[] = [], buckets?: number[]): void {\n if (!this.enabled) {\n return;\n }\n\n try {\n const histogram = new promClient.Histogram({\n name,\n help,\n labelNames,\n buckets: buckets ?? this.latencyBuckets,\n registers: [this.registry],\n });\n\n this.histograms.set(name, histogram);\n } catch (error) {\n throw new MetricRegistrationError(name, error instanceof Error ? error : undefined);\n }\n }\n\n registerGauge(name: string, help: string, labelNames: string[] = []): void {\n if (!this.enabled) {\n return;\n }\n\n try {\n const gauge = new promClient.Gauge({\n name,\n help,\n labelNames,\n registers: [this.registry],\n });\n\n this.gauges.set(name, gauge);\n } catch (error) {\n throw new MetricRegistrationError(name, error instanceof Error ? error : undefined);\n }\n }\n}\n","import { Controller, Get, Header, Inject } from '@nestjs/common';\n\nimport { METRICS_SERVICE } from '../../../shared/constants';\nimport { IMetricsService } from '../../application/ports/metrics-service.port';\n\n@Controller('metrics')\nexport class MetricsController {\n constructor(@Inject(METRICS_SERVICE) private readonly metricsService: IMetricsService) {}\n\n @Get()\n @Header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8')\n async getMetrics(): Promise<string> {\n return this.metricsService.getMetrics();\n }\n}\n","/**\n * Metrics plugin for NestJS RedisX.\n * Provides Prometheus metrics collection and export.\n */\n\nimport { Provider, Type } from '@nestjs/common';\nimport { IRedisXPlugin } from '@nestjs-redisx/core';\nimport { METRICS_PLUGIN_OPTIONS, METRICS_SERVICE } from './shared/constants';\nimport { IMetricsPluginOptions } from './shared/types';\nimport { MetricsService } from './metrics/application/services/metrics.service';\nimport { MetricsController } from './metrics/api/controllers/metrics.controller';\n\nconst DEFAULT_METRICS_CONFIG: Required<Omit<IMetricsPluginOptions, 'isGlobal' | 'defaultLabels'>> = {\n enabled: true,\n prefix: 'redisx_',\n exposeEndpoint: true,\n endpoint: '/metrics',\n histogramBuckets: [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],\n collectDefaultMetrics: true,\n commandMetrics: true,\n pluginMetrics: true,\n collectInterval: 15000,\n};\n\n/**\n * Metrics plugin for NestJS RedisX.\n *\n * Provides Prometheus metrics:\n * - Redis command latency\n * - Connection pool stats\n * - Cache hit/miss rates\n * - Error counts\n * - HTTP endpoint for Prometheus scraping\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [\n * RedisModule.forRoot({\n * clients: { host: 'localhost', port: 6379 },\n * plugins: [\n * new MetricsPlugin({\n * enabled: true,\n * exposeEndpoint: true,\n * endpoint: '/metrics',\n * }),\n * ],\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\nexport class MetricsPlugin implements IRedisXPlugin {\n readonly name = 'metrics';\n readonly version = '0.1.0';\n readonly description = 'Prometheus metrics collection and export';\n\n constructor(private readonly options: IMetricsPluginOptions = {}) {}\n\n getProviders(): Provider[] {\n const config: IMetricsPluginOptions = {\n enabled: this.options.enabled ?? DEFAULT_METRICS_CONFIG.enabled,\n prefix: this.options.prefix ?? DEFAULT_METRICS_CONFIG.prefix,\n exposeEndpoint: this.options.exposeEndpoint ?? DEFAULT_METRICS_CONFIG.exposeEndpoint,\n endpoint: this.options.endpoint ?? DEFAULT_METRICS_CONFIG.endpoint,\n histogramBuckets: this.options.histogramBuckets ?? DEFAULT_METRICS_CONFIG.histogramBuckets,\n collectDefaultMetrics: this.options.collectDefaultMetrics ?? DEFAULT_METRICS_CONFIG.collectDefaultMetrics,\n commandMetrics: this.options.commandMetrics ?? DEFAULT_METRICS_CONFIG.commandMetrics,\n pluginMetrics: this.options.pluginMetrics ?? DEFAULT_METRICS_CONFIG.pluginMetrics,\n collectInterval: this.options.collectInterval ?? DEFAULT_METRICS_CONFIG.collectInterval,\n defaultLabels: this.options.defaultLabels,\n };\n\n return [\n { provide: METRICS_PLUGIN_OPTIONS, useValue: config },\n { provide: METRICS_SERVICE, useClass: MetricsService },\n ];\n }\n\n getExports(): Array<string | symbol | Provider> {\n return [METRICS_SERVICE];\n }\n\n getControllers(): Type[] {\n // Only expose controller if endpoint is enabled\n if (this.options.exposeEndpoint !== false) {\n return [MetricsController];\n }\n return [];\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/constants/index.ts","../src/shared/errors/index.ts","../src/metrics/application/services/metrics.service.ts","../src/metrics/api/controllers/metrics.controller.ts","../src/metrics.plugin.ts"],"names":["RedisXError","ErrorCode","MetricsService","promClient","Injectable","MetricsController","Get","Header","Controller","Inject"],"mappings":"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","file":"index.js","sourcesContent":["export const METRICS_PLUGIN_OPTIONS = Symbol.for('METRICS_PLUGIN_OPTIONS');\nexport const METRICS_SERVICE = Symbol.for('METRICS_SERVICE');\nexport const METRICS_REGISTRY = Symbol.for('METRICS_REGISTRY');\n","import { RedisXError, ErrorCode } from '@nestjs-redisx/core';\n\nexport class MetricsError extends RedisXError {\n constructor(message: string, cause?: Error) {\n super(message, ErrorCode.OP_FAILED, cause);\n }\n}\n\nexport class MetricRegistrationError extends MetricsError {\n constructor(metricName: string, cause?: Error) {\n super(`Failed to register metric \"${metricName}\"`, cause);\n }\n}\n","import { Injectable, Inject, OnModuleInit, OnModuleDestroy } from '@nestjs/common';\nimport * as promClient from 'prom-client';\n\nimport { METRICS_PLUGIN_OPTIONS } from '../../../shared/constants';\nimport { MetricRegistrationError } from '../../../shared/errors';\nimport { IMetricsPluginOptions, IMetricsJson } from '../../../shared/types';\nimport { IMetricsService } from '../ports/metrics-service.port';\n\n@Injectable()\nexport class MetricsService implements IMetricsService, OnModuleInit, OnModuleDestroy {\n private readonly registry: promClient.Registry;\n private readonly counters = new Map<string, promClient.Counter>();\n private readonly histograms = new Map<string, promClient.Histogram>();\n private readonly gauges = new Map<string, promClient.Gauge>();\n private readonly prefix: string;\n private readonly defaultLabels: Record<string, string>;\n private readonly latencyBuckets: number[];\n private readonly enabled: boolean;\n private defaultMetricsInterval?: ReturnType<typeof setInterval>;\n\n constructor(\n @Inject(METRICS_PLUGIN_OPTIONS)\n private readonly config: IMetricsPluginOptions,\n ) {\n this.enabled = config.enabled !== false;\n this.prefix = config.prefix ?? 'redisx_';\n this.defaultLabels = config.defaultLabels ?? {};\n this.latencyBuckets = config.histogramBuckets ?? [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10];\n\n this.registry = new promClient.Registry();\n this.registry.setDefaultLabels(this.defaultLabels);\n }\n\n onModuleInit(): void {\n if (!this.enabled) {\n return;\n }\n\n this.registerStandardMetrics();\n\n if (this.config.collectDefaultMetrics !== false) {\n const collectInterval = this.config.collectInterval ?? 15000;\n promClient.collectDefaultMetrics({\n register: this.registry,\n prefix: this.prefix,\n ...(collectInterval > 0 ? { timeout: collectInterval } : {}),\n });\n }\n }\n\n onModuleDestroy(): void {\n this.registry.clear();\n }\n\n private registerStandardMetrics(): void {\n const commandMetrics = this.config.commandMetrics !== false;\n const pluginMetrics = this.config.pluginMetrics !== false;\n\n // Core metrics\n if (commandMetrics) {\n this.registerCounter(`${this.prefix}commands_total`, 'Total Redis commands executed', ['command', 'client', 'status']);\n\n this.registerHistogram(`${this.prefix}command_duration_seconds`, 'Redis command latency in seconds', ['command', 'client'], this.latencyBuckets);\n\n this.registerGauge(`${this.prefix}connections_active`, 'Number of active Redis connections', ['client']);\n\n this.registerCounter(`${this.prefix}errors_total`, 'Total Redis errors', ['client', 'error_type']);\n }\n\n // Plugin-specific metrics\n if (pluginMetrics) {\n // Cache metrics\n this.registerCounter(`${this.prefix}cache_hits_total`, 'Total cache hits', ['layer']);\n\n this.registerCounter(`${this.prefix}cache_misses_total`, 'Total cache misses', ['layer']);\n\n this.registerGauge(`${this.prefix}cache_hit_ratio`, 'Cache hit ratio (0-1)', ['layer']);\n\n this.registerGauge(`${this.prefix}cache_size`, 'Current cache size', ['layer']);\n\n this.registerCounter(`${this.prefix}cache_stampede_prevented_total`, 'Total cache stampede prevention activations');\n\n // Lock metrics\n this.registerCounter(`${this.prefix}lock_acquisitions_total`, 'Total lock acquisition attempts', ['status']);\n\n this.registerHistogram(`${this.prefix}lock_wait_duration_seconds`, 'Lock wait time in seconds', [], this.latencyBuckets);\n\n this.registerHistogram(`${this.prefix}lock_hold_duration_seconds`, 'Lock hold time in seconds', [], this.latencyBuckets);\n\n this.registerGauge(`${this.prefix}locks_active`, 'Number of currently held locks');\n\n // Rate limit metrics\n this.registerCounter(`${this.prefix}ratelimit_requests_total`, 'Total rate limit requests', ['status']);\n\n // Stream metrics\n this.registerCounter(`${this.prefix}stream_messages_published_total`, 'Total stream messages published', ['stream']);\n\n this.registerCounter(`${this.prefix}stream_messages_consumed_total`, 'Total stream messages consumed', ['stream', 'group', 'status']);\n\n this.registerHistogram(`${this.prefix}stream_publish_duration_seconds`, 'Stream publish latency in seconds', ['stream'], this.latencyBuckets);\n\n this.registerCounter(`${this.prefix}stream_publish_errors_total`, 'Total stream publish errors', ['stream']);\n\n this.registerHistogram(`${this.prefix}stream_processing_duration_seconds`, 'Stream message processing time in seconds', ['stream', 'group'], this.latencyBuckets);\n\n // Idempotency metrics\n this.registerCounter(`${this.prefix}idempotency_requests_total`, 'Total idempotency requests', ['status']);\n\n this.registerHistogram(`${this.prefix}idempotency_duration_seconds`, 'Idempotency check duration in seconds', [], this.latencyBuckets);\n }\n }\n\n incrementCounter(name: string, labels?: Record<string, string>, value = 1): void {\n if (!this.enabled) {\n return;\n }\n\n const counter = this.counters.get(name);\n if (!counter) {\n return;\n }\n\n if (labels) {\n counter.inc(labels, value);\n } else {\n counter.inc(value);\n }\n }\n\n observeHistogram(name: string, value: number, labels?: Record<string, string>): void {\n if (!this.enabled) {\n return;\n }\n\n const histogram = this.histograms.get(name);\n if (!histogram) {\n return;\n }\n\n if (labels) {\n histogram.observe(labels, value);\n } else {\n histogram.observe(value);\n }\n }\n\n startTimer(name: string, labels?: Record<string, string>): () => number {\n if (!this.enabled) {\n return () => 0;\n }\n\n const histogram = this.histograms.get(name);\n if (!histogram) {\n return () => 0;\n }\n\n const startTime = Date.now();\n\n return () => {\n const duration = (Date.now() - startTime) / 1000;\n this.observeHistogram(name, duration, labels);\n return duration;\n };\n }\n\n setGauge(name: string, value: number, labels?: Record<string, string>): void {\n if (!this.enabled) {\n return;\n }\n\n const gauge = this.gauges.get(name);\n if (!gauge) {\n return;\n }\n\n if (labels) {\n gauge.set(labels, value);\n } else {\n gauge.set(value);\n }\n }\n\n incrementGauge(name: string, labels?: Record<string, string>, value = 1): void {\n if (!this.enabled) {\n return;\n }\n\n const gauge = this.gauges.get(name);\n if (!gauge) {\n return;\n }\n\n if (labels) {\n gauge.inc(labels, value);\n } else {\n gauge.inc(value);\n }\n }\n\n decrementGauge(name: string, labels?: Record<string, string>, value = 1): void {\n if (!this.enabled) {\n return;\n }\n\n const gauge = this.gauges.get(name);\n if (!gauge) {\n return;\n }\n\n if (labels) {\n gauge.dec(labels, value);\n } else {\n gauge.dec(value);\n }\n }\n\n async getMetrics(): Promise<string> {\n if (!this.enabled) {\n return '';\n }\n\n return this.registry.metrics();\n }\n\n async getMetricsJson(): Promise<IMetricsJson[]> {\n if (!this.enabled) {\n return [];\n }\n\n const metrics = await this.registry.getMetricsAsJSON();\n\n return metrics.map((metric: promClient.MetricObjectWithValues<promClient.MetricValue<string>>) => ({\n name: metric.name,\n help: metric.help,\n type: String(metric.type),\n values: metric.values.map((v: promClient.MetricValue<string>) => ({\n labels: (v.labels as Record<string, string>) ?? {},\n value: v.value,\n })),\n }));\n }\n\n registerCounter(name: string, help: string, labelNames: string[] = []): void {\n if (!this.enabled) {\n return;\n }\n\n try {\n const counter = new promClient.Counter({\n name,\n help,\n labelNames,\n registers: [this.registry],\n });\n\n this.counters.set(name, counter);\n } catch (error) {\n throw new MetricRegistrationError(name, error instanceof Error ? error : undefined);\n }\n }\n\n registerHistogram(name: string, help: string, labelNames: string[] = [], buckets?: number[]): void {\n if (!this.enabled) {\n return;\n }\n\n try {\n const histogram = new promClient.Histogram({\n name,\n help,\n labelNames,\n buckets: buckets ?? this.latencyBuckets,\n registers: [this.registry],\n });\n\n this.histograms.set(name, histogram);\n } catch (error) {\n throw new MetricRegistrationError(name, error instanceof Error ? error : undefined);\n }\n }\n\n registerGauge(name: string, help: string, labelNames: string[] = []): void {\n if (!this.enabled) {\n return;\n }\n\n try {\n const gauge = new promClient.Gauge({\n name,\n help,\n labelNames,\n registers: [this.registry],\n });\n\n this.gauges.set(name, gauge);\n } catch (error) {\n throw new MetricRegistrationError(name, error instanceof Error ? error : undefined);\n }\n }\n}\n","import { Controller, Get, Header, Inject } from '@nestjs/common';\n\nimport { METRICS_SERVICE } from '../../../shared/constants';\nimport { IMetricsService } from '../../application/ports/metrics-service.port';\n\n@Controller('metrics')\nexport class MetricsController {\n constructor(@Inject(METRICS_SERVICE) private readonly metricsService: IMetricsService) {}\n\n @Get()\n @Header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8')\n async getMetrics(): Promise<string> {\n return this.metricsService.getMetrics();\n }\n}\n","/**\n * Metrics plugin for NestJS RedisX.\n * Provides Prometheus metrics collection and export.\n */\n\nimport { DynamicModule, ForwardReference, Provider, Type } from '@nestjs/common';\nimport { IRedisXPlugin, IPluginAsyncOptions } from '@nestjs-redisx/core';\nimport { METRICS_PLUGIN_OPTIONS, METRICS_SERVICE } from './shared/constants';\nimport { IMetricsPluginOptions } from './shared/types';\nimport { MetricsService } from './metrics/application/services/metrics.service';\nimport { MetricsController } from './metrics/api/controllers/metrics.controller';\n\nconst DEFAULT_METRICS_CONFIG: Required<Omit<IMetricsPluginOptions, 'isGlobal' | 'defaultLabels'>> = {\n enabled: true,\n prefix: 'redisx_',\n exposeEndpoint: true,\n endpoint: '/metrics',\n histogramBuckets: [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],\n collectDefaultMetrics: true,\n commandMetrics: true,\n pluginMetrics: true,\n collectInterval: 15000,\n};\n\n/**\n * Metrics plugin for NestJS RedisX.\n *\n * Provides Prometheus metrics:\n * - Redis command latency\n * - Connection pool stats\n * - Cache hit/miss rates\n * - Error counts\n * - HTTP endpoint for Prometheus scraping\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [\n * RedisModule.forRoot({\n * clients: { host: 'localhost', port: 6379 },\n * plugins: [\n * new MetricsPlugin({\n * enabled: true,\n * exposeEndpoint: true,\n * endpoint: '/metrics',\n * }),\n * ],\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\nexport class MetricsPlugin implements IRedisXPlugin {\n readonly name = 'metrics';\n readonly version = '0.1.0';\n readonly description = 'Prometheus metrics collection and export';\n\n private asyncOptions?: IPluginAsyncOptions<IMetricsPluginOptions>;\n\n constructor(private readonly options: IMetricsPluginOptions = {}) {}\n\n static registerAsync(asyncOptions: IPluginAsyncOptions<IMetricsPluginOptions>): MetricsPlugin {\n const plugin = new MetricsPlugin();\n plugin.asyncOptions = asyncOptions;\n return plugin;\n }\n\n private static mergeDefaults(options: IMetricsPluginOptions): IMetricsPluginOptions {\n return {\n enabled: options.enabled ?? DEFAULT_METRICS_CONFIG.enabled,\n prefix: options.prefix ?? DEFAULT_METRICS_CONFIG.prefix,\n exposeEndpoint: options.exposeEndpoint ?? DEFAULT_METRICS_CONFIG.exposeEndpoint,\n endpoint: options.endpoint ?? DEFAULT_METRICS_CONFIG.endpoint,\n histogramBuckets: options.histogramBuckets ?? DEFAULT_METRICS_CONFIG.histogramBuckets,\n collectDefaultMetrics: options.collectDefaultMetrics ?? DEFAULT_METRICS_CONFIG.collectDefaultMetrics,\n commandMetrics: options.commandMetrics ?? DEFAULT_METRICS_CONFIG.commandMetrics,\n pluginMetrics: options.pluginMetrics ?? DEFAULT_METRICS_CONFIG.pluginMetrics,\n collectInterval: options.collectInterval ?? DEFAULT_METRICS_CONFIG.collectInterval,\n defaultLabels: options.defaultLabels,\n };\n }\n\n getImports(): Array<Type<unknown> | DynamicModule | ForwardReference> {\n return this.asyncOptions?.imports ?? [];\n }\n\n getProviders(): Provider[] {\n const optionsProvider: Provider = this.asyncOptions\n ? {\n provide: METRICS_PLUGIN_OPTIONS,\n useFactory: async (...args: unknown[]) => {\n const userOptions = await this.asyncOptions!.useFactory(...args);\n return MetricsPlugin.mergeDefaults(userOptions);\n },\n inject: this.asyncOptions.inject || [],\n }\n : {\n provide: METRICS_PLUGIN_OPTIONS,\n useValue: MetricsPlugin.mergeDefaults(this.options),\n };\n\n return [optionsProvider, { provide: METRICS_SERVICE, useClass: MetricsService }];\n }\n\n getExports(): Array<string | symbol | Provider> {\n return [METRICS_SERVICE];\n }\n\n getControllers(): Type[] {\n // Only expose controller if endpoint is enabled\n if (this.options.exposeEndpoint !== false) {\n return [MetricsController];\n }\n return [];\n }\n}\n"]}
package/dist/index.mjs CHANGED
@@ -284,30 +284,49 @@ var DEFAULT_METRICS_CONFIG = {
284
284
  pluginMetrics: true,
285
285
  collectInterval: 15e3
286
286
  };
287
- var MetricsPlugin = class {
287
+ var MetricsPlugin = class _MetricsPlugin {
288
288
  constructor(options = {}) {
289
289
  this.options = options;
290
290
  }
291
291
  name = "metrics";
292
292
  version = "0.1.0";
293
293
  description = "Prometheus metrics collection and export";
294
+ asyncOptions;
295
+ static registerAsync(asyncOptions) {
296
+ const plugin = new _MetricsPlugin();
297
+ plugin.asyncOptions = asyncOptions;
298
+ return plugin;
299
+ }
300
+ static mergeDefaults(options) {
301
+ return {
302
+ enabled: options.enabled ?? DEFAULT_METRICS_CONFIG.enabled,
303
+ prefix: options.prefix ?? DEFAULT_METRICS_CONFIG.prefix,
304
+ exposeEndpoint: options.exposeEndpoint ?? DEFAULT_METRICS_CONFIG.exposeEndpoint,
305
+ endpoint: options.endpoint ?? DEFAULT_METRICS_CONFIG.endpoint,
306
+ histogramBuckets: options.histogramBuckets ?? DEFAULT_METRICS_CONFIG.histogramBuckets,
307
+ collectDefaultMetrics: options.collectDefaultMetrics ?? DEFAULT_METRICS_CONFIG.collectDefaultMetrics,
308
+ commandMetrics: options.commandMetrics ?? DEFAULT_METRICS_CONFIG.commandMetrics,
309
+ pluginMetrics: options.pluginMetrics ?? DEFAULT_METRICS_CONFIG.pluginMetrics,
310
+ collectInterval: options.collectInterval ?? DEFAULT_METRICS_CONFIG.collectInterval,
311
+ defaultLabels: options.defaultLabels
312
+ };
313
+ }
314
+ getImports() {
315
+ return this.asyncOptions?.imports ?? [];
316
+ }
294
317
  getProviders() {
295
- const config = {
296
- enabled: this.options.enabled ?? DEFAULT_METRICS_CONFIG.enabled,
297
- prefix: this.options.prefix ?? DEFAULT_METRICS_CONFIG.prefix,
298
- exposeEndpoint: this.options.exposeEndpoint ?? DEFAULT_METRICS_CONFIG.exposeEndpoint,
299
- endpoint: this.options.endpoint ?? DEFAULT_METRICS_CONFIG.endpoint,
300
- histogramBuckets: this.options.histogramBuckets ?? DEFAULT_METRICS_CONFIG.histogramBuckets,
301
- collectDefaultMetrics: this.options.collectDefaultMetrics ?? DEFAULT_METRICS_CONFIG.collectDefaultMetrics,
302
- commandMetrics: this.options.commandMetrics ?? DEFAULT_METRICS_CONFIG.commandMetrics,
303
- pluginMetrics: this.options.pluginMetrics ?? DEFAULT_METRICS_CONFIG.pluginMetrics,
304
- collectInterval: this.options.collectInterval ?? DEFAULT_METRICS_CONFIG.collectInterval,
305
- defaultLabels: this.options.defaultLabels
318
+ const optionsProvider = this.asyncOptions ? {
319
+ provide: METRICS_PLUGIN_OPTIONS,
320
+ useFactory: async (...args) => {
321
+ const userOptions = await this.asyncOptions.useFactory(...args);
322
+ return _MetricsPlugin.mergeDefaults(userOptions);
323
+ },
324
+ inject: this.asyncOptions.inject || []
325
+ } : {
326
+ provide: METRICS_PLUGIN_OPTIONS,
327
+ useValue: _MetricsPlugin.mergeDefaults(this.options)
306
328
  };
307
- return [
308
- { provide: METRICS_PLUGIN_OPTIONS, useValue: config },
309
- { provide: METRICS_SERVICE, useClass: MetricsService }
310
- ];
329
+ return [optionsProvider, { provide: METRICS_SERVICE, useClass: MetricsService }];
311
330
  }
312
331
  getExports() {
313
332
  return [METRICS_SERVICE];
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shared/constants/index.ts","../src/shared/errors/index.ts","../src/metrics/application/services/metrics.service.ts","../src/metrics/api/controllers/metrics.controller.ts","../src/metrics.plugin.ts"],"names":["Inject"],"mappings":"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","file":"index.mjs","sourcesContent":["export const METRICS_PLUGIN_OPTIONS = Symbol.for('METRICS_PLUGIN_OPTIONS');\nexport const METRICS_SERVICE = Symbol.for('METRICS_SERVICE');\nexport const METRICS_REGISTRY = Symbol.for('METRICS_REGISTRY');\n","import { RedisXError, ErrorCode } from '@nestjs-redisx/core';\n\nexport class MetricsError extends RedisXError {\n constructor(message: string, cause?: Error) {\n super(message, ErrorCode.OP_FAILED, cause);\n }\n}\n\nexport class MetricRegistrationError extends MetricsError {\n constructor(metricName: string, cause?: Error) {\n super(`Failed to register metric \"${metricName}\"`, cause);\n }\n}\n","import { Injectable, Inject, OnModuleInit, OnModuleDestroy } from '@nestjs/common';\nimport * as promClient from 'prom-client';\n\nimport { METRICS_PLUGIN_OPTIONS } from '../../../shared/constants';\nimport { MetricRegistrationError } from '../../../shared/errors';\nimport { IMetricsPluginOptions, IMetricsJson } from '../../../shared/types';\nimport { IMetricsService } from '../ports/metrics-service.port';\n\n@Injectable()\nexport class MetricsService implements IMetricsService, OnModuleInit, OnModuleDestroy {\n private readonly registry: promClient.Registry;\n private readonly counters = new Map<string, promClient.Counter>();\n private readonly histograms = new Map<string, promClient.Histogram>();\n private readonly gauges = new Map<string, promClient.Gauge>();\n private readonly prefix: string;\n private readonly defaultLabels: Record<string, string>;\n private readonly latencyBuckets: number[];\n private readonly enabled: boolean;\n private defaultMetricsInterval?: ReturnType<typeof setInterval>;\n\n constructor(\n @Inject(METRICS_PLUGIN_OPTIONS)\n private readonly config: IMetricsPluginOptions,\n ) {\n this.enabled = config.enabled !== false;\n this.prefix = config.prefix ?? 'redisx_';\n this.defaultLabels = config.defaultLabels ?? {};\n this.latencyBuckets = config.histogramBuckets ?? [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10];\n\n this.registry = new promClient.Registry();\n this.registry.setDefaultLabels(this.defaultLabels);\n }\n\n onModuleInit(): void {\n if (!this.enabled) {\n return;\n }\n\n this.registerStandardMetrics();\n\n if (this.config.collectDefaultMetrics !== false) {\n const collectInterval = this.config.collectInterval ?? 15000;\n promClient.collectDefaultMetrics({\n register: this.registry,\n prefix: this.prefix,\n ...(collectInterval > 0 ? { timeout: collectInterval } : {}),\n });\n }\n }\n\n onModuleDestroy(): void {\n this.registry.clear();\n }\n\n private registerStandardMetrics(): void {\n const commandMetrics = this.config.commandMetrics !== false;\n const pluginMetrics = this.config.pluginMetrics !== false;\n\n // Core metrics\n if (commandMetrics) {\n this.registerCounter(`${this.prefix}commands_total`, 'Total Redis commands executed', ['command', 'client', 'status']);\n\n this.registerHistogram(`${this.prefix}command_duration_seconds`, 'Redis command latency in seconds', ['command', 'client'], this.latencyBuckets);\n\n this.registerGauge(`${this.prefix}connections_active`, 'Number of active Redis connections', ['client']);\n\n this.registerCounter(`${this.prefix}errors_total`, 'Total Redis errors', ['client', 'error_type']);\n }\n\n // Plugin-specific metrics\n if (pluginMetrics) {\n // Cache metrics\n this.registerCounter(`${this.prefix}cache_hits_total`, 'Total cache hits', ['layer']);\n\n this.registerCounter(`${this.prefix}cache_misses_total`, 'Total cache misses', ['layer']);\n\n this.registerGauge(`${this.prefix}cache_hit_ratio`, 'Cache hit ratio (0-1)', ['layer']);\n\n this.registerGauge(`${this.prefix}cache_size`, 'Current cache size', ['layer']);\n\n this.registerCounter(`${this.prefix}cache_stampede_prevented_total`, 'Total cache stampede prevention activations');\n\n // Lock metrics\n this.registerCounter(`${this.prefix}lock_acquisitions_total`, 'Total lock acquisition attempts', ['status']);\n\n this.registerHistogram(`${this.prefix}lock_wait_duration_seconds`, 'Lock wait time in seconds', [], this.latencyBuckets);\n\n this.registerHistogram(`${this.prefix}lock_hold_duration_seconds`, 'Lock hold time in seconds', [], this.latencyBuckets);\n\n this.registerGauge(`${this.prefix}locks_active`, 'Number of currently held locks');\n\n // Rate limit metrics\n this.registerCounter(`${this.prefix}ratelimit_requests_total`, 'Total rate limit requests', ['status']);\n\n // Stream metrics\n this.registerCounter(`${this.prefix}stream_messages_published_total`, 'Total stream messages published', ['stream']);\n\n this.registerCounter(`${this.prefix}stream_messages_consumed_total`, 'Total stream messages consumed', ['stream', 'group', 'status']);\n\n this.registerHistogram(`${this.prefix}stream_publish_duration_seconds`, 'Stream publish latency in seconds', ['stream'], this.latencyBuckets);\n\n this.registerCounter(`${this.prefix}stream_publish_errors_total`, 'Total stream publish errors', ['stream']);\n\n this.registerHistogram(`${this.prefix}stream_processing_duration_seconds`, 'Stream message processing time in seconds', ['stream', 'group'], this.latencyBuckets);\n\n // Idempotency metrics\n this.registerCounter(`${this.prefix}idempotency_requests_total`, 'Total idempotency requests', ['status']);\n\n this.registerHistogram(`${this.prefix}idempotency_duration_seconds`, 'Idempotency check duration in seconds', [], this.latencyBuckets);\n }\n }\n\n incrementCounter(name: string, labels?: Record<string, string>, value = 1): void {\n if (!this.enabled) {\n return;\n }\n\n const counter = this.counters.get(name);\n if (!counter) {\n return;\n }\n\n if (labels) {\n counter.inc(labels, value);\n } else {\n counter.inc(value);\n }\n }\n\n observeHistogram(name: string, value: number, labels?: Record<string, string>): void {\n if (!this.enabled) {\n return;\n }\n\n const histogram = this.histograms.get(name);\n if (!histogram) {\n return;\n }\n\n if (labels) {\n histogram.observe(labels, value);\n } else {\n histogram.observe(value);\n }\n }\n\n startTimer(name: string, labels?: Record<string, string>): () => number {\n if (!this.enabled) {\n return () => 0;\n }\n\n const histogram = this.histograms.get(name);\n if (!histogram) {\n return () => 0;\n }\n\n const startTime = Date.now();\n\n return () => {\n const duration = (Date.now() - startTime) / 1000;\n this.observeHistogram(name, duration, labels);\n return duration;\n };\n }\n\n setGauge(name: string, value: number, labels?: Record<string, string>): void {\n if (!this.enabled) {\n return;\n }\n\n const gauge = this.gauges.get(name);\n if (!gauge) {\n return;\n }\n\n if (labels) {\n gauge.set(labels, value);\n } else {\n gauge.set(value);\n }\n }\n\n incrementGauge(name: string, labels?: Record<string, string>, value = 1): void {\n if (!this.enabled) {\n return;\n }\n\n const gauge = this.gauges.get(name);\n if (!gauge) {\n return;\n }\n\n if (labels) {\n gauge.inc(labels, value);\n } else {\n gauge.inc(value);\n }\n }\n\n decrementGauge(name: string, labels?: Record<string, string>, value = 1): void {\n if (!this.enabled) {\n return;\n }\n\n const gauge = this.gauges.get(name);\n if (!gauge) {\n return;\n }\n\n if (labels) {\n gauge.dec(labels, value);\n } else {\n gauge.dec(value);\n }\n }\n\n async getMetrics(): Promise<string> {\n if (!this.enabled) {\n return '';\n }\n\n return this.registry.metrics();\n }\n\n async getMetricsJson(): Promise<IMetricsJson[]> {\n if (!this.enabled) {\n return [];\n }\n\n const metrics = await this.registry.getMetricsAsJSON();\n\n return metrics.map((metric: promClient.MetricObjectWithValues<promClient.MetricValue<string>>) => ({\n name: metric.name,\n help: metric.help,\n type: String(metric.type),\n values: metric.values.map((v: promClient.MetricValue<string>) => ({\n labels: (v.labels as Record<string, string>) ?? {},\n value: v.value,\n })),\n }));\n }\n\n registerCounter(name: string, help: string, labelNames: string[] = []): void {\n if (!this.enabled) {\n return;\n }\n\n try {\n const counter = new promClient.Counter({\n name,\n help,\n labelNames,\n registers: [this.registry],\n });\n\n this.counters.set(name, counter);\n } catch (error) {\n throw new MetricRegistrationError(name, error instanceof Error ? error : undefined);\n }\n }\n\n registerHistogram(name: string, help: string, labelNames: string[] = [], buckets?: number[]): void {\n if (!this.enabled) {\n return;\n }\n\n try {\n const histogram = new promClient.Histogram({\n name,\n help,\n labelNames,\n buckets: buckets ?? this.latencyBuckets,\n registers: [this.registry],\n });\n\n this.histograms.set(name, histogram);\n } catch (error) {\n throw new MetricRegistrationError(name, error instanceof Error ? error : undefined);\n }\n }\n\n registerGauge(name: string, help: string, labelNames: string[] = []): void {\n if (!this.enabled) {\n return;\n }\n\n try {\n const gauge = new promClient.Gauge({\n name,\n help,\n labelNames,\n registers: [this.registry],\n });\n\n this.gauges.set(name, gauge);\n } catch (error) {\n throw new MetricRegistrationError(name, error instanceof Error ? error : undefined);\n }\n }\n}\n","import { Controller, Get, Header, Inject } from '@nestjs/common';\n\nimport { METRICS_SERVICE } from '../../../shared/constants';\nimport { IMetricsService } from '../../application/ports/metrics-service.port';\n\n@Controller('metrics')\nexport class MetricsController {\n constructor(@Inject(METRICS_SERVICE) private readonly metricsService: IMetricsService) {}\n\n @Get()\n @Header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8')\n async getMetrics(): Promise<string> {\n return this.metricsService.getMetrics();\n }\n}\n","/**\n * Metrics plugin for NestJS RedisX.\n * Provides Prometheus metrics collection and export.\n */\n\nimport { Provider, Type } from '@nestjs/common';\nimport { IRedisXPlugin } from '@nestjs-redisx/core';\nimport { METRICS_PLUGIN_OPTIONS, METRICS_SERVICE } from './shared/constants';\nimport { IMetricsPluginOptions } from './shared/types';\nimport { MetricsService } from './metrics/application/services/metrics.service';\nimport { MetricsController } from './metrics/api/controllers/metrics.controller';\n\nconst DEFAULT_METRICS_CONFIG: Required<Omit<IMetricsPluginOptions, 'isGlobal' | 'defaultLabels'>> = {\n enabled: true,\n prefix: 'redisx_',\n exposeEndpoint: true,\n endpoint: '/metrics',\n histogramBuckets: [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],\n collectDefaultMetrics: true,\n commandMetrics: true,\n pluginMetrics: true,\n collectInterval: 15000,\n};\n\n/**\n * Metrics plugin for NestJS RedisX.\n *\n * Provides Prometheus metrics:\n * - Redis command latency\n * - Connection pool stats\n * - Cache hit/miss rates\n * - Error counts\n * - HTTP endpoint for Prometheus scraping\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [\n * RedisModule.forRoot({\n * clients: { host: 'localhost', port: 6379 },\n * plugins: [\n * new MetricsPlugin({\n * enabled: true,\n * exposeEndpoint: true,\n * endpoint: '/metrics',\n * }),\n * ],\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\nexport class MetricsPlugin implements IRedisXPlugin {\n readonly name = 'metrics';\n readonly version = '0.1.0';\n readonly description = 'Prometheus metrics collection and export';\n\n constructor(private readonly options: IMetricsPluginOptions = {}) {}\n\n getProviders(): Provider[] {\n const config: IMetricsPluginOptions = {\n enabled: this.options.enabled ?? DEFAULT_METRICS_CONFIG.enabled,\n prefix: this.options.prefix ?? DEFAULT_METRICS_CONFIG.prefix,\n exposeEndpoint: this.options.exposeEndpoint ?? DEFAULT_METRICS_CONFIG.exposeEndpoint,\n endpoint: this.options.endpoint ?? DEFAULT_METRICS_CONFIG.endpoint,\n histogramBuckets: this.options.histogramBuckets ?? DEFAULT_METRICS_CONFIG.histogramBuckets,\n collectDefaultMetrics: this.options.collectDefaultMetrics ?? DEFAULT_METRICS_CONFIG.collectDefaultMetrics,\n commandMetrics: this.options.commandMetrics ?? DEFAULT_METRICS_CONFIG.commandMetrics,\n pluginMetrics: this.options.pluginMetrics ?? DEFAULT_METRICS_CONFIG.pluginMetrics,\n collectInterval: this.options.collectInterval ?? DEFAULT_METRICS_CONFIG.collectInterval,\n defaultLabels: this.options.defaultLabels,\n };\n\n return [\n { provide: METRICS_PLUGIN_OPTIONS, useValue: config },\n { provide: METRICS_SERVICE, useClass: MetricsService },\n ];\n }\n\n getExports(): Array<string | symbol | Provider> {\n return [METRICS_SERVICE];\n }\n\n getControllers(): Type[] {\n // Only expose controller if endpoint is enabled\n if (this.options.exposeEndpoint !== false) {\n return [MetricsController];\n }\n return [];\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/shared/constants/index.ts","../src/shared/errors/index.ts","../src/metrics/application/services/metrics.service.ts","../src/metrics/api/controllers/metrics.controller.ts","../src/metrics.plugin.ts"],"names":["Inject"],"mappings":";;;;;;;;;;;;;;;;;AAAO,IAAM,sBAAA,mBAAyB,MAAA,CAAO,GAAA,CAAI,wBAAwB;AAClE,IAAM,eAAA,mBAAkB,MAAA,CAAO,GAAA,CAAI,iBAAiB;AACpD,IAAM,gBAAA,mBAAmB,MAAA,CAAO,GAAA,CAAI,kBAAkB;ACAtD,IAAM,YAAA,GAAN,cAA2B,WAAA,CAAY;AAAA,EAC5C,WAAA,CAAY,SAAiB,KAAA,EAAe;AAC1C,IAAA,KAAA,CAAM,OAAA,EAAS,SAAA,CAAU,SAAA,EAAW,KAAK,CAAA;AAAA,EAC3C;AACF;AAEO,IAAM,uBAAA,GAAN,cAAsC,YAAA,CAAa;AAAA,EACxD,WAAA,CAAY,YAAoB,KAAA,EAAe;AAC7C,IAAA,KAAA,CAAM,CAAA,2BAAA,EAA8B,UAAU,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,EAC1D;AACF;;;ACHO,IAAM,iBAAN,MAA+E;AAAA,EAWpF,YAEmB,MAAA,EACjB;AADiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,KAAY,KAAA;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,OAAO,MAAA,IAAU,SAAA;AAC/B,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA,CAAO,aAAA,IAAiB,EAAC;AAC9C,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA,CAAO,gBAAA,IAAoB,CAAC,MAAO,IAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAK,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,GAAG,EAAE,CAAA;AAEhH,IAAA,IAAA,CAAK,QAAA,GAAW,IAAe,UAAA,CAAA,QAAA,EAAS;AACxC,IAAA,IAAA,CAAK,QAAA,CAAS,gBAAA,CAAiB,IAAA,CAAK,aAAa,CAAA;AAAA,EACnD;AAAA,EArBiB,QAAA;AAAA,EACA,QAAA,uBAAe,GAAA,EAAgC;AAAA,EAC/C,UAAA,uBAAiB,GAAA,EAAkC;AAAA,EACnD,MAAA,uBAAa,GAAA,EAA8B;AAAA,EAC3C,MAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACT,sBAAA;AAAA,EAeR,YAAA,GAAqB;AACnB,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,uBAAA,EAAwB;AAE7B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,qBAAA,KAA0B,KAAA,EAAO;AAC/C,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,eAAA,IAAmB,IAAA;AACvD,MAAW,UAAA,CAAA,qBAAA,CAAsB;AAAA,QAC/B,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,GAAI,eAAA,GAAkB,CAAA,GAAI,EAAE,OAAA,EAAS,eAAA,KAAoB;AAAC,OAC3D,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,eAAA,GAAwB;AACtB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACtB;AAAA,EAEQ,uBAAA,GAAgC;AACtC,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,cAAA,KAAmB,KAAA;AACtD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,MAAA,CAAO,aAAA,KAAkB,KAAA;AAGpD,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,eAAA,CAAgB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,cAAA,CAAA,EAAkB,iCAAiC,CAAC,SAAA,EAAW,QAAA,EAAU,QAAQ,CAAC,CAAA;AAErH,MAAA,IAAA,CAAK,iBAAA,CAAkB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,wBAAA,CAAA,EAA4B,kCAAA,EAAoC,CAAC,SAAA,EAAW,QAAQ,CAAA,EAAG,IAAA,CAAK,cAAc,CAAA;AAE/I,MAAA,IAAA,CAAK,aAAA,CAAc,GAAG,IAAA,CAAK,MAAM,sBAAsB,oCAAA,EAAsC,CAAC,QAAQ,CAAC,CAAA;AAEvG,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAG,IAAA,CAAK,MAAM,gBAAgB,oBAAA,EAAsB,CAAC,QAAA,EAAU,YAAY,CAAC,CAAA;AAAA,IACnG;AAGA,IAAA,IAAI,aAAA,EAAe;AAEjB,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAG,IAAA,CAAK,MAAM,oBAAoB,kBAAA,EAAoB,CAAC,OAAO,CAAC,CAAA;AAEpF,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAG,IAAA,CAAK,MAAM,sBAAsB,oBAAA,EAAsB,CAAC,OAAO,CAAC,CAAA;AAExF,MAAA,IAAA,CAAK,aAAA,CAAc,GAAG,IAAA,CAAK,MAAM,mBAAmB,uBAAA,EAAyB,CAAC,OAAO,CAAC,CAAA;AAEtF,MAAA,IAAA,CAAK,aAAA,CAAc,GAAG,IAAA,CAAK,MAAM,cAAc,oBAAA,EAAsB,CAAC,OAAO,CAAC,CAAA;AAE9E,MAAA,IAAA,CAAK,eAAA,CAAgB,CAAA,EAAG,IAAA,CAAK,MAAM,kCAAkC,6CAA6C,CAAA;AAGlH,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAG,IAAA,CAAK,MAAM,2BAA2B,iCAAA,EAAmC,CAAC,QAAQ,CAAC,CAAA;AAE3G,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAG,IAAA,CAAK,MAAM,8BAA8B,2BAAA,EAA6B,EAAC,EAAG,IAAA,CAAK,cAAc,CAAA;AAEvH,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAG,IAAA,CAAK,MAAM,8BAA8B,2BAAA,EAA6B,EAAC,EAAG,IAAA,CAAK,cAAc,CAAA;AAEvH,MAAA,IAAA,CAAK,aAAA,CAAc,CAAA,EAAG,IAAA,CAAK,MAAM,gBAAgB,gCAAgC,CAAA;AAGjF,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAG,IAAA,CAAK,MAAM,4BAA4B,2BAAA,EAA6B,CAAC,QAAQ,CAAC,CAAA;AAGtG,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAG,IAAA,CAAK,MAAM,mCAAmC,iCAAA,EAAmC,CAAC,QAAQ,CAAC,CAAA;AAEnH,MAAA,IAAA,CAAK,eAAA,CAAgB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,8BAAA,CAAA,EAAkC,kCAAkC,CAAC,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAC,CAAA;AAEpI,MAAA,IAAA,CAAK,iBAAA,CAAkB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,+BAAA,CAAA,EAAmC,qCAAqC,CAAC,QAAQ,CAAA,EAAG,IAAA,CAAK,cAAc,CAAA;AAE5I,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAG,IAAA,CAAK,MAAM,+BAA+B,6BAAA,EAA+B,CAAC,QAAQ,CAAC,CAAA;AAE3G,MAAA,IAAA,CAAK,iBAAA,CAAkB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,kCAAA,CAAA,EAAsC,2CAAA,EAA6C,CAAC,QAAA,EAAU,OAAO,CAAA,EAAG,IAAA,CAAK,cAAc,CAAA;AAGhK,MAAA,IAAA,CAAK,eAAA,CAAgB,GAAG,IAAA,CAAK,MAAM,8BAA8B,4BAAA,EAA8B,CAAC,QAAQ,CAAC,CAAA;AAEzG,MAAA,IAAA,CAAK,iBAAA,CAAkB,GAAG,IAAA,CAAK,MAAM,gCAAgC,uCAAA,EAAyC,EAAC,EAAG,IAAA,CAAK,cAAc,CAAA;AAAA,IACvI;AAAA,EACF;AAAA,EAEA,gBAAA,CAAiB,IAAA,EAAc,MAAA,EAAiC,KAAA,GAAQ,CAAA,EAAS;AAC/E,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,KAAK,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,gBAAA,CAAiB,IAAA,EAAc,KAAA,EAAe,MAAA,EAAuC;AACnF,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,SAAA,CAAU,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,QAAQ,KAAK,CAAA;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,UAAA,CAAW,MAAc,MAAA,EAA+C;AACtE,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,MAAM,CAAA;AAAA,IACf;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,MAAM,CAAA;AAAA,IACf;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,QAAA,GAAA,CAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,IAAa,GAAA;AAC5C,MAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAM,QAAA,EAAU,MAAM,CAAA;AAC5C,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAAA,EACF;AAAA,EAEA,QAAA,CAAS,IAAA,EAAc,KAAA,EAAe,MAAA,EAAuC;AAC3E,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,CAAM,GAAA,CAAI,QAAQ,KAAK,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAI,KAAK,CAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,cAAA,CAAe,IAAA,EAAc,MAAA,EAAiC,KAAA,GAAQ,CAAA,EAAS;AAC7E,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,CAAM,GAAA,CAAI,QAAQ,KAAK,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAI,KAAK,CAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,cAAA,CAAe,IAAA,EAAc,MAAA,EAAiC,KAAA,GAAQ,CAAA,EAAS;AAC7E,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,CAAM,GAAA,CAAI,QAAQ,KAAK,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAI,KAAK,CAAA;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA8B;AAClC,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,SAAS,OAAA,EAAQ;AAAA,EAC/B;AAAA,EAEA,MAAM,cAAA,GAA0C;AAC9C,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,gBAAA,EAAiB;AAErD,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAA+E;AAAA,MACjG,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,IAAA,EAAM,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,MACxB,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAuC;AAAA,QAChE,MAAA,EAAS,CAAA,CAAE,MAAA,IAAqC,EAAC;AAAA,QACjD,OAAO,CAAA,CAAE;AAAA,OACX,CAAE;AAAA,KACJ,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,eAAA,CAAgB,IAAA,EAAc,IAAA,EAAc,UAAA,GAAuB,EAAC,EAAS;AAC3E,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAe,UAAA,CAAA,OAAA,CAAQ;AAAA,QACrC,IAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,OAC1B,CAAA;AAED,MAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAAA,IACjC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,uBAAA,CAAwB,IAAA,EAAM,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAS,CAAA;AAAA,IACpF;AAAA,EACF;AAAA,EAEA,kBAAkB,IAAA,EAAc,IAAA,EAAc,UAAA,GAAuB,IAAI,OAAA,EAA0B;AACjG,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,IAAe,UAAA,CAAA,SAAA,CAAU;AAAA,QACzC,IAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA,EAAS,WAAW,IAAA,CAAK,cAAA;AAAA,QACzB,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,OAC1B,CAAA;AAED,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAA,EAAM,SAAS,CAAA;AAAA,IACrC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,uBAAA,CAAwB,IAAA,EAAM,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAS,CAAA;AAAA,IACpF;AAAA,EACF;AAAA,EAEA,aAAA,CAAc,IAAA,EAAc,IAAA,EAAc,UAAA,GAAuB,EAAC,EAAS;AACzE,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACjB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAe,UAAA,CAAA,KAAA,CAAM;AAAA,QACjC,IAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA;AAAA,QACA,SAAA,EAAW,CAAC,IAAA,CAAK,QAAQ;AAAA,OAC1B,CAAA;AAED,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,KAAK,CAAA;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,uBAAA,CAAwB,IAAA,EAAM,KAAA,YAAiB,KAAA,GAAQ,QAAQ,MAAS,CAAA;AAAA,IACpF;AAAA,EACF;AACF;AAlSa,cAAA,GAAN,eAAA,CAAA;AAAA,EADN,UAAA,EAAW;AAAA,EAaP,0BAAO,sBAAsB,CAAA;AAAA,CAAA,EAZrB,cAAA,CAAA;ACHN,IAAM,oBAAN,MAAwB;AAAA,EAC7B,YAAsD,cAAA,EAAiC;AAAjC,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA,EAAkC;AAAA,EAIxF,MAAM,UAAA,GAA8B;AAClC,IAAA,OAAO,IAAA,CAAK,eAAe,UAAA,EAAW;AAAA,EACxC;AACF;AAHQ,eAAA,CAAA;AAAA,EAFL,GAAA,EAAI;AAAA,EACJ,MAAA,CAAO,gBAAgB,0CAA0C;AAAA,CAAA,EAJvD,iBAAA,CAKL,SAAA,EAAA,YAAA,EAAA,CAAA,CAAA;AALK,iBAAA,GAAN,eAAA,CAAA;AAAA,EADN,WAAW,SAAS,CAAA;AAAA,EAEN,eAAA,CAAA,CAAA,EAAAA,OAAO,eAAe,CAAA;AAAA,CAAA,EADxB,iBAAA,CAAA;;;ACMb,IAAM,sBAAA,GAA8F;AAAA,EAClG,OAAA,EAAS,IAAA;AAAA,EACT,MAAA,EAAQ,SAAA;AAAA,EACR,cAAA,EAAgB,IAAA;AAAA,EAChB,QAAA,EAAU,UAAA;AAAA,EACV,gBAAA,EAAkB,CAAC,IAAA,EAAO,IAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,GAAA,EAAK,GAAG,EAAE,CAAA;AAAA,EACjF,qBAAA,EAAuB,IAAA;AAAA,EACvB,cAAA,EAAgB,IAAA;AAAA,EAChB,aAAA,EAAe,IAAA;AAAA,EACf,eAAA,EAAiB;AACnB,CAAA;AA+BO,IAAM,aAAA,GAAN,MAAM,cAAA,CAAuC;AAAA,EAOlD,WAAA,CAA6B,OAAA,GAAiC,EAAC,EAAG;AAArC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAAA,EAAsC;AAAA,EAN1D,IAAA,GAAO,SAAA;AAAA,EACP,OAAA,GAAU,OAAA;AAAA,EACV,WAAA,GAAc,0CAAA;AAAA,EAEf,YAAA;AAAA,EAIR,OAAO,cAAc,YAAA,EAAyE;AAC5F,IAAA,MAAM,MAAA,GAAS,IAAI,cAAA,EAAc;AACjC,IAAA,MAAA,CAAO,YAAA,GAAe,YAAA;AACtB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,OAAe,cAAc,OAAA,EAAuD;AAClF,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAA,CAAQ,OAAA,IAAW,sBAAA,CAAuB,OAAA;AAAA,MACnD,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,sBAAA,CAAuB,MAAA;AAAA,MACjD,cAAA,EAAgB,OAAA,CAAQ,cAAA,IAAkB,sBAAA,CAAuB,cAAA;AAAA,MACjE,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,sBAAA,CAAuB,QAAA;AAAA,MACrD,gBAAA,EAAkB,OAAA,CAAQ,gBAAA,IAAoB,sBAAA,CAAuB,gBAAA;AAAA,MACrE,qBAAA,EAAuB,OAAA,CAAQ,qBAAA,IAAyB,sBAAA,CAAuB,qBAAA;AAAA,MAC/E,cAAA,EAAgB,OAAA,CAAQ,cAAA,IAAkB,sBAAA,CAAuB,cAAA;AAAA,MACjE,aAAA,EAAe,OAAA,CAAQ,aAAA,IAAiB,sBAAA,CAAuB,aAAA;AAAA,MAC/D,eAAA,EAAiB,OAAA,CAAQ,eAAA,IAAmB,sBAAA,CAAuB,eAAA;AAAA,MACnE,eAAe,OAAA,CAAQ;AAAA,KACzB;AAAA,EACF;AAAA,EAEA,UAAA,GAAsE;AACpE,IAAA,OAAO,IAAA,CAAK,YAAA,EAAc,OAAA,IAAW,EAAC;AAAA,EACxC;AAAA,EAEA,YAAA,GAA2B;AACzB,IAAA,MAAM,eAAA,GAA4B,KAAK,YAAA,GACnC;AAAA,MACE,OAAA,EAAS,sBAAA;AAAA,MACT,UAAA,EAAY,UAAU,IAAA,KAAoB;AACxC,QAAA,MAAM,cAAc,MAAM,IAAA,CAAK,YAAA,CAAc,UAAA,CAAW,GAAG,IAAI,CAAA;AAC/D,QAAA,OAAO,cAAA,CAAc,cAAc,WAAW,CAAA;AAAA,MAChD,CAAA;AAAA,MACA,MAAA,EAAQ,IAAA,CAAK,YAAA,CAAa,MAAA,IAAU;AAAC,KACvC,GACA;AAAA,MACE,OAAA,EAAS,sBAAA;AAAA,MACT,QAAA,EAAU,cAAA,CAAc,aAAA,CAAc,IAAA,CAAK,OAAO;AAAA,KACpD;AAEJ,IAAA,OAAO,CAAC,eAAA,EAAiB,EAAE,SAAS,eAAA,EAAiB,QAAA,EAAU,gBAAgB,CAAA;AAAA,EACjF;AAAA,EAEA,UAAA,GAAgD;AAC9C,IAAA,OAAO,CAAC,eAAe,CAAA;AAAA,EACzB;AAAA,EAEA,cAAA,GAAyB;AAEvB,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,cAAA,KAAmB,KAAA,EAAO;AACzC,MAAA,OAAO,CAAC,iBAAiB,CAAA;AAAA,IAC3B;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AACF","file":"index.mjs","sourcesContent":["export const METRICS_PLUGIN_OPTIONS = Symbol.for('METRICS_PLUGIN_OPTIONS');\nexport const METRICS_SERVICE = Symbol.for('METRICS_SERVICE');\nexport const METRICS_REGISTRY = Symbol.for('METRICS_REGISTRY');\n","import { RedisXError, ErrorCode } from '@nestjs-redisx/core';\n\nexport class MetricsError extends RedisXError {\n constructor(message: string, cause?: Error) {\n super(message, ErrorCode.OP_FAILED, cause);\n }\n}\n\nexport class MetricRegistrationError extends MetricsError {\n constructor(metricName: string, cause?: Error) {\n super(`Failed to register metric \"${metricName}\"`, cause);\n }\n}\n","import { Injectable, Inject, OnModuleInit, OnModuleDestroy } from '@nestjs/common';\nimport * as promClient from 'prom-client';\n\nimport { METRICS_PLUGIN_OPTIONS } from '../../../shared/constants';\nimport { MetricRegistrationError } from '../../../shared/errors';\nimport { IMetricsPluginOptions, IMetricsJson } from '../../../shared/types';\nimport { IMetricsService } from '../ports/metrics-service.port';\n\n@Injectable()\nexport class MetricsService implements IMetricsService, OnModuleInit, OnModuleDestroy {\n private readonly registry: promClient.Registry;\n private readonly counters = new Map<string, promClient.Counter>();\n private readonly histograms = new Map<string, promClient.Histogram>();\n private readonly gauges = new Map<string, promClient.Gauge>();\n private readonly prefix: string;\n private readonly defaultLabels: Record<string, string>;\n private readonly latencyBuckets: number[];\n private readonly enabled: boolean;\n private defaultMetricsInterval?: ReturnType<typeof setInterval>;\n\n constructor(\n @Inject(METRICS_PLUGIN_OPTIONS)\n private readonly config: IMetricsPluginOptions,\n ) {\n this.enabled = config.enabled !== false;\n this.prefix = config.prefix ?? 'redisx_';\n this.defaultLabels = config.defaultLabels ?? {};\n this.latencyBuckets = config.histogramBuckets ?? [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10];\n\n this.registry = new promClient.Registry();\n this.registry.setDefaultLabels(this.defaultLabels);\n }\n\n onModuleInit(): void {\n if (!this.enabled) {\n return;\n }\n\n this.registerStandardMetrics();\n\n if (this.config.collectDefaultMetrics !== false) {\n const collectInterval = this.config.collectInterval ?? 15000;\n promClient.collectDefaultMetrics({\n register: this.registry,\n prefix: this.prefix,\n ...(collectInterval > 0 ? { timeout: collectInterval } : {}),\n });\n }\n }\n\n onModuleDestroy(): void {\n this.registry.clear();\n }\n\n private registerStandardMetrics(): void {\n const commandMetrics = this.config.commandMetrics !== false;\n const pluginMetrics = this.config.pluginMetrics !== false;\n\n // Core metrics\n if (commandMetrics) {\n this.registerCounter(`${this.prefix}commands_total`, 'Total Redis commands executed', ['command', 'client', 'status']);\n\n this.registerHistogram(`${this.prefix}command_duration_seconds`, 'Redis command latency in seconds', ['command', 'client'], this.latencyBuckets);\n\n this.registerGauge(`${this.prefix}connections_active`, 'Number of active Redis connections', ['client']);\n\n this.registerCounter(`${this.prefix}errors_total`, 'Total Redis errors', ['client', 'error_type']);\n }\n\n // Plugin-specific metrics\n if (pluginMetrics) {\n // Cache metrics\n this.registerCounter(`${this.prefix}cache_hits_total`, 'Total cache hits', ['layer']);\n\n this.registerCounter(`${this.prefix}cache_misses_total`, 'Total cache misses', ['layer']);\n\n this.registerGauge(`${this.prefix}cache_hit_ratio`, 'Cache hit ratio (0-1)', ['layer']);\n\n this.registerGauge(`${this.prefix}cache_size`, 'Current cache size', ['layer']);\n\n this.registerCounter(`${this.prefix}cache_stampede_prevented_total`, 'Total cache stampede prevention activations');\n\n // Lock metrics\n this.registerCounter(`${this.prefix}lock_acquisitions_total`, 'Total lock acquisition attempts', ['status']);\n\n this.registerHistogram(`${this.prefix}lock_wait_duration_seconds`, 'Lock wait time in seconds', [], this.latencyBuckets);\n\n this.registerHistogram(`${this.prefix}lock_hold_duration_seconds`, 'Lock hold time in seconds', [], this.latencyBuckets);\n\n this.registerGauge(`${this.prefix}locks_active`, 'Number of currently held locks');\n\n // Rate limit metrics\n this.registerCounter(`${this.prefix}ratelimit_requests_total`, 'Total rate limit requests', ['status']);\n\n // Stream metrics\n this.registerCounter(`${this.prefix}stream_messages_published_total`, 'Total stream messages published', ['stream']);\n\n this.registerCounter(`${this.prefix}stream_messages_consumed_total`, 'Total stream messages consumed', ['stream', 'group', 'status']);\n\n this.registerHistogram(`${this.prefix}stream_publish_duration_seconds`, 'Stream publish latency in seconds', ['stream'], this.latencyBuckets);\n\n this.registerCounter(`${this.prefix}stream_publish_errors_total`, 'Total stream publish errors', ['stream']);\n\n this.registerHistogram(`${this.prefix}stream_processing_duration_seconds`, 'Stream message processing time in seconds', ['stream', 'group'], this.latencyBuckets);\n\n // Idempotency metrics\n this.registerCounter(`${this.prefix}idempotency_requests_total`, 'Total idempotency requests', ['status']);\n\n this.registerHistogram(`${this.prefix}idempotency_duration_seconds`, 'Idempotency check duration in seconds', [], this.latencyBuckets);\n }\n }\n\n incrementCounter(name: string, labels?: Record<string, string>, value = 1): void {\n if (!this.enabled) {\n return;\n }\n\n const counter = this.counters.get(name);\n if (!counter) {\n return;\n }\n\n if (labels) {\n counter.inc(labels, value);\n } else {\n counter.inc(value);\n }\n }\n\n observeHistogram(name: string, value: number, labels?: Record<string, string>): void {\n if (!this.enabled) {\n return;\n }\n\n const histogram = this.histograms.get(name);\n if (!histogram) {\n return;\n }\n\n if (labels) {\n histogram.observe(labels, value);\n } else {\n histogram.observe(value);\n }\n }\n\n startTimer(name: string, labels?: Record<string, string>): () => number {\n if (!this.enabled) {\n return () => 0;\n }\n\n const histogram = this.histograms.get(name);\n if (!histogram) {\n return () => 0;\n }\n\n const startTime = Date.now();\n\n return () => {\n const duration = (Date.now() - startTime) / 1000;\n this.observeHistogram(name, duration, labels);\n return duration;\n };\n }\n\n setGauge(name: string, value: number, labels?: Record<string, string>): void {\n if (!this.enabled) {\n return;\n }\n\n const gauge = this.gauges.get(name);\n if (!gauge) {\n return;\n }\n\n if (labels) {\n gauge.set(labels, value);\n } else {\n gauge.set(value);\n }\n }\n\n incrementGauge(name: string, labels?: Record<string, string>, value = 1): void {\n if (!this.enabled) {\n return;\n }\n\n const gauge = this.gauges.get(name);\n if (!gauge) {\n return;\n }\n\n if (labels) {\n gauge.inc(labels, value);\n } else {\n gauge.inc(value);\n }\n }\n\n decrementGauge(name: string, labels?: Record<string, string>, value = 1): void {\n if (!this.enabled) {\n return;\n }\n\n const gauge = this.gauges.get(name);\n if (!gauge) {\n return;\n }\n\n if (labels) {\n gauge.dec(labels, value);\n } else {\n gauge.dec(value);\n }\n }\n\n async getMetrics(): Promise<string> {\n if (!this.enabled) {\n return '';\n }\n\n return this.registry.metrics();\n }\n\n async getMetricsJson(): Promise<IMetricsJson[]> {\n if (!this.enabled) {\n return [];\n }\n\n const metrics = await this.registry.getMetricsAsJSON();\n\n return metrics.map((metric: promClient.MetricObjectWithValues<promClient.MetricValue<string>>) => ({\n name: metric.name,\n help: metric.help,\n type: String(metric.type),\n values: metric.values.map((v: promClient.MetricValue<string>) => ({\n labels: (v.labels as Record<string, string>) ?? {},\n value: v.value,\n })),\n }));\n }\n\n registerCounter(name: string, help: string, labelNames: string[] = []): void {\n if (!this.enabled) {\n return;\n }\n\n try {\n const counter = new promClient.Counter({\n name,\n help,\n labelNames,\n registers: [this.registry],\n });\n\n this.counters.set(name, counter);\n } catch (error) {\n throw new MetricRegistrationError(name, error instanceof Error ? error : undefined);\n }\n }\n\n registerHistogram(name: string, help: string, labelNames: string[] = [], buckets?: number[]): void {\n if (!this.enabled) {\n return;\n }\n\n try {\n const histogram = new promClient.Histogram({\n name,\n help,\n labelNames,\n buckets: buckets ?? this.latencyBuckets,\n registers: [this.registry],\n });\n\n this.histograms.set(name, histogram);\n } catch (error) {\n throw new MetricRegistrationError(name, error instanceof Error ? error : undefined);\n }\n }\n\n registerGauge(name: string, help: string, labelNames: string[] = []): void {\n if (!this.enabled) {\n return;\n }\n\n try {\n const gauge = new promClient.Gauge({\n name,\n help,\n labelNames,\n registers: [this.registry],\n });\n\n this.gauges.set(name, gauge);\n } catch (error) {\n throw new MetricRegistrationError(name, error instanceof Error ? error : undefined);\n }\n }\n}\n","import { Controller, Get, Header, Inject } from '@nestjs/common';\n\nimport { METRICS_SERVICE } from '../../../shared/constants';\nimport { IMetricsService } from '../../application/ports/metrics-service.port';\n\n@Controller('metrics')\nexport class MetricsController {\n constructor(@Inject(METRICS_SERVICE) private readonly metricsService: IMetricsService) {}\n\n @Get()\n @Header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8')\n async getMetrics(): Promise<string> {\n return this.metricsService.getMetrics();\n }\n}\n","/**\n * Metrics plugin for NestJS RedisX.\n * Provides Prometheus metrics collection and export.\n */\n\nimport { DynamicModule, ForwardReference, Provider, Type } from '@nestjs/common';\nimport { IRedisXPlugin, IPluginAsyncOptions } from '@nestjs-redisx/core';\nimport { METRICS_PLUGIN_OPTIONS, METRICS_SERVICE } from './shared/constants';\nimport { IMetricsPluginOptions } from './shared/types';\nimport { MetricsService } from './metrics/application/services/metrics.service';\nimport { MetricsController } from './metrics/api/controllers/metrics.controller';\n\nconst DEFAULT_METRICS_CONFIG: Required<Omit<IMetricsPluginOptions, 'isGlobal' | 'defaultLabels'>> = {\n enabled: true,\n prefix: 'redisx_',\n exposeEndpoint: true,\n endpoint: '/metrics',\n histogramBuckets: [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10],\n collectDefaultMetrics: true,\n commandMetrics: true,\n pluginMetrics: true,\n collectInterval: 15000,\n};\n\n/**\n * Metrics plugin for NestJS RedisX.\n *\n * Provides Prometheus metrics:\n * - Redis command latency\n * - Connection pool stats\n * - Cache hit/miss rates\n * - Error counts\n * - HTTP endpoint for Prometheus scraping\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [\n * RedisModule.forRoot({\n * clients: { host: 'localhost', port: 6379 },\n * plugins: [\n * new MetricsPlugin({\n * enabled: true,\n * exposeEndpoint: true,\n * endpoint: '/metrics',\n * }),\n * ],\n * }),\n * ],\n * })\n * export class AppModule {}\n * ```\n */\nexport class MetricsPlugin implements IRedisXPlugin {\n readonly name = 'metrics';\n readonly version = '0.1.0';\n readonly description = 'Prometheus metrics collection and export';\n\n private asyncOptions?: IPluginAsyncOptions<IMetricsPluginOptions>;\n\n constructor(private readonly options: IMetricsPluginOptions = {}) {}\n\n static registerAsync(asyncOptions: IPluginAsyncOptions<IMetricsPluginOptions>): MetricsPlugin {\n const plugin = new MetricsPlugin();\n plugin.asyncOptions = asyncOptions;\n return plugin;\n }\n\n private static mergeDefaults(options: IMetricsPluginOptions): IMetricsPluginOptions {\n return {\n enabled: options.enabled ?? DEFAULT_METRICS_CONFIG.enabled,\n prefix: options.prefix ?? DEFAULT_METRICS_CONFIG.prefix,\n exposeEndpoint: options.exposeEndpoint ?? DEFAULT_METRICS_CONFIG.exposeEndpoint,\n endpoint: options.endpoint ?? DEFAULT_METRICS_CONFIG.endpoint,\n histogramBuckets: options.histogramBuckets ?? DEFAULT_METRICS_CONFIG.histogramBuckets,\n collectDefaultMetrics: options.collectDefaultMetrics ?? DEFAULT_METRICS_CONFIG.collectDefaultMetrics,\n commandMetrics: options.commandMetrics ?? DEFAULT_METRICS_CONFIG.commandMetrics,\n pluginMetrics: options.pluginMetrics ?? DEFAULT_METRICS_CONFIG.pluginMetrics,\n collectInterval: options.collectInterval ?? DEFAULT_METRICS_CONFIG.collectInterval,\n defaultLabels: options.defaultLabels,\n };\n }\n\n getImports(): Array<Type<unknown> | DynamicModule | ForwardReference> {\n return this.asyncOptions?.imports ?? [];\n }\n\n getProviders(): Provider[] {\n const optionsProvider: Provider = this.asyncOptions\n ? {\n provide: METRICS_PLUGIN_OPTIONS,\n useFactory: async (...args: unknown[]) => {\n const userOptions = await this.asyncOptions!.useFactory(...args);\n return MetricsPlugin.mergeDefaults(userOptions);\n },\n inject: this.asyncOptions.inject || [],\n }\n : {\n provide: METRICS_PLUGIN_OPTIONS,\n useValue: MetricsPlugin.mergeDefaults(this.options),\n };\n\n return [optionsProvider, { provide: METRICS_SERVICE, useClass: MetricsService }];\n }\n\n getExports(): Array<string | symbol | Provider> {\n return [METRICS_SERVICE];\n }\n\n getControllers(): Type[] {\n // Only expose controller if endpoint is enabled\n if (this.options.exposeEndpoint !== false) {\n return [MetricsController];\n }\n return [];\n }\n}\n"]}
@@ -2,8 +2,8 @@
2
2
  * Metrics plugin for NestJS RedisX.
3
3
  * Provides Prometheus metrics collection and export.
4
4
  */
5
- import { Provider, Type } from '@nestjs/common';
6
- import { IRedisXPlugin } from '@nestjs-redisx/core';
5
+ import { DynamicModule, ForwardReference, Provider, Type } from '@nestjs/common';
6
+ import { IRedisXPlugin, IPluginAsyncOptions } from '@nestjs-redisx/core';
7
7
  import { IMetricsPluginOptions } from './shared/types';
8
8
  /**
9
9
  * Metrics plugin for NestJS RedisX.
@@ -39,7 +39,11 @@ export declare class MetricsPlugin implements IRedisXPlugin {
39
39
  readonly name = "metrics";
40
40
  readonly version = "0.1.0";
41
41
  readonly description = "Prometheus metrics collection and export";
42
+ private asyncOptions?;
42
43
  constructor(options?: IMetricsPluginOptions);
44
+ static registerAsync(asyncOptions: IPluginAsyncOptions<IMetricsPluginOptions>): MetricsPlugin;
45
+ private static mergeDefaults;
46
+ getImports(): Array<Type<unknown> | DynamicModule | ForwardReference>;
43
47
  getProviders(): Provider[];
44
48
  getExports(): Array<string | symbol | Provider>;
45
49
  getControllers(): Type[];
@@ -1 +1 @@
1
- {"version":3,"file":"metrics.plugin.d.ts","sourceRoot":"","sources":["../src/metrics.plugin.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAgBvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,aAAc,YAAW,aAAa;IAKrC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAJpC,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,WAAW,8CAA8C;gBAErC,OAAO,GAAE,qBAA0B;IAEhE,YAAY,IAAI,QAAQ,EAAE;IAoB1B,UAAU,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAI/C,cAAc,IAAI,IAAI,EAAE;CAOzB"}
1
+ {"version":3,"file":"metrics.plugin.d.ts","sourceRoot":"","sources":["../src/metrics.plugin.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAgBvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,aAAc,YAAW,aAAa;IAOrC,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,OAAO,WAAW;IAC3B,QAAQ,CAAC,WAAW,8CAA8C;IAElE,OAAO,CAAC,YAAY,CAAC,CAA6C;gBAErC,OAAO,GAAE,qBAA0B;IAEhE,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,mBAAmB,CAAC,qBAAqB,CAAC,GAAG,aAAa;IAM7F,OAAO,CAAC,MAAM,CAAC,aAAa;IAe5B,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,aAAa,GAAG,gBAAgB,CAAC;IAIrE,YAAY,IAAI,QAAQ,EAAE;IAkB1B,UAAU,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IAI/C,cAAc,IAAI,IAAI,EAAE;CAOzB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nestjs-redisx/metrics",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Prometheus metrics plugin for NestJS RedisX with custom metrics support",
5
5
  "author": "NestJS RedisX Team",
6
6
  "license": "MIT",
@@ -49,8 +49,8 @@
49
49
  },
50
50
  "peerDependencies": {
51
51
  "@nestjs-redisx/core": "^1.0.0",
52
- "@nestjs/common": "^10.0.0",
53
- "@nestjs/core": "^10.0.0",
52
+ "@nestjs/common": "^10.0.0 || ^11.0.0",
53
+ "@nestjs/core": "^10.0.0 || ^11.0.0",
54
54
  "reflect-metadata": "^0.2.0",
55
55
  "rxjs": "^7.8.0"
56
56
  },