Python-based alerting, notification, and reliability monitoring runtime
Project description
Kanary
Kanary is a Python-based alerting, notification, and reliability monitoring runtime inspired by the historical “canary in a coal mine” You define three kinds of plugins in Python:
SourceReads values from a system, database, API, or device.RuleEvaluates those values and decides whether an alert should fire.OutputSends state changes to humans or other systems.
This separation keeps collection, evaluation, and notification independent, so monitoring definitions stay manageable as the system grows.
Installation
The normal installation method is PyPI:
pip install kanary
If you use uv, this also works:
uv tool install kanary
Then kanary and kanaryctl executables will be installed.
Installing from a source checkout is still supported, but it should be treated as a development workflow:
git clone https://github.com/mzks/kanary
cd kanary
uv sync
uv run python -m kanary ./demo
What To Do First
Start by running the smallest example from demo/.
kanary ./demo
Then move in this order:
- Read demo/basic_monitoring.py to understand the smallest possible
Source,Rule, andOutput. - Read docs/getting_started.md and work through the examples in examples/getting_started.py.
- Browse
examples/for PostgreSQL, Discord, peer monitoring, and remote alert import. - Create your own
plugins/directory and start with oneSourceand oneRule.
Minimal Example
The smallest working example is in demo/basic_monitoring.py. Make a directory to place plugin files then put the following scripts.
from datetime import datetime, timezone
import kanary
@kanary.source(source_id="demo", interval=10.0)
class DemoSource:
def poll(self, ctx):
return kanary.SourceResult(
measurements=[
kanary.Measurement(
name="temperature",
value=23.4,
timestamp=datetime.now(timezone.utc),
)
],
status="ok",
)
@kanary.rule(
rule_id="demo.temperature.high",
source="demo",
severity=kanary.WARN,
tags=["demo"],
owner="demo_owner",
)
class DemoTemperatureHigh:
threshold = 25.0
def evaluate(self, payload, ctx):
temperature = ctx.value("temperature")
if temperature is None:
return kanary.Evaluation(
state=kanary.AlertState.OK,
payload=payload,
message="temperature is missing",
)
if temperature > self.threshold:
return kanary.Evaluation(
state=kanary.AlertState.FIRING,
payload=payload,
message=f"temperature={temperature} is higher than {self.threshold}",
)
return kanary.Evaluation(
state=kanary.AlertState.OK,
payload=payload,
message=f"temperature={temperature} is within limit",
)
@kanary.output(output_id="console")
class ConsoleOutput:
def emit(self, event, ctx):
print(event.rule_id, event.current_state.value, event.alert.message)
In this example, you only implement the minimum interface:
- a source that returns values
- a rule that evaluates them
- an output that reacts to state changes
Internally, Kanary handles plugin loading, periodic source polling, rule evaluation, alert state tracking, the HTTP API, and the Web viewer.
If you want shorter definitions later, you can switch to built-in helper classes such as RangeRule, StaleRule, and ThresholdRule.
Users can create plugin class factory too.
Running Kanary
Basic run:
kanary ./demo
Change the API and Web viewer port:
kanary ./demo --api-port 8000
Expose the API and Web viewer on the LAN:
kanary ./demo --api-host 0.0.0.0 --api-port 8000
Persist history in SQLite:
kanary ./demo --state-db ./var/kanary.db
The Web viewer is available at:
http://<host>:8000/viewer
See all CLI options with:
kanary --help
kanaryctl help
Environment Variables
Kanary does not require any environment variables by default. You can use these when needed:
KANARY_SQLITE_PATHAlternative way to set the SQLite database path.KANARY_API_URLDefault API base URL forkanaryctl.KANARY_API_HOSTBind host for the local API and Web viewer. The default is0.0.0.0.KANARY_NODE_IDOptional node identifier for peer export and import. If unset, Kanary uses the hostname.
Connection details for actual monitoring targets are defined by each Source implementation. For example, a PostgreSQL source may use KANARY_POSTGRES_DSN.
Demo And Examples
Smallest example:
More realistic examples:
- examples/getting_started.py
- examples/factory_patterns.py
- examples/fake_alarm_monitoring.py
- examples/fake_alarm_target.py
- examples/sqlite_monitoring.py
- examples/sqlite_console_output.py
- examples/discord_webhook_output.py
- examples/latest_postgres.py
- examples/peer_monitoring.py
- examples/remote_alarm_import.py
demo/ is for the first working run. examples/ is closer to real deployments and includes helper classes, remote monitoring, PostgreSQL, and webhook outputs.
Web Viewer
Kanary includes a built-in Web viewer. The operational surface, however, is the HTTP API. The viewer is the standard UI built on top of that API, and you can replace it with your own tooling if needed.
Documentation
- docs/getting_started.md Hands-on introduction.
- docs/plugins.md Plugin interfaces and built-in helper classes.
- docs/operations.md Running Kanary, the viewer, the CLI, and persistence.
- docs/api.md
HTTP API and
kanaryctl. - docs/development.md Development, linting, and tests.
- docs/deployment.md
Deployment layout and
systemd.
Japanese versions are available as _ja documents, for example README_ja.md.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kanary-0.2.0.tar.gz.
File metadata
- Download URL: kanary-0.2.0.tar.gz
- Upload date:
- Size: 65.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f8a9909d35ab05add1f5099c6f77dfbc4f7559e8d104685de76cf72db4eea834
|
|
| MD5 |
808b379afc9a9d6586bf4278d3539a21
|
|
| BLAKE2b-256 |
009202f6394c9bf1ff0d0167a7ce79791ea6e7edcabfe09986d1861a958353c8
|
File details
Details for the file kanary-0.2.0-py3-none-any.whl.
File metadata
- Download URL: kanary-0.2.0-py3-none-any.whl
- Upload date:
- Size: 60.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6e83f077ec9379bfe8186afcc12d57c8d7687aa1e8e92c48f2d42a521749f702
|
|
| MD5 |
4eb4909703d587bc6cec78cf922de5e7
|
|
| BLAKE2b-256 |
82eb75520d2d5a7609c2ebb9e1aa224317aff003840c3dcbb4c96de088275749
|