@vtex/api
Version:
VTEX I/O API client
79 lines (78 loc) • 3.65 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.addOtelRequestMetricsMiddleware = void 0;
const stream_1 = require("stream");
const utils_1 = require("../../utils");
const metrics_1 = require("./metrics");
const INSTRUMENTS_INITIALIZATION_TIMEOUT = 500;
const addOtelRequestMetricsMiddleware = () => {
let instruments;
const tryGetInstruments = async (ctx) => {
try {
return await Promise.race([
(0, metrics_1.getOtelInstruments)(),
new Promise((_, reject) => setTimeout(() => reject(new Error('Timeout waiting for OpenTelemetry instruments initialization')), INSTRUMENTS_INITIALIZATION_TIMEOUT)),
]);
}
catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
console.warn(`OpenTelemetry instruments not ready for request ${ctx.requestHandlerName}: ${errorMessage}`);
return undefined;
}
};
return async function addOtelRequestMetrics(ctx, next) {
var _a, _b;
instruments = instruments ? instruments : await tryGetInstruments(ctx);
if (!instruments) {
await next();
return;
}
const start = process.hrtime();
instruments.concurrentRequests.add(1);
ctx.req.once('aborted', () => {
if (instruments) {
instruments.abortedRequests.add(1, { [metrics_1.RequestsMetricLabels.REQUEST_HANDLER]: ctx.requestHandlerName });
}
});
let responseClosed = false;
ctx.res.once('close', () => (responseClosed = true));
try {
await next();
}
finally {
const responseLength = ctx.response.length;
if (responseLength && instruments) {
instruments.responseSizes.record(responseLength, {
[metrics_1.RequestsMetricLabels.REQUEST_HANDLER]: ctx.requestHandlerName,
[metrics_1.RequestsMetricLabels.STATUS_CODE]: ctx.response.status,
[metrics_1.RequestsMetricLabels.ACCOUNT_NAME]: ((_a = ctx.vtex) === null || _a === void 0 ? void 0 : _a.account) || 'unknown',
});
}
if (instruments) {
instruments.totalRequests.add(1, {
[metrics_1.RequestsMetricLabels.REQUEST_HANDLER]: ctx.requestHandlerName,
[metrics_1.RequestsMetricLabels.STATUS_CODE]: ctx.response.status,
[metrics_1.RequestsMetricLabels.ACCOUNT_NAME]: ((_b = ctx.vtex) === null || _b === void 0 ? void 0 : _b.account) || 'unknown',
});
}
const onResFinished = () => {
var _a;
if (instruments) {
instruments.requestTimings.record((0, utils_1.hrToMillisFloat)(process.hrtime(start)), {
[metrics_1.RequestsMetricLabels.REQUEST_HANDLER]: ctx.requestHandlerName,
[metrics_1.RequestsMetricLabels.STATUS_CODE]: ctx.response.status,
[metrics_1.RequestsMetricLabels.ACCOUNT_NAME]: ((_a = ctx.vtex) === null || _a === void 0 ? void 0 : _a.account) || 'unknown',
});
instruments.concurrentRequests.subtract(1);
}
};
if (responseClosed) {
onResFinished();
}
else {
(0, stream_1.finished)(ctx.res, onResFinished);
}
}
};
};
exports.addOtelRequestMetricsMiddleware = addOtelRequestMetricsMiddleware;