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.6.0.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.6.0-py3-none-any.whl (22.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: fluxgate-0.6.0.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.6.0.tar.gz
Algorithm Hash digest
SHA256 ed8d7300da86365ee09e53d95617d88bd5f1c55e9e6bc1191079b4aec09b5401
MD5 9f664d06971f3d4fa149671bf7d38f2e
BLAKE2b-256 d24a1207159a1292dd2c55f79e2e3572034e668a52dc864a384c0f5256c720fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for fluxgate-0.6.0.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.6.0-py3-none-any.whl.

File metadata

  • Download URL: fluxgate-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 22.5 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.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 166cee5b2fc7bb82eacfc8fb2c57770f6ca84b2facaec5500ecf5c23adc303e1
MD5 e4844cb4a67cb466ff0e5ca18989de38
BLAKE2b-256 404f90302c7ac5a5626f9be2dbad7e305caff7dd23d0617a8acda829249e1fa1

See more details on using hashes here.

Provenance

The following attestation bundles were made for fluxgate-0.6.0-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