Überwachung von Go-Anwendungen: Metriken und Alarme

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

Einleitung: Warum Monitoring für Go-Anwendungen kritisch ist

Go (Golang) hat aufgrund seiner Leistungsfähigkeit und Einfachheit an Popularität in der Entwicklung von hochlastigen Microservices, API-Gateways und Netzwerk-Dienstprogrammen gewonnen. Doch selbst die stabilste Anwendung kann mit Speicherlecks, Goroutine-Hängern oder plötzlich steigenden Latenzen konfrontiert werden. Genau hier kommt Monitoring ins Spiel – eine Schlüsselpraxis des Site Reliability Engineering (SRE).

In diesem Artikel werden wir durchgehen, wie man das Monitoring von Go-Anwendungen mit dem Prometheus + Grafana Stack einrichtet, welche Metriken zuerst erfasst werden sollten und wie man Alarme zur Vermeidung von Vorfällen konfiguriert. Das Material wird sowohl für Anfänger unter den Go-Entwicklern als auch für erfahrene Ingenieure nützlich sein, die die Observability ihrer Dienste verbessern möchten.



1. Grundlegende Metriken einer Go-Anwendung

Bevor Sie das Monitoring einrichten, ist es wichtig zu verstehen, welche Metriken für einen Go-Dienst lebenswichtig sind. Sie können in drei Kategorien unterteilt werden:



1.1. Metriken der Go-Laufzeit

Die Go-Laufzeit bietet umfangreiche Informationen über den Zustand der Anwendung. Mit dem Paket runtime und dem Standard-Exporter expvar können Daten zu Folgendem abgerufen werden:

  • Anzahl der Goroutinen (runtime.NumGoroutine()) – ein starker Anstieg deutet auf ein Goroutine-Leck hin.
  • Speichernutzung (runtime.ReadMemStats()) – überwachen Sie Alloc, HeapInuse und GCStats.
  • Garbage-Collection-Zeit – wenn die GC mehr als 5% der Zeit beansprucht, ist dies ein Signal zur Optimierung.
  • Anzahl der Systemaufrufe – kann auf Blockierungen hinweisen.


1.2. Geschäftsmetriken

Um die Gesundheit des Dienstes zu verstehen, müssen Geschäftskennzahlen überwacht werden:

  • RPS (Requests Per Second) – Anzahl der Anfragen pro Sekunde.
  • Latenz (P50, P95, P99) – Verzögerungen bei der Anfrageverarbeitung.
  • Fehlerrate – Prozentsatz der Fehler (5xx, 4xx).
  • Anzahl aktiver Verbindungen (Datenbank, externe APIs).


1.3. Infrastrukturmetriken

Vergessen Sie nicht die Systemmetriken: CPU, Speicher, Datenträger-I/O, Netzwerkpakete. Sie helfen, ein Anwendungsproblem von einem Host-Problem zu unterscheiden.



2. Integration mit Prometheus: Metriken exportieren

Prometheus ist der De-facto-Standard für die Metrikenerfassung in der Go-Welt. Betrachten wir die schrittweise Integration.



2.1. Installation des Prometheus-Clients für Go

Fügen Sie die Abhängigkeit zu Ihrer go.mod hinzu:

go get github.com/prometheus/client_golang/prometheusgo get github.com/prometheus/client_golang/prometheus/promhttp


2.2. Erstellung benutzerdefinierter Metriken

Beispiel für die Erstellung eines Anfragezählers und eines Histogramms für die Antwortzeit:

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", "status"}, ) 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) prometheus.MustRegister(requestDuration)}

func metricsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { start := time.Now() wrapped := &responseWriter{ResponseWriter: w, statusCode: http.Stat

Blogs

Buchempfehlungen