openapi-connect
Version:
Base for microservices around OpenAPI/Swagger
58 lines • 3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.collectMetricsMiddlewares = exports.collectMetrics = void 0;
const responseTime = require("response-time");
const normalizers_1 = require("../helpers/normalizers");
const urlModule = require("url");
const collectMetrics = (options) => (req, res, time) => {
var _a, _b, _c;
const { requestCount, requestDuration, requestLength, responseLength, options: metricsOptions } = options.collectMetrics;
const { originalUrl, method } = req;
if ((_a = options.swaggerUI) === null || _a === void 0 ? void 0 : _a.enable) {
const swaggerDocsPath = urlModule.resolve(options.basePath, 'docs');
const swaggerApiDocsPath = urlModule.resolve(options.basePath, 'api-docs');
if (originalUrl === swaggerDocsPath ||
originalUrl === swaggerApiDocsPath ||
originalUrl.includes('swagger') ||
originalUrl === '/favicon-32x32.png') {
return;
}
}
const route = (0, normalizers_1.normalizePath)(originalUrl, (_b = metricsOptions === null || metricsOptions === void 0 ? void 0 : metricsOptions.extraMasks) !== null && _b !== void 0 ? _b : []);
const status = (0, normalizers_1.normalizeStatusCode)(res.statusCode);
let labels = { route, method, status };
if (metricsOptions === null || metricsOptions === void 0 ? void 0 : metricsOptions.transformLabels) {
labels = metricsOptions.transformLabels(labels, req, res);
}
requestCount === null || requestCount === void 0 ? void 0 : requestCount.inc(labels);
requestDuration === null || requestDuration === void 0 ? void 0 : requestDuration.observe(labels, time / 1000);
const reqLength = req.headers['content-length'];
if (reqLength) {
requestLength === null || requestLength === void 0 ? void 0 : requestLength.observe(labels, Number(reqLength));
}
const responseHeaders = res.getHeaders();
const resLength = (_c = responseHeaders['Content-Length']) !== null && _c !== void 0 ? _c : responseHeaders['content-length'];
if (resLength) {
responseLength === null || responseLength === void 0 ? void 0 : responseLength.observe(labels, Number(resLength));
}
};
exports.collectMetrics = collectMetrics;
function collectMetricsMiddlewares(options) {
if (!options.collectMetrics) {
return null;
}
const { requestCount, requestDuration, requestLength, responseLength } = options.collectMetrics;
const metrics = [requestCount, requestDuration, requestLength, responseLength];
if (!metrics.some(Boolean)) {
return null;
}
const collectMetricsHandler = responseTime((0, exports.collectMetrics)(options));
return {
handler: collectMetricsHandler,
errorHandler: (err, req, res, next) => {
collectMetricsHandler(req, res, () => next(err));
}
};
}
exports.collectMetricsMiddlewares = collectMetricsMiddlewares;
//# sourceMappingURL=metrics.js.map