UNPKG

@promster/express

Version:

Express server integrations of promster

132 lines (125 loc) 4.56 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var metrics = require('@promster/metrics'); var merge = require('merge-options'); function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; } var merge__default = /*#__PURE__*/_interopDefault(merge); const exposeOnLocals = ({ app, key, value }) => { if (app !== null && app !== void 0 && 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: undefined, options: undefined }) => { const allDefaultedOptions = merge__default["default"](metrics.createHttpMetrics.defaultOptions, metrics.createGcMetrics.defaultOptions, metrics.createRequestRecorder.defaultOptions, // @ts-expect-error metrics.createGcObserver.defaultOptions, metrics.defaultNormalizers, options); const shouldSkipMetricsByEnvironment = metrics.skipMetricsInEnvironment(allDefaultedOptions); const httpMetrics = metrics.createHttpMetrics(allDefaultedOptions); const gcMetrics = metrics.createGcMetrics(allDefaultedOptions); const observeGc = metrics.createGcObserver(gcMetrics, allDefaultedOptions); recordRequest = metrics.createRequestRecorder(httpMetrics, allDefaultedOptions); upMetric = gcMetrics === null || gcMetrics === void 0 ? void 0 : gcMetrics.up; exposeOnLocals({ app, key: 'Prometheus', value: metrics.Prometheus }); exposeOnLocals({ app, key: 'recordRequest', value: recordRequest }); if (!shouldSkipMetricsByEnvironment) { observeGc(); } signalIsUp(); return (request, response, next) => { const requestTiming = metrics.timing.start(); response.on('finish', () => { var _allDefaultedOptions$, _allDefaultedOptions$2, _request$headers$cont, _response$getHeader; 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$ = allDefaultedOptions.getLabelValues) === null || _allDefaultedOptions$ === void 0 ? void 0 : _allDefaultedOptions$.call(allDefaultedOptions, request, response)); const shouldSkipByRequest = (_allDefaultedOptions$2 = allDefaultedOptions.skip) === null || _allDefaultedOptions$2 === void 0 ? void 0 : _allDefaultedOptions$2.call(allDefaultedOptions, request, response, labels); const requestContentLength = Number((_request$headers$cont = request.headers['content-length']) !== null && _request$headers$cont !== void 0 ? _request$headers$cont : 0); const responseContentLength = Number((_response$getHeader = response.getHeader('content-length')) !== null && _response$getHeader !== void 0 ? _response$getHeader : 0); if (!shouldSkipByRequest && !shouldSkipMetricsByEnvironment) { recordRequest(requestTiming, { labels, requestContentLength, responseContentLength }); } }); next(); }; }; Object.defineProperty(exports, 'Prometheus', { enumerable: true, get: function () { return metrics.Prometheus; } }); Object.defineProperty(exports, 'defaultNormalizers', { enumerable: true, get: function () { return metrics.defaultNormalizers; } }); Object.defineProperty(exports, 'defaultRegister', { enumerable: true, get: function () { return metrics.defaultRegister; } }); Object.defineProperty(exports, 'getContentType', { enumerable: true, get: function () { return metrics.getContentType; } }); Object.defineProperty(exports, 'getSummary', { enumerable: true, get: function () { return metrics.getSummary; } }); Object.defineProperty(exports, 'timing', { enumerable: true, get: function () { return metrics.timing; } }); exports.createMiddleware = createMiddleware; exports.getRequestRecorder = getRequestRecorder; exports.signalIsNotUp = signalIsNotUp; exports.signalIsUp = signalIsUp;