Einleitung: Warum Monitoring für Go-Anwendungen kritisch ist
Go (Golang) hat aufgrund seiner Leistungsfähigkeit und Einfachheit an Popularität in der Entwicklung von hochlastigen Microservices, API-Gateways und Netzwerk-Dienstprogrammen gewonnen. Doch selbst die stabilste Anwendung kann mit Speicherlecks, Goroutine-Hängern oder plötzlich steigenden Latenzen konfrontiert werden. Genau hier kommt Monitoring ins Spiel – eine Schlüsselpraxis des Site Reliability Engineering (SRE).
In diesem Artikel werden wir durchgehen, wie man das Monitoring von Go-Anwendungen mit dem Prometheus + Grafana Stack einrichtet, welche Metriken zuerst erfasst werden sollten und wie man Alarme zur Vermeidung von Vorfällen konfiguriert. Das Material wird sowohl für Anfänger unter den Go-Entwicklern als auch für erfahrene Ingenieure nützlich sein, die die Observability ihrer Dienste verbessern möchten.
1. Grundlegende Metriken einer Go-Anwendung
Bevor Sie das Monitoring einrichten, ist es wichtig zu verstehen, welche Metriken für einen Go-Dienst lebenswichtig sind. Sie können in drei Kategorien unterteilt werden:
1.1. Metriken der Go-Laufzeit
Die Go-Laufzeit bietet umfangreiche Informationen über den Zustand der Anwendung. Mit dem Paket runtime und dem Standard-Exporter expvar können Daten zu Folgendem abgerufen werden:
- Anzahl der Goroutinen (
runtime.NumGoroutine()) – ein starker Anstieg deutet auf ein Goroutine-Leck hin. - Speichernutzung (
runtime.ReadMemStats()) – überwachen SieAlloc,HeapInuseundGCStats. - Garbage-Collection-Zeit – wenn die GC mehr als 5% der Zeit beansprucht, ist dies ein Signal zur Optimierung.
- Anzahl der Systemaufrufe – kann auf Blockierungen hinweisen.
1.2. Geschäftsmetriken
Um die Gesundheit des Dienstes zu verstehen, müssen Geschäftskennzahlen überwacht werden:
- RPS (Requests Per Second) – Anzahl der Anfragen pro Sekunde.
- Latenz (P50, P95, P99) – Verzögerungen bei der Anfrageverarbeitung.
- Fehlerrate – Prozentsatz der Fehler (5xx, 4xx).
- Anzahl aktiver Verbindungen (Datenbank, externe APIs).
1.3. Infrastrukturmetriken
Vergessen Sie nicht die Systemmetriken: CPU, Speicher, Datenträger-I/O, Netzwerkpakete. Sie helfen, ein Anwendungsproblem von einem Host-Problem zu unterscheiden.
2. Integration mit Prometheus: Metriken exportieren
Prometheus ist der De-facto-Standard für die Metrikenerfassung in der Go-Welt. Betrachten wir die schrittweise Integration.
2.1. Installation des Prometheus-Clients für Go
Fügen Sie die Abhängigkeit zu Ihrer go.mod hinzu:
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttp2.2. Erstellung benutzerdefinierter Metriken
Beispiel für die Erstellung eines Anfragezählers und eines Histogramms für die Antwortzeit:
package main
import ( "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")
var ( requestCount = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests", }, []string{"method", "endpoint", "status"}, ) requestDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "Duration of HTTP requests in seconds", Buckets: prometheus.DefBuckets, }, []string{"method", "endpoint"}, ))
func init() { prometheus.MustRegister(requestCount) prometheus.MustRegister(requestDuration)}
func metricsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() wrapped := &responseWriter{ResponseWriter: w, statusCode: http.Stat