OpenTelemetry Node.js Runtime Metrics Instrumentation

This module provides automatic metric instrumentation that exposes measurements from the Performance measurement APIs (i.e. perf_hooks).
It can also emit OpenTelemetry logs for uncaught exceptions.
When a configured logger provider exposes forceFlush() (for example, the SDK
LoggerProvider), this instrumentation calls it immediately after emitting the
uncaught-exception log record as a best-effort attempt to reduce log loss on
process termination.
Supported Versions
Example
npm install --save @opentelemetry/sdk-node @opentelemetry/exporter-prometheus
npm install --save @opentelemetry/instrumentation-runtime-node
import { NodeSDK } from '@opentelemetry/sdk-node';
import { PrometheusExporter } from '@opentelemetry/exporter-prometheus';
import { RuntimeNodeInstrumentation } from '@opentelemetry/instrumentation-runtime-node';
const sdk = new NodeSDK({
metricReaders: [
new PrometheusExporter({ port: 9464, startServer: true }),
],
instrumentations: [
new RuntimeNodeInstrumentation({ monitoringPrecision: 5000 })
],
});
sdk.start()
Go to localhost:9464/metrics, and you should see:
# HELP nodejs_performance_event_loop_utilization Event loop utilization
# UNIT nodejs_performance_event_loop_utilization 1
# TYPE nodejs_performance_event_loop_utilization gauge
nodejs_performance_event_loop_utilization 0.010140079547955264
On the very first metrics collection the event loop utilization and time metrics may report zero or near-zero values while the instrumentation establishes a baseline.
Options
RuntimeNodeInstrumentation's constructor accepts the following options:
monitoringPrecision | int | millisecond | 10 | The resolution in milliseconds for the event loop delay histogram (perf_hooks.monitorEventLoopDelay). A smaller value gives finer-grained delay samples at the cost of more overhead. Has no effect on event loop utilization or time metrics. |
captureUncaughtException | bool | - | false | Whether to emit a LogRecord for uncaught exceptions (severity FATAL). Uses the uncaughtExceptionMonitor process event. |
applyCustomExceptionAttributes | function | - | undefined | Optional callback to attach custom attributes to emitted exception log records. |
Semantic Conventions
This instrumentation emits metrics defined in the experimental @opentelemetry/semantic-conventions (^1.29.0) for the nodejs and v8js runtime namespaces.
Metrics collected
nodejs.eventloop.time | Cumulative duration the event loop has been in each state |
nodejs.eventloop.utilization | Event loop utilization ratio (0.0–1.0) |
nodejs.eventloop.delay.min | Minimum event loop delay |
nodejs.eventloop.delay.max | Maximum event loop delay |
nodejs.eventloop.delay.mean | Mean event loop delay |
nodejs.eventloop.delay.stddev | Standard deviation of event loop delay |
nodejs.eventloop.delay.p50 | 50th-percentile event loop delay |
nodejs.eventloop.delay.p90 | 90th-percentile event loop delay |
nodejs.eventloop.delay.p99 | 99th-percentile event loop delay |
v8js.gc.duration | Garbage Collection pause duration by type |
v8js.memory.heap.space.size | Total pre-allocated size of a heap space |
v8js.memory.heap.used | Used heap memory in a heap space |
v8js.memory.heap.space.available_size | Available size in a heap space |
v8js.memory.heap.space.physical_size | Committed (physical) size of a heap space |
v8js.resource.active | Count of active resources keeping the event loop alive |
Attributes collected
nodejs.eventloop.state | State of the event loop (active, idle) |
v8js.gc.type | Type of Garbage Collection (major, minor, incremental, weakcb) |
v8js.heap.space.name | Name of the V8 heap space |
v8js.resource.type | Type of active resource |
Useful links
License
Apache 2.0 - See LICENSE for more information.