Ü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): Tools und Bibliotheken



Überwachung ist ein wesentlicher Bestandteil des Produktionsbetriebs eines jeden Dienstes. Für Anwendungen in Go (Golang) bietet das Ökosystem sowohl integrierte Lösungen als auch leistungsstarke externe Tools. In diesem Artikel werden wir die wichtigsten Ansätze behandeln: vom grundlegenden Profiling bis zur Erfassung von Metriken und Tracing.



1. Integrierte Mittel: Das Paket expvar

Das Paket expvar bietet einen einfachen HTTP-Endpunkt zur Veröffentlichung von Anwendungszustandsvariablen. Es benötigt keine externen Abhängigkeiten und eignet sich ideal für die schnelle Diagnose.



Einbindung und Verwendung

package main

import ( "expvar" "net/http")

var requestsCount = expvar.NewInt("total_requests")

func handler(w http.ResponseWriter, r *http.Request) { requestsCount.Add(1) w.Write([]byte("OK"))}

func main() { http.HandleFunc("/api", handler) // Der Endpunkt /debug/vars ist automatisch verfügbar http.ListenAndServe(":8080", nil)}

Nach dem Start rufen Sie /debug/vars auf – Sie sehen eine JSON-Darstellung mit Metriken, einschließlich des Anfragezählers, GC-Daten und Speicher.



2. Prometheus – De-facto-Standard für Metriken

Prometheus ist das beliebteste Überwachungssystem für Go. Die Bibliothek prometheus/client_golang ermöglicht den Export von Metriken in einem Format, das der Prometheus-Server versteht.



Installation

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


Beispiel: Zähler und 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: "Histogram of request durations", Buckets: prometheus.DefBuckets, }, []string{"method"}, ))

func init() { prometheus.MustRegister(requestCount, requestDuration)}

func handler(w http.ResponseWriter, r *http.Request) { start := time.Now() requestCount.WithLabelValues(r.Method, r.URL.Path).Inc() w.Write([]byte("Hello")) requestDuration.WithLabelValues(r.Method).Observe(time.Since(start).Seconds())}

func main() { http.Handle("/metrics", promhttp.Handler()) http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}

Prometheus sammelt Metriken vom Endpunkt /metrics. Sie können auf Basis dieser Daten Alarme in Alertmanager hinzufügen.



3. Profiling mit pprof

Das Paket net/http/pprof fügt der Anwendung Endpunkte für das Profiling von CPU, Speicher, Goroutinen und Sperren hinzu. Dies ist ein unverzichtbares Werkzeug zur Identifizierung von Engpässen.



Schnellstart

package main

import ( "log" "net/http" _ "net/http/pprof" // registriert die Handler)

func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello, pprof!")) }) log.Fatal(http.ListenAndServe(":6060", nil))}

Jetzt sind folgende Endpunkte verfügbar:

  • /debug/pprof/ – Liste der Profile
  • /debug/pprof/profile – CPU-Profil
  • /debug/pprof/heap – Speicherprofil
  • /debug/pprof/goroutine – Goroutine-Stacks

Analysieren Sie die Profile mit dem Befehl go tool pprof oder vi

Empfehlungen