mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 18:12:04 +00:00
fix(core): Prometheus metrics can't be ingested by datadog (#15910)
This commit is contained in:
@@ -151,6 +151,7 @@ describe('PrometheusMetricsService', () => {
|
|||||||
await prometheusMetricsService.init(app);
|
await prometheusMetricsService.init(app);
|
||||||
|
|
||||||
expect(promBundle).toHaveBeenCalledWith({
|
expect(promBundle).toHaveBeenCalledWith({
|
||||||
|
httpDurationMetricName: 'n8n_http_request_duration_seconds',
|
||||||
autoregister: false,
|
autoregister: false,
|
||||||
includeUp: false,
|
includeUp: false,
|
||||||
includePath: false,
|
includePath: false,
|
||||||
|
|||||||
@@ -95,22 +95,28 @@ workflow_success_total{workflow_id="1234"} 1"
|
|||||||
workflowRepository,
|
workflowRepository,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// ACT
|
||||||
await prometheusMetricsService.init(app);
|
await prometheusMetricsService.init(app);
|
||||||
|
|
||||||
// ACT
|
|
||||||
const event = new EventMessageWorkflow({
|
|
||||||
eventName: 'n8n.workflow.success',
|
|
||||||
payload: { workflowId: '1234' },
|
|
||||||
});
|
|
||||||
|
|
||||||
eventBus.emit('metrics.eventBus.event', event);
|
|
||||||
|
|
||||||
// ASSERT
|
// ASSERT
|
||||||
const versionInfoMetric = promClient.register.getSingleMetric(`${customPrefix}version_info`);
|
// native metric from promClient
|
||||||
|
const eventLoopLagMetric = await promClient.register.getSingleMetricAsString(
|
||||||
if (!versionInfoMetric) {
|
`${customPrefix}nodejs_eventloop_lag_seconds`,
|
||||||
fail(`Could not find a metric called "${customPrefix}version_info"`);
|
);
|
||||||
}
|
expect(eventLoopLagMetric.split('\n')).toMatchObject([
|
||||||
|
'# HELP custom_nodejs_eventloop_lag_seconds Lag of event loop in seconds.',
|
||||||
|
'# TYPE custom_nodejs_eventloop_lag_seconds gauge',
|
||||||
|
expect.stringMatching('custom_nodejs_eventloop_lag_seconds .*'),
|
||||||
|
]);
|
||||||
|
// custom metric
|
||||||
|
const versionMetric = await promClient.register.getSingleMetricAsString(
|
||||||
|
`${customPrefix}version_info`,
|
||||||
|
);
|
||||||
|
expect(versionMetric.split('\n')).toMatchObject([
|
||||||
|
'# HELP custom_version_info n8n version info.',
|
||||||
|
'# TYPE custom_version_info gauge',
|
||||||
|
expect.stringMatching('custom_version_info.*'),
|
||||||
|
]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ export class PrometheusMetricsService {
|
|||||||
private initDefaultMetrics() {
|
private initDefaultMetrics() {
|
||||||
if (!this.includes.metrics.default) return;
|
if (!this.includes.metrics.default) return;
|
||||||
|
|
||||||
promClient.collectDefaultMetrics();
|
promClient.collectDefaultMetrics({ prefix: this.globalConfig.endpoints.metrics.prefix });
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -132,6 +132,7 @@ export class PrometheusMetricsService {
|
|||||||
includePath: this.includes.labels.apiPath,
|
includePath: this.includes.labels.apiPath,
|
||||||
includeMethod: this.includes.labels.apiMethod,
|
includeMethod: this.includes.labels.apiMethod,
|
||||||
includeStatusCode: this.includes.labels.apiStatusCode,
|
includeStatusCode: this.includes.labels.apiStatusCode,
|
||||||
|
httpDurationMetricName: this.prefix + 'http_request_duration_seconds',
|
||||||
});
|
});
|
||||||
|
|
||||||
const activityGauge = new promClient.Gauge({
|
const activityGauge = new promClient.Gauge({
|
||||||
@@ -165,25 +166,11 @@ export class PrometheusMetricsService {
|
|||||||
private mountMetricsEndpoint(app: express.Application) {
|
private mountMetricsEndpoint(app: express.Application) {
|
||||||
app.get('/metrics', async (_req: express.Request, res: express.Response) => {
|
app.get('/metrics', async (_req: express.Request, res: express.Response) => {
|
||||||
const metrics = await promClient.register.metrics();
|
const metrics = await promClient.register.metrics();
|
||||||
const prefixedMetrics = this.addPrefixToMetrics(metrics);
|
|
||||||
res.setHeader('Content-Type', promClient.register.contentType);
|
res.setHeader('Content-Type', promClient.register.contentType);
|
||||||
res.send(prefixedMetrics).end();
|
res.send(metrics).end();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private addPrefixToMetrics(metrics: string) {
|
|
||||||
return metrics
|
|
||||||
.split('\n')
|
|
||||||
.map((rawLine) => {
|
|
||||||
const line = rawLine.trim();
|
|
||||||
|
|
||||||
if (!line || line.startsWith('#') || line.startsWith(this.prefix)) return rawLine;
|
|
||||||
|
|
||||||
return this.prefix + line;
|
|
||||||
})
|
|
||||||
.join('\n');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set up cache metrics: `n8n_cache_hits_total`, `n8n_cache_misses_total`, and
|
* Set up cache metrics: `n8n_cache_hits_total`, `n8n_cache_misses_total`, and
|
||||||
* `n8n_cache_updates_total`
|
* `n8n_cache_updates_total`
|
||||||
|
|||||||
Reference in New Issue
Block a user