@promster/express
Version:
Express server integrations of promster
132 lines (125 loc) • 4.56 kB
JavaScript
;
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;