Fortgeschrittene Überwachung von Go-Anwendungen: von Metriken bis zu Alarmen
In der modernen Entwicklung mit Go (Golang) reichen grundlegendes Logging und Health Checks nicht aus. Für Produktionssysteme ist eine tiefgehende Observability erforderlich: Erfassung benutzerdefinierter Metriken, deren Export nach Prometheus, Visualisierung in Grafana und automatische Alarme. In diesem Artikel behandeln wir die fortgeschrittene Überwachung von Go-Anwendungen – von der Metrikarchitektur bis zur Einrichtung von Alarmen basierend auf Geschäftslogik.
Überwachungsarchitektur: Prometheus + Go
Der Standard-Überwachungsstack für Go umfasst:
- Prometheus – System zur Erfassung und Speicherung von Metriken (Pull-Modell).
- Go-Client für Prometheus (
prometheus/client_golang) – Bibliothek zum Export von Metriken. - Grafana – Visualisierung von Dashboards.
- Alertmanager – Verwaltung von Alarmen (E-Mail, Slack, Telegram).
Die Go-Anwendung muss einen HTTP-Endpunkt (normalerweise /metrics) bereitstellen, von dem Prometheus die Daten abruft. Betrachten wir die grundlegende Einrichtung.
package main
import ( "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp")
func main() { // Registrierung der Standard-Go-Metriken (Runtime, GC, Goroutinen) prometheus.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{})) prometheus.MustRegister(prometheus.NewGoCollector())
http.Handle("/metrics", promhttp.Handler()) http.ListenAndServe(":8080", nil)}Wenn Sie die Anwendung starten, erhalten Sie Standardmetriken: go_goroutines, process_cpu_seconds_total, go_memstats_alloc_bytes und andere. Für die fortgeschrittene Überwachung reicht dies jedoch nicht aus – es werden benutzerdefinierte Metriken benötigt.
Erstellung benutzerdefinierter Metriken: Gauge, Counter, Histogram
Prometheus unterstützt vier Hauptmetriktypen. Betrachten wir sie am Beispiel einer Go-Anwendung, die HTTP-Anfragen verarbeitet.
Counter (Zähler) – Anzahl der Ereignisse
Wird zum Zählen von Anfragen, Fehlern, Aufgabenausführungen verwendet.
var requestCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Gesamtzahl der HTTP-Anfragen", }, []string{"method", "endpoint", "status"},)
func init() { prometheus.MustRegister(requestCounter)}
func handler(w http.ResponseWriter, r *http.Request) { // Anfrage verarbeiten requestCounter.WithLabelValues(r.Method, r.URL.Path, "200").Inc()}Gauge (Messer) – aktuelle Werte
Ideal zur Überwachung von Warteschlangen, Verbindungspools, Temperaturen.
var queueSize = prometheus.NewGauge( prometheus.GaugeOpts{ Name: "task_queue_size", Help: "Aktuelle Größe der Aufgabenwarteschlange", },)
func addToQueue() { queueSize.Inc()}
func processFromQueue() { queueSize.Dec()}Histogram (Histogramm) – Werteverteilung
Wird zur Messung der Antwortzeit oder Datengröße verwendet.
var requestDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "http_request_duration_seconds", Help: "Histogramm der Anfrageverarbeitungszeit", Buckets: prometheus.DefBuckets, // 0.005, 0.01, 0.025, 0.05, ... }, []string{"endpoint"},)
func measureRequest(endpoint string, duration float64) { requestDuration.WithLabelValues(endpoint).Observe(duration)}Summary (Zusammenfassung) – Quantile
Ähnlich wie Histogramm, berechnet jedoch genaue Quantile (p50, p95, p99).
var requestLatency = prometheus.NewSummaryVec( prometheus.SummaryOpts{ Name: "http_request_latency_seconds", Help: "Anfragelatenz (Quantile)",