Überwachung von Go-Anwendungen: Bibliotheken und Tools

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Ü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/promhttp


Beispiel: 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 <

Empfehlungen