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.0.tar.gz (90.3 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.0-py3-none-any.whl (22.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: fluxgate-0.5.0.tar.gz
  • Upload date:
  • Size: 90.3 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.0.tar.gz
Algorithm Hash digest
SHA256 3ebfa934bbf82aac07d8b52aace05adb60611b09df07e9173cd547c3bafd9cef
MD5 7e99abe702b17a97bbba6d98f811901d
BLAKE2b-256 5009b30a594d3c3c43dc71eb4133078d08ad3329ec97c99f55e4e649a297358a

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: fluxgate-0.5.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.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 7a4f61d40680bc02eef036d6e8f416d8148e8dbc3d4dad45ae08ee29f28a98b2
MD5 8e2e735fa22a05211dbd1e7abd64f911
BLAKE2b-256 aae1fa6d8567148b3de594d7fcf17a7a6dbb2b34783b976337dbc855d8712940

See more details on using hashes here.

Provenance

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