Überwachung von Go-Anwendungen: Metriken und Alarme auf fortgeschrittenem Niveau
\nModerne 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\n1. Fortgeschrittene Metriksammlung in Go mit Prometheus
\nDie 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.
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\nIn 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\n2. Konfiguration von Alarmen auf Basis der Geschäftslogik
\nAlarme 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):
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\nBeachten Sie die Verwendung