Prometheus Metriken in Go (Golang): Kompletter Leitfaden
Prometheus ist ein Open-Source-Monitoring-System, das sich zum De-facto-Standard für die Erfassung und Analyse von Metriken in modernen Microservice-Architekturen entwickelt hat. Im Go-Ökosystem (Golang) bietet die Bibliothek prometheus/client_golang ein leistungsstarkes und flexibles Toolkit zur Instrumentierung von Anwendungen. In diesem Artikel zeigen wir Ihnen Schritt für Schritt, wie Sie Prometheus-Metriken in Ihre Go-Anwendung einbinden, HTTP-Endpunkte konfigurieren und eigene Metriktypen erstellen.
Installation und Einrichtung
Zunächst müssen Sie den offiziellen Prometheus-Client für Go installieren:
go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp
Die erste Bibliothek stellt den Kern zum Erstellen und Registrieren von Metriken bereit, die zweite einen fertigen HTTP-Handler für den Endpunkt /metrics.
Basistypen von Prometheus-Metriken
Prometheus unterstützt vier grundlegende Metriktypen, die jeweils für bestimmte Aufgaben optimiert sind:
- Counter (Zähler) — ein monoton steigender Wert. Ideal zum Zählen von Anfragen, Fehlern oder abgeschlossenen Aufgaben.
- Gauge (Messer) — ein Wert, der sowohl steigen als auch fallen kann. Wird für aktuelle Temperaturen, Anzahl aktiver Verbindungen oder Warteschlangengrößen verwendet.
- Histogram (Histogramm) — sammelt Beobachtungen (z. B. Antwortzeiten) und gruppiert sie in konfigurierbare "Buckets". Ermöglicht die Berechnung von Quantilen.
- Summary (Zusammenfassung) — ähnlich wie ein Histogramm, berechnet Quantile jedoch auf Anwendungsebene. Empfohlen, wenn Quantile für die Geschäftslogik kritisch sind.
Praktisches Beispiel: HTTP-Server mit Metriken
Wir erstellen eine einfache Webanwendung, die die Anzahl der Anfragen, deren Dauer und die aktuell aktiven Verbindungen erfasst.
package main
import (
"fmt"
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
// Anfragenzähler mit Labels "method" und "endpoint"
requestCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Gesamtzahl der HTTP-Anfragen",
},
[]string{"method", "endpoint"},
)
// Histogramm für die Anfragedauer
requestDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Histogramm der Anfragedauer in Sekunden",
Buckets: prometheus.DefBuckets, // [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]
},
[]string{"method", "endpoint"},
)
// Messer für aktive Verbindungen
activeConnections = prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "http_active_connections",
Help: "Aktuelle Anzahl aktiver Verbindungen",
},
)
)
func init() {
// Metriken im Prometheus-Register registrieren
prometheus.MustRegister(requestCounter)
prometheus.MustRegister(requestDuration)
prometheus.MustRegister(activeConnections)
}
// Middleware umschließt jede HTTP-Anfrage zur Metrikerfassung
func metricsMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Zähler für aktive Verbindungen erhöhen
activeConnections.Inc()
defer activeConnections.Dec()
start := time.Now()
next.ServeHTTP(w, r)
duration := time.Since(start).Seconds()
// Metriken für die Anfrage erfassen
requestCounter.WithLabelValues(r.Method, r.URL.Path).Inc()
requestDuration.WithLabelValues(r.Method, r.URL. Auch in der Bibliothek
Arbeiten mit ZIP/Archiven in Java: java.util.zip und Zip4j
Datenvalidierung in Swift (iOS/macOS): Best Practices und Tools
Arbeiten mit Excel in Swift: Vollständiger Leitfaden zu Bibliotheken und Tools für iOS/macOS
GraphQL-Bibliothek für JavaScript (Node.js) — Vollständiger Leitfaden