Files
satusehat-service/internal/infrastructure/monitoring/middleware.go
T
2026-04-14 01:23:34 +00:00

99 lines
2.4 KiB
Go

// File: /home/meninjar/goprint/service/internal/infrastructure/monitoring/middleware.go
package monitoring
import (
"strconv"
"time"
"service/pkg/logger"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
)
// MetricsMiddleware creates Gin middleware for collecting HTTP metrics
func MetricsMiddleware(metrics *Metrics) gin.HandlerFunc {
return func(c *gin.Context) {
// Generate request ID if not present
requestID := c.GetHeader("X-Request-ID")
if requestID == "" {
requestID = uuid.New().String()
c.Header("X-Request-ID", requestID)
}
// Add request ID to context for logging
log := logger.Default().WithFields(
logger.String("request_id", requestID),
logger.String("method", c.Request.Method),
logger.String("path", c.Request.URL.Path),
logger.String("client_ip", c.ClientIP()),
)
// Start timer
start := time.Now()
// Increment requests in flight
metrics.HttpRequestsInFlight.Inc()
defer metrics.HttpRequestsInFlight.Dec()
// Log request start
log.Info("HTTP request started")
// Process request
c.Next()
// Calculate duration
duration := time.Since(start)
// Get response size
responseSize := c.Writer.Size()
if responseSize < 0 {
responseSize = 0
}
// Get status code
status := strconv.Itoa(c.Writer.Status())
// Record metrics
metrics.RecordHTTPRequest(
c.Request.Method,
c.FullPath(),
status,
duration,
int64(responseSize),
)
// Log request completion
log.Info("HTTP request completed",
logger.String("status", status),
logger.Float64("duration_seconds", duration.Seconds()),
logger.Int("response_size", responseSize),
)
// Add request ID to response
c.Header("X-Request-ID", requestID)
}
}
// DatabaseMetricsMiddleware creates middleware for database metrics
func DatabaseMetricsMiddleware(metrics *Metrics) func(operation, table, database string) func(error) {
return func(operation, table, database string) func(error) {
start := time.Now()
return func(err error) {
duration := time.Since(start)
metrics.RecordDBQuery(operation, table, database, duration, err)
}
}
}
// CacheMetricsMiddleware creates middleware for cache metrics
func CacheMetricsMiddleware(metrics *Metrics) func(operation string, hit bool) func() {
return func(operation string, hit bool) func() {
start := time.Now()
return func() {
duration := time.Since(start)
metrics.RecordCacheOperation(operation, hit, duration)
}
}
}