From 9a329067560a31757c346c89d4ddffbe12d863e0 Mon Sep 17 00:00:00 2001 From: rishh09 Date: Mon, 13 Jul 2026 15:16:31 +0530 Subject: [PATCH 1/5] Add debug logging for metrics collection failures Signed-off-by: rishh09 --- lib/metrics/eventLoopLag.js | 5 +++-- lib/metrics/gc.js | 5 +++-- lib/metrics/helpers/safeMemoryUsage.js | 5 ++++- lib/metrics/helpers/safeRss.js | 5 ++++- lib/metrics/osMemoryHeapLinux.js | 5 +++-- lib/metrics/processMaxFileDescriptors.js | 4 +++- lib/metrics/processOpenFileDescriptors.js | 5 +++-- package.json | 2 +- 8 files changed, 24 insertions(+), 12 deletions(-) diff --git a/lib/metrics/eventLoopLag.js b/lib/metrics/eventLoopLag.js index af5090f8..68154a97 100644 --- a/lib/metrics/eventLoopLag.js +++ b/lib/metrics/eventLoopLag.js @@ -14,14 +14,15 @@ 'use strict'; +const debug = require('debug')('prom:metrics:event-loop-lag'); const Gauge = require('../gauge'); // Check if perf_hooks module is available let perf_hooks; try { perf_hooks = require('perf_hooks'); -} catch { - // node version is too old +} catch (error) { + debug('perf_hooks module is unavailable: %o', error); } // Reported always. diff --git a/lib/metrics/gc.js b/lib/metrics/gc.js index 3d9b60d7..164ed769 100644 --- a/lib/metrics/gc.js +++ b/lib/metrics/gc.js @@ -13,14 +13,15 @@ // limitations under the License. 'use strict'; +const debug = require('debug')('prom:metrics:gc'); const Histogram = require('../histogram'); let perf_hooks; try { perf_hooks = require('perf_hooks'); -} catch { - // node version is too old +} catch (error) { + debug('perf_hooks module is unavailable: %o', error); } const NODEJS_GC_DURATION_SECONDS = 'nodejs_gc_duration_seconds'; diff --git a/lib/metrics/helpers/safeMemoryUsage.js b/lib/metrics/helpers/safeMemoryUsage.js index eb586515..826d6afe 100644 --- a/lib/metrics/helpers/safeMemoryUsage.js +++ b/lib/metrics/helpers/safeMemoryUsage.js @@ -14,11 +14,14 @@ 'use strict'; +const debug = require('debug')('prom:metrics:safe-memory-usage'); + // process.memoryUsage() can throw on some platforms, see #67 function safeMemoryUsage() { try { return process.memoryUsage(); - } catch { + } catch (error) { + debug('process.memoryUsage() failed: %o', error); return; } } diff --git a/lib/metrics/helpers/safeRss.js b/lib/metrics/helpers/safeRss.js index dcd35ebd..b088e37f 100644 --- a/lib/metrics/helpers/safeRss.js +++ b/lib/metrics/helpers/safeRss.js @@ -14,11 +14,14 @@ 'use strict'; +const debug = require('debug')('prom:metrics:safe-rss'); + // process.memoryUsage.rss() can throw on some platforms, see #67 function safeRss() { try { return process.memoryUsage.rss(); - } catch { + } catch (error) { + debug('process.memoryUsage.rss() failed: %o', error); return; } } diff --git a/lib/metrics/osMemoryHeapLinux.js b/lib/metrics/osMemoryHeapLinux.js index 4bdabc45..6e094047 100644 --- a/lib/metrics/osMemoryHeapLinux.js +++ b/lib/metrics/osMemoryHeapLinux.js @@ -14,6 +14,7 @@ 'use strict'; +const debug = require('debug')('prom:metrics:os-memory-heap-linux'); const Gauge = require('../gauge'); const fs = require('fs'); @@ -70,8 +71,8 @@ module.exports = (registry, config = {}) => { residentMemGauge.set(labels, structuredOutput.VmRSS); virtualMemGauge.set(labels, structuredOutput.VmSize); heapSizeMemGauge.set(labels, structuredOutput.VmData); - } catch { - // noop + } catch (error) { + debug('failed to collect Linux memory metrics: %o', error); } }, }); diff --git a/lib/metrics/processMaxFileDescriptors.js b/lib/metrics/processMaxFileDescriptors.js index 81cfe777..58e6417d 100644 --- a/lib/metrics/processMaxFileDescriptors.js +++ b/lib/metrics/processMaxFileDescriptors.js @@ -14,6 +14,7 @@ 'use strict'; +const debug = require('debug')('prom:metrics:process-max-fds'); const Gauge = require('../gauge'); const fs = require('fs'); @@ -34,7 +35,8 @@ module.exports = (registry, config = {}) => { break; } } - } catch { + } catch (error) { + debug('failed to collect maximum file descriptors: %o', error); return; } } diff --git a/lib/metrics/processOpenFileDescriptors.js b/lib/metrics/processOpenFileDescriptors.js index 6569c7d9..dc9a3cb6 100644 --- a/lib/metrics/processOpenFileDescriptors.js +++ b/lib/metrics/processOpenFileDescriptors.js @@ -14,6 +14,7 @@ 'use strict'; +const debug = require('debug')('prom:metrics:process-open-fds'); const Gauge = require('../gauge'); const fs = require('fs'); const process = require('process'); @@ -40,8 +41,8 @@ module.exports = (registry, config = {}) => { // Minus 1 to not count the fd that was used by readdirSync(), // it's now closed. this.set(labels, fds.length - 1); - } catch { - // noop + } catch (error) { + debug('failed to collect open file descriptors: %o', error); } }, }); diff --git a/package.json b/package.json index dc4a3eb5..3f948fb1 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "homepage": "https://github.com/prometheus/client_js", "devDependencies": { "@eslint/js": "^9.29.0", - "debug": "^4.4.1", "eslint": "^9.29.0", "eslint-config-prettier": "^10.1.5", "eslint-plugin-jsdoc": "^61.4.1", @@ -54,6 +53,7 @@ }, "dependencies": { "@opentelemetry/api": "^1.4.0", + "debug": "^4.4.1", "tdigest": "^0.1.1" }, "types": "./index.d.ts", From 36300b02f511c308a484e921e065659032784398 Mon Sep 17 00:00:00 2001 From: rishh09 Date: Tue, 14 Jul 2026 10:30:42 +0530 Subject: [PATCH 2/5] Use built-in debug logging Signed-off-by: rishh09 --- benchmarks/index.js | 18 ++++++------------ lib/metrics/eventLoopLag.js | 4 +++- lib/metrics/gc.js | 4 +++- lib/metrics/helpers/safeMemoryUsage.js | 4 +++- lib/metrics/helpers/safeRss.js | 4 +++- lib/metrics/osMemoryHeapLinux.js | 4 +++- lib/metrics/processMaxFileDescriptors.js | 4 +++- lib/metrics/processOpenFileDescriptors.js | 4 +++- package.json | 1 - 9 files changed, 27 insertions(+), 20 deletions(-) diff --git a/benchmarks/index.js b/benchmarks/index.js index ef05209b..a6ccc2d1 100644 --- a/benchmarks/index.js +++ b/benchmarks/index.js @@ -15,7 +15,6 @@ 'use strict'; const Benchmark = require('faceoff').default; -const debug = require('debug')('benchmark'); /** * Async suite workaround. benchmark-regression forwards no options to @@ -41,14 +40,9 @@ benchmarks.suite('summary', require('./summary')); benchmarks.suite('registry', require('./registry')); benchmarks.suite('cluster', require('./cluster')); -benchmarks - .run() - .then(() => { - debug('Process end'); - }) - .catch(err => { - console.error('Failure', err); - console.error(err.stack); - // eslint-disable-next-line n/no-process-exit - process.exit(1); - }); +benchmarks.run().catch(err => { + console.error('Failure', err); + console.error(err.stack); + // eslint-disable-next-line n/no-process-exit + process.exit(1); +}); diff --git a/lib/metrics/eventLoopLag.js b/lib/metrics/eventLoopLag.js index 68154a97..8b75293c 100644 --- a/lib/metrics/eventLoopLag.js +++ b/lib/metrics/eventLoopLag.js @@ -14,9 +14,11 @@ 'use strict'; -const debug = require('debug')('prom:metrics:event-loop-lag'); +const { debuglog } = require('node:util'); const Gauge = require('../gauge'); +const debug = debuglog('prom:metrics:event-loop-lag'); + // Check if perf_hooks module is available let perf_hooks; try { diff --git a/lib/metrics/gc.js b/lib/metrics/gc.js index 164ed769..3ea49bf6 100644 --- a/lib/metrics/gc.js +++ b/lib/metrics/gc.js @@ -13,9 +13,11 @@ // limitations under the License. 'use strict'; -const debug = require('debug')('prom:metrics:gc'); +const { debuglog } = require('node:util'); const Histogram = require('../histogram'); +const debug = debuglog('prom:metrics:gc'); + let perf_hooks; try { diff --git a/lib/metrics/helpers/safeMemoryUsage.js b/lib/metrics/helpers/safeMemoryUsage.js index 826d6afe..1b72e40c 100644 --- a/lib/metrics/helpers/safeMemoryUsage.js +++ b/lib/metrics/helpers/safeMemoryUsage.js @@ -14,7 +14,9 @@ 'use strict'; -const debug = require('debug')('prom:metrics:safe-memory-usage'); +const { debuglog } = require('node:util'); + +const debug = debuglog('prom:metrics:safe-memory-usage'); // process.memoryUsage() can throw on some platforms, see #67 function safeMemoryUsage() { diff --git a/lib/metrics/helpers/safeRss.js b/lib/metrics/helpers/safeRss.js index b088e37f..a4a4ed8d 100644 --- a/lib/metrics/helpers/safeRss.js +++ b/lib/metrics/helpers/safeRss.js @@ -14,7 +14,9 @@ 'use strict'; -const debug = require('debug')('prom:metrics:safe-rss'); +const { debuglog } = require('node:util'); + +const debug = debuglog('prom:metrics:safe-rss'); // process.memoryUsage.rss() can throw on some platforms, see #67 function safeRss() { diff --git a/lib/metrics/osMemoryHeapLinux.js b/lib/metrics/osMemoryHeapLinux.js index 6e094047..dbe1652f 100644 --- a/lib/metrics/osMemoryHeapLinux.js +++ b/lib/metrics/osMemoryHeapLinux.js @@ -14,10 +14,12 @@ 'use strict'; -const debug = require('debug')('prom:metrics:os-memory-heap-linux'); +const { debuglog } = require('node:util'); const Gauge = require('../gauge'); const fs = require('fs'); +const debug = debuglog('prom:metrics:os-memory-heap-linux'); + const values = ['VmSize', 'VmRSS', 'VmData']; const PROCESS_RESIDENT_MEMORY = 'process_resident_memory_bytes'; diff --git a/lib/metrics/processMaxFileDescriptors.js b/lib/metrics/processMaxFileDescriptors.js index 58e6417d..0c002d9d 100644 --- a/lib/metrics/processMaxFileDescriptors.js +++ b/lib/metrics/processMaxFileDescriptors.js @@ -14,10 +14,12 @@ 'use strict'; -const debug = require('debug')('prom:metrics:process-max-fds'); +const { debuglog } = require('node:util'); const Gauge = require('../gauge'); const fs = require('fs'); +const debug = debuglog('prom:metrics:process-max-fds'); + const PROCESS_MAX_FDS = 'process_max_fds'; let maxFds; diff --git a/lib/metrics/processOpenFileDescriptors.js b/lib/metrics/processOpenFileDescriptors.js index dc9a3cb6..3c8150cc 100644 --- a/lib/metrics/processOpenFileDescriptors.js +++ b/lib/metrics/processOpenFileDescriptors.js @@ -14,11 +14,13 @@ 'use strict'; -const debug = require('debug')('prom:metrics:process-open-fds'); +const { debuglog } = require('node:util'); const Gauge = require('../gauge'); const fs = require('fs'); const process = require('process'); +const debug = debuglog('prom:metrics:process-open-fds'); + const PROCESS_OPEN_FDS = 'process_open_fds'; module.exports = (registry, config = {}) => { diff --git a/package.json b/package.json index 3f948fb1..0a6816c9 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,6 @@ }, "dependencies": { "@opentelemetry/api": "^1.4.0", - "debug": "^4.4.1", "tdigest": "^0.1.1" }, "types": "./index.d.ts", From 0af13555ec56dfeed337ae7f9a20ddcf0812bf14 Mon Sep 17 00:00:00 2001 From: Jason Marshall Date: Tue, 14 Jul 2026 01:30:23 -0700 Subject: [PATCH 3/5] Restore debug logging Signed-off-by: Jason Marshall --- benchmarks/index.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/benchmarks/index.js b/benchmarks/index.js index a6ccc2d1..c10bc0da 100644 --- a/benchmarks/index.js +++ b/benchmarks/index.js @@ -14,6 +14,8 @@ 'use strict'; +const { debuglog } = require('node:util'); +const debug = debuglog('prom:metrics:safe-memory-usage'); const Benchmark = require('faceoff').default; /** @@ -40,9 +42,14 @@ benchmarks.suite('summary', require('./summary')); benchmarks.suite('registry', require('./registry')); benchmarks.suite('cluster', require('./cluster')); -benchmarks.run().catch(err => { - console.error('Failure', err); - console.error(err.stack); - // eslint-disable-next-line n/no-process-exit - process.exit(1); -}); +benchmarks + .run() + .then(() => { + debug('Process end'); + }) + .catch(err => { + console.error('Failure', err); + console.error(err.stack); + // eslint-disable-next-line n/no-process-exit + process.exit(1); + }); From c3e946b4eb6f67d674467ff73b6bff32eb5e0d47 Mon Sep 17 00:00:00 2001 From: Jason Marshall Date: Tue, 14 Jul 2026 01:31:44 -0700 Subject: [PATCH 4/5] Fix debug log namespace for benchmarks Signed-off-by: Jason Marshall --- benchmarks/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/index.js b/benchmarks/index.js index c10bc0da..90c4211c 100644 --- a/benchmarks/index.js +++ b/benchmarks/index.js @@ -15,7 +15,7 @@ 'use strict'; const { debuglog } = require('node:util'); -const debug = debuglog('prom:metrics:safe-memory-usage'); +const debug = debuglog('prom:benchmark'); const Benchmark = require('faceoff').default; /** From 6f13917f871341106efe6bf96633993f110a9a3a Mon Sep 17 00:00:00 2001 From: rishh09 Date: Tue, 14 Jul 2026 15:09:02 +0530 Subject: [PATCH 5/5] Add changelog entry for debug logging Signed-off-by: rishh09 --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 41b3c037..91e6cbd2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,7 @@ This release marks our first release under the Prometheus umbrella. ### Added +- Add debug logging for metrics collection failures. - Node 26 added to the test matrix - Expanded benchmarking code - new WorkerRegistry to provide equivalent support to AggregatorRegistry