Prometheus-Metriken in TypeScript: Vollständiger Leitfaden zum Monitoring

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Prometheus-Metriken in TypeScript: Vollständiger Leitfaden

\n\n

Prometheus ist ein Open-Source-System für Monitoring und Alarmierung, das Metriken in Echtzeit aus Ihren Anwendungen sammelt. In diesem Artikel betrachten wir, wie Sie Prometheus-Metriken in TypeScript-Anwendungen mithilfe der Bibliothek prom-client integrieren. Sie erfahren, wie Sie Metriken erstellen, registrieren und exportieren sowie einen Endpunkt zur Datenerfassung einrichten.

\n\n

Was sind Prometheus-Metriken?

\n\n

Prometheus arbeitet nach dem Pull-Modell: Es fragt regelmäßig (scrape) die Endpunkte Ihrer Anwendung ab, um Metriken zu erhalten. Die Metriken werden in mehrere Haupttypen unterteilt:

\n\n
    \n
  • Counter (Zähler) — erhöht sich nur (z. B. Anzahl der Anfragen).
  • \n
  • Gauge (Messwert) — kann steigen und fallen (z. B. aktuelle Anzahl aktiver Benutzer).
  • \n
  • Histogram (Histogramm) — misst die Verteilung von Werten (z. B. Antwortzeit).
  • \n
  • Summary (Zusammenfassung) — ähnlich einem Histogramm, berechnet jedoch Quantile auf Client-Seite.
  • \n
\n\n

Installation von prom-client in TypeScript

\n\n

Für die Arbeit mit Prometheus in TypeScript verwenden wir die offizielle Bibliothek prom-client. Installieren Sie sie über npm:

\n\n
npm install prom-client
\n\n

Installieren Sie auch die Typen für TypeScript:

\n\n
npm install @types/prom-client --save-dev
\n\n

Erstellen und Registrieren von Metriken

\n\n

Betrachten wir ein grundlegendes Beispiel zum Erstellen von Metriken. Erstellen Sie eine Datei metrics.ts:

\n\n
import client from 'prom-client';\n\n// Erstellen eines Registers für Metriken (standardmäßig wird das globale verwendet)\nconst register = new client.Registry();\n\n// Hinzufügen von Standardmetriken (z. B. Speicher, CPU)\nclient.collectDefaultMetrics({ register });\n\n// Erstellen eines Counters zum Zählen von Anfragen\nconst httpRequestsTotal = new client.Counter({\n  name: 'http_requests_total',\n  help: 'Total number of HTTP requests',\n  labelNames: ['method', 'status', 'path'],\n  registers: [register],\n});\n\n// Erstellen eines Gauges für aktive Verbindungen\nconst activeConnections = new client.Gauge({\n  name: 'active_connections',\n  help: 'Number of active connections',\n  registers: [register],\n});\n\n// Erstellen eines 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', 'path'],\n  buckets: [0.01, 0.05, 0.1, 0.5, 1, 5],\n  registers: [register],\n});\n\nexport { register, httpRequestsTotal, activeConnections, httpRequestDuration };
\n\n

Verwendung von Metriken in einer Express-Anwendung

\n\n

Erstellen wir nun eine einfache Express-Anwendung in TypeScript, die unsere Metriken verwendet:

\n\n
import express from 'express';\nimport { register, httpRequestsTotal, activeConnections, httpRequestDuration } from './metrics';\n\nconst app = express();\nconst port = 3000;\n\n// Middleware zum Zählen der Anfragezeit\napp.use((req, res, next) => {\n  const end = httpRequestDuration.startTimer({ method: req.method, path: req.path });\n  activeConnections.inc();\n\n  res.on('finish', () => {\n    httpRequestsTotal.inc({ method: req.method, status: res.statusCode.toString(), path: req.path });\n    activeConnections.dec();\n    end();\n  });\n\n  next();\n});\n\n// Endpunkt für Prometheus\napp.get('/metrics', async (req, res) => {\n  res.set('Content-Type', register.contentType);\n  res.end(await register.metrics());\n});\n\n// Beispiel-Endpunkt\napp.get('/', (req, res) => {\n  res.send('Hello, Prometheus!');\n});\n\napp.listen(port, () => {\n  console.log(`Server running at http://localhost:${port}`);\n});
\n\n

Starten und Überprüfen

\n\n

Starten Sie die Anwendung:

\n\n
npx ts-node app.ts
\n\n

Öffnen Sie in

Empfehlungen