Observability gồm 3 trụ cột: logs, metrics, traces.
Prometheus là tiêu chuẩn de facto cho metrics trong Go.
go
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
httpRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total HTTP requests by status and method",
},
[]string{"method", "status"},
)
httpDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "HTTP request latency",
Buckets: prometheus.DefBuckets,
},
[]string{"method", "path"},
)
)
func init() {
prometheus.MustRegister(httpRequests, httpDuration)
}
// Middleware ghi metrics
func metricsMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
rw := &responseWriter{ResponseWriter: w, statusCode: 200}
next.ServeHTTP(rw, r)
duration := time.Since(start).Seconds()
httpRequests.WithLabelValues(r.Method, fmt.Sprint(rw.statusCode)).Inc()
httpDuration.WithLabelValues(r.Method, r.URL.Path).Observe(duration)
})
}
// Expose /metrics endpoint
mux.Handle("/metrics", promhttp.Handler())4 loại metrics: Counter (chỉ tăng), Gauge (tăng/giảm), Histogram (distribution + percentiles), Summary (similar Histogram).
Scrape bởi Prometheus server → visualize với Grafana.