Metrics in detail
This page describes the process characteristics and metrics that the N|Solid Runtime collects, and the few values that the N|Solid Console adds. Use it as a reference when you read nsolid.info() and nsolid.metrics() output, the nsolid-cli info and metrics commands, or data exported to OTLP and StatsD.
Process characteristics
The two primary data sets, info and metrics, contain values recorded live by the N|Solid Agent. They include data about the system hosting the process, the process as a whole, and each thread in the process.
| Property | Description |
|---|---|
app | The application name, from NSOLID_APP (or its alias NSOLID_APPNAME), the nsolid.app or name property in package.json, or nsolid.start(). Defaults to untitled application. |
appVersion | The application version, from the version property in package.json or appVersion in nsolid.start(). |
execPath | The absolute path of the N|Solid executable running the application. |
id | The unique N|Solid agent ID. Unique per N|Solid process. |
main | The absolute path to the root module in the process's module tree. |
iisNodeMain | (iisnode only, when iisNode is enabled) The absolute path to the real main script. |
nodeEnv | The value of NODE_ENV, otherwise the env property in the nsolid section of package.json. Defaults to prod. |
pid | The host system's process ID for the process. Unique per host. |
processStart | The time the process started, in milliseconds since the epoch. |
tags | The tags set with NSOLID_TAGS, the tags property in the nsolid section of package.json, or nsolid.start(). Up to 20 tags, each 2 to 140 bytes. |
vulns | The number of known vulnerabilities found in the modules of the process. This value is added by the N|Solid Console. |
Core library versions
The versions object in the info data lists the libraries built into Node.js core and added by N|Solid, with their versions. For example, from N|Solid 6.2.4 on Node.js 24:
versions: {
acorn: '8.16.0',
ada: '3.4.4',
amaro: '1.1.8',
ares: '1.34.6',
brotli: '1.2.0',
cldr: '48.0',
curl: '8.18.0',
grpc: '1.76.0',
icu: '78.2',
llhttp: '9.3.1',
merve: '1.2.2',
modules: '137',
napi: '10',
nbytes: '0.1.3',
ncrypto: '0.0.1',
nghttp2: '1.68.0',
nlohmann: '3.12.0',
node: '24.15.0',
nsolid: '6.2.4',
openssl: '3.5.5',
opentelemetry: '1.23.0',
protobuf: '6.33.2',
simdjson: '4.5.0',
simdutf: '6.4.0',
sodium: '1.0.21',
sqlite: '3.51.3',
tz: '2026a',
undici: '7.24.4',
unicode: '17.0',
uv: '1.51.0',
uvwasi: '0.0.23',
v8: '13.6.233.17-node.48',
zlib: '1.3.1-e00f703',
zmq: '4.3.5',
zstd: '1.5.7'
}
The exact set of keys depends on the Node.js and N|Solid versions and the build.
System information
The host system may be physical hardware, a virtual machine, or a container.
| Property | Description |
|---|---|
arch | The host system's CPU architecture. |
cpuCores | The host system's number of CPU cores (or hyperthreaded cores), as reported by the OS. |
cpuModel | The host system's CPU model. |
hostname | The host system's configured hostname, unless overridden with NSOLID_HOSTNAME or the hostname property in the nsolid section of package.json. |
kernelVersion | The Linux kernel version encoded as a number. 0 on other platforms. |
platform | The host system's operating system platform. |
totalMem | The host system's total memory, in bytes. This is the host's memory, not a container memory limit. Reported in the info data and, starting with N|Solid 6.3.0, also in the metrics. |
System data
| Property | Description |
|---|---|
freeMem | The host system's amount of free (unused) memory, in bytes. |
load1m | The average number of processes on the host that were running or waiting for CPU time over the past minute. |
load5m | ... over the past 5 minutes. |
load15m | ... over the past 15 minutes. |
systemUptime | The host system's uptime, in seconds. |
These numbers aren't correlated with the core that the process or its threads run on.
General process stats and information
| Property | Description |
|---|---|
timestamp | When the metrics were collected, in milliseconds since the epoch. |
blockInputOpCount | The number of file system input operations performed by the process. |
blockOutputOpCount | The number of file system output operations performed by the process. |
cpuSystemPercent | The percentage of CPU the process used in system calls, for example 4.1. |
cpuUserPercent | The percentage of CPU the process used in user code, for example 7.4. |
cpuPercent | The percentage of CPU used by the process, for example 11.5. Equal to user plus system. It's measured against a single core, so values above 100 are possible for multi-threaded workloads. |
cpu | Legacy alias of cpuPercent. |
ctxSwitchInvoluntaryCount | The number of involuntary context switches away from the process, for example because a higher-priority process needed time or the process used up its time slice. |
ctxSwitchVoluntaryCount | The number of voluntary context switches away from the process, where the process yielded before its time slice ended, usually to wait for an I/O resource. |
pageFaultHardCount | The number of hard page faults triggered by the process: the process tried to read from memory, but the page had been moved to disk. These can be costly for performance. |
pageFaultSoftCount | The number of soft page faults (page reclaims) triggered by the process: the page was still in memory but had to be remapped. Not a great cause for concern. |
title | The current system title of the process. |
uptime | The process uptime, in seconds. |
user | The system user currently running the process. Reflects changes made at runtime. |
rss | The resident set size (RSS): the total memory used by the process. All other active memory sections are subsets of RSS. If this value grows continually and never stabilizes, you likely have a memory leak. |
Legacy POSIX process statistics
These POSIX values are considered legacy but are kept for potential future use.
| Property | Description |
|---|---|
ipcReceivedCount | The number of IPC messages received by the process. Not used on modern platforms. |
ipcSentCount | The number of IPC messages sent by the process. Not used on modern platforms. |
signalCount | The number of signals received by the process. Not used on modern platforms. |
swapCount | The number of times the process was swapped out of memory. Not used on modern platforms. |
Per-thread metrics
To support Node.js worker threads, the metrics that relate to a specific thread are reported separately for the main thread and for each worker thread.
| Property | Description |
|---|---|
threadName | The name of the thread, if set with nsolid.setThreadName(). |
threadId | The thread's ID. The main thread is 0. |
JavaScript memory stats
rss isn't specific to a thread, so it's listed with the process stats. Each thread's heapTotal and externalMem are subsets of the process's rss.
| Property | Description |
|---|---|
totalAvailableSize | The remaining amount of memory the thread's heap can allocate before reaching the maximum heap size, in bytes. |
totalHeapSizeExecutable | The total amount of executable memory (containing code instructions) allocated in the thread's heap, in bytes. |
totalPhysicalSize | The amount of physical memory currently committed for the thread's heap, in bytes. |
heapSizeLimit | The maximum size of the thread's JavaScript heap, in bytes. If the allocator requests memory beyond this limit, V8 terminates the process with an allocation failure. |
heapTotal | The thread's total allocated JavaScript heap size, in bytes. Includes the used portion (heapUsed) and spare memory. When heapUsed gets close to heapTotal, V8 allocates more memory; as the garbage collector frees objects, it can shrink. |
heapUsed | The thread's used JavaScript heap size, in bytes: the memory storing all JavaScript objects and values. A key value to watch for memory leaks. |
externalMem | The thread's memory allocated by Node.js outside of V8's heap but referenced from the heap, in bytes. This is where Buffers and native addon memory live. It may exceed RSS if large Buffers are allocated but not yet backed by physical memory. |
numberOfNativeContexts | The number of attached contexts, typically created with the vm module to create additional V8 memory sandboxes. |
numberOfDetachedContexts | The number of detached contexts that still hold memory and aren't being garbage collected. |
mallocedMemory | The amount of memory currently allocated with malloc by V8, in bytes. |
peakMallocedMemory | The largest amount of memory allocated with malloc by V8 over the life of the thread, in bytes. |
Node.js event loop stats
To learn more about event loop utilization, read the event loop utilization blog post.
| Property | Description |
|---|---|
loopAvgTasks | Legacy metric kept for backward compatibility. Don't rely on it. |
loopEstimatedLag | The estimated time an I/O response may have to wait on the thread's event loop, in milliseconds. |
loopIdlePercent | The percentage of time the event loop is waiting (idle) for I/O or timers. |
loopTotalCount | The cumulative count of all event loop iterations. Legacy name for loopIterations. |
loopIterations | The total number of event loop iterations since the thread started. |
loopIterWithEvents | The total number of event loop iterations since the thread started that had events to handle. |
loopIdleTime | The total time the event loop has spent idle since the thread started, in nanoseconds. |
loopUtilization | The ratio of time the event loop spends processing events rather than being idle. When this number grows, you may start to see latency spikes. |
eventsProcessed | The total number of events processed by the event loop since the thread started. |
eventsWaiting | The cumulative number of events that were already waiting in the queue when the event provider was polled. A growing rate indicates event loop lag. |
providerDelay | The cumulative estimated time events spent waiting in the event queue before being received by the event loop, in nanoseconds. |
processingDelay | The cumulative estimated time events waited, after being received by the event loop, before being processed, in nanoseconds. |
res5s | A moving average of the event loop's "responsiveness" over the past 5 seconds: the ratio of estimated event delay to processing time. |
res1m | ... over the past minute. |
res5m | ... over the past 5 minutes. |
res15m | ... over the past 15 minutes. |
JavaScript garbage collection stats
| Property | Description |
|---|---|
gcCount | The total number of garbage collections of any type done by the thread. |
gcDurUs99Ptile | The 99th percentile duration of the thread's garbage collections, in microseconds. This is the cutoff for the slowest 1% of GC events. |
gcDurUsMedian | The median duration of the thread's garbage collections, in microseconds. |
gcForcedCount | The number of externally forced garbage collections on the thread, for example triggered by taking a heap snapshot. |
gcFullCount | The number of garbage collections on the thread that collected all available garbage. Usually only seen when heapTotal is approaching heapSizeLimit. |
gcMajorCount | The number of major garbage collections on the thread, such as a mark-sweep. |
HTTP and DNS stats
| Property | Description |
|---|---|
dnsCount | The total number of DNS lookups performed since the thread started. |
dnsMedian | The median duration of DNS lookups, in milliseconds. |
dns99Ptile | The 99th percentile duration of DNS lookups, in milliseconds. |
httpClientCount | The total number of outgoing HTTP(S) client requests performed. |
httpClientAbortCount | The total number of outgoing HTTP(S) client requests canceled due to inactivity or by calling abort(). |
httpClientMedian | The median duration of completed outgoing HTTP(S) client requests, in milliseconds. |
httpClient99Ptile | The 99th percentile duration of completed outgoing HTTP(S) client requests, in milliseconds. |
httpServerCount | The total number of incoming HTTP(S) requests served. |
httpServerAbortCount | The total number of incoming HTTP(S) requests that were aborted. |
httpServerMedian | The median duration of completed incoming HTTP(S) requests, in milliseconds. |
httpServer99Ptile | The 99th percentile duration of completed incoming HTTP(S) requests, in milliseconds. These are the slowest 1% of requests handled by your HTTP server. |
I/O primitives
As your application creates and uses I/O primitives, these metrics track the cumulative numbers over the life of the thread. They're good indicators of activity and can reveal memory leaks caused by I/O resources that aren't closed.
| Property | Description |
|---|---|
activeHandles | The number of active libuv handles: long-lived asynchronous resources such as open sockets, servers, timers, and child processes. |
activeRequests | The number of active libuv requests: short-lived operations such as file system calls, DNS lookups, and socket writes. |
pipeServerCreatedCount | The total number of server objects created using named pipes. |
pipeServerDestroyedCount | The total number of pipe server objects torn down. |
pipeSocketCreatedCount | The total number of pipe socket objects created. |
pipeSocketDestroyedCount | The total number of pipe socket objects torn down. |
tcpServerCreatedCount | The total number of TCP server objects created. |
tcpServerDestroyedCount | The total number of TCP server objects torn down. |
tcpSocketCreatedCount | The total number of TCP socket objects created. |
tcpSocketDestroyedCount | The total number of TCP socket objects torn down. |
udpSocketCreatedCount | The total number of UDP socket objects created. |
udpSocketDestroyedCount | The total number of UDP socket objects torn down. |
promiseCreatedCount | The total number of promises created. Requires promise tracking (see the note below). |
promiseResolvedCount | The total number of promises resolved. Requires promise tracking. |
fsHandlesOpenedCount | The total number of file system handles opened. |
fsHandlesClosedCount | The total number of file system handles closed. |
The N|Solid Runtime doesn't track promises by default. To enable it, set NSOLID_PROMISE_TRACKING=1 or set promiseTracking to true in your N|Solid configuration. You can also enable it from the N|Solid Console.