Prometheus is a monitoring system, and Go provides a client for sending metrics.
1import (2 "net/http"3 "github.com/prometheus/client_golang/prometheus"4 "github.com/prometheus/client_golang/prometheus/promhttp"5)67// Metric definitions8var (9 httpRequestsTotal = prometheus.NewCounterVec(10 prometheus.CounterOpts{11 Name: "http_requests_total",12 Help: "Total HTTP requests",13 },14 []string{"method", "path", "status"},15 )1617 httpRequestDuration = prometheus.NewHistogramVec(18 prometheus.HistogramOpts{19 Name: "http_request_duration_seconds",20 Help: "HTTP request duration",21 Buckets: []float64{0.01, 0.05, 0.1, 0.5, 1, 5},22 },23 []string{"method", "path"},24 )2526 dbQueryDuration = prometheus.NewHistogram(27 prometheus.HistogramOpts{28 Name: "db_query_duration_seconds",29 Help: "Database query duration",30 Buckets: prometheus.DefBuckets,31 },32 )33)3435func init() {36 prometheus.MustRegister(httpRequestsTotal)37 prometheus.MustRegister(httpRequestDuration)38 prometheus.MustRegister(dbQueryDuration)39}4041// Middleware42func MetricsMiddleware(next http.Handler) http.Handler {43 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {44 start := time.Now()4546 next.ServeHTTP(w, r)4748 duration := time.Since(start).Seconds()49 status := w.Header().Get("X-Status")5051 httpRequestsTotal.WithLabelValues(r.Method, r.URL.Path, status).Inc()52 httpRequestDuration.WithLabelValues(r.Method, r.URL.Path).Observe(duration)53 })54}5556// Endpoint for Prometheus57func main() {58 http.Handle("/metrics", promhttp.Handler())59 http.Handle("/api/", MetricsMiddleware(handler))60 log.Fatal(http.ListenAndServe(":8080", nil))61}
Metric types: