summary refs log tree commit diff
path: root/src/util/monitoring/Monitoring.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/monitoring/Monitoring.ts')
-rw-r--r--src/util/monitoring/Monitoring.ts39
1 files changed, 35 insertions, 4 deletions
diff --git a/src/util/monitoring/Monitoring.ts b/src/util/monitoring/Monitoring.ts

index 9b668fcd..eb714bab 100644 --- a/src/util/monitoring/Monitoring.ts +++ b/src/util/monitoring/Monitoring.ts
@@ -16,9 +16,10 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. */ -import * as client from "prom-client"; -import { Router } from "express"; import http, { IncomingMessage, ServerResponse } from "node:http"; +import * as client from "prom-client"; +import { Application, Router } from "express"; +import { sleep } from "@spacebar/util"; export class Monitoring { static isInitialised = false; @@ -29,8 +30,38 @@ export class Monitoring { Monitoring.isInitialised = true; } - public static attach(router: Router) { - router.get("/metrics", async (req, res) => { + public static attach(app: Application) { + const a = app; + const http_request_total = new client.Counter({ + name: "node_http_request_total", + help: "The total number of HTTP requests received", + labelNames: ["path", "method", "status_code"], + }); + client.register.registerMetric(http_request_total); + + const http_response_rate_histogram = new client.Histogram({ + name: "node_http_duration", + labelNames: ["path", "method", "status_code"], + help: "The duration of HTTP requests in seconds", + buckets: [0.0, 0.05, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 10], + }); + client.register.registerMetric(http_response_rate_histogram); + + app.use((req, res, next) => { + const endTimer = http_response_rate_histogram.startTimer(); + res.on("finish", () => { + const r = req; + const path = (res.locals.lambertRouteBase ?? req.baseUrl ?? "") + req.route?.path; + if (!req.route?.path) { + console.log(req); + } + endTimer({ method: req.method, path, status_code: res.statusCode }); + http_request_total.inc({ method: req.method, path, status_code: res.statusCode }); + }); + next(); + }); + + app.get("/metrics", async (req, res) => { res.setHeader("Content-Type", client.register.contentType); const metrics = await client.register.metrics(); res.send(metrics);