tercul-backend/internal/observability/metrics.go
Damir Mukimov d50722dad5
Some checks failed
Test / Integration Tests (push) Successful in 4s
Build / Build Binary (push) Failing after 2m9s
Docker Build / Build Docker Image (push) Failing after 2m32s
Test / Unit Tests (push) Failing after 3m12s
Lint / Go Lint (push) Failing after 1m0s
Refactor ID handling to use UUIDs across the application
- Updated database models and repositories to replace uint IDs with UUIDs.
- Modified test fixtures to generate and use UUIDs for authors, translations, users, and works.
- Adjusted mock implementations to align with the new UUID structure.
- Ensured all relevant functions and methods are updated to handle UUIDs correctly.
- Added necessary imports for UUID handling in various files.
2025-12-27 00:33:34 +01:00

73 lines
2.2 KiB
Go

package observability
import (
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
// Metrics contains the Prometheus metrics for the application.
type Metrics struct {
RequestsTotal *prometheus.CounterVec
RequestDuration *prometheus.HistogramVec
DBQueriesTotal *prometheus.CounterVec
DBQueryDuration *prometheus.HistogramVec
}
// NewMetrics creates and registers the Prometheus metrics.
func NewMetrics(reg prometheus.Registerer) *Metrics {
return &Metrics{
RequestsTotal: promauto.With(reg).NewCounterVec(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Total number of HTTP requests.",
},
[]string{"method", "path", "status"},
),
RequestDuration: promauto.With(reg).NewHistogramVec(
prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "Duration of HTTP requests.",
Buckets: prometheus.DefBuckets,
},
[]string{"method", "path"},
),
DBQueriesTotal: promauto.With(reg).NewCounterVec(
prometheus.CounterOpts{
Name: "db_queries_total",
Help: "Total number of database queries.",
},
[]string{"operation", "status"},
),
DBQueryDuration: promauto.With(reg).NewHistogramVec(
prometheus.HistogramOpts{
Name: "db_query_duration_seconds",
Help: "Duration of database queries.",
Buckets: prometheus.DefBuckets,
},
[]string{"operation", "status"},
),
}
}
// PrometheusMiddleware returns an HTTP middleware that records Prometheus metrics.
func (m *Metrics) PrometheusMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
rw := &responseWriter{ResponseWriter: w}
next.ServeHTTP(rw, r)
duration := time.Since(start).Seconds()
m.RequestDuration.WithLabelValues(r.Method, r.URL.Path).Observe(duration)
m.RequestsTotal.WithLabelValues(r.Method, r.URL.Path, http.StatusText(rw.statusCode)).Inc()
})
}
// PrometheusHandler returns an HTTP handler for serving Prometheus metrics.
func PrometheusHandler(reg prometheus.Gatherer) http.Handler {
return promhttp.HandlerFor(reg, promhttp.HandlerOpts{})
}