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
- See How to Enable Prometheus Metrics for Pod in Kubernetes
- Use Prometheus and Grafana to display metrics and create alerts