Skip to main content

Abstract, extensible RabbitMQ error-queue remediation tool

Project description

RMQ Healer

RMQ Healer Logo

Abstract, extensible RabbitMQ error-queue remediation.
Classify → remediate → audit — fully configurable, no code required for common cases.

Python License CI Coverage PyPI Docker Code style


What Is It?

RMQ Healer watches RabbitMQ error queues and automatically remediates known failure patterns — classify, remediate, audit — fully configurable, no code required for common cases.

When you probably don't need this tool

In a well-designed RabbitMQ system, error queues don't accumulate indefinitely. A properly configured setup handles failure natively:

  • Dead-letter exchanges (DLX) — messages that are rejected, expired, or exceed queue length limits are automatically routed to a designated dead-letter queue
  • Message TTL — messages that sit too long are expired and dead-lettered rather than silently dropped
  • Consumer retry logic — consumers catch transient errors, requeue with backoff, and reject permanently after N attempts
  • Dedicated error consumers — purpose-built services subscribe to error queues and handle known failure modes inline

If you control the system and have the bandwidth to implement these properly, you should — they are the right long-term answer.

When RMQ Healer is the right tool

RMQ Healer is built for situations where reconfiguring the messaging system is not an option:

  • Legacy processors you can't modify — the consumer is a vendor library, a third-party service, or a system outside your control
  • No technical bandwidth for a proper fix — reconfiguring RabbitMQ topology, updating consumers, and testing safely takes time you don't have right now
  • Temporary remediation during migration — you're moving toward a better architecture but need something working in the meantime
  • Operational recovery — a bad deployment filled an error queue and you need to safely triage, replay, and audit the affected messages

In all of these cases, RMQ Healer gives you a safe, auditable, externally-configurable remediation layer — without modifying the application that produced the messages.

Features

Zero-loss processing, declarative YAML rules, a rich built-in action library (log, mutate_json, set_headers, python_script, republish, quarantine, route_unknown, drop), Python script hooks for arbitrary logic, Prometheus metrics, dry-run with diffs, and an interactive terminal TUI for config editing, rule management, live runs, and queue inspection.

Full feature list


Architecture

Classify → remediate → audit. Messages are acked only after a terminal action succeeds — if anything fails, the message stays in the queue untouched.

flowchart TD
    EQ[("Error Queue")]
    CL["Classifier\n(first match wins)"]
    WF["WorkflowRunner"]
    AU["AuditLogger\n(JSON-lines)"]

    EQ -->|basic_get| CL
    CL -->|matched rule| WF
    CL -->|no match| UQ[("Unknown Queue")]
    WF --> A1["log / set_headers\nmutate_json / python_script"]
    A1 --> T{"Terminal\naction"}
    T -->|republish| RQ[("Repaired Queue")]
    T -->|quarantine| Q[("Quarantine Queue")]
    T -->|route_unknown| UQ
    T -->|drop| DONE["Ack + discard"]
    WF --> AU
    CL --> AU

Architecture overview and design decisions


Quick Start

# 1. Install
pip install -e ".[dev]"

# 2. Set broker URL
export RMQ_URL="amqp://guest:guest@localhost/"

# 3. Generate config interactively
rmq-healer configure --output config/queues.yml

# 4. Validate
rmq-healer validate --config config/queues.yml

# 5. Test a rule against a sample message
rmq-healer test-rule --config config/queues.yml \
  --queue order-service.error --message examples/retry-timeout/sample.json

# 6. Dry-run with mutation diffs — nothing acked or published
rmq-healer dry-run --config config/queues.yml --all --pretty

# 7. Live run
rmq-healer run --config config/queues.yml --all --pretty

# 8. Peek without consuming
rmq-healer peek --config config/queues.yml --queue order-service.error --count 10

# 9. Visualise a workflow as a Mermaid diagram
rmq-healer workflow render --config config/queues.yml --queue order-service.error

# 10. Search audit logs
rmq-healer audit-search --log audit.jsonl --outcome quarantine

Example Configuration

rabbitmq:
  url: "${RMQ_URL}"
  prefetch: 10

idempotency:
  enabled: true
  max_handler_attempts: 3

queues:
  - name: order-service.error
    enabled: true
    rules_file: rules/order-errors.yml
    repaired_exchange: order.events
    repaired_routing_key: order.retry
    quarantine_exchange: ops.errors
    quarantine_routing_key: order.quarantine
# rules/order-errors.yml
rules:
  - id: transient_timeout
    match:
      any:
        - body_contains: "ETIMEDOUT"
        - json_path: $.error.code
          equals: "TIMEOUT"
    workflow:
      - action: set_headers
        params:
          headers:
            x-rmq-healer-rule: transient_timeout
      - action: republish
        params:
          exchange: "{{ queue.repaired_exchange }}"
          routing_key: "{{ queue.repaired_routing_key }}"

  - id: missing_customer_id
    match:
      all:
        - json_path: $.customer_id
          equals: null
    workflow:
      - action: python_script
        params:
          script: scripts/lookup_customer.py
          timeout: 30
          output:
            save_as: customer
      - action: mutate_json
        params:
          set:
            "$.customer_id": "{{ customer.id }}"
      - action: republish
        params:
          exchange: "{{ queue.repaired_exchange }}"
          routing_key: "{{ queue.repaired_routing_key }}"

See the examples/ directory for complete, runnable scenarios.


Documentation

Topic Guide
Installation & setup docs/installation.md
Configuration reference docs/configuration.md
Writing rules docs/rules.md
Python script actions docs/python-scripts.md
CLI reference (all commands) docs/cli-reference.md
Operations guide docs/operations.md
Docker deployment docs/docker.md
Interactive TUI docs/developer-gui.md
Plugin architecture docs/plugins.md
Metrics & observability docs/metrics.md
Contributing & tooling docs/contributing.md
GitHub workflow docs/github-workflow.md
Troubleshooting docs/troubleshooting.md

Browse all docs →


Developers

Quick start for contributors.

# Windows
.\developer\scripts\setup.ps1      # start RabbitMQ + seed fixtures
.\developer\scripts\run-test.ps1   # dry-run against local broker
.\developer\scripts\teardown.ps1   # stop
# Linux / macOS
bash developer/scripts/setup.sh
bash developer/scripts/run-test.sh
bash developer/scripts/teardown.sh
# Python (cross-platform)
python developer/scripts/dev_setup.py
python developer/scripts/run_test.py
python developer/scripts/dev_teardown.py

Full contributor guide  ·  GitHub workflow


License

MIT — see LICENSE.

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

rmq_healer-0.4.0.tar.gz (87.3 kB view details)

Uploaded Source

Built Distribution

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

rmq_healer-0.4.0-py3-none-any.whl (80.4 kB view details)

Uploaded Python 3

File details

Details for the file rmq_healer-0.4.0.tar.gz.

File metadata

  • Download URL: rmq_healer-0.4.0.tar.gz
  • Upload date:
  • Size: 87.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rmq_healer-0.4.0.tar.gz
Algorithm Hash digest
SHA256 eee6c69eaefc8f7f96a0ae90e5143e54852554434fde6a5dbb50fb0891a29ac4
MD5 27524e30139235712433b77eec243a05
BLAKE2b-256 b678bee1bd842d893af1c73457c1bf35e49620eccc98a28d6cd9386f40e56d71

See more details on using hashes here.

Provenance

The following attestation bundles were made for rmq_healer-0.4.0.tar.gz:

Publisher: release.yml on grimnexo/RMQ-Healer

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

File details

Details for the file rmq_healer-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: rmq_healer-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 80.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for rmq_healer-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f604c81bdf3b8e164a2ab659cf8cb4504960ba4d387e3f85b66fe72c5bbd1932
MD5 feab9deaf41ca083fe897479cf3d1fd0
BLAKE2b-256 ffea1555b1b453f90c089737e5aaf7d32c04120acc1cac547883fdc0e95ee71a

See more details on using hashes here.

Provenance

The following attestation bundles were made for rmq_healer-0.4.0-py3-none-any.whl:

Publisher: release.yml on grimnexo/RMQ-Healer

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