feat: Phase 2 - reliability & observability
CI / Lint (push) Has been cancelled
CI / Test (push) Has been cancelled
CI / Build (push) Has been cancelled

- Circuit breaker: proper thresholds (3 failures, 30s timeout)
- HTTP timeouts: 30s on all providers (was no timeout)
- Structured logging: slog replaces fmt.Printf throughout
- Stream errors: propagated as SSE error events to client
- Registry fetch: retry with backoff (3 attempts)
- Registry reads in dashboard protected by RWMutex
This commit is contained in:
2026-04-26 14:48:41 -04:00
parent 8a8d8d1477
commit 1f574d8134
15 changed files with 126 additions and 608 deletions
+14 -1
View File
@@ -2,6 +2,7 @@ package providers
import (
"context"
"time"
"github.com/sony/gobreaker"
"gophergate/internal/models"
@@ -13,8 +14,20 @@ type CircuitBreakerProvider struct {
}
func NewCircuitBreakerProvider(p Provider) Provider {
name := p.Name()
var maxRequests uint32 = 5
var interval = 60 * time.Second
var timeout = 30 * time.Second
settings := gobreaker.Settings{
Name: p.Name(),
Name: name,
MaxRequests: maxRequests,
Interval: interval,
Timeout: timeout,
ReadyToTrip: func(counts gobreaker.Counts) bool {
// Trip after 3 consecutive failures
return counts.ConsecutiveFailures > 3
},
}
return &CircuitBreakerProvider{
provider: p,