package metrics import ( "io" "net/http" "net/http/httptest" "github.com/gofiber/fiber/v2" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) var ( HTTPRequestsTotal = prometheus.NewCounterVec( prometheus.CounterOpts{Name: "http_requests_total", Help: "Total HTTP requests"}, []string{"method", "path", "status"}, ) HTTPRequestDuration = prometheus.NewHistogramVec( prometheus.HistogramOpts{Name: "http_request_duration_seconds", Help: "HTTP request duration"}, []string{"method", "path"}, ) DBConnectionsActive = prometheus.NewGauge( prometheus.GaugeOpts{Name: "db_connections_active", Help: "Active DB connections"}, ) RedisConnectionsActive = prometheus.NewGauge( prometheus.GaugeOpts{Name: "redis_connections_active", Help: "Active Redis connections"}, ) ) func init() { prometheus.MustRegister(HTTPRequestsTotal, HTTPRequestDuration, DBConnectionsActive, RedisConnectionsActive) } // Handler returns a Fiber handler that serves the Prometheus metrics endpoint. // It wraps promhttp.Handler() without requiring the gofiber/adaptor package. func Handler(c *fiber.Ctx) error { handler := promhttp.Handler() req, err := http.NewRequest(http.MethodGet, "/metrics", nil) if err != nil { return c.SendStatus(fiber.StatusInternalServerError) } rec := httptest.NewRecorder() handler.ServeHTTP(rec, req) result := rec.Result() defer result.Body.Close() c.Set("Content-Type", result.Header.Get("Content-Type")) c.Status(result.StatusCode) body, err := io.ReadAll(result.Body) if err != nil { return c.SendStatus(fiber.StatusInternalServerError) } return c.Send(body) }