n8n
Version:
n8n Workflow Automation Tool
159 lines • 7.46 kB
JavaScript
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
;