{"version":3,"sources":["../package.json","../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":["{\n  \"name\": \"@nestjs-redisx/metrics\",\n  \"version\": \"1.13.0\",\n  \"description\": \"Prometheus metrics plugin for NestJS RedisX with custom metrics support\",\n  \"author\": \"NestJS RedisX Team\",\n  \"license\": \"MIT\",\n  \"main\": \"./dist/index.js\",\n  \"module\": \"./dist/index.mjs\",\n  \"types\": \"./dist/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"import\": {\n        \"types\": \"./dist/index.d.mts\",\n        \"default\": \"./dist/index.mjs\"\n      },\n      \"require\": {\n        \"types\": \"./dist/index.d.ts\",\n        \"default\": \"./dist/index.js\"\n      },\n      \"default\": \"./dist/index.js\"\n    },\n    \"./package.json\": \"./package.json\"\n  },\n  \"files\": [\n    \"dist\",\n    \"README.md\",\n    \"LICENSE\"\n  ],\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"test\": \"SKIP_INTEGRATION=true vitest run\",\n    \"test:watch\": \"SKIP_INTEGRATION=true vitest\",\n    \"test:cov\": \"SKIP_INTEGRATION=true vitest run --coverage\",\n    \"lint\": \"eslint \\\"{src,test}/**/*.ts\\\"\",\n    \"format\": \"prettier --write \\\"{src,test}/**/*.ts\\\"\",\n    \"prepublishOnly\": \"node ../../scripts/check-changelog.mjs\"\n  },\n  \"keywords\": [\n    \"nestjs\",\n    \"redis\",\n    \"metrics\",\n    \"prometheus\",\n    \"monitoring\",\n    \"observability\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/nestjs-redisx/nestjs-redisx.git\",\n    \"directory\": \"packages/metrics\"\n  },\n  \"homepage\": \"https://nestjs-redisx.dev/en/reference/metrics/\",\n  \"bugs\": {\n    \"url\": \"https://github.com/nestjs-redisx/nestjs-redisx/issues\"\n  },\n  \"peerDependencies\": {\n    \"@nestjs-redisx/core\": \"^1.0.0\",\n    \"@nestjs/common\": \"^10.0.0 || ^11.0.0 || ^12.0.0\",\n    \"@nestjs/core\": \"^10.0.0 || ^11.0.0 || ^12.0.0\",\n    \"prom-client\": \"^15.0.0\",\n    \"reflect-metadata\": \"^0.2.0\",\n    \"rxjs\": \"^7.8.0\"\n  },\n  \"devDependencies\": {\n    \"@nestjs/testing\": \"^9.0.0 || ^10.0.0 || ^11.0.0\",\n    \"@types/node\": \"^20.0.0\",\n    \"@typescript-eslint/eslint-plugin\": \"^6.0.0\",\n    \"@typescript-eslint/parser\": \"^6.0.0\",\n    \"@vitest/coverage-v8\": \"^1.6.0\",\n    \"eslint\": \"^8.0.0\",\n    \"prettier\": \"^3.0.0\",\n    \"prom-client\": \"^15.1.0\",\n    \"tsup\": \"^8.0.0\",\n    \"typescript\": \"^5.3.0\",\n    \"vitest\": \"^1.6.0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"engines\": {\n    \"node\": \">=18.0.0\"\n  }\n}\n","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/**\n * Feature packages (cache, locks, session, leader, ...) emit metric names\n * under this canonical prefix; a custom `prefix` option renames the series\n * this registry REGISTERS. Lookups resolve canonical names against the\n * configured prefix so a custom prefix renames the series instead of\n * silently dropping every emit.\n */\nconst CANONICAL_METRICS_PREFIX = 'redisx_';\n\n@Injectable()\nexport class MetricsService implements IMetricsService, OnModuleInit, OnModuleDestroy {\n  private readonly registry: promClient.Registry;\n  /** True when the registry is created (and thus fully owned) by this service. */\n  private readonly ownRegistry: boolean;\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 ?? CANONICAL_METRICS_PREFIX;\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    const registryOption = config.registry ?? 'own';\n    if (registryOption === 'own') {\n      this.registry = new promClient.Registry();\n      this.ownRegistry = true;\n    } else if (registryOption === 'default') {\n      this.registry = promClient.register;\n      this.ownRegistry = false;\n    } else {\n      this.registry = registryOption;\n      this.ownRegistry = false;\n    }\n\n    // Never overwrite the default labels of an external registry unless the\n    // user explicitly configured labels for this plugin.\n    if (this.ownRegistry || config.defaultLabels) {\n      this.registry.setDefaultLabels(this.defaultLabels);\n    }\n  }\n\n  onModuleInit(): void {\n    if (!this.enabled) {\n      return;\n    }\n\n    this.registerStandardMetrics();\n\n    // Own registry: collect by default. External registry: opt-in only — the\n    // application almost certainly collects process metrics there already.\n    const collectDefault = this.ownRegistry ? this.config.collectDefaultMetrics !== false : this.config.collectDefaultMetrics === true;\n\n    if (collectDefault) {\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    if (this.ownRegistry) {\n      this.registry.clear();\n    } else {\n      // External registry: remove ONLY the metrics this service registered —\n      // clearing would wipe the application's metrics.\n      for (const name of [...this.counters.keys(), ...this.histograms.keys(), ...this.gauges.keys()]) {\n        this.registry.removeSingleMetric(name);\n      }\n    }\n    this.counters.clear();\n    this.histograms.clear();\n    this.gauges.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      // Session metrics\n      this.registerCounter(`${this.prefix}session_created_total`, 'Total sessions created');\n\n      this.registerCounter(`${this.prefix}session_destroyed_total`, 'Total sessions removed, by cause', ['reason']);\n\n      this.registerCounter(`${this.prefix}session_limit_rejections_total`, 'Total logins refused by the per-user session seat limit');\n\n      // Leader election metrics\n      this.registerCounter(`${this.prefix}leader_elected_total`, 'Times this instance became leader, by group', ['group']);\n\n      this.registerCounter(`${this.prefix}leader_lost_total`, 'Times this instance lost leadership, by group and reason', ['group', 'reason']);\n    }\n  }\n\n  /**\n   * Look up a metric by the name the caller emits. Feature packages hardcode\n   * canonical `redisx_*` names; when this registry uses a custom prefix the\n   * series is registered under that prefix instead — resolve the canonical\n   * name against it rather than silently no-oping the emit.\n   */\n  private resolveMetric<T>(metrics: Map<string, T>, name: string): T | undefined {\n    const metric = metrics.get(name);\n    if (metric !== undefined || this.prefix === CANONICAL_METRICS_PREFIX || !name.startsWith(CANONICAL_METRICS_PREFIX)) {\n      return metric;\n    }\n    return metrics.get(this.prefix + name.slice(CANONICAL_METRICS_PREFIX.length));\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.resolveMetric(this.counters, 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.resolveMetric(this.histograms, 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.resolveMetric(this.histograms, 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.resolveMetric(this.gauges, 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.resolveMetric(this.gauges, 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.resolveMetric(this.gauges, 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 { version } from '../package.json';\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  registry: 'own',\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: string = version;\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    const registry = options.registry ?? DEFAULT_METRICS_CONFIG.registry;\n    // External registry: the app almost certainly collects process metrics\n    // there already — duplicating them is opt-in, not the default.\n    const collectDefaultMetricsFallback = registry === 'own' ? DEFAULT_METRICS_CONFIG.collectDefaultMetrics : false;\n\n    return {\n      enabled: options.enabled ?? DEFAULT_METRICS_CONFIG.enabled,\n      registry,\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 ?? collectDefaultMetricsFallback,\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"]}