diff --git a/index.js b/index.js index 8ac6e135..7c6ec2e0 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,7 @@ 'use strict'; const CircuitBreaker = require('./lib/circuit'); +const circuits = []; const defaults = { timeout: 10000, // 10 seconds @@ -63,7 +64,10 @@ const defaults = { * @return {CircuitBreaker} a newly created {@link CircuitBreaker} instance */ function factory (action, options) { - return new CircuitBreaker(action, Object.assign({}, defaults, options)); + const circuit = new CircuitBreaker(action, + Object.assign({}, defaults, options)); + circuits.push(circuit); + return circuit; } /** @@ -80,6 +84,17 @@ function factory (action, options) { * const breaker = circuitBreaker(readFilePromised); */ factory.promisify = require('./lib/promisify'); + +/** + * Get the Prometheus metrics for all circuits. + * @function factory.metrics + * @return {String} the metrics for all circuits + */ +factory.metrics = function metrics() { + const lastCircuit = circuits[circuits.length - 1]; + if (lastCircuit.metrics) return lastCircuit.metrics.metrics; +} + let warningIssued = false; Object.defineProperty(factory, 'stats', { get: _ => { diff --git a/test/prometheus-test.js b/test/prometheus-test.js index 93f57ce1..cabd97c8 100644 --- a/test/prometheus-test.js +++ b/test/prometheus-test.js @@ -20,6 +20,17 @@ test('Does not load Prometheus when the option is not provided', t => { t.end(); }); +test('The factory function provides access to metrics for all circuits', t => { + t.plan(4); + const c1 = cb(passFail, { usePrometheus: true, name: 'fred' }); + const c2 = cb(passFail, { usePrometheus: true, name: 'bob' }); + t.equal(c1.name, 'fred'); + t.equal(c2.name, 'bob'); + t.ok(/circuit_fred_/.test(cb.metrics())); + t.ok(/circuit_bob_/.test(cb.metrics())); + t.end(); +}); + // All of the additional tests only make sense when running in a Node.js context if (!process.env.WEB) {