veza/veza-backend-api/internal/metrics/circuit_breaker.go
2025-12-16 11:23:49 -05:00

77 lines
2.8 KiB
Go

package metrics
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/sony/gobreaker"
)
var (
// circuitBreakerState indique l'état actuel du circuit breaker (0=closed, 1=half-open, 2=open)
// MOD-P2-007: Métrique pour suivre l'état du circuit breaker
circuitBreakerState = promauto.NewGaugeVec(
prometheus.GaugeOpts{
Name: "veza_circuit_breaker_state",
Help: "Current state of the circuit breaker (0=closed, 1=half-open, 2=open)",
},
[]string{"circuit_breaker_name"},
)
// circuitBreakerRequestsTotal compte le nombre total de requêtes
// MOD-P2-007: Métrique pour compter les requêtes
circuitBreakerRequestsTotal = promauto.NewCounterVec(
prometheus.CounterOpts{
Name: "veza_circuit_breaker_requests_total",
Help: "Total number of requests through the circuit breaker",
},
[]string{"circuit_breaker_name", "result"}, // result: success, failure, rejected
)
// circuitBreakerFailuresTotal compte le nombre total d'échecs
// MOD-P2-007: Métrique pour compter les échecs
circuitBreakerFailuresTotal = promauto.NewCounterVec(
prometheus.CounterOpts{
Name: "veza_circuit_breaker_failures_total",
Help: "Total number of failures through the circuit breaker",
},
[]string{"circuit_breaker_name"},
)
// circuitBreakerConsecutiveFailures indique le nombre d'échecs consécutifs
// MOD-P2-007: Métrique pour suivre les échecs consécutifs
circuitBreakerConsecutiveFailures = promauto.NewGaugeVec(
prometheus.GaugeOpts{
Name: "veza_circuit_breaker_consecutive_failures",
Help: "Number of consecutive failures",
},
[]string{"circuit_breaker_name"},
)
)
// UpdateCircuitBreakerMetrics met à jour les métriques Prometheus pour un circuit breaker
// MOD-P2-007: Expose les métriques du circuit breaker via Prometheus
func UpdateCircuitBreakerMetrics(name string, counts gobreaker.Counts, state gobreaker.State) {
// État du circuit breaker (0=closed, 1=half-open, 2=open)
stateValue := 0.0
switch state {
case gobreaker.StateClosed:
stateValue = 0.0
case gobreaker.StateHalfOpen:
stateValue = 1.0
case gobreaker.StateOpen:
stateValue = 2.0
}
circuitBreakerState.WithLabelValues(name).Set(stateValue)
// Échecs consécutifs
circuitBreakerConsecutiveFailures.WithLabelValues(name).Set(float64(counts.ConsecutiveFailures))
// Total des échecs
circuitBreakerFailuresTotal.WithLabelValues(name).Add(float64(counts.TotalFailures - counts.ConsecutiveFailures))
}
// RecordCircuitBreakerRequest enregistre une requête dans les métriques
// MOD-P2-007: Enregistre le résultat d'une requête (success, failure, rejected)
func RecordCircuitBreakerRequest(name string, result string) {
circuitBreakerRequestsTotal.WithLabelValues(name, result).Inc()
}