mirror of
https://github.com/lukaszraczylo/graphql-monitoring-proxy.git
synced 2026-10-24 06:48:09 +00:00
improvements mid may 2025 (#24)
* 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
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user