Skip to main content

A modern, composable circuit breaker library for Python

Project description

Fluxgate

A composable circuit breaker library for Python.

License Python

Installation

pip install fluxgate

Quick Start

from fluxgate import CircuitBreaker

cb = CircuitBreaker(name="my_api")

@cb
def call_api():
    return requests.get("https://api.example.com")

That's it. The circuit breaker will:

  • Track the last 100 calls
  • Open when failure rate exceeds 50% (after 100+ requests)
  • Wait 60 seconds before testing recovery
  • Gradually allow more calls as the service recovers

Async Support

For async applications, use AsyncCircuitBreaker:

from fluxgate import AsyncCircuitBreaker

cb = AsyncCircuitBreaker(name="my_api")

@cb
async def call_api():
    async with httpx.AsyncClient() as client:
        return await client.get("https://api.example.com")

Customization

Every component is customizable. You can apply different policies to different services based on their criticality:

import httpx
from fluxgate import AsyncCircuitBreaker
from fluxgate.windows import TimeWindow
from fluxgate.trackers import TypeOf, Custom
from fluxgate.trippers import MinRequests, FailureRate, FailureStreak
from fluxgate.retries import Backoff
from fluxgate.permits import RampUp

# Track only 5xx errors and network failures (not 4xx client errors)
def is_server_error(e: Exception) -> bool:
    if isinstance(e, httpx.HTTPStatusError):
        return e.response.status_code >= 500
    return isinstance(e, (httpx.ConnectError, httpx.TimeoutException))

# Conservative policy for critical payment service
payment_cb = AsyncCircuitBreaker(
    name="payment_service",
    window=TimeWindow(size=300),              # Track calls over 5 minutes
    tracker=Custom(is_server_error),          # Custom error filtering
    tripper=(
        FailureStreak(5) |                    # Trip on 5 consecutive failures OR
        (MinRequests(20) & FailureRate(0.4))  # 40% failure rate after 20 calls
    ),
    retry=Backoff(initial=30.0, max_duration=600.0),  # 30s, 60s, 120s... up to 10min
    permit=RampUp(0.1, 1.0, 60.0),            # Gradually allow 10% → 100% over 60s
)

# Aggressive policy for less critical inventory service
inventory_cb = AsyncCircuitBreaker(
    name="inventory_service",
    window=TimeWindow(size=60),               # Track calls over 1 minute
    tracker=TypeOf(httpx.HTTPError),          # Track all HTTP errors
    tripper=MinRequests(10) & FailureRate(0.6),  # 60% failure rate after 10 calls
    retry=Backoff(initial=10.0, max_duration=300.0),
)

@payment_cb
async def charge_payment(amount: float):
    async with httpx.AsyncClient() as client:
        response = await client.post("https://payment.example.com/charge", json={"amount": amount})
        response.raise_for_status()
        return response.json()

@inventory_cb
async def check_inventory(product_id: str):
    async with httpx.AsyncClient() as client:
        response = await client.get(f"https://inventory.example.com/products/{product_id}")
        response.raise_for_status()
        return response.json()

Components

Component Purpose Examples
Window How to track call history CountWindow(100), TimeWindow(60)
Tracker Which exceptions to track All(), TypeOf(HTTPError), Custom(func)
Tripper When to open the circuit MinRequests(n), FailureRate(0.5), FailureStreak(5), SlowRate(0.5), AvgLatency(1.0), Closed(), HalfOpened()
Retry When to attempt recovery Cooldown(60.0), Backoff(initial=10.0), Always(), Never()
Permit How to allow calls during recovery All(), Random(0.5), RampUp(0.1, 1.0, 60.0)

Monitoring

Attach listeners to get notified on state transitions:

from fluxgate import CircuitBreaker
from fluxgate.listeners.log import LogListener
from fluxgate.listeners.prometheus import PrometheusListener
from fluxgate.listeners.slack import SlackListener

cb = CircuitBreaker(
    name="my_api",
    listeners=[
        LogListener(),
        PrometheusListener(),
        SlackListener(channel="C123", token="xoxb-..."),
    ],
)

Documentation

Full documentation

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fluxgate-0.5.1.tar.gz (91.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fluxgate-0.5.1-py3-none-any.whl (22.6 kB view details)

Uploaded Python 3

File details

Details for the file fluxgate-0.5.1.tar.gz.

File metadata

  • Download URL: fluxgate-0.5.1.tar.gz
  • Upload date:
  • Size: 91.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fluxgate-0.5.1.tar.gz
Algorithm Hash digest
SHA256 a2c8e8a036e36d2c597406a88b579e4212046d9d87ab1dc28f40242003687566
MD5 e47b7c83b4cadbf96ade5ed9a94d1996
BLAKE2b-256 8bc056647060fe3a75cc5e35149f37d1b75b30e6bac6c969bceaf615046294f2

See more details on using hashes here.

Provenance

The following attestation bundles were made for fluxgate-0.5.1.tar.gz:

Publisher: publish.yml on byExist/fluxgate

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fluxgate-0.5.1-py3-none-any.whl.

File metadata

  • Download URL: fluxgate-0.5.1-py3-none-any.whl
  • Upload date:
  • Size: 22.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fluxgate-0.5.1-py3-none-any.whl
Algorithm Hash digest
SHA256 20fa727f39805d0cf45cd485b15cda2bd6e820e40cacdcc93ad49eb530a7d5d2
MD5 8c19132836151c7be16dedbd5a35d8cd
BLAKE2b-256 9d38918782e80596d48b7295a81a18fd03b7b077a4b6f861520993f82fc1c739

See more details on using hashes here.

Provenance

The following attestation bundles were made for fluxgate-0.5.1-py3-none-any.whl:

Publisher: publish.yml on byExist/fluxgate

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page