Skip to content

Commit

Permalink
risk: add Enabled config to circuitbreaker
Browse files Browse the repository at this point in the history
  • Loading branch information
c9s committed Aug 26, 2024
1 parent 321eb23 commit 7fdb3f6
Showing 1 changed file with 16 additions and 5 deletions.
21 changes: 16 additions & 5 deletions pkg/risk/circuitbreaker/basic.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ func init() {
}

type BasicCircuitBreaker struct {
Enabled bool `json:"enabled"`

MaximumConsecutiveTotalLoss fixedpoint.Value `json:"maximumConsecutiveTotalLoss"`

MaximumConsecutiveLossTimes int `json:"maximumConsecutiveLossTimes"`
Expand Down Expand Up @@ -117,14 +119,17 @@ type BasicCircuitBreaker struct {

func NewBasicCircuitBreaker(strategyID, strategyInstance string) *BasicCircuitBreaker {
b := &BasicCircuitBreaker{
Enabled: true,
MaximumConsecutiveLossTimes: 8,
MaximumHaltTimes: 3,
MaximumHaltTimesExceededPanic: false,
HaltDuration: types.Duration(1 * time.Hour),
strategyID: strategyID,
strategyInstance: strategyInstance,
metricsLabels: prometheus.Labels{"strategy": strategyID, "strategyInstance": strategyInstance},

HaltDuration: types.Duration(1 * time.Hour),
strategyID: strategyID,
strategyInstance: strategyInstance,
metricsLabels: prometheus.Labels{"strategy": strategyID, "strategyInstance": strategyInstance},
}

b.updateMetrics()
return b
}
Expand Down Expand Up @@ -182,7 +187,7 @@ func (b *BasicCircuitBreaker) RecordProfit(profit fixedpoint.Value, now time.Tim
b.winRatio = float64(b.winTimes) / float64(b.lossTimes)
}

b.updateMetrics()
defer b.updateMetrics()

if b.MaximumConsecutiveLossTimes > 0 && b.consecutiveLossTimes >= b.MaximumConsecutiveLossTimes {
b.halt(now, "exceeded MaximumConsecutiveLossTimes")
Expand Down Expand Up @@ -224,6 +229,10 @@ func (b *BasicCircuitBreaker) reset() {
}

func (b *BasicCircuitBreaker) IsHalted(now time.Time) (string, bool) {
if !b.Enabled {
return "disabled", false
}

b.mu.Lock()
defer b.mu.Unlock()

Expand Down Expand Up @@ -251,6 +260,8 @@ func (b *BasicCircuitBreaker) halt(now time.Time, reason string) {
haltCounterMetrics.With(labels).Set(float64(b.haltCounter))
haltMetrics.With(labels).Set(1.0)

defer b.updateMetrics()

if b.MaximumHaltTimesExceededPanic && b.haltCounter > b.MaximumHaltTimes {
panic(fmt.Errorf("total %d halt times > maximumHaltTimesExceededPanic %d", b.haltCounter, b.MaximumHaltTimes))
}
Expand Down

0 comments on commit 7fdb3f6

Please sign in to comment.