Überwachung von Go-Anwendungen (Golang): Von Metriken bis zum Profiling
Go (Golang) ist eine Sprache, die für hochbelastbare Serveranwendungen entwickelt wurde. Doch selbst der leistungsfähigste Code kann Fehler, Speicherlecks oder unnötig hohe Latenzzeiten aufweisen. Ohne Überwachung riskieren Sie, erst von verärgerten Nutzern von einem Problem zu erfahren. In diesem Artikel behandeln wir die wichtigsten Bibliotheken und Tools zur Überwachung von Go-Anwendungen: von der Metrikenerfassung bis hin zu Tracing und Profiling.
Warum eine Go-Anwendung überwachen?
- Leistung: Überwachung von Antwortzeiten, Anzahl der Goroutinen, CPU- und Speichernutzung.
- Zuverlässigkeit: Kontrolle von Fehlern, Paniken und Neustartanzahl.
- Skalierung: Verstehen, wann weitere Replikate hinzugefügt werden müssen.
- Geschäftsmetriken: Anzahl der Anfragen, aktive Nutzer, verarbeitete Datenmengen.
1. Das integrierte Paket expvar
Der einfachste Weg ist expvar. Es stellt einen HTTP-Endpunkt mit grundlegenden Metriken bereit: Anzahl der Goroutinen, Speichernutzung, Betriebszeit. Geeignet für einen schnellen Start.
package main
import ( "expvar" "net/http")
var requestCount = expvar.NewInt("requests_total")
func handler(w http.ResponseWriter, r *http.Request) { requestCount.Add(1) w.Write([]byte("Hello, Go!"))}
func main() { http.HandleFunc("/", handler) // Metriken verfügbar unter /debug/vars http.ListenAndServe(":8080", nil)}Starten Sie die Anwendung und öffnen Sie http://localhost:8080/debug/vars – Sie sehen ein JSON mit den Metriken.
2. Prometheus + prometheus/client_golang
Prometheus ist der De-facto-Standard für die Metrikenerfassung in Go. Die Bibliothek prometheus/client_golang ermöglicht die Registrierung benutzerdefinierter Metriken: Zähler, Histogramme, Zusammenfassungen.
package main
import ( "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")
var ( httpRequests = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests.", }, []string{"method", "path"}, ))
func init() { prometheus.MustRegister(httpRequests)}
func handler(w http.ResponseWriter, r *http.Request) { httpRequests.WithLabelValues(r.Method, r.URL.Path).Inc() w.Write([]byte("OK"))}
func main() { http.HandleFunc("/", handler) http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":8080", nil)}Der Endpunkt /metrics liefert Daten in einem Format, das Prometheus versteht. Anschließend können Dashboards in Grafana konfiguriert werden.
3. Profiling mit pprof
Das Paket net/http/pprof fügt Endpunkte für das Profiling hinzu: CPU, Speicher, Sperren, Goroutinen. Dies ist ein unverzichtbares Werkzeug zur Identifizierung von Engpässen.
package main
import ( "net/http" _ "net/http/pprof" // Profiler einbinden)
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Profiling aktiv")) }) http.ListenAndServe(":6060", nil)}Jetzt können Sie ausführen:
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30Dies sammelt ein 30-Sekunden-CPU-Profil. Analysieren Sie es im interaktiven Modus oder exportieren Sie es als SVG/PDF.
4. OpenTelemetry – Tracing und Metriken
OpenTelemetry (OTel) ist der moderne Standard für Observability. Es vereint Metriken, Logs und Traces. Für Go gibt es das offizielle SDK go.opentelemetry.io/otel.
package main
import ( "context" "log" "net/http" "go.opentelemetry.io Auch in der Bibliothek
Geolokalisierung und Karten in Go (Golang): Bibliotheken und Codebeispiele
JSON-Verarbeitung in PHP: Funktionen, Beispiele und Best Practices
Arbeiten mit Excel in C++: Bibliotheken und Werkzeuge zum Lesen und Schreiben
Arbeit mit CSV in C++: Bibliotheken, Parsing und Datenschreiben