Überwachung von Go-Anwendungen: Metriken und Alarme auf fortgeschrittenem Niveau

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

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)",                

Blogs

Buchempfehlungen