The solution below implements the following metrics for any sort of NodeJS Server:

  • Total Number of requests (plus per endpoint)
  • Percentage of error (5xx) responses (plus per endpoint)
  • Latency of successful responses (plus per endpoint)

The code below is just an example. I recommend to follow Programming Principles and Design Patterns

Setup Interceptor / Middleware

First find the way to intercept all requests. See examples below:

// NestJS
export class MetricsMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {...}
}
 
// ExpressJS
const express = require('express')
const app = express()
app.use((req, res, next) => {
  console.log('Time:', Date.now())
  next()
})

Initialize Opentelemetry and Create Metrics

import "@opentelemetry/api", "@opentelemetry/sdk-metrics", "@opentelemetry/exporter-prometheus";
 
_prometheusExporter = new PrometheusExporter({port: 9090});  
_meterProvider = new MeterProvider({readers: [this._prometheusExporter]});  
_meter = _meterProvider.getMeter("meter");  
metrics.setGlobalMeterProvider(_meterProvider);  
 
requestCount = _meter.createCounter("request_count", {  
  unit: "requests",  
  valueType: ValueType.INT,  
  description: "Number of requests",  
});  
  
responseTime = _meter.createHistogram("response_time", {  
  advice: { explicitBucketBoundaries: [5, 10, 20, 50, 100, 200,...]},
  unit: "milliseconds",  
  valueType: ValueType.INT,  
  description: "Latency of responses",  
});

Start to Update Metrics from Middleware

const path = normalize(path); // limit number of URL variations
const responseType = this.responseTypeByCode(responseCode);  
const service = "some-service";
const duration = 1; // calculate duration in Middleware
requestCount.add(1, { service, responseType, path});  
responseTime.record(durationMs, {service, { service, responseType, path});

Configure Prometheus and Grafana