@vtex/api
Version:
VTEX I/O API client
47 lines (46 loc) • 2.23 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.addRequestMetricsMiddleware = void 0;
const stream_1 = require("stream");
const utils_1 = require("../../utils");
const instruments_1 = require("../tracing/metrics/instruments");
const addRequestMetricsMiddleware = () => {
const concurrentRequests = (0, instruments_1.createConcurrentRequestsInstrument)();
const requestTimings = (0, instruments_1.createRequestsTimingsInstrument)();
const totalRequests = (0, instruments_1.createTotalRequestsInstrument)();
const responseSizes = (0, instruments_1.createRequestsResponseSizesInstrument)();
const abortedRequests = (0, instruments_1.createTotalAbortedRequestsInstrument)();
return async function addRequestMetrics(ctx, next) {
const start = process.hrtime();
concurrentRequests.inc(1);
ctx.req.once('aborted', () => abortedRequests.inc({ ["handler" /* RequestsMetricLabels.REQUEST_HANDLER */]: ctx.requestHandlerName }, 1));
let responseClosed = false;
ctx.res.once('close', () => (responseClosed = true));
try {
await next();
}
finally {
const responseLength = ctx.response.length;
if (responseLength) {
responseSizes.observe({ ["handler" /* RequestsMetricLabels.REQUEST_HANDLER */]: ctx.requestHandlerName }, responseLength);
}
totalRequests.inc({
["handler" /* RequestsMetricLabels.REQUEST_HANDLER */]: ctx.requestHandlerName,
["status_code" /* RequestsMetricLabels.STATUS_CODE */]: ctx.response.status,
}, 1);
const onResFinished = () => {
requestTimings.observe({
["handler" /* RequestsMetricLabels.REQUEST_HANDLER */]: ctx.requestHandlerName,
}, (0, utils_1.hrToMillisFloat)(process.hrtime(start)));
concurrentRequests.dec(1);
};
if (responseClosed) {
onResFinished();
}
else {
(0, stream_1.finished)(ctx.res, onResFinished);
}
}
};
};
exports.addRequestMetricsMiddleware = addRequestMetricsMiddleware;