veza/veza-backend-api/internal/metrics/errors.go
2025-12-03 20:29:37 +01:00

69 lines
2 KiB
Go

package metrics
import (
"sync"
"veza-backend-api/internal/errors"
)
// ErrorMetrics collecte et stocke les métriques d'erreurs pour le monitoring
type ErrorMetrics struct {
mu sync.RWMutex
errorsByCode map[errors.ErrorCode]int64
errorsByHTTPStatus map[int]int64
totalErrors int64
aggregated *AggregatedMetrics // Agrégation par fenêtres de temps (T0029)
}
// NewErrorMetrics crée une nouvelle instance de ErrorMetrics
func NewErrorMetrics() *ErrorMetrics {
return &ErrorMetrics{
errorsByCode: make(map[errors.ErrorCode]int64),
errorsByHTTPStatus: make(map[int]int64),
totalErrors: 0,
aggregated: NewAggregatedMetrics(), // Initialiser l'agrégation (T0029)
}
}
// RecordError enregistre une erreur dans les métriques
func (m *ErrorMetrics) RecordError(code errors.ErrorCode, httpStatus int) {
m.mu.Lock()
m.errorsByCode[code]++
m.errorsByHTTPStatus[httpStatus]++
m.totalErrors++
m.mu.Unlock()
// Enregistrer dans les fenêtres d'agrégation (T0029)
if m.aggregated != nil {
m.aggregated.AddError("1m", code, httpStatus)
m.aggregated.AddError("5m", code, httpStatus)
m.aggregated.AddError("1h", code, httpStatus)
}
}
// GetStats retourne les statistiques actuelles des erreurs
func (m *ErrorMetrics) GetStats() map[string]interface{} {
m.mu.RLock()
defer m.mu.RUnlock()
return map[string]interface{}{
"total_errors": m.totalErrors,
"errors_by_code": m.errorsByCode,
"errors_by_http_status": m.errorsByHTTPStatus,
}
}
// Reset réinitialise toutes les métriques (utile pour les tests)
func (m *ErrorMetrics) Reset() {
m.mu.Lock()
defer m.mu.Unlock()
m.errorsByCode = make(map[errors.ErrorCode]int64)
m.errorsByHTTPStatus = make(map[int]int64)
m.totalErrors = 0
// Note: on ne reset pas l'agrégation pour garder l'historique
}
// GetAggregatedMetrics retourne l'instance AggregatedMetrics
func (m *ErrorMetrics) GetAggregatedMetrics() *AggregatedMetrics {
return m.aggregated
}