nestjs-hot-shots
Version:
Hot-shots Module for Nest.js Framework
85 lines (84 loc) • 3.87 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.HttpMetricsMiddleware = void 0;
const tslib_1 = require("tslib");
const common_1 = require("@nestjs/common");
const response_time_1 = tslib_1.__importDefault(require("response-time"));
const urlParser = tslib_1.__importStar(require("url"));
const metrics_1 = require("../metrics");
let HttpMetricsMiddleware = class HttpMetricsMiddleware {
constructor(metricsService) {
this.metricsService = metricsService;
this.httpServerRequestCount = this.metricsService.getCounter('http_server_request_count');
this.httpServerResponseCount = this.metricsService.getCounter('http_server_response_count');
this.httpServerDuration = this.metricsService.getHistogram('http_server_duration');
this.httpServerRequestSize = this.metricsService.getHistogram('http_server_request_size');
this.httpServerResponseSize = this.metricsService.getHistogram('http_server_response_size');
this.httpServerResponseSuccessCount = this.metricsService.getCounter('http_server_response_success_count');
this.httpServerResponseErrorCount = this.metricsService.getCounter('http_server_response_error_count');
this.httpClientRequestErrorCount = this.metricsService.getCounter('http_client_request_error_count');
this.httpServerAbortCount = this.metricsService.getCounter('http_server_abort_count');
}
use(req, res, next) {
(0, response_time_1.default)((req, res, time) => {
const { route, url, method } = req;
let path;
if (route) {
path = route.path;
}
else {
path = urlParser.parse(url).pathname;
}
this.httpServerRequestCount.add(1, { method, path });
const requestLength = parseInt(req.headers['content-length'], 10) || 0;
const responseLength = parseInt(res.getHeader('Content-Length'), 10) || 0;
const status = res.statusCode || 500;
const attributes = {
method,
status,
path
};
this.httpServerRequestSize.record(requestLength, attributes);
this.httpServerResponseSize.record(responseLength, attributes);
this.httpServerResponseCount.add(1, attributes);
this.httpServerDuration.record(time, attributes);
const codeClass = this.getStatusCodeClass(status);
switch (codeClass) {
case 'success':
this.httpServerResponseSuccessCount.add(1);
break;
case 'redirect':
// TODO: Review what should be appropriate for redirects.
this.httpServerResponseSuccessCount.add(1);
break;
case 'client_error':
this.httpClientRequestErrorCount.add(1);
break;
case 'server_error':
this.httpServerResponseErrorCount.add(1);
break;
}
req.on('end', () => {
if (req.aborted === true) {
this.httpServerAbortCount.add(1);
}
});
})(req, res, next);
}
getStatusCodeClass(code) {
if (code < 200)
return 'info';
if (code < 300)
return 'success';
if (code < 400)
return 'redirect';
if (code < 500)
return 'client_error';
return 'server_error';
}
};
exports.HttpMetricsMiddleware = HttpMetricsMiddleware;
exports.HttpMetricsMiddleware = HttpMetricsMiddleware = tslib_1.__decorate([
(0, common_1.Injectable)(),
tslib_1.__metadata("design:paramtypes", [metrics_1.MetricsService])
], HttpMetricsMiddleware);