Tripper is a circuit breaker package for Go that allows you to circuit and control the status of circuits.
To install Tripper, use go get
:
go get github.com/rajnandan1/go-tripper
Import the Tripper package in your Go code:
import "github.com/rajnandan1/go-tripper"
To add a circuit to the Tripper, use the ConfigureCircuit
function:
//Adding a circuit that will trip the circuit if count of failure is more than 10 in 1 minute
//for a minimum of 100 count
circuitOptions := tripper.CircuitOptions{
Name: "example-circuit",
Threshold: 10,
ThresholdType: tripper.ThresholdCount,
MinimumCount: 100,
IntervalInSeconds: 60,
OnCircuitOpen: onCircuitOpenCallback,
OnCircuitClosed: onCircuitClosedCallback,
}
circuit, err := tripper.ConfigureCircuit(circuitOptions)
if err != nil {
fmt.Println("Failed to add circuit:", err)
return
}
//Adding a circuit that will trip the circuit if count of failure is more than 10% in 1 minute
//for a minimum of 100 count
circuitOptions := tripper.CircuitOptions{
Name: "example-circuit",
Threshold: 10,
ThresholdType: tripper.ThresholdPercentage,
MinimumCount: 100,
IntervalInSeconds: 60,
OnCircuitOpen: onCircuitOpenCallback,
OnCircuitClosed: onCircuitClosedCallback,
}
circuit, err := tripper.ConfigureCircuit(circuitOptions)
if err != nil {
fmt.Println("Failed to add circuit:", err)
return
}
//Adding a circuit that will trip the circuit if 10 consecutive erros occur in 1 minute
//for a minimum of 100 count
circuitOptions := tripper.CircuitOptions{
Name: "example-circuit",
Threshold: 10,
ThresholdType: tripper.ThresholdConsecutive,
MinimumCount: 100,
IntervalInSeconds: 60,
OnCircuitOpen: onCircuitOpenCallback,
OnCircuitClosed: onCircuitClosedCallback,
}
circuit, err := tripper.ConfigureCircuit(circuitOptions)
if err != nil {
fmt.Println("Failed to add circuit:", err)
return
}
func onCircuitOpenCallback(x tripper.CallbackEvent){
fmt.Println("Callback OPEN")
fmt.Println(x.FailureCount)
fmt.Println(x.SuccessCount)
fmt.Println(x.Timestamp)
}
func onCircuitClosedCallback(x tripper.CallbackEvent){
fmt.Println("Callback Closed")
fmt.Println(x.FailureCount)
fmt.Println(x.SuccessCount)
fmt.Println(x.Timestamp)
}
circuitOptions := tripper.CircuitOptions{
Name: "example-circuit",
Threshold: 10,
ThresholdType: tripper.ThresholdCount,
MinimumCount: 100,
IntervalInSeconds: 60,
OnCircuitOpen: onCircuitOpenCallback,
OnCircuitClosed: onCircuitClosedCallback,
}
circuit, err := tripper.ConfigureCircuit(circuitOptions)
if err != nil {
fmt.Println("Failed to add circuit:", err)
return
}
Option | Description | Required | Type |
---|---|---|---|
Name |
The name of the circuit. | Required | string |
Threshold |
The threshold value for the circuit. | Required | float32 |
ThresholdType |
The type of threshold (ThresholdCount or ThresholdPercentage or ThresholdConsecutive ). |
Required | string |
MinimumCount |
The minimum number of events required for monitoring. | Required | int64 |
IntervalInSeconds |
The time interval for monitoring in seconds. | Required | int |
OnCircuitOpen |
Callback function called when the circuit opens. | Optional | func() |
OnCircuitClosed |
Callback function called when the circuit closes. | Optional | func() |
Circuits are reset after IntervalInSeconds
To update the status of a circuit based on the success of an event, use the UpdateStatus
function:
circuit.UpdateStatus(true) // Success event
circuit.UpdateStatus(false) // Failure event
To check if a circuit is open or closed, use the IsCircuitOpen
function:
isOpen := circuit.IsCircuitOpen()
if isOpen {
fmt.Println("Circuit is open")
} else {
fmt.Println("Circuit is closed")
}
Here's an example of using Tripper to handle HTTP requests with a circuit breaker:
package main
import (
"fmt"
"time"
"github.com/rajnandan1/go-tripper"
)
func main() {
// Configure the circuit options
circuitOptions := tripper.CircuitOptions{
Name: "MyServiceMonitor",
Threshold: 50, // Threshold for triggering circuit open (percentage)
ThresholdType: tripper.ThresholdPercentage,
MinimumCount: 10, // Minimum number of events required for monitoring
IntervalInSeconds: 60, // Interval in seconds for monitoring
OnCircuitOpen: func(event tripper.CallbackEvent) {
fmt.Println("Circuit opened:", event)
},
OnCircuitClosed: func(event tripper.CallbackEvent) {
fmt.Println("Circuit closed:", event)
},
}
// Create a new circuit
circuit, err := tripper.ConfigureCircuit(circuitOptions)
if err != nil {
fmt.Println("Error creating circuit:", err)
return
}
// Simulate calling a service
for i := 0; i < 20; i++ {
success := i%2 == 0 // Simulate failures every other call
circuit.UpdateStatus(success)
time.Sleep(time.Second)
}
// Check if the circuit is open
if circuit.IsCircuitOpen() {
fmt.Println("Circuit is open!")
} else {
fmt.Println("Circuit is closed.")
}
}
This project is licensed under the MIT License.