Überwachung von JavaScript-Anwendungen: Metriken und Alarme von A bis Z
\n\nIn der modernen Entwicklungswelt reicht es nicht aus, einfach nur funktionierenden Code zu schreiben. Es ist entscheidend zu verstehen, wie sich Ihre Anwendung in der Produktionsumgebung verhält. Die Überwachung von JavaScript-Anwendungen (insbesondere auf Node.js) ist nicht nur ein Trend, sondern eine Notwendigkeit. Sie ermöglicht es, Engpässe zu identifizieren, Ausfälle zu verhindern und eine hohe Verfügbarkeit der Dienste sicherzustellen. In diesem Artikel werden wir den gesamten Zyklus durchgehen: von der Erfassung wichtiger Metriken bis zur Einrichtung von Alarmen unter Verwendung eines modernen Tool-Stacks.
\n\nWarum ist die Überwachung von Node.js wichtig?
\nNode.js-Anwendungen arbeiten oft asynchron und verarbeiten Tausende von Anfragen pro Sekunde. Ohne Überwachung riskieren Sie:
\n- \n
- Ein Speicherleck (memory leak) zu übersehen, das zum Absturz des Servers führt. \n
- Einen Anstieg der Antwortzeit (Latenz) nicht zu bemerken, was die Benutzererfahrung verschlechtert. \n
- Daten aufgrund nicht behandelter Fehler zu verlieren. \n
Ein Überwachungssystem gibt Ihnen Visibility (Beobachtbarkeit) und ermöglicht es Ihnen, Entscheidungen auf der Grundlage von Daten statt von Vermutungen zu treffen.
\n\nWichtige Metriken für JavaScript-Anwendungen
\nAlle Metriken lassen sich in drei Gruppen einteilen: Infrastrukturmetriken, Geschäftsmetriken und Anwendungsmetriken. Betrachten wir sie genauer.
\n\n1. Infrastrukturmetriken (USE-Methode)
\nDies sind die grundlegenden Indikatoren für die Servergesundheit: CPU, Arbeitsspeicher, Festplatte, Netzwerk. Für Node.js sind besonders der Speicher (Heap, Non-Heap) und die Anzahl der geöffneten Dateideskriptoren wichtig.
\n\n2. Anwendungsmetriken (RED-Methode)
\nDie RED-Methode (Rate, Errors, Duration) ist der Goldstandard für Microservices:
\n- \n
- Rate (Geschwindigkeit): Anzahl der Anfragen pro Sekunde (RPS). \n
- Errors (Fehler): Prozentsatz der Anfragen, die mit einem Fehler enden (4xx, 5xx). \n
- Duration (Dauer): Ausführungszeit der Anfrage (p50, p95, p99 Perzentile). \n
3. Geschäftsmetriken
\nSpezifisch für Ihr Produkt: Anzahl der registrierten Benutzer, abgeschlossenen Bestellungen, aktiven Sitzungen usw.
\n\nErfassung von Metriken mit Prometheus und Node.js
\nPrometheus ist der De-facto-Standard für die Metrikenerfassung. Für Node.js verwenden wir die Bibliothek prom-client. Betrachten wir ein Konfigurationsbeispiel.
Installation und grundlegende Konfiguration
\nnpm install prom-client express\n\nErstellen wir einen Server mit dem Endpunkt /metrics:
const express = require('express');\nconst client = require('prom-client');\n\nconst app = express();\nconst port = 3000;\n\n// Erstellen eines Metrik-Registers\nconst register = new client.Registry();\n\n// Hinzufügen von Standard-Node.js-Metriken\nclient.collectDefaultMetrics({ register });\n\n// Erstellen eines benutzerdefinierten Histogramms für die Antwortzeit\nconst httpRequestDuration = new client.Histogram({\n name: 'http_request_duration_seconds',\n help: 'Duration of HTTP requests in seconds',\n labelNames: ['method', 'route', 'status'],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5]\n});\nregister.registerMetric(httpRequestDuration);\n\n// Middleware zum Messen der Zeit\napp.use((req, res, next) => {\n const end = httpRequestDuration.startTimer();\n res.on('finish', () => {\n end({ method: req.method, route: req.route?.path || 'unknown', status: res.statusCode });\n });\n next();\n});\n\n// Endpunkt für Metriken\napp.get('/metrics', async (req, res) => {\n res.set('Content-Type', register.contentType);\n res.end(await register.metrics());\n});\n\napp.get('/', (req, res) => {\n res.send('Hello, monitoring!');\n});\n\napp.listen(port, () => {\n console.log(`App listening at http://localhost:${port}`);\n});\n\nBenutzerdefinierte Zähler
\nFügen wir einen Fehlerzähler hinzu:
\nconst errorCounter = new client.Counter({\n name: 'app_errors_total',