UNPKG

@promster/express

Version:

Express server integrations of promster

74 lines (73 loc) 2.95 kB
import { Prometheus, Prometheus as Prometheus$1, createGcMetrics, createGcObserver, createHttpMetrics, createRequestRecorder, defaultNormalizers, defaultNormalizers as defaultNormalizers$1, defaultRegister, getContentType, getSummary, skipMetricsInEnvironment, timing, timing as timing$1 } from "@promster/metrics"; import merge from "merge-options"; //#region src/middleware/middleware.ts const exposeOnLocals = ({ app, key, value }) => { if (app?.locals) app.locals[key] = value; }; const extractPath = (req) => req.originalUrl || req.url; let recordRequest; let upMetric; const getRequestRecorder = () => recordRequest; const signalIsUp = () => { if (!upMetric) return; for (const upMetricType of upMetric) upMetricType.set(1); }; const signalIsNotUp = () => { if (!upMetric) return; for (const upMetricType of upMetric) upMetricType.set(0); }; const createMiddleware = ({ app, options } = { app: void 0, options: void 0 }) => { const allDefaultedOptions = merge(createHttpMetrics.defaultOptions, createGcMetrics.defaultOptions, createRequestRecorder.defaultOptions, createGcObserver.defaultOptions, defaultNormalizers$1, options); const shouldSkipMetricsByEnvironment = skipMetricsInEnvironment(allDefaultedOptions); const httpMetrics = createHttpMetrics(allDefaultedOptions); const gcMetrics = createGcMetrics(allDefaultedOptions); const observeGc = createGcObserver(gcMetrics, allDefaultedOptions); recordRequest = createRequestRecorder(httpMetrics, allDefaultedOptions); upMetric = gcMetrics?.up; exposeOnLocals({ app, key: "Prometheus", value: Prometheus$1 }); exposeOnLocals({ app, key: "recordRequest", value: recordRequest }); if (!shouldSkipMetricsByEnvironment) observeGc(); signalIsUp(); return (request, response, next) => { const requestTiming = timing$1.start(); response.on("finish", () => { const labels = Object.assign({}, { method: allDefaultedOptions.normalizeMethod(request.method, { req: request, res: response }), status_code: allDefaultedOptions.normalizeStatusCode(response.statusCode, { req: request, res: response }), path: allDefaultedOptions.normalizePath(extractPath(request), { req: request, res: response }) }, allDefaultedOptions.getLabelValues?.(request, response)); const shouldSkipByRequest = allDefaultedOptions.skip?.(request, response, labels); const requestContentLength = Number(request.headers["content-length"] ?? 0); const responseContentLength = Number(response.getHeader("content-length") ?? 0); if (!shouldSkipByRequest && !shouldSkipMetricsByEnvironment) recordRequest(requestTiming, { labels, requestContentLength, responseContentLength }); }); next(); }; }; //#endregion export { Prometheus, createMiddleware, defaultNormalizers, defaultRegister, getContentType, getRequestRecorder, getSummary, signalIsNotUp, signalIsUp, timing }; //# sourceMappingURL=index.js.map