Node.js Monitoring: Tools and Libraries for Performance Tracking

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

Monitoring JavaScript (Node.js) Applications: A Complete Overview of Tools and Practices



Developing with Node.js is powerful, but without proper monitoring, your application can turn into a "black box." In this article, we will break down the key tools and libraries that will help you track the state of server-side JavaScript applications, identify bottlenecks, and prevent failures.



Why is Node.js Monitoring Needed?

Node.js operates on a single-threaded Event Loop, so any blocking operation (e.g., a heavy loop or synchronous file reading) can paralyze the entire application. Without monitoring, you risk:

  • Missing a memory leak — GC can't keep up, the application crashes.
  • Not noticing an increase in response time — users leave.
  • Losing control over errors — unhandled rejections kill the process.


1. Built-in Node.js Tools

Let's start with what's already in the core. Node.js provides the process module and perf_hooks for basic metric collection.

// Example: collecting memory and response time metricsconst { performance, PerformanceObserver } = require('perf_hooks');

// Monitoring the Event Loopconst obs = new PerformanceObserver((items) => { const entry = items.getEntries()[0]; console.log(`Event Loop delay: ${entry.duration}ms`);});obs.observe({ entryTypes: ['function'] });

// Measuring function execution timeperformance.mark('start');// ... your code ...performance.mark('end');performance.measure('myFunction', 'start', 'end');

// Memory monitoringsetInterval(() => { const memory = process.memoryUsage(); console.log(`RSS: ${memory.rss}, Heap: ${memory.heapUsed}`);}, 5000);


2. PM2 — Process Manager with Monitoring

PM2 is the de facto standard for production Node.js. It not only manages processes but also provides built-in monitoring via the pm2 monit command.

  • Automatic restart on process crash.
  • Metric collection: CPU, memory, request count.
  • Logging stdout/stderr.
  • Cluster mode for maximum core utilization.
// Installation and launchnpm install pm2 -gpm2 start app.js --name "my-app" --instances max

// Built-in monitoringpm2 monit

// Export metrics to JSONpm2 jlist > metrics.json

For advanced monitoring, use pm2-metrics — a plugin that sends data to Prometheus.



3. Clinic.js — Performance Diagnostics

Clinic.js is a set of tools from NearForm for profiling Node.js. It includes three utilities:

  • Clinic Doctor — general diagnostics (Event Loop, GC, I/O).
  • Clinic Bubbleprof — analysis of asynchronous operations.
  • Clinic Flame — flame graphs for finding hot functions.
// Installationnpm install -g clinic

// Run with load testingclinic doctor -- node app.js

// Then in another terminal:autocannon localhost:3000

// After stopping, an HTML report with visualization will open

Clinic.js is especially useful for identifying Event Loop issues (high latency, frequent GC pauses).



4. Prometheus + Node.js — Custom Metrics

Prometheus is the standard for metric collection in a microservice architecture. For Node.js, use the prom-client library.

const prometheus = require('prom-client');

// Create a request counterconst httpRequestsTotal = new prometheus.Counter({ name: 'http_requests_total', help: 'Total number of HTTP requests', labelNames: ['method', 'route', 'status']});

// Response time histogramconst httpRequestDuration = new prometheus.Histogram({ name: 'http

Recommendations