Skip to main content

Fluxgate

CI PyPI Python License

A composable circuit breaker library for Python with first-class sync and async support.

English | 한국어


Why Fluxgate?

Circuit breakers prevent cascading failures by monitoring service health and temporarily blocking calls to failing dependencies. Most Python libraries trip on consecutive failures — brittle for any service with intermittent errors. Fluxgate trips on failure rates over a sliding window, and rules are first-class values you compose:

from fluxgate import CircuitBreaker
from fluxgate.trippers import MinRequests, FailureRate, SlowRate, FailureStreak

cb = CircuitBreaker(
    tripper=FailureStreak(5) | (MinRequests(20) & (
        FailureRate(0.5) | SlowRate(0.3, threshold=1.0)
    )),
)

Note: State is process-local and not thread-safe. For concurrency, use asyncio + AsyncCircuitBreaker, not threading.

Installation

pip install fluxgate                  # core, zero dependencies
pip install "fluxgate[prometheus]"    # +PrometheusListener
pip install "fluxgate[slack]"         # +SlackListener

Usage

import httpx
from fluxgate import AsyncCircuitBreaker
from fluxgate.trackers import TypeOf

cb = AsyncCircuitBreaker(
    tracker=TypeOf(httpx.ConnectError, httpx.TimeoutException),
    max_half_open_calls=10,
)

@cb
async def fetch(url):
    async with httpx.AsyncClient() as client:
        return (await client.get(url)).json()

CircuitBreaker mirrors this API for sync code. A tripped circuit raises CallNotPermittedError; pass @cb(fallback=...) to fall back gracefully.

How It Works

Fluxgate is a state machine. The core cycle is CLOSED → OPEN → HALF_OPEN:

stateDiagram-v2
    direction LR
    [*] --> CLOSED
    CLOSED --> OPEN: tripper
    OPEN --> HALF_OPEN: retry
    HALF_OPEN --> CLOSED: !tripper
    HALF_OPEN --> OPEN: tripper

Three additional states (METRICS_ONLY, DISABLED, FORCED_OPEN) are documented in Operational Controls.

Composable Rules

Every condition is a value and combines with & / |:

from fluxgate.trippers import (
    Closed, HalfOpened, MinRequests, FailureRate, SlowRate, FailureStreak,
)

# State-specific rules: stricter when probing recovery.
tripper = FailureStreak(5) | (MinRequests(20) & (
    (Closed()    & (FailureRate(0.5) | SlowRate(0.3, threshold=1.0))) |
    (HalfOpened() & (FailureRate(0.3) | SlowRate(0.2, threshold=1.0)))
))

Tracker (failure classification) follows the same pattern with & / | / ~.

Components

Component Role Examples
Window Track recent calls (count- or time-based) CountWindow(100), TimeWindow(60)
Tracker Classify which exceptions count as failures All(), TypeOf(HTTPError), Custom(fn); combine with & / | / ~
Tripper Decide when to open the circuit MinRequests, FailureRate, SlowRate, AvgLatency, FailureStreak, Closed/HalfOpened; combine with & / |
Retry Trigger OPEN → HALF_OPEN Cooldown, Backoff, Always, Never
Permit Admit calls in HALF_OPEN All, Random(p), RampUp(start, end, duration)
Listener React to state transitions LogListener, PrometheusListener, SlackListener

All components are abstract base classes (abc.ABC) with input validation — misconfigurations fail fast at construction time. Subclass to write your own.

Operational Controls

Beyond automatic trips, the breaker exposes hooks for safe rollouts and manual control:

  • cb.metrics_only() — shadow mode: collect metrics without ever tripping. Ideal for validating thresholds in production before going live.
  • cb.force_open() / cb.disable() — manual override during incident response or maintenance.
  • cb.info() — snapshot of state, metrics, and reopen count.
  • cb.reset() — return to CLOSED and clear metrics.

Monitoring

Pass listeners via listeners=... — built-in: LogListener, PrometheusListener (optional), SlackListener (optional). Each listener takes a name= identifier used in log lines, Prometheus labels, or Slack messages. State transitions emit Signal events; AsyncCircuitBreaker additionally accepts AsyncListener.

Documentation

Development

uv sync --all-extras --all-groups
uv run pytest

Metadata

Release files for fluxgate 0.9.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fluxgate 0.9.4
File Size Uploaded Provenance Actions
fluxgate-0.9.4.tar.gz 107.1 kB With provenance Details for fluxgate-0.9.4.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for fluxgate 0.9.4
File Interpreter ABI Platform Actions
fluxgate-0.9.4-py3-none-any.whl Python 3 none any Details for fluxgate-0.9.4-py3-none-any.whl

Total release size: 132.7 kB

Release files / fluxgate-0.9.4.tar.gz

Download URL fluxgate-0.9.4.tar.gz
Size 107.1 kB
Tags Source
SHA-256 checksum
How to use checksums
799812a3c31fff47411cbd56b8958e21e8b9c1d529a9d715fd99d808d5b4ab9e
BLAKE2b-256 checksum
How to use checksums
3355867589221469186e8b139375c74a1f36ef1c52b66a3e10ac3e5c3dd491bb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 2, 2026.

Transparency log

Release files / fluxgate-0.9.4-py3-none-any.whl

Download URL fluxgate-0.9.4-py3-none-any.whl
Size 25.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
f6fb3e027dfc614e7908a3c798e5724ac3fc73547300e740ca195f3a3f9a2a33
BLAKE2b-256 checksum
How to use checksums
819627c24fcf391c0c79efac42dd40613b3cfcde5523ac92dccdda5a81c85832
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 2, 2026.

Transparency log

Security for fluxgate 0.9.4

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for fluxgate-0.9.4.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 2, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page