UNPKG

n8n

Version:

n8n Workflow Automation Tool

159 lines 7.46 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.MetricsService = void 0; const config_1 = __importDefault(require("../config")); const constants_1 = require("../constants"); const express_prom_bundle_1 = __importDefault(require("express-prom-bundle")); const prom_client_1 = __importDefault(require("prom-client")); const parse_1 = __importDefault(require("semver/functions/parse")); const typedi_1 = require("typedi"); const events_1 = __importDefault(require("events")); const cache_service_1 = require("../services/cache/cache.service"); const eventbus_1 = require("../eventbus"); const MessageEventBus_1 = require("../eventbus/MessageEventBus/MessageEventBus"); const Logger_1 = require("../Logger"); let MetricsService = class MetricsService extends events_1.default { constructor(logger, cacheService, eventBus) { super(); this.logger = logger; this.cacheService = cacheService; this.eventBus = eventBus; this.counters = {}; } async configureMetrics(app) { prom_client_1.default.register.clear(); this.setupDefaultMetrics(); this.setupN8nVersionMetric(); this.setupCacheMetrics(); this.setupMessageEventBusMetrics(); this.setupApiMetrics(app); this.mountMetricsEndpoint(app); } setupN8nVersionMetric() { const n8nVersion = (0, parse_1.default)(constants_1.N8N_VERSION || '0.0.0'); if (n8nVersion) { const versionGauge = new prom_client_1.default.Gauge({ name: config_1.default.getEnv('endpoints.metrics.prefix') + 'version_info', help: 'n8n version info.', labelNames: ['version', 'major', 'minor', 'patch'], }); versionGauge.set({ version: 'v' + n8nVersion.version, major: n8nVersion.major, minor: n8nVersion.minor, patch: n8nVersion.patch, }, 1); } } setupDefaultMetrics() { if (config_1.default.getEnv('endpoints.metrics.includeDefaultMetrics')) { prom_client_1.default.collectDefaultMetrics(); } } setupApiMetrics(app) { if (config_1.default.getEnv('endpoints.metrics.includeApiEndpoints')) { const metricsMiddleware = (0, express_prom_bundle_1.default)({ autoregister: false, includeUp: false, includePath: config_1.default.getEnv('endpoints.metrics.includeApiPathLabel'), includeMethod: config_1.default.getEnv('endpoints.metrics.includeApiMethodLabel'), includeStatusCode: config_1.default.getEnv('endpoints.metrics.includeApiStatusCodeLabel'), }); app.use(['/rest/', '/webhook/', 'webhook-test/', '/api/'], metricsMiddleware); } } mountMetricsEndpoint(app) { app.get('/metrics', async (_req, res) => { const metrics = await prom_client_1.default.register.metrics(); res.setHeader('Content-Type', prom_client_1.default.register.contentType); res.send(metrics).end(); }); } setupCacheMetrics() { if (!config_1.default.getEnv('endpoints.metrics.includeCacheMetrics')) { return; } this.counters.cacheHitsTotal = new prom_client_1.default.Counter({ name: config_1.default.getEnv('endpoints.metrics.prefix') + 'cache_hits_total', help: 'Total number of cache hits.', labelNames: ['cache'], }); this.counters.cacheHitsTotal.inc(0); this.cacheService.on('metrics.cache.hit', (amount = 1) => { var _a; (_a = this.counters.cacheHitsTotal) === null || _a === void 0 ? void 0 : _a.inc(amount); }); this.counters.cacheMissesTotal = new prom_client_1.default.Counter({ name: config_1.default.getEnv('endpoints.metrics.prefix') + 'cache_misses_total', help: 'Total number of cache misses.', labelNames: ['cache'], }); this.counters.cacheMissesTotal.inc(0); this.cacheService.on('metrics.cache.miss', (amount = 1) => { var _a; (_a = this.counters.cacheMissesTotal) === null || _a === void 0 ? void 0 : _a.inc(amount); }); this.counters.cacheUpdatesTotal = new prom_client_1.default.Counter({ name: config_1.default.getEnv('endpoints.metrics.prefix') + 'cache_updates_total', help: 'Total number of cache updates.', labelNames: ['cache'], }); this.counters.cacheUpdatesTotal.inc(0); this.cacheService.on('metrics.cache.update', (amount = 1) => { var _a; (_a = this.counters.cacheUpdatesTotal) === null || _a === void 0 ? void 0 : _a.inc(amount); }); } getCounterForEvent(event) { if (!prom_client_1.default) return null; if (!this.counters[event.eventName]) { const prefix = config_1.default.getEnv('endpoints.metrics.prefix'); const metricName = prefix + event.eventName.replace('n8n.', '').replace(/\./g, '_') + '_total'; if (!prom_client_1.default.validateMetricName(metricName)) { this.logger.debug(`Invalid metric name: ${metricName}. Ignoring it!`); this.counters[event.eventName] = null; return null; } const counter = new prom_client_1.default.Counter({ name: metricName, help: `Total number of ${event.eventName} events.`, labelNames: Object.keys((0, eventbus_1.getLabelsForEvent)(event)), }); counter.inc(0); this.counters[event.eventName] = counter; } return this.counters[event.eventName]; } setupMessageEventBusMetrics() { if (!config_1.default.getEnv('endpoints.metrics.includeMessageEventBusMetrics')) { return; } this.eventBus.on(eventbus_1.METRICS_EVENT_NAME, (event) => { const counter = this.getCounterForEvent(event); if (!counter) return; counter.inc(1); }); } }; exports.MetricsService = MetricsService; exports.MetricsService = MetricsService = __decorate([ (0, typedi_1.Service)(), __metadata("design:paramtypes", [Logger_1.Logger, cache_service_1.CacheService, MessageEventBus_1.MessageEventBus]) ], MetricsService); //# sourceMappingURL=metrics.service.js.map