RuntimeTools / appmetrics

Node Application Metrics provides a foundational infrastructure for collecting resource and performance monitoring data for Node.js-based applications.
https://developer.ibm.com/open/node-application-metrics/
Apache License 2.0
970 stars 125 forks source link

Warnings emitted on Node 14 #646

Open jloveridge opened 3 years ago

jloveridge commented 3 years ago

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');
kams2160 commented 3 years ago

Same here! Node v14.15.2

Warning: Accessing non-existent property '__ddProbeAttached__' of module exports inside circular dependency

dnascimb commented 3 years ago

Same here, Node v14.16.1

jokeyrhyme commented 3 years ago

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

realjasonbourne commented 2 years ago

Any update on this issue?

amanthegreatone commented 1 year ago

@jokeyrhyme can you explain how you removed this package and got the required metrics?

jokeyrhyme commented 1 year ago
amanthegreatone commented 1 year ago

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