@mojaloop/central-services-metrics
Advanced tools
Comparing version 12.1.0 to 12.2.0
@@ -75,3 +75,3 @@ /***** | ||
/** The options passed to the setup */ | ||
this._options = { prefix: '', timeout: 0 }; | ||
this._options = { prefix: '', timeout: 0, maxConnections: 0, maxRequestsPending: 0 }; | ||
/** Object containing the default registry */ | ||
@@ -188,2 +188,100 @@ this._register = client.register; | ||
}; | ||
this.plugin = { | ||
name: 'http server metrics', | ||
register: function (server) { | ||
var requestCounter = new client.Counter({ | ||
registers: [_this.getDefaultRegister()], | ||
name: 'http_requests_total', | ||
help: 'Total number of http requests', | ||
labelNames: ['method', 'status_code', 'path'] | ||
}); | ||
var requestDuration = new client.Summary({ | ||
registers: [_this.getDefaultRegister()], | ||
name: 'http_request_duration_seconds', | ||
help: 'Duration of http requests', | ||
labelNames: ['method', 'status_code', 'path'], | ||
aggregator: 'average' | ||
}); | ||
var requestDurationHistogram = new client.Histogram({ | ||
registers: [_this.getDefaultRegister()], | ||
name: 'http_request_duration_histogram_seconds', | ||
help: 'Duration of http requests', | ||
labelNames: ['method', 'status_code', 'path'], | ||
aggregator: 'average' | ||
}); | ||
var requests = 0; | ||
var requestsGauge = new client.Gauge({ | ||
registers: [_this.getDefaultRegister()], | ||
name: 'http_requests_current', | ||
help: 'Number of requests currently running', | ||
labelNames: ['method'] | ||
}); | ||
server.ext('onRequest', function (request, h) { | ||
var _a = _this.getOptions(), _b = _a.maxConnections, maxConnections = _b === void 0 ? 0 : _b, _c = _a.maxRequestsPending, maxRequestsPending = _c === void 0 ? 0 : _c; | ||
if ((maxConnections > 0 || maxRequestsPending > 0) && request.path === '/ready') { | ||
if (maxConnections > 0 && connections >= maxConnections) { | ||
return h.response('Max connections reached').code(503).takeover(); | ||
} | ||
if (maxRequestsPending > 0 && requests >= maxRequestsPending) { | ||
return h.response('Max requests pending reached').code(503).takeover(); | ||
} | ||
} | ||
if (['/metrics', '/health', '/ready'].includes(request.path)) | ||
return h.continue; | ||
requests++; | ||
requestsGauge.inc({ method: request.method }); | ||
return h.continue; | ||
}); | ||
server.events.on('response', function (request) { | ||
if (['/metrics', '/health', '/ready'].includes(request.path)) | ||
return; | ||
requests--; | ||
requestsGauge.dec({ method: request.method }); | ||
var path = request.route.path === '/{p*}' ? request.path : request.route.path; | ||
var statusCode = String('isBoom' in request.response | ||
? request.response.output.statusCode | ||
: request.response.statusCode); | ||
var duration = Math.max(Math.max(request.info.completed, request.info.responded) - request.info.received, 0); | ||
requestCounter.labels(request.method, statusCode, path).inc(); | ||
requestDuration.labels(request.method, statusCode, path).observe(duration); | ||
requestDurationHistogram.labels(request.method, statusCode, path).observe(duration / 1000); | ||
}); | ||
var connections = 0; | ||
var connectionsGauge = new client.Gauge({ | ||
registers: [_this.getDefaultRegister()], | ||
name: 'http_connections_current', | ||
help: 'Number of connections currently established', | ||
labelNames: ['remote_address'] | ||
}); | ||
server.listener.on('connection', function (socket) { | ||
var labels = { remote_address: socket.remoteAddress }; | ||
connections++; | ||
connectionsGauge.inc(labels); | ||
socket.on('close', function () { | ||
connections--; | ||
connectionsGauge.dec(labels); | ||
}); | ||
}); | ||
server.route({ | ||
method: 'GET', | ||
path: '/metrics', | ||
handler: function (request, h) { return __awaiter(_this, void 0, void 0, function () { | ||
var _a, _b; | ||
return __generator(this, function (_c) { | ||
switch (_c.label) { | ||
case 0: | ||
_b = (_a = h).response; | ||
return [4 /*yield*/, this.getMetricsForPrometheus()]; | ||
case 1: return [2 /*return*/, _b.apply(_a, [_c.sent()]).code(200).type('text/plain; version=0.0.4')]; | ||
} | ||
}); | ||
}); }, | ||
options: { | ||
tags: ['api', 'metrics'], | ||
description: 'Prometheus metrics endpoint', | ||
id: 'metrics' | ||
} | ||
}); | ||
} | ||
}; | ||
} | ||
@@ -190,0 +288,0 @@ return Metrics; |
{ | ||
"name": "@mojaloop/central-services-metrics", | ||
"version": "12.1.0", | ||
"version": "12.2.0", | ||
"description": "Shared code for metrics generation", | ||
@@ -64,6 +64,8 @@ "main": "./dist/index.js", | ||
"devDependencies": { | ||
"@types/node": "^22.9.0", | ||
"@hapi/hapi": "^21.3.12", | ||
"@types/node": "^22.9.1", | ||
"@types/tape": "^5.6.4", | ||
"audit-ci": "^7.1.0", | ||
"debug": "4.3.7", | ||
"joi": "^17.13.3", | ||
"npm-check-updates": "17.1.11", | ||
@@ -70,0 +72,0 @@ "nyc": "17.1.0", |
Sorry, the diff of this file is not supported yet
30906
311
22