From 5fb9a3e6c3f70bc615db2a1c2a7fde7b022703d6 Mon Sep 17 00:00:00 2001 From: Ludwig Behm Date: Thu, 3 Feb 2022 01:17:27 +0100 Subject: [PATCH] pusher: add a /metrics.json endpoint --- pusher/src/Controller/PrometheusController.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/pusher/src/Controller/PrometheusController.ts b/pusher/src/Controller/PrometheusController.ts index 7fff3981..1ce106f1 100644 --- a/pusher/src/Controller/PrometheusController.ts +++ b/pusher/src/Controller/PrometheusController.ts @@ -2,6 +2,16 @@ import { App } from "../Server/sifrr.server"; import { HttpRequest, HttpResponse } from "uWebSockets.js"; import { register, collectDefaultMetrics } from "prom-client"; +interface IPrometheusValue { + labels: { [label: string]: string }; + value: number; +} +interface IPrometheusMetric { + name: string; + help: string; + type: string; + values: Array; +} export class PrometheusController { constructor(private App: App) { collectDefaultMetrics({ @@ -9,10 +19,36 @@ export class PrometheusController { }); this.App.get("/metrics", this.metrics.bind(this)); + this.App.get("/metrics.json", this.metricsAsJSON.bind(this)); } private metrics(res: HttpResponse, req: HttpRequest): void { res.writeHeader("Content-Type", register.contentType); res.end(register.metrics()); } + private async getAllMetrics() : Promise { + return await Promise.all( + (register.getMetricsAsArray() as any[]) + .map((metric) => metric.get() as Promise)); + } + private metricsAsJSON(res: HttpResponse, req: HttpRequest): void { + this.getAllMetrics().then((items) => { + let json : { [key : string] : number | { [label : string] : number } } = {}; + for (const item of items) { + for (const value of item.values) { + if (value.labels && Object.keys(value.labels).length > 0) { + const key = Object.keys(value.labels) + .map((label) => label + ':' + value.labels[label]).join('|'); + const data : { [label : string] : number } = (json[item.name] as { [label : string] : number }) || { }; + data[key] = value.value; + json[item.name] = data; + } else { + json[item.name] = value.value; + } + } + } + res.writeHeader('Content-Type', 'application/json'); + res.end(JSON.stringify(json)); + }); + } }