Skip to content

Commit d00060a

Browse files
authored
fix(core): Prometheus metrics can't be ingested by datadog (#15910)
1 parent 9607908 commit d00060a

File tree

3 files changed

+23
-29
lines changed

3 files changed

+23
-29
lines changed

packages/cli/src/metrics/__tests__/prometheus-metrics.service.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ describe('PrometheusMetricsService', () => {
151151
await prometheusMetricsService.init(app);
152152

153153
expect(promBundle).toHaveBeenCalledWith({
154+
httpDurationMetricName: 'n8n_http_request_duration_seconds',
154155
autoregister: false,
155156
includeUp: false,
156157
includePath: false,

packages/cli/src/metrics/__tests__/prometheus-metrics.service.unmocked.test.ts

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -95,22 +95,28 @@ workflow_success_total{workflow_id="1234"} 1"
9595
workflowRepository,
9696
);
9797

98-
await prometheusMetricsService.init(app);
99-
10098
// ACT
101-
const event = new EventMessageWorkflow({
102-
eventName: 'n8n.workflow.success',
103-
payload: { workflowId: '1234' },
104-
});
105-
106-
eventBus.emit('metrics.eventBus.event', event);
99+
await prometheusMetricsService.init(app);
107100

108101
// ASSERT
109-
const versionInfoMetric = promClient.register.getSingleMetric(`${customPrefix}version_info`);
110-
111-
if (!versionInfoMetric) {
112-
fail(`Could not find a metric called "${customPrefix}version_info"`);
113-
}
102+
// native metric from promClient
103+
const eventLoopLagMetric = await promClient.register.getSingleMetricAsString(
104+
`${customPrefix}nodejs_eventloop_lag_seconds`,
105+
);
106+
expect(eventLoopLagMetric.split('\n')).toMatchObject([
107+
'# HELP custom_nodejs_eventloop_lag_seconds Lag of event loop in seconds.',
108+
'# TYPE custom_nodejs_eventloop_lag_seconds gauge',
109+
expect.stringMatching('custom_nodejs_eventloop_lag_seconds .*'),
110+
]);
111+
// custom metric
112+
const versionMetric = await promClient.register.getSingleMetricAsString(
113+
`${customPrefix}version_info`,
114+
);
115+
expect(versionMetric.split('\n')).toMatchObject([
116+
'# HELP custom_version_info n8n version info.',
117+
'# TYPE custom_version_info gauge',
118+
expect.stringMatching('custom_version_info.*'),
119+
]);
114120
});
115121
});
116122

packages/cli/src/metrics/prometheus-metrics.service.ts

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ export class PrometheusMetricsService {
116116
private initDefaultMetrics() {
117117
if (!this.includes.metrics.default) return;
118118

119-
promClient.collectDefaultMetrics();
119+
promClient.collectDefaultMetrics({ prefix: this.globalConfig.endpoints.metrics.prefix });
120120
}
121121

122122
/**
@@ -132,6 +132,7 @@ export class PrometheusMetricsService {
132132
includePath: this.includes.labels.apiPath,
133133
includeMethod: this.includes.labels.apiMethod,
134134
includeStatusCode: this.includes.labels.apiStatusCode,
135+
httpDurationMetricName: this.prefix + 'http_request_duration_seconds',
135136
});
136137

137138
const activityGauge = new promClient.Gauge({
@@ -165,25 +166,11 @@ export class PrometheusMetricsService {
165166
private mountMetricsEndpoint(app: express.Application) {
166167
app.get('/metrics', async (_req: express.Request, res: express.Response) => {
167168
const metrics = await promClient.register.metrics();
168-
const prefixedMetrics = this.addPrefixToMetrics(metrics);
169169
res.setHeader('Content-Type', promClient.register.contentType);
170-
res.send(prefixedMetrics).end();
170+
res.send(metrics).end();
171171
});
172172
}
173173

174-
private addPrefixToMetrics(metrics: string) {
175-
return metrics
176-
.split('\n')
177-
.map((rawLine) => {
178-
const line = rawLine.trim();
179-
180-
if (!line || line.startsWith('#') || line.startsWith(this.prefix)) return rawLine;
181-
182-
return this.prefix + line;
183-
})
184-
.join('\n');
185-
}
186-
187174
/**
188175
* Set up cache metrics: `n8n_cache_hits_total`, `n8n_cache_misses_total`, and
189176
* `n8n_cache_updates_total`

0 commit comments

Comments
 (0)