diff --git a/packages/cli/src/metrics/__tests__/prometheus-metrics.service.test.ts b/packages/cli/src/metrics/__tests__/prometheus-metrics.service.test.ts index d78116f46211d..cbdd09f6438e6 100644 --- a/packages/cli/src/metrics/__tests__/prometheus-metrics.service.test.ts +++ b/packages/cli/src/metrics/__tests__/prometheus-metrics.service.test.ts @@ -38,6 +38,13 @@ describe('PrometheusMetricsService', () => { includeApiStatusCodeLabel: false, includeQueueMetrics: false, }, + rest: 'rest', + form: 'form', + formTest: 'form-test', + formWaiting: 'form-waiting', + webhook: 'webhook', + webhookTest: 'webhook-test', + webhookWaiting: 'webhook-waiting', }, }); @@ -145,10 +152,16 @@ describe('PrometheusMetricsService', () => { includeStatusCode: false, }); + expect(promClient.Gauge).toHaveBeenNthCalledWith(2, { + name: 'n8n_last_activity', + help: 'last instance activity (backend request).', + labelNames: ['timestamp'], + }); + expect(app.use).toHaveBeenCalledWith( [ - '/rest/', '/api/', + '/rest/', '/webhook/', '/webhook-waiting/', '/webhook-test/', diff --git a/packages/cli/src/metrics/prometheus-metrics.service.ts b/packages/cli/src/metrics/prometheus-metrics.service.ts index b17b8f85783ad..ec66dd9a70235 100644 --- a/packages/cli/src/metrics/prometheus-metrics.service.ts +++ b/packages/cli/src/metrics/prometheus-metrics.service.ts @@ -117,7 +117,8 @@ export class PrometheusMetricsService { } /** - * Set up metrics for server routes with `express-prom-bundle` + * Set up metrics for server routes with `express-prom-bundle`. The same + * middleware is also utilized for an instance activity metric */ private initRouteMetrics(app: express.Application) { if (!this.includes.metrics.routes) return; @@ -130,18 +131,31 @@ export class PrometheusMetricsService { includeStatusCode: this.includes.labels.apiStatusCode, }); + const activityGauge = new promClient.Gauge({ + name: this.prefix + 'last_activity', + help: 'last instance activity (backend request).', + labelNames: ['timestamp'], + }); + + activityGauge.set({ timestamp: new Date().toISOString() }, 1); + app.use( [ - '/rest/', '/api/', - '/webhook/', - '/webhook-waiting/', - '/webhook-test/', - '/form/', - '/form-waiting/', - '/form-test/', + `/${this.globalConfig.endpoints.rest}/`, + `/${this.globalConfig.endpoints.webhook}/`, + `/${this.globalConfig.endpoints.webhookWaiting}/`, + `/${this.globalConfig.endpoints.webhookTest}/`, + `/${this.globalConfig.endpoints.form}/`, + `/${this.globalConfig.endpoints.formWaiting}/`, + `/${this.globalConfig.endpoints.formTest}/`, ], - metricsMiddleware, + (req, res, next) => { + activityGauge.reset(); + activityGauge.set({ timestamp: new Date().toISOString() }, 1); + + metricsMiddleware(req, res, next); + }, ); }