Skip to main content

Monitor Node.js applications

Quickstart guide for monitoring Node.js applications using OpenAPM

To quickly get started with the OpenAPM in your Node.js application, follow the steps below:


npm install --save @last9/openapm@latest


yarn add @last9/openapm@latest


OpenAPM needs to be initialized in the application as early as possible so that it starts a metrics server and can monitor your application from the get-go.

To initialize OpenAPM, import the OpenAPM class from the package and create its instance. This will create a metrics server running by default on http://localhost:9097. The metrics will be available on http://localhost:9097/metrics.

import { OpenAPM } from "@last9/openapm";
const openapm = new OpenAPM();

Now, OpenAPM is ready to instrument the application packages using the .instrument() method.


Currently, OpenAPM supports the following frameworks and databases.

  1. Express
  2. MySQL
  3. NestJS

We will keep adding support for more packages. Feel free to request a feature here.


Call the instrument method before initializing the Express application as below.


// Create application after the openapm initialization
const app = express();

// ...


This will instrument all HTTP requests from the Express application and emit the Rate, Errors, Duration (RED) metrics. These metrics will be available on http://localhost:9097/metrics.


OpenAPM supports instrumenting the mysql2 package. This means all the ORMs that use the mysql2 package internally will get instrumented.


The database query metrics will be exposed on the /metrics route on the metrics server.


OpenAPM supports instrumenting @nestjs/core v4 and above.

import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
import { OpenAPM } from "@last9/openapm";

async function bootstrap() {
const openapm = new OpenAPM();

const app = await NestFactory.create(AppModule);
await app.listen(3000);

The Rate, Errors, Duration (RED) metrics for all the HTTP requests in the application will be emitted by default.


You can customize the default behavior of OpenAPM by providing specific options described below.

const openapm = new OpenAPM({
// Options go here
  1. path: The path at which the metrics will be served. Defaults to /metrics.

  2. metricsServerPort: (Optional) The port at which the metricsServer will run. Defaults to 9097.

  3. environment: (Optional) The application environment. Defaults to production.

  4. defaultLabels: (Optional) Any default labels to be included.

  5. requestsCounterConfig: (Optional) Requests counter configuration, same as Counter in prom-client. Defaults to

    name: 'http_requests_total',
    help: 'Total number of requests',
    labelNames: ['path', 'method', 'status'],
  6. requestDurationHistogramConfig: (Optional) Requests Duration histogram configuration, the same as Histogram in prom-client. Defaults to

    name: 'http_requests_duration_milliseconds',
    help: 'Duration of HTTP requests in milliseconds',
    labelNames: ['path', 'method', 'status'],
    buckets: promClient.exponentialBuckets(0.25, 1.5, 31),
  7. extractLabels: (Optional) Extract labels from URL path params.

    // To extract from the URL params
    extractLabels: {
    tenant: { // Here, 'tenant' is the label name
    from : 'params',
    key: 'org' // Which key to extract from the params
    mask: ':org' // Replacement string
  8. excludeDefaultLabels: (Optional) Provide labels to exclude from the default labels emitted by OpenAPM.

excludeDefaultLabels: ['environment', 'version']
  1. levitateConfig: (Optional) Configuration for Levitate. Adding this configuration will enable the Change Events such as application lifecycle events.
levitateConfig: {
host: '',
orgSlug: 'acme', /** The slug can be obtained from the Last9 dashboard.*/
dataSourceName: 'data-source', /** The data source can be obtained from the data source pages in the Last9 dashboard*/
refreshTokens: {
write: '0d2a1a9aXXX' /** You can get this from the API access page on Last9 dashboard*/

Storing Metrics

Metrics emitted by the OpenAPM library can be scraped by the Prometheus agent and sent to remote write storage like Levitate. Follow the guide here to know more.


OpenAPM collection ships with ready-to-import Grafana dashboards for applications to understand key performance indicators such as Apdex score, slow endpoints and slow database queries, among many others.

Steps to import default dashboards

  1. Import this dashboard into Grafana.
  2. Set up the data source to the one where metrics from OpenAPM are getting sent.
  3. Save the dashboard.

APM Dashboard - RED Metrics APM Dashboard - DB Metrics APM Dashboard - Infra Metrics