Überwachung von Go-Anwendungen (Golang): vollständiger Überblick über Tools und Bibliotheken
Überwachung ist ein kritischer Bestandteil des Betriebs jeder Serveranwendung. Für das Go-Ökosystem (Golang) wurden zahlreiche Tools entwickelt, um Leistung, Zustand und Fehler in Echtzeit zu verfolgen. In diesem Artikel behandeln wir die wichtigsten Bibliotheken und Ansätze zur Überwachung von Go-Anwendungen, einschließlich Prometheus, expvar, pprof und OpenTelemetry.
Warum ist die Überwachung von Go-Anwendungen wichtig?
Go-Anwendungen werden häufig für hochbelastete Microservices, API-Gateways und Hintergrundverarbeiter eingesetzt. Ohne Überwachung riskieren Sie, Folgendes zu übersehen:
- Speicherlecks und Goroutine-Leaks;
- Langsame Anfragen und Blockaden;
- Leistungseinbrüche unter Last;
- Verbindungsfehler zu Datenbanken und externen Diensten.
1. Prometheus — Standard für die Metrikenerfassung
Prometheus ist der De-facto-Standard für die Metrikenerfassung in der Go-Welt. Die offizielle Client-Bibliothek prometheus/client_golang ermöglicht den einfachen Export von Metriken im Prometheus-Format.
Installation
go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttpBeispiel: Anfragenzähler und Zeit-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: "Duration of HTTP requests in seconds", Buckets: prometheus.DefBuckets, }, []string{"method", "endpoint"}, ))
func init() { prometheus.MustRegister(requestCount, requestDuration)}
func middleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() next.ServeHTTP(w, r) duration := time.Since(start).Seconds() requestCount.WithLabelValues(r.Method, r.URL.Path).Inc() requestDuration.WithLabelValues(r.Method, r.URL.Path).Observe(duration) })}
func main() { mux := http.NewServeMux() mux.Handle("/metrics", promhttp.Handler()) mux.Handle("/", middleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, World!")) }))) http.ListenAndServe(":8080", mux)}Nach dem Start sind die Metriken unter http://localhost:8080/metrics verfügbar. Prometheus wird so konfiguriert, dass es von diesem Endpunkt sammelt.
2. expvar — integrierter Metrikenexport
Die Go-Standardbibliothek bietet das Paket expvar zur Veröffentlichung von Anwendungszustandsvariablen. Es sind keine externen Abhängigkeiten erforderlich.
Anwendungsbeispiel
package main
import ( "expvar" "net/http")
var ( requests = expvar.NewInt("requests_total") errors = expvar.NewInt("errors_total"))
func handler(w http.ResponseWriter, r *http.Request) { requests.Add(1) // Fehlersimulation if r.URL.Query().Get("error") == "1" { errors.Add(1) w.WriteHeader(http.StatusInternalServerError) return } w.Write([]byte("OK"))}
func main() { http.HandleFunc("/debug/vars", expvar.Handler().ServeHTTP) http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}Die Metriken sind unter dem Pfad /debug/vars im JSON-Format verfügbar. Für die Integration mit Prometheus kann <
Auch in der Bibliothek
gRPC in Rust: Die Bibliotheken Tonic und Grpc-rs mit Beispielen