mirror of
https://github.com/lukaszraczylo/graphql-monitoring-proxy.git
synced 2026-06-05 23:03:48 +00:00
cedee416a8
* General improvements and bug fixes. * Improve tests coverage. * fixup! Improve tests coverage. * Update README.md with latest changes. * Fix the uint32 * Resolve issue with race condition for logging. * fixup! Merge remote-tracking branch 'origin/main' into improvements-mid-apr-2025 * Fix the test of the rate limiter * Add default ratelimit.json file * Update dependencies. * Significant refactor. * fixup! Significant refactor. * fixup! Merge remote-tracking branch 'origin/main' into improvements-mid-apr-2025 * fixup! fixup! Merge remote-tracking branch 'origin/main' into improvements-mid-apr-2025 * fixup! fixup! fixup! Merge remote-tracking branch 'origin/main' into improvements-mid-apr-2025 * fixup! fixup! fixup! fixup! fixup! Merge remote-tracking branch 'origin/main' into improvements-mid-apr-2025 * fixup! fixup! fixup! fixup! fixup! fixup! Merge remote-tracking branch 'origin/main' into improvements-mid-apr-2025 * fixup! fixup! fixup! fixup! fixup! fixup! fixup! Merge remote-tracking branch 'origin/main' into improvements-mid-apr-2025 * fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! Merge remote-tracking branch 'origin/main' into improvements-mid-apr-2025 * fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! Merge remote-tracking branch 'origin/main' into improvements-mid-apr-2025 * fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! Merge remote-tracking branch 'origin/main' into improvements-mid-apr-2025
77 lines
2.2 KiB
Go
77 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"sync/atomic"
|
|
|
|
"github.com/VictoriaMetrics/metrics"
|
|
libpack_monitoring "github.com/lukaszraczylo/graphql-monitoring-proxy/monitoring"
|
|
)
|
|
|
|
// CircuitBreakerMetrics manages circuit breaker metrics without recreating gauges
|
|
type CircuitBreakerMetrics struct {
|
|
stateValue atomic.Value // stores float64
|
|
stateGauge *metrics.Gauge
|
|
failCounters map[string]*metrics.Counter
|
|
}
|
|
|
|
// NewCircuitBreakerMetrics creates a new circuit breaker metrics manager
|
|
func NewCircuitBreakerMetrics(monitoring *libpack_monitoring.MetricsSetup) *CircuitBreakerMetrics {
|
|
cbm := &CircuitBreakerMetrics{
|
|
failCounters: make(map[string]*metrics.Counter),
|
|
}
|
|
|
|
// Initialize state value
|
|
cbm.stateValue.Store(float64(0))
|
|
|
|
// Create gauge with callback that reads the atomic value
|
|
cbm.stateGauge = monitoring.RegisterMetricsGauge(
|
|
libpack_monitoring.MetricsCircuitState,
|
|
nil,
|
|
0, // Initial value doesn't matter as callback will be used
|
|
)
|
|
|
|
// Override the gauge callback to read from atomic value
|
|
cbm.stateGauge = monitoring.RegisterMetricsGauge(
|
|
libpack_monitoring.MetricsCircuitState,
|
|
nil,
|
|
cbm.GetState(),
|
|
)
|
|
|
|
return cbm
|
|
}
|
|
|
|
// UpdateState updates the circuit breaker state value atomically
|
|
func (cbm *CircuitBreakerMetrics) UpdateState(state float64) {
|
|
cbm.stateValue.Store(state)
|
|
}
|
|
|
|
// GetState returns the current circuit breaker state value
|
|
func (cbm *CircuitBreakerMetrics) GetState() float64 {
|
|
if val := cbm.stateValue.Load(); val != nil {
|
|
return val.(float64)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// GetOrCreateFailCounter returns a counter for the given state key
|
|
func (cbm *CircuitBreakerMetrics) GetOrCreateFailCounter(monitoring *libpack_monitoring.MetricsSetup, stateKey string) *metrics.Counter {
|
|
if counter, exists := cbm.failCounters[stateKey]; exists {
|
|
return counter
|
|
}
|
|
|
|
// Create new counter
|
|
counter := monitoring.RegisterMetricsCounter(stateKey, nil)
|
|
cbm.failCounters[stateKey] = counter
|
|
return counter
|
|
}
|
|
|
|
// Global circuit breaker metrics instance
|
|
var cbMetrics *CircuitBreakerMetrics
|
|
|
|
// InitializeCircuitBreakerMetrics initializes the global circuit breaker metrics
|
|
func InitializeCircuitBreakerMetrics(monitoring *libpack_monitoring.MetricsSetup) {
|
|
if cbMetrics == nil {
|
|
cbMetrics = NewCircuitBreakerMetrics(monitoring)
|
|
}
|
|
}
|