Giter Club home page Giter Club logo

go-tripper's Introduction

Tripper

Tripper is a circuit breaker package for Go that allows you to circuit and control the status of circuits.

Tripper

Coverage Status Go Reference

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.

go-tripper's People

Contributors

rajnandan1 avatar

Stargazers

prasunparijatm avatar  avatar Budi avatar tsingson avatar Clayton Kehoe avatar Rick Wong avatar 卜木 avatar  avatar  avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.