Überwachung von Go-Anwendungen: Metriken und Alarme auf fortgeschrittenem Niveau

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

Überwachung von Go-Anwendungen: Metriken und Alarme auf fortgeschrittenem Niveau

\n

Moderne Go-Anwendungen erfordern nicht nur hohe Leistung, sondern auch eine zuverlässige Überwachung. Die grundlegende Erfassung von Metriken (CPU, Speicher, Anfragen) ist nur der erste Schritt. Auf fortgeschrittenem Niveau müssen benutzerdefinierte Metriken implementiert, Alarme auf Basis der Geschäftslogik konfiguriert und Ausfallsicherheit gewährleistet werden. In diesem Artikel betrachten wir, wie eine umfassende Überwachung von Go-Anwendungen mit Prometheus, Grafana und eigenen Alarmen realisiert werden kann.

\n\n

1. Fortgeschrittene Metriksammlung in Go mit Prometheus

\n

Die Bibliothek prometheus/client_golang ermöglicht nicht nur die Sammlung von Standardmetriken, sondern auch von benutzerdefinierten. Betrachten wir ein Beispiel für die Konfiguration eines benutzerdefinierten Metriksammlers für einen HTTP-Server.

\n\n
package main\n\nimport (\n    "net/http"\n    "github.com/prometheus/client_golang/prometheus"\n    "github.com/prometheus/client_golang/prometheus/promhttp"\n)\n\nvar (\n    requestDuration = prometheus.NewHistogramVec(\n        prometheus.HistogramOpts{\n            Name:    "http_request_duration_seconds",\n            Help:    "Dauer der HTTP-Anfragen.",\n            Buckets: prometheus.DefBuckets,\n        },\n        []string{"method", "path", "status"},\n    )\n    activeRequests = prometheus.NewGauge(\n        prometheus.GaugeOpts{\n            Name: "http_active_requests_total",\n            Help: "Aktuelle Anzahl aktiver Anfragen.",\n        },\n    )\n)\n\nfunc init() {\n    prometheus.MustRegister(requestDuration)\n    prometheus.MustRegister(activeRequests)\n}\n\nfunc metricsMiddleware(next http.Handler) http.Handler {\n    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n        activeRequests.Inc()\n        defer activeRequests.Dec()\n\n        timer := prometheus.NewTimer(prometheus.ObserverFunc(func(v float64) {\n            requestDuration.WithLabelValues(r.Method, r.URL.Path, "200").Observe(v)\n        }))\n        defer timer.ObserveDuration()\n\n        next.ServeHTTP(w, r)\n    })\n}\n\nfunc main() {\n    mux := http.NewServeMux()\n    mux.Handle("/metrics", promhttp.Handler())\n    mux.Handle("/api", metricsMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n        w.Write([]byte("Hello, Go!"))\n    })))\n    http.ListenAndServe(":8080", mux)\n}
\n\n

In diesem Beispiel erstellen wir ein Histogramm für die Anfragedauer und einen Gauge für aktive Anfragen. Die Verwendung von Labels ermöglicht eine Detaillierung der Metriken nach Methoden, Pfaden und Statuscodes.

\n\n

2. Konfiguration von Alarmen auf Basis der Geschäftslogik

\n

Alarme sollten nicht nur technischer Natur sein (hohe CPU-Auslastung), sondern auch geschäftsbezogen. Zum Beispiel eine Überschreitung der Antwortzeit für einen kritischen Endpunkt oder ein Rückgang der Anzahl erfolgreicher Transaktionen. Konfiguration der Alarme in Prometheus (Datei alerts.yml):

\n\n
groups:\n  - name: go_app_alerts\n    rules:\n      - alert: HighRequestLatency\n        expr: http_request_duration_seconds{job="go-app"} > 1.0\n        for: 5m\n        labels:\n          severity: critical\n        annotations:\n          summary: "Hohe Anfrageverzögerung ({{ $value }}s)"\n          description: "Endpunkt {{ $labels.path }} hat für 5 Minuten eine Verzögerung von mehr als 1 Sekunde."\n\n      - alert: ActiveRequestsSurge\n        expr: http_active_requests_total{job="go-app"} > 100\n        for: 2m\n        labels:\n          severity: warning\n        annotations:\n          summary: "Anstieg aktiver Anfragen ({{ $value }})"\n          description: "Die Anzahl aktiver Anfragen hat für 2 Minuten 100 überschritten."\n\n      - alert: ErrorRateHigh\n        expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1\n        for: 10m\n        labels:\n          severity: critical\n        annotations:\n          summary: "Hohe Fehlerrate 5xx"\n          description: "Die Fehlerrate überschreitet in den letzten 10 Minuten 10%."
\n\n

Beachten Sie die Verwendung

Blogs

Buchempfehlungen