Node.js VM measurements

New Relic APM's Node.js agent collects key metric timeslice data from the Node.js virtual machine (V8). These metrics give you insight into Node.js VM behavior and help you improve your application's performance. The agent also collects CPU metrics, which are often analyzed together with garbage collection (GC) metrics.

Compatibility and requirements

New Relic requires an additional native module to collect Node.js VM metric timeslice data related to garbage collection, memory, and CPU. As of Node v6.1.0 the native module is not required to collect CPU metrics, as the New Relic Node.js agent collects them with process.cpuUsage().

The native module can be used with:

  • New Relic Node.js version 1.35.1 or higher
  • Node v4 or higher
  • NPM v2.0.0 or higher

To compile the native module on your deployment platform, follow the node-gyp package procedures. Prerequisites to install native Node modules include:

Platform Prerequisites
Unix/Linux Python (v2.7 recommended, v3.x.x not supported), make, C/C++ compiler (such as GCC)
macOS Python (v2.7 recommended, v3.x.x not supported), Xcode
Windows Python (v2.7 recommended, v3.x.x not supported), Visual C++ Build Environment

If you have problems installing New Relic's Node.js agent, follow the installation troubleshooting procedures.

Install the native module

As of v2.0.0 of the New Relic Node.js agent, the native module has become an optional dependency that attempts to install automatically.

During installation, the native module first attempts to build from source on the target machine. If the build fails, Node outputs a stack trace to the console that you can typically ignore. For Linux environments running supported versions of Node, the agent then attempts to download and install a pre-built binary.

It is possible to prevent the agent from attempting to download and install a pre-built binary. Instead, it will only attempt to build the native module. Do this by setting the NR_NATIVE_METRICS_NO_DOWNLOAD environment variable to true before installation with either NPM or Yarn.

export NR_NATIVE_METRICS_NO_DOWNLOAD=true
npm install @newrelic/native-metrics
yarn add @newrelic/native-metrics

Alternatively, use the --no-download flag which works with NPM.

npm install @newrelic/native-metrics --no-download

If the build fails with NR_NATIVE_METRICS_NO_DOWNLOAD=true or the --no-download flag set, the optional native module will not be installed.

If both environment variables are set, NR_NATIVE_METRICS_NO_BUILD will override NR_NATIVE_METRICS_NO_DOWNLOAD.

If you're using an older version, upgrade to the latest agent version, or install the native module manually:

  1. Ensure a supported version of Node.js is installed. Recommendation: Use the latest LTS version. Do not use versions lower than the minimum supported version for the @newrelic/native-metrics module (v4 or higher).
  2. To get all currently available metrics, ensure you are running the newrelic module for agent 1.37.0 or higher.
  3. Windows users: Run the following command:

    npm install --global windows-build-tools

    If this step doesn't work, follow Option 2 in the node-gyp module on GitHub for manual installation instructions.

  4. To install the native metrics module, use either of these methods:

    • Run the npm install @newrelic/native-metrics --save command.

      OR

    • Add the module to your app's package.json file.

  5. Restart your app.

The Node.js agent automatically detects if the native metrics module is installed and starts using it. If you'd like to avoid installation of the native module completely, you can use the following NPM or Yarn arguments.

npm install newrelic --no-optional
yarn add newrelic --ignore-optional

Pre-built binaries

To skip the build step and only attempt to download a pre-built binary, and to avoid seeing build errors in the console, set the NR_NATIVE_METRICS_NO_BUILD environment variable to true before installation.

export NR_NATIVE_METRICS_NO_BUILD=true

If working behind a firewall, you can cache pre-built binaries by setting the NR_NATIVE_METRICS_DOWNLOAD_HOST and NR_NATIVE_METRICS_REMOTE_PATH environment variables before installation.

export NR_NATIVE_METRICS_DOWNLOAD_HOST=http://your-internal-cache/
export NR_NATIVE_METRICS_REMOTE_PATH=path/to/download/folder/

Once you've set environment variables, installation can then proceed.

npm install @newrelic/native-metrics
yarn add @newrelic/native-metrics

View Node.js VM data

To view curated charts with Node.js VM data, go to rpm.newrelic.com/apm > (select an app) > Monitoring > Node VMs. For more information, see the Node.js VMs statistics page.

The data is also available in New Relic Insights' Metric Explorer:

  1. Go to insights.newrelic.com > Data explorer > Metrics.
  2. Select the application you want to monitor.
  3. Select one of the available metrics.
nodejs-gc-metric-explorer.png
Insights > Data Explorer > Metrics: Here is an example of using the Insights Data Explorer to chart the average duration of garbage collection over time.

Measurement details

Not all data can be collected across all Node versions. In general, you will get the most complete data if you are on the most recent LTS version of Node.

Time in garbage collection

Available on:

  • Node.js agent v1.35.1 or higher
  • Node v4 or higher
  • New Relic Node.js @newrelic/native-metrics v1.0.0 or higher

The amount of time spent in garbage collection (all types used by V8) by your Node process. Time is measured both as a cumulative metric, as GC/System/Pauses, and bucketed by garbage collection type as GC/<type>.

Possible garbage collection types include:

GC type Description
Scavenge The most common garbage collection method. Node will typically trigger one of these every time the VM is idle.
MarkSweepCompact The heaviest type of garbage collection V8 may do. If you see many of these happening you will need to either keep fewer objects around in your process or increase V8's heap limit.
IncrementalMarking A phased garbage collection that interleaves collection with application logic to reduce the amount of time the application is paused. Only in Node v6 or higher.
ProcessWeakCallbacks After a garbage collection occurs, V8 will call any weak reference callbacks registered for objects that have been freed. This measurement is from the start of the first weak callback to the end of the last for a given garbage collection. Only in Node v6 or higher.
Memory

Available on:

  • Node.js agent v1.36.0 or higher
  • Node v4 or higher

The New Relic Node.js agent collects the following metrics related to memory usage:

Metric Description
Memory/Physical The total physical memory (in MB) used by the Node process. It is recorded using the process.memoryUsage().rss Node API.
Memory/Heap/Max The total heap (in MB) allocated by V8 for storing Javascript objects. It is recorded using the process.memoryUsage().heapTotal Node API.
Memory/Heap/Used The amount of V8 heap (in MB) currently used by the app. It is recorded using the process.memoryUsage().heapUsed Node API.
Memory/Heap/Free The amount of V8 memory (in MB) that is allocated but not used. This is a derived metric (heapTotal - heapUsed).
Memory/NonHeap/Used The amount of memory other than V8 heap (in MB). This is a derived metric (rss - heapTotal). This metric is useful for finding memory leaks outside of V8 heap; for example, with buffers or streams.
CPU

Available on:

  • Node >= v6.1.0, Agent v1.34.0 or higher
  • Node v4 - v6.0.0, Agent v1.35.2 with @newrelic/native-metrics v1.0.0 or higher

CPU metrics are collected on Node v6.1.0 or higher using the process.cpuUsage() Node API. For older versions of Node, the additional native module must be installed.

The agent collects the following metrics related to CPU:

Metric Description
CPU/User Time The time spent by CPU executing the user code. It is recorded in seconds.
CPU/User/Utilization

The time spent executing the user code (CPU/User Time) divided by wall clock time and the number of logical processors. Because the Node runtime always uses only one core, the max value reported by this metric will be 100 divided by the number of cores.

CPU/System Time The time spent by CPU in the system kernel in relation to the Node process.
CPU/System/Utilization

The time spent in the system kernel (CPU/System Time) divided by wall clock time and the number of logical processors. Because the Node runtime always uses only one core, the max value reported by this metric will be 100 divided by number of cores.

Event Loop

Available on:

  • Node.js agent v1.37.0 or higher
  • @newrelic/native-metrics v2.1.0 or higher
  • Node v4 or higher

Performance metrics for the Node event loop. Collection of event loop metrics requires installation of an additional native module.

The agent collects the following event loop metrics:

Metric Description
Nodejs/EventLoop/CPU/Usage

The total CPU time spent actively executing in each event loop tick. This includes executing your application's callbacks, but also the runtime itself. Reported in units of seconds.

An abnormally long event loop tick indicates unbroken synchronous execution that may be a target for optimization; for example, recursive process.nextTick calls).

For more help

If you need more help, check out these support and learning resources: