UNPKG

nestjs-hot-shots

Version:
85 lines (84 loc) 3.87 kB
"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);