Changelog¶
The following changelog is available via the ExaCheck GitHub repository CHANGELOG file.
ExaCheck Changelog¶
2026-05-22 - 0.1.7¶
Fixes:
- Worker child processes are no longer left as zombies when ExaBGP terminates ExaCheck. The previous SIGCHLD-based reaper raced against shutdown and respawned workers as the master was exiting; it has been removed in favour of an explicit terminate-and-join in the master cleanup handler, with a SIGKILL escalation on hang. The same fix is applied to
_stop_workerso live-reload removals do not leak zombies either. - Shell health check output is no longer dropped — and, more importantly, no longer leaks into the ExaBGP command stream.
subprocess.runis now invoked withcapture_output=True, sostdout/stderrare properly captured into theCheckResultinstead of being inherited from the parent (whose stdout is the ExaBGP control channel). - ICMP health check: the
Packets lost (...)error string reported the boolean result of the comparison instead of the actual number of lost packets, due to walrus-operator precedence. Now reports the correct count. - ICMP health check: the "max jitter exceeded" error message reported
max_rttinstead ofjitter. Now reports the jitter value. - DNS resolution error handling: the
getaddrinfoerrno was being matched against string literals ("-9","-2"), so the branches never fired andAddressFamilyErrorwas effectively unreachable. Now matched against thesocket.EAI_*integer constants. CheckResult.datewas evaluated once at module import time, so every check result shared the same timestamp. Switched todefault_factory=datetime.nowso each result is dated when it is created.Notifications.notifyno longer raisesIndexErroron an unknown event type; it now falls back to theINFOnotification level._stop_workerno longer raisesIndexErrorif the named worker is missing from the job list; it logs an error and returns.Sleeperno longer enforces a hard-coded 1-second floor on the sleep interval — health checks with sub-second intervals now run at the configured cadence. If an iteration over-runs the interval, the next iteration runs immediately (with a warning) instead of being delayed to a full second.
Misc:
- Bump ExaBGP requirement to
^5.0.9(was^4.2.25) - Bump tabulate to
^0.10.0 - Narrow supported Python range to
>=3.11,<3.14(ExaBGP 5 does not support Python 3.14) - Refresh all other core and development dependencies to their latest compatible versions
- Drop the obsolete "Known Issues" note about the ExaBGP 4.2
six.movesvendoring issue on Python 3.12 (no longer applicable on ExaBGP 5) - Master monitoring loop simplified: the redundant
kill(pid, 0)liveness check has been removed;Process.is_alive()is sufficient and already reaps exited children Settingsduplicate log-path detection rewritten usingcollections.Counter(functionally identical, no longer relies onset.addreturningNoneinside a comprehension)
2025-03-17 - 0.1.6¶
Fixes:
- Allow setting
expected_statusfor the HTTP method as a single integer (previously only a list of integers was allowed)
Misc:
- Update core requirements:
- Apprise
- Loguru
- Pydantic
- httpx
- click
- Sentry
- ExaBGP
- Update various development dependencies
- Minimum Python release 3.11 due to ipython dependency for dev
2024-10-28 - 0.1.5¶
Misc:
- Update Sentry requirement
- Update various development dependencies
- Support Python 3.13
- Docker image is now built using Python 3.13 base by default
- Development environment is now using Python 3.13 by default
2024-09-10 - 0.1.4¶
Misc:
- Remove deprecated
versionkeyword from dev container compose file - Add comments to example compose file
- Update various development dependencies
- Add respx to test dependencies
- Minor formatting fixes
- Update core requirements:
- Apprise
- Sentry
- httpx
- Pydantic
2024-07-10 - 0.1.3¶
Fixes:
- If a DNS health check had a response pattern configured the last character of the response was being removed during validation. Some additional debug output was added in case of future issues.
Misc:
- Update core requirements:
- Sentry
- Pydantic
- Update various development dependencies (linting/formatting tools)
- Add debugger launch configs for VS Code
2024-06-13 - 0.1.2¶
Changes:
- Bump ExaBGP to build 4.2.22 - This fixes build issues on Python 3.12 which required working around. The Docker image has had the manual deployment of ExaBGP removed since it can now be built on its own successfully.
Misc:
- Update core requirements:
- Pydantic
- Sentry
- Apprise
- ujson
- Update various development dependencies (linting/formatting tools)
- VS Code Workspace fixes (debugpy, spelling)
- Dev container image mirror changed to
gitlab.com - Remove duplicate apt install in dev container
- Reformat docker ignore file
- Update default compose file
2024-04-18 - 0.1.1¶
Changes:
- Docker builds now use a venv rather than installing in system Python
- Docker builds now use Python 3.12 as the base
Fixes:
- Docker builds were not including ExaBGP so they would not be able to work. To fix this the requirement on ExaBGP has been dropped from Python >= 3.12. To use ExaCheck with Python 3.12 onwards (if not using Docker) you must currently install ExaBGP from source:
Misc:
- Update Apprise, Pydantic, Sentry and various development related modules
2024-04-01 - 0.1.0¶
Changes:
- The HTTP health check method now uses HTTPX instead of
requeststo make the request - HTTP check SNI adapter removed - HTTPX can handle SNI natively without requiring an adapter
Misc:
- Update Sentry, Apprise and Pydantic releases
- Update development group dependency Markdown
- Update various development dependencies
- Pytest configuration moved from .ini file to
pyproject.toml - MyPy configuration moved from .ini file to
pyproject.toml
Features
- With the change to HTTPX, the HTTP health check now supports HTTP2 (defaults to
False)
2024-02-21 - 0.0.11¶
Fixes:
- Reap zombie processes and respawn on failure (fixes #8)
Misc:
- Update Sentry and dnspython releases
2024-02-08 - 0.0.10¶
Changes:
- Add support for Python 3.10 and Python 3.12
- ExaBGP will be built from source if using Python 3.12 (using the 4.2 branch)
- Dockerfile changes to add support for Python 3.12:
- Install ExaCheck from git rather than PyPi to allow easier version customisation
- Make sure wheel/setuptools/pip is up to date
Misc:
- Update Semgrep and pydantic releases
- Remove requirement on types-requests; this is not needed for production usage
- Re-format pyproject.toml - use groups for development/typing/formatting/testing
2024-02-07 - 0.0.9¶
Fixes:
httpcheck method fails to parse the URL correctly for IPv6 hosts; IPv6 address must be enclosed with[]
2024-02-07 - 0.0.8¶
Fixes:
- Log file
countoption was not being used at all; log files would rotate but never be cleaned up - If a
hostvalue was provided for thehttpcheck method the value was being ignored; the host was overwritten from the hostname in URL
2024-01-31 - 0.0.7¶
Fixes:
- Correct the logging event types for announce/withdraw of routes for log filtering to work correctly
- Fix metric attribute naming error
Changes:
- Log exceptions when sending routes to ExaBGP
- Update syslog format string
- Include hostname when logging to remote servers
- Include timestamp when logging to remote servers or when structured logging is used
Features:
- Add the following options for Sentry; values are set to the Sentry defaults:
attach_stacktraceinclude_local_variablesdebug- Move Sentry profile sample rate out of experimental configuration
2024-01-30 - 0.0.6¶
Fixes:
- Formatting fixup in
__version__.py - Ensure STDOUT is flushed on route announce/withdraw
- Define
app_urlfor Apprise - Change line breaks for Apprise notification as they are broken in Slack
- Debug or trace level logging must be enabled to log the Python filename/line number/function name in file/syslog
Changes:
- ExaCheck internal configuration (eg. for the
live_reloadfeature) has been migrated out of the baseSettingsclass. Instead, ExaCheck configuration now resides in its ownsettings.ExaCheckclass.
2024-01-29 - 0.0.5¶
Fixes:
- ExaBGP fails to start on Python 3.12. ExaCheck now requires Python 3.11.
Features
- Docker deployment now available - see the ExaCheck Docker deployment page for instructions.
2024-01-29 - 0.0.4¶
Fixes:
- Replace static version definition in
__version__.pywithimportlib.metadatalookup
Features:
- Add support for Python 3.11
Misc:
- Update Apprise and dnspython
2024-01-29 - 0.0.3¶
Fixes:
- Add CHANGELOG.md
2024-01-29 - 0.0.3a0¶
Fixes:
- Adds dependency on
loguruandclickcorrectly
2024-01-29 - 0.0.2¶
Initial public release