Einleitung: Warum Monitoring für Node.js-Anwendungen kritisch ist
Moderne JavaScript-Webanwendungen (Node.js) arbeiten unter hoher Last und in verteilten Architekturen. Selbst perfekt geschriebener Code kann aufgrund von Speicherlecks, Leistungseinbußen oder Fehlern in asynchronen Operationen ausfallen. Das Monitoring von JavaScript-Anwendungen ermöglicht es, Probleme nicht nur zu erkennen, sondern auch zu verhindern, bevor sie die Benutzer betreffen.
In diesem Artikel werden wir untersuchen, welche Metriken überwacht werden müssen, wie die Datenerfassung mit beliebten Tools (Prometheus, Grafana) eingerichtet wird und wie ein Alerting-System für Node.js organisiert werden kann. Alle Codebeispiele sind in JavaScript geschrieben und einsatzbereit.
Wichtige Metriken für Node.js-Anwendungen
Das Monitoring von Node.js-Anwendungen kann in drei Ebenen unterteilt werden: Infrastrukturmetriken, Anwendungsmetriken und Geschäftsmetriken. Betrachten wir jede davon.
Infrastrukturmetriken
Diese Metriken zeigen den Zustand des Servers und der Laufzeitumgebung:
- CPU und Memory (RSS, Heap Total, Heap Used) — Speicherlecks und hohe CPU-Auslastung.
- Event Loop Lag — Verzögerung der Ereignisschleife (wenn >50ms, beginnt die Anwendung zu verlangsamen).
- Garbage Collection (GC) — Häufigkeit und Dauer der Speicherbereinigung.
- File Descriptors — Anzahl der geöffneten Dateien und Sockets.
Anwendungsmetriken
Zeigen, wie die Anwendung Anfragen verarbeitet:
- RPS (Requests Per Second) — Anzahl der Anfragen pro Sekunde.
- Latency (p50, p95, p99) — Antwortverzögerung.
- Error Rate — Fehlerprozentsatz (4xx, 5xx).
- Active Connections — Anzahl der aktiven WebSocket/HTTP-Verbindungen.
Geschäftsmetriken
Spezifisch für Ihre Anwendung:
- Anzahl der registrierten Benutzer.
- Geschwindigkeit der Zahlungsabwicklung.
- Antwortzeit externer APIs.
Metrikenerfassung mit Prometheus und Node.js
Prometheus ist der De-facto-Standard für die Metrikenerfassung in der modernen Infrastruktur. Für Node.js gibt es die Bibliothek prom-client, die den Export von Metriken erleichtert.
Installation und Konfiguration von prom-client
npm install prom-client expressErstellen wir einen Basisserver mit Metriken:
const express = require('express');const client = require('prom-client');const app = express();
// Erstellen eines Metrikregistersconst register = new client.Registry();client.collectDefaultMetrics({ register });
// Erstellen eines benutzerdefinierten Histogramms für Verzögerungenconst httpRequestDuration = new client.Histogram({ name: 'http_request_duration_seconds', help: 'Duration of HTTP requests in seconds', labelNames: ['method', 'route', 'status_code'], buckets: [0.1, 0.5, 1, 2, 5]});register.registerMetric(httpRequestDuration);
// Middleware zur Messung von Verzögerungenapp.use((req, res, next) => { const end = httpRequestDuration.startTimer(); res.on('finish', () => { end({ method: req.method, route: req.route?.path || 'unknown', status_code: res.statusCode }); }); next();});
// Endpunkt für Metrikenapp.get('/metrics', async (req, res) => { res.set('Content-Type', register.contentType); res.end(await register.metrics());});
app.get('/', (req, res) => { res.send('Hello World');});
app.listen(3000, () => console.log('Server running on port 3000'));Erfassung von Event-Loop-Metriken
Zur Überwachung der Ereignisschleife verwenden wir process.hrtime() oder die Bibliothek event-loop-lag:
const eventLoopLag = new client.Gauge({ name: 'nodejs_event_loop_lag_seconds', help: 'Event loop lag in seconds'});register.re