Awesome
Tripper
Tripper is a circuit breaker package for Go that allows you to circuit and control the status of circuits.
Installation
To install Tripper, use go get
:
go get github.com/rajnandan1/go-tripper
Usage
Import the Tripper package in your Go code:
import "github.com/rajnandan1/go-tripper"
Adding a Circuit
To add a circuit to the Tripper, use the ConfigureCircuit
function:
Circuit With Count
//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
}
Circuit With Percentage
//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
}
Circuit With Consecutive Errors
//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
}
Circuit with Callbacks
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
}
Circuit Options
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
Updating Circuit Status
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
Checking Circuit Status
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")
}
Example: HTTP Request with Circuit Breaker
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.")
}
}
License
This project is licensed under the MIT License.