@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 +35 -16
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +35 -16
- package/dist/index.mjs.map +1 -1
- package/dist/metrics.plugin.d.ts +6 -2
- package/dist/metrics.plugin.d.ts.map +1 -1
- package/package.json +3 -3
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
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
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
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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];
|
package/dist/index.mjs.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":["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":"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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 { 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/metrics.plugin.d.ts
CHANGED
|
@@ -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;
|
|
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.
|
|
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
|
},
|