Einleitung: Warum Überwachung für TypeScript-Anwendungen kritisch ist
\nTypeScript ist ein leistungsstarkes Werkzeug zur Erstellung skalierbarer Webanwendungen, aber selbst der beste Code ist nicht vor Ausfällen in der Produktion gefeit. Ohne ein Überwachungssystem riskieren Sie, Probleme von Benutzern statt von automatischen Alarmen zu erfahren. In diesem Artikel behandeln wir den gesamten Zyklus der Überwachungseinrichtung: von der Metrikerfassung bis zum Versand von Benachrichtigungen.
\nWir betrachten die drei wichtigsten Säulen der Observability: Metriken (numerische Systemkennzahlen), Logs (detaillierte Ereignisaufzeichnungen) und Tracing (Verfolgung von Anfragen). Besonderes Augenmerk legen wir auf die Integration mit beliebten Tools – Prometheus, Grafana und Sentry.
\n\n1. Grundlegende Metriken für TypeScript-Anwendungen
\nBevor Sie Alarme einrichten, müssen Sie festlegen, welche Metriken für Ihre Anwendung kritisch sind. Unterteilen wir sie in drei Gruppen:
\n\n1.1 Geschäftsmetriken
\nSie spiegeln die Gesundheit der Anwendung aus Benutzersicht wider:
\n- \n
- Anzahl der Anfragen pro Sekunde (RPS) – zeigt die Serverlast an \n
- Antwortzeit (Latenz) – p50-, p95-, p99-Perzentile \n
- Anzahl der Fehler – 4xx- und 5xx-Statuscodes \n
- Aktive Benutzer – Sitzungen, WebSocket-Verbindungen \n
1.2 Technische Metriken
\nSie zeigen den Zustand der Infrastruktur:
\n- \n
- CPU und Arbeitsspeicher – Prozessorauslastung und Speicherlecks \n
- Event Loop Lag – Verzögerungen in der Ereignisschleife von Node.js \n
- Garbage Collection – Häufigkeit und Dauer der Speicherbereinigung \n
- HTTP-Verbindungspool – Anzahl offener Verbindungen \n
1.3 Beispiel: Metrikerfassung mit Prometheus in TypeScript
\nInstallieren Sie die Bibliothek prom-client für Node.js:
npm install prom-client @types/prom-client\n\nErstellen Sie eine Datei metrics.ts:
import client from 'prom-client';\nimport express, { Request, Response } from 'express';\n\n// Metrikregister erstellen\nconst register = new client.Registry();\nclient.collectDefaultMetrics({ register });\n\n// Benutzerdefinierte Metrik: Anzahl der HTTP-Anfragen\nconst httpRequestCounter = new client.Counter({\n name: 'http_requests_total',\n help: 'Total number of HTTP requests',\n labelNames: ['method', 'route', 'status_code'],\n registers: [register],\n});\n\n// Histogramm der 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_code'],\n buckets: [0.1, 0.5, 1, 2, 5],\n registers: [register],\n});\n\n// Middleware zur Metrikerfassung\nexport function metricsMiddleware(req: Request, res: Response, next: Function) {\n const end = httpRequestDuration.startTimer();\n res.on('finish', () => {\n const labels = {\n method: req.method,\n route: req.route?.path || 'unknown',\n status_code: res.statusCode.toString(),\n };\n httpRequestCounter.inc(labels);\n end(labels);\n });\n next();\n}\n\n// Endpoint für Prometheus\nexport function metricsEndpoint(req: Request, res: Response) {\n res.set('Content-Type', register.contentType);\n res.send(register.metrics());\n}\n\n2. Einrichtung von Alarmen: Von der Theorie zur Praxis
\nAlarme sollten intelligent sein – zu viele Fehlalarme ermüden das Team. Verwenden Sie die "Drei-Sigma"-Regel für Anomalien und Schwellenwerte für kritische Metriken.
\n\n2.1 Alarmregeln in Prometheus
\nErstellen Sie eine Datei alerts.yml:
groups:\n - name: typescript-app\n rules:\n - alert: HighErrorRate\n expr: |\n rate(http_requests_total{status_code=~"5.."}[5m]) \n / \n rate(http_requests_total[5m]) > 0.05\n for: 2m\n labels:\n severity: critical\n annotations:\n