GitHub - rajnandan1/go-tripper: The Go Tripper package provides functionality for monitoring the status of a circuit. Track success and failure counts, implement circuit breaker patterns, and manage service availability. (original) (raw)
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 ThresholdPercentageor 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.
