From 33f1034a6fc257f1a87de7bb38d876925f61cb5f Mon Sep 17 00:00:00 2001 From: Alex Potsides Date: Wed, 15 Dec 2021 12:44:30 +0000 Subject: [PATCH] feat: improve collected metrics (#3978) Exposes the per-component metrics from https://github.com/libp2p/js-libp2p/pull/1061 in the prometheus end point. Also allows changing the `debug` logging level dynamically. --- packages/ipfs-core-config/package.json | 2 +- packages/ipfs-core/package.json | 2 +- packages/ipfs-daemon/package.json | 2 +- .../ipfs-http-server/src/api/routes/debug.js | 44 ++++++++++++++++--- 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/packages/ipfs-core-config/package.json b/packages/ipfs-core-config/package.json index 1651ff20fb..a50a2b322e 100644 --- a/packages/ipfs-core-config/package.json +++ b/packages/ipfs-core-config/package.json @@ -95,7 +95,7 @@ "it-drain": "^1.0.3", "libp2p-floodsub": "^0.28.0", "libp2p-gossipsub": "^0.12.0", - "libp2p-kad-dht": "^0.27.0", + "libp2p-kad-dht": "^0.27.4", "libp2p-mdns": "^0.18.0", "libp2p-mplex": "^0.10.2", "libp2p-tcp": "^0.17.1", diff --git a/packages/ipfs-core/package.json b/packages/ipfs-core/package.json index c4a4514eb3..081040d416 100644 --- a/packages/ipfs-core/package.json +++ b/packages/ipfs-core/package.json @@ -111,7 +111,7 @@ "it-tar": "^4.0.0", "it-to-buffer": "^2.0.0", "just-safe-set": "^2.2.1", - "libp2p": "^0.35.0", + "libp2p": "^0.35.4", "libp2p-bootstrap": "^0.14.0", "libp2p-crypto": "^0.21.0", "libp2p-delegated-content-routing": "^0.11.1", diff --git a/packages/ipfs-daemon/package.json b/packages/ipfs-daemon/package.json index 513b69d054..61ab793fa9 100644 --- a/packages/ipfs-daemon/package.json +++ b/packages/ipfs-daemon/package.json @@ -52,7 +52,7 @@ "ipfs-http-server": "^0.9.2", "ipfs-utils": "^9.0.2", "just-safe-set": "^2.2.1", - "libp2p": "^0.35.0", + "libp2p": "^0.35.4", "libp2p-webrtc-star": "^0.25.0" }, "devDependencies": { diff --git a/packages/ipfs-http-server/src/api/routes/debug.js b/packages/ipfs-http-server/src/api/routes/debug.js index f4d19de8d5..8bb82f043f 100644 --- a/packages/ipfs-http-server/src/api/routes/debug.js +++ b/packages/ipfs-http-server/src/api/routes/debug.js @@ -1,9 +1,12 @@ import client from 'prom-client' import Boom from '@hapi/boom' +import debug from 'debug' // Clear the register to make sure we're not registering multiple ones client.register.clear() -const gauge = new client.Gauge({ name: 'number_of_peers', help: 'the_number_of_currently_connected_peers' }) + +/** @type {Record>} */ +const gauges = {} // Endpoint for handling debug metrics export default [{ @@ -19,13 +22,44 @@ export default [{ } const { ipfs } = request.server.app - const peers = await ipfs.swarm.peers() + // @ts-expect-error libp2p does not exist on ipfs + const metrics = ipfs.libp2p.metrics + + if (metrics) { + for (const [component, componentMetrics] of metrics.getComponentMetrics().entries()) { + for (const [metricName, metricValue] of componentMetrics.entries()) { + const name = `libp2p-${component}-${metricName}`.replace(/-/g, '_') - gauge.set(peers.length) + if (!gauges[name]) { + gauges[name] = new client.Gauge({ name, help: name }) + } - const metrics = await client.register.metrics() + gauges[name].set(metricValue) + } + } + } - return h.response(metrics) + return h.response(await client.register.metrics()) .type(client.register.contentType) } +}, { + method: 'POST', + path: '/debug/logs', + /** + * @param {import('../../types').Request} request + * @param {import('@hapi/hapi').ResponseToolkit} h + */ + async handler (request, h) { + if (!process.env.IPFS_MONITORING) { + throw Boom.notImplemented('Monitoring is disabled. Enable it by setting environment variable IPFS_MONITORING') + } + + if (!request.query.debug) { + debug.disable() + } else { + debug.enable(request.query.debug) + } + + return h.response() + } }]