@promster/express
Version:
Express server integrations of promster
74 lines (73 loc) • 2.95 kB
JavaScript
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