Skip to content

Commit 9dd2773

Browse files
authored
Instrumentation: Add gauge of total number of requests in flight (#281)
* Instrumentation: Add gauge of total number of requests in flight * remove useless call to next * Update package.json
1 parent 88e1c25 commit 9dd2773

File tree

3 files changed

+39
-13
lines changed

3 files changed

+39
-13
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"lodash": "^4.17.21",
3030
"minimist": "^1.2.0",
3131
"morgan": "^1.9.0",
32+
"on-finished": "^2.3.0",
3233
"prom-client": "^11.5.3",
3334
"puppeteer": "^10.0.0",
3435
"puppeteer-cluster": "^0.22.0",

src/service/http-server.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import * as promClient from 'prom-client';
88
import { Logger } from '../logger';
99
import { Browser, createBrowser } from '../browser';
1010
import { ServiceConfig } from '../config';
11-
import { metricsMiddleware } from './metrics_middleware';
11+
import { setupHttpServerMetrics } from './metrics_middleware';
1212
import { RenderOptions, RenderCSVOptions, HTTPHeaders, Metrics } from '../browser/browser';
1313

1414
export interface RenderRequest {
@@ -58,7 +58,10 @@ export class HttpServer {
5858
stream: this.log.errorWriter,
5959
})
6060
);
61-
this.app.use(metricsMiddleware(this.config.service.metrics, this.log));
61+
62+
if (this.config.service.metrics.enabled) {
63+
setupHttpServerMetrics(this.app, this.config.service.metrics, this.log);
64+
}
6265
this.app.get('/', (req: express.Request, res: express.Response) => {
6366
res.send('Grafana Image Renderer');
6467
});

src/service/metrics_middleware.ts

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import * as promBundle from 'express-prom-bundle';
2+
import * as promClient from 'prom-client';
3+
import * as onFinished from 'on-finished';
4+
import express = require('express');
5+
26
import { MetricsConfig } from '../config';
37
import { Logger } from '../logger';
48

5-
export const metricsMiddleware = (config: MetricsConfig, log: Logger) => {
6-
if (!config.enabled) {
7-
return (req, res, next) => {
8-
next();
9-
};
10-
}
11-
9+
export const setupHttpServerMetrics = (app: express.Express, config: MetricsConfig, log: Logger) => {
1210
log.info(
1311
'Metrics enabled',
1412
'collectDefaultMetrics',
@@ -17,13 +15,15 @@ export const metricsMiddleware = (config: MetricsConfig, log: Logger) => {
1715
config.requestDurationBuckets.join(',')
1816
);
1917

18+
const excludeRegExp = /^((?!(render)).)*$/;
19+
2020
const opts = {
2121
httpDurationMetricName: 'grafana_image_renderer_service_http_request_duration_seconds',
2222
metricType: 'histogram',
2323
buckets: config.requestDurationBuckets,
24-
excludeRoutes: [/^((?!(render)).)*$/],
24+
excludeRoutes: [excludeRegExp],
2525
promClient: {},
26-
formatStatusCode: res => {
26+
formatStatusCode: (res) => {
2727
if (res && res.req && res.req.aborted) {
2828
// Nginx non-standard code 499 Client Closed Request
2929
// Used when the client has closed the request before
@@ -39,6 +39,28 @@ export const metricsMiddleware = (config: MetricsConfig, log: Logger) => {
3939
opts.promClient.collectDefaultMetrics = {};
4040
}
4141

42-
const bundle = promBundle(opts);
43-
return bundle;
42+
const metricsMiddleware = promBundle(opts);
43+
app.use(metricsMiddleware);
44+
45+
const httpRequestsInFlight = new promClient.Gauge({
46+
name: 'grafana_image_renderer_http_request_in_flight',
47+
help: 'A gauge of requests currently being served by the image renderer.',
48+
});
49+
app.use(requestsInFlightMiddleware(httpRequestsInFlight, excludeRegExp));
50+
};
51+
52+
const requestsInFlightMiddleware = (httpRequestsInFlight: promClient.Gauge, excludeRegExp: RegExp) => {
53+
return (req, res, next) => {
54+
const path = req.originalUrl || req.url;
55+
if (path.match(excludeRegExp)) {
56+
return next();
57+
}
58+
59+
httpRequestsInFlight.inc();
60+
onFinished(res, () => {
61+
httpRequestsInFlight.dec();
62+
});
63+
64+
next();
65+
};
4466
};

0 commit comments

Comments
 (0)