Ü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
Arbeiten mit Bildern in TypeScript: resize und crop mit Sharp und Jimp
Arbeit mit XML in Rust: Bibliotheken quick-xml, roxmltree und serde_xml_rs
Zod für TypeScript: vollständige Anleitung mit Beispielen
Überwachung von Rust-Anwendungen mit der tracing-Bibliothek