Skip to content

Releases: sslinNn/devalerts

v0.3.0

Choose a tag to compare

@sslinNn sslinNn released this 18 Jul 18:47
3296812

Added

  • devalerts.init(slack_webhook_url=...): Slack delivery via an incoming webhook, alongside or instead of Telegram — every configured channel gets every alert.
  • devalerts.init(..., blame=True): runs git blame on the line that raised and adds the author, short commit hash, and date to the alert.
  • devalerts.LogHandler: reports ERROR+ log records, catching exceptions that are logged and swallowed (logger.exception(...)) rather than left to propagate.
  • Alerts now mark the first-ever occurrence of an error group with a 🆕 New error badge.

Full changelog: https://github.com/sslinNn/devalerts/blob/main/CHANGELOG.md#030---2026-07-19

v0.2.3

Choose a tag to compare

@sslinNn sslinNn released this 18 Jul 16:19

Fixed

  • devalerts dashboard no longer crashes with UnicodeEncodeError on
    consoles using a legacy codepage (e.g. cp1251) when a group's backoff
    multiplier is shown — the × suffix (limited ×2) now falls back to
    x2 like the dashboard's other unicode characters already did.

Added

  • README: demo GIF showing setup, the dashboard, mute, and a real alert
    landing in Telegram with the collapsed traceback.

v0.2.2

Choose a tag to compare

@sslinNn sslinNn released this 18 Jul 04:09

capture() used as a decorator now tags the alert with the wrapped function's name as job automatically -- no need to pass extra={'job': ...} by hand.

v0.2.1

Choose a tag to compare

@sslinNn sslinNn released this 18 Jul 02:37

Fold the traceback into a collapsed HTML blockquote (parse_mode: HTML) so a large stack trace no longer dumps as a wall of text into the chat.

v0.2.0

Choose a tag to compare

@sslinNn sslinNn released this 18 Jul 02:13

Added

  • devalerts.init_celery(): reports Celery task failures automatically via
    the task_failure signal. init()'s excepthook alone never sees
    exceptions raised inside a task, since Celery catches those itself to
    record the task's FAILURE state — same class of problem ASGIMiddleware
    solves for ASGI request errors. Tags each alert with the task name and id.
    Celery is imported lazily, not a devalerts dependency.
  • Every alert now includes the sending host (socket.gethostname()) — useful
    when one bot serves multiple processes/servers. init(tags={...}) adds
    global tags to every alert; report(extra={...}) / capture(extra={...})
    add ad-hoc tags to a single call, overriding init()'s tags on key
    collision.
  • Chronic error groups (occurrences piling up while rate-limited) now back
    off exponentially: each chronic resend doubles the effective
    rate_limit_seconds for that group, capped at 8x. A group that goes quiet
    and reappears once (no pile-up) resets to the base rate immediately.
    dashboard/--json show the active multiplier.
  • devalerts mute <fingerprint> / devalerts unmute <fingerprint>: silence
    or re-enable alerts for a specific error group without touching code.
    Unmuting resends with the accumulated skip count, same as a rate-limit
    window expiring.
  • devalerts clear <fingerprint> / devalerts clear --all: delete error
    group(s) from local state. All three commands accept a unique prefix of
    the fingerprint (the ID column shown by dashboard).
  • devalerts dashboard --json: machine-readable output for scripting.
  • devalerts test --bot-token ... --chat-id ... CLI command: sends a one-off
    message so you can verify bot_token/chat_id are wired up correctly
    before touching any code.
  • Test coverage for ASGIMiddleware (previously untested) and for
    _excepthook/_threading_excepthook's "must never raise" guarantee,
    raising overall coverage from 86% to 95%.
  • GitHub repo topics for discoverability.

Fixed

  • devalerts dashboard now uses each error group's actually configured
    rate_limit_seconds (persisted to the local DB) to decide limited vs
    sending status, instead of always assuming the library default.

Changed

  • _send_telegram_message now returns True/False instead of None, so
    callers (like the new test command) can tell whether delivery succeeded.
  • Telegram delivery now retries once on failure (honoring Retry-After on a
    429, up to 10s) before giving up. If every attempt fails, the message is
    appended to ~/.devalerts/failed.log instead of just being dropped.

v0.1.5

Choose a tag to compare

@sslinNn sslinNn released this 17 Jul 18:25

v0.1.4

Choose a tag to compare

@sslinNn sslinNn released this 17 Jul 15:30

PyPI discovery metadata (classifiers, keywords, project URLs) and a stronger README with badges, feature highlights, and a comparison table.