@nestjs-redisx/metrics 1.0.2 → 1.0.3
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 +4 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -1
- package/dist/index.mjs.map +1 -1
- package/dist/metrics.plugin.d.ts +1 -1
- package/dist/metrics.plugin.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -36,6 +36,9 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
36
36
|
};
|
|
37
37
|
var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
38
38
|
|
|
39
|
+
// package.json
|
|
40
|
+
var version = "1.0.3";
|
|
41
|
+
|
|
39
42
|
// src/shared/constants/index.ts
|
|
40
43
|
var METRICS_PLUGIN_OPTIONS = /* @__PURE__ */ Symbol.for("METRICS_PLUGIN_OPTIONS");
|
|
41
44
|
var METRICS_SERVICE = /* @__PURE__ */ Symbol.for("METRICS_SERVICE");
|
|
@@ -311,7 +314,7 @@ var MetricsPlugin = class _MetricsPlugin {
|
|
|
311
314
|
this.options = options;
|
|
312
315
|
}
|
|
313
316
|
name = "metrics";
|
|
314
|
-
version =
|
|
317
|
+
version = version;
|
|
315
318
|
description = "Prometheus metrics collection and export";
|
|
316
319
|
asyncOptions;
|
|
317
320
|
static registerAsync(asyncOptions) {
|
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 { 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"]}
|
|
1
|
+
{"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":["RedisXError","ErrorCode","MetricsService","promClient","Injectable","MetricsController","Get","Header","Controller","Inject"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"name\": \"@nestjs-redisx/metrics\",\n \"version\": \"1.0.3\",\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 \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.js\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n }\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 },\n \"dependencies\": {\n \"prom-client\": \"^15.1.0\"\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\",\n \"@nestjs/core\": \"^10.0.0 || ^11.0.0\",\n \"reflect-metadata\": \"^0.2.0\",\n \"rxjs\": \"^7.8.0\"\n },\n \"devDependencies\": {\n \"@nestjs/testing\": \"^10.0.0\",\n \"@types/express\": \"^4.17.0\",\n \"@types/node\": \"^20.0.0\",\n \"@typescript-eslint/eslint-plugin\": \"^6.0.0\",\n \"@typescript-eslint/parser\": \"^6.0.0\",\n \"eslint\": \"^8.0.0\",\n \"prettier\": \"^3.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.3.0\",\n \"vitest\": \"^1.6.0\",\n \"@vitest/coverage-v8\": \"^1.6.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\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@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 { 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 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 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
|
@@ -14,6 +14,9 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
14
14
|
};
|
|
15
15
|
var __decorateParam = (index, decorator) => (target, key) => decorator(target, key, index);
|
|
16
16
|
|
|
17
|
+
// package.json
|
|
18
|
+
var version = "1.0.3";
|
|
19
|
+
|
|
17
20
|
// src/shared/constants/index.ts
|
|
18
21
|
var METRICS_PLUGIN_OPTIONS = /* @__PURE__ */ Symbol.for("METRICS_PLUGIN_OPTIONS");
|
|
19
22
|
var METRICS_SERVICE = /* @__PURE__ */ Symbol.for("METRICS_SERVICE");
|
|
@@ -289,7 +292,7 @@ var MetricsPlugin = class _MetricsPlugin {
|
|
|
289
292
|
this.options = options;
|
|
290
293
|
}
|
|
291
294
|
name = "metrics";
|
|
292
|
-
version =
|
|
295
|
+
version = version;
|
|
293
296
|
description = "Prometheus metrics collection and export";
|
|
294
297
|
asyncOptions;
|
|
295
298
|
static registerAsync(asyncOptions) {
|
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 { 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"]}
|
|
1
|
+
{"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.0.3\",\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 \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.js\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n }\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 },\n \"dependencies\": {\n \"prom-client\": \"^15.1.0\"\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\",\n \"@nestjs/core\": \"^10.0.0 || ^11.0.0\",\n \"reflect-metadata\": \"^0.2.0\",\n \"rxjs\": \"^7.8.0\"\n },\n \"devDependencies\": {\n \"@nestjs/testing\": \"^10.0.0\",\n \"@types/express\": \"^4.17.0\",\n \"@types/node\": \"^20.0.0\",\n \"@typescript-eslint/eslint-plugin\": \"^6.0.0\",\n \"@typescript-eslint/parser\": \"^6.0.0\",\n \"eslint\": \"^8.0.0\",\n \"prettier\": \"^3.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.3.0\",\n \"vitest\": \"^1.6.0\",\n \"@vitest/coverage-v8\": \"^1.6.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\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@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 { 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 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 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
|
@@ -37,7 +37,7 @@ import { IMetricsPluginOptions } from './shared/types';
|
|
|
37
37
|
export declare class MetricsPlugin implements IRedisXPlugin {
|
|
38
38
|
private readonly options;
|
|
39
39
|
readonly name = "metrics";
|
|
40
|
-
readonly version
|
|
40
|
+
readonly version: string;
|
|
41
41
|
readonly description = "Prometheus metrics collection and export";
|
|
42
42
|
private asyncOptions?;
|
|
43
43
|
constructor(options?: IMetricsPluginOptions);
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;AAGzE,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,EAAE,MAAM,CAAW;IACnC,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"}
|