appmetrics
appmetrics copied to clipboard
Warnings emitted on Node 14
When appmetrics is required on node 14 multiple messages are emitted which state:
(node:74412) Warning: Accessing non-existent property '__ddProbeAttached__' of module exports inside circular dependency
The following simple script can reproduce the issue:
require('appmetrics');
Same here! Node v14.15.2
Warning: Accessing non-existent property '__ddProbeAttached__' of module exports inside circular dependency
Same here, Node v14.16.1
It's internal code unfortunately (so I cannot share it at this time), but my team managed to replace the appmetrics module completely in Node.js 14.x using methods available in the standard library
Any update on this issue?
@jokeyrhyme can you explain how you removed this package and got the required metrics?
- we have setTimeout/setInterval jobs that use
os.cpus(),os.freemem(),os.totalmem(),perf_hooks.PerformanceObserver,perf_hooks.monitorEventLoopDelay(), etc to collect data - and we have some conversion logic to turn this data into values that correspond to appmetrics.eventloop.latency.* , appmetrics.gc.* , appmetrics.loop.* , appmetrics.memory.*
- we have completely dropped appmetrics (mostly out of necessity, since it seems abandoned and incompatible with modern Node.js)
this is what i could come up with
// timer start time
let trackingTime = process.hrtime();
// last cpu usage to get difference from current cpu usage (the diff will give usage over timer period)
let lastCpuUsage = process.cpuUsage();
// histogram for event loop monitoring
const histogram = perf_hooks.monitorEventLoopDelay();
histogram.enable();
// monitor cpu, memory, event loop
const monitor = () => {
// end time for the timer (diff from start time by passing as arg)
// hrtime gives nanosecond resolution ([0] seconds, [1] remaining nanoseconds)
const delta = process.hrtime(trackingTime);
const nanosec = delta[0] * 1e9 + delta[1];
// get cpu usage (user and system)
const cpuUsage = process.cpuUsage();
// diff from last cpu usage to get % usage over timer interval
const userUsage = ((cpuUsage.user - lastCpuUsage.user) / nanosec) * 1000;
const systemUsage = ((cpuUsage.system - lastCpuUsage.system) / nanosec) * 1000;
transportClient.gauge('cpu.process', userUsage);
transportClient.gauge('cpu.system', systemUsage);
// update last cpu usage for next timer cycle
lastCpuUsage = cpuUsage;
// get process memory usage
// Resident Set Size, is the amount of space occupied in the main memory device
// (that is a subset of the total allocated memory) for the process
// including all C++ and JavaScript objects and code
const memoryUsage = process.memoryUsage();
transportClient.gauge('memory.process.physical', memoryUsage.rss);
transportClient.gauge('eventloop.latency.min', histogram.min / 1e6);
transportClient.gauge('eventloop.latency.max', histogram.max / 1e6);
transportClient.gauge('eventloop.latency.avg', histogram.mean / 1e6);
// reset histogram to start new cycle
histogram.reset();
// update timer time for getting diff for next cycle
trackingTime = process.hrtime();
};
// collect process metrics every 5 seconds
setInterval(monitor, 5000);
any comments are welcome