Überwachung von Go-Anwendungen (Golang): Tools und Bibliotheken
Überwachung ist ein wesentlicher Bestandteil des Produktionsbetriebs eines jeden Dienstes. Für Anwendungen in Go (Golang) bietet das Ökosystem sowohl integrierte Lösungen als auch leistungsstarke externe Tools. In diesem Artikel werden wir die wichtigsten Ansätze behandeln: vom grundlegenden Profiling bis zur Erfassung von Metriken und Tracing.
1. Integrierte Mittel: Das Paket expvar
Das Paket expvar bietet einen einfachen HTTP-Endpunkt zur Veröffentlichung von Anwendungszustandsvariablen. Es benötigt keine externen Abhängigkeiten und eignet sich ideal für die schnelle Diagnose.
Einbindung und Verwendung
package main
import ( "expvar" "net/http")
var requestsCount = expvar.NewInt("total_requests")
func handler(w http.ResponseWriter, r *http.Request) { requestsCount.Add(1) w.Write([]byte("OK"))}
func main() { http.HandleFunc("/api", handler) // Der Endpunkt /debug/vars ist automatisch verfügbar http.ListenAndServe(":8080", nil)}Nach dem Start rufen Sie /debug/vars auf – Sie sehen eine JSON-Darstellung mit Metriken, einschließlich des Anfragezählers, GC-Daten und Speicher.
2. Prometheus – De-facto-Standard für Metriken
Prometheus ist das beliebteste Überwachungssystem für Go. Die Bibliothek prometheus/client_golang ermöglicht den Export von Metriken in einem Format, das der Prometheus-Server versteht.
Installation
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttpBeispiel: Zähler und Histogramm
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"}, ) requestDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "Histogram of request durations", Buckets: prometheus.DefBuckets, }, []string{"method"}, ))
func init() { prometheus.MustRegister(requestCount, requestDuration)}
func handler(w http.ResponseWriter, r *http.Request) { start := time.Now() requestCount.WithLabelValues(r.Method, r.URL.Path).Inc() w.Write([]byte("Hello")) requestDuration.WithLabelValues(r.Method).Observe(time.Since(start).Seconds())}
func main() { http.Handle("/metrics", promhttp.Handler()) http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}Prometheus sammelt Metriken vom Endpunkt /metrics. Sie können auf Basis dieser Daten Alarme in Alertmanager hinzufügen.
3. Profiling mit pprof
Das Paket net/http/pprof fügt der Anwendung Endpunkte für das Profiling von CPU, Speicher, Goroutinen und Sperren hinzu. Dies ist ein unverzichtbares Werkzeug zur Identifizierung von Engpässen.
Schnellstart
package main
import ( "log" "net/http" _ "net/http/pprof" // registriert die Handler)
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, pprof!")) }) log.Fatal(http.ListenAndServe(":6060", nil))}Jetzt sind folgende Endpunkte verfügbar:
/debug/pprof/– Liste der Profile/debug/pprof/profile– CPU-Profil/debug/pprof/heap– Speicherprofil/debug/pprof/goroutine– Goroutine-Stacks
Analysieren Sie die Profile mit dem Befehl go tool pprof oder vi