Plugin System¶
Nuvom v0.9 introduced first-class plugin support — allowing developers to register their own backends, extensions, and instrumentation layers with clean lifecycle management.
What is a Plugin?¶
A plugin is a Python class that implements the Plugin
protocol, defining:
name
: Unique plugin nameprovides
: What kind of capability it offers (e.g.queue_backend
,monitoring
)start(settings: dict)
: Initialization logicstop()
: Cleanup logic on shutdown
File Layout¶
Plugins can live inside your project or in external libraries. Common layout:
my_project/
├── plugins/
│ ├── my_plugin.py # Your plugin logic
│ └── __init__.py
└── .nuvom_plugins.toml # Plugin registration
Plugin Example: Custom Queue Backend¶
# plugins/my_queue.py
from nuvom.queue_backends.base import BaseJobQueue
from nuvom.plugins.contracts import Plugin
class MyQueue(BaseJobQueue):
def enqueue(self, job): ...
def dequeue(self, timeout=None): ...
def pop_batch(self, n): ...
def qsize(self): ...
def clear(self): ...
class MyPlugin(Plugin):
name = "my_queue"
provides = ["queue_backend"]
def start(self, settings):
from nuvom.plugins.registry import register_queue_backend
register_queue_backend("my_custom_queue", MyQueue)
def stop(self):
pass
Then register in .nuvom_plugins.toml
:
[plugins]
queue_backend = ["plugins.my_queue:MyPlugin"]
Plugin Registry¶
Nuvom loads plugins at worker startup (not during CLI commands).
Each plugin is discovered from .nuvom_plugins.toml
, instantiated, and injected with runtime settings.
To test plugin loading:
nuvom plugin test
nuvom plugin list
nuvom plugin inspect my_queue
Plugin Lifecycle¶
Each plugin receives a start(settings)
call when the worker starts.
Example use cases:
- Registering new backends
- Spawning monitoring threads
- Configuring metrics exporters
- Connecting to databases
On shutdown (CTRL+C
, SIGINT), plugins receive a stop()
call to clean up.
Plugin Types¶
Provides | Purpose |
---|---|
queue_backend |
Add a new job queue implementation |
result_backend |
Add a result/error store |
monitoring |
Expose runtime metrics (e.g. Prometheus) |
lifecycle_hook |
Run logic on job events (future) |
Monitoring Plugin Example¶
# plugins/prometheus_exporter.py
from nuvom.plugins.contracts import Plugin
from nuvom.plugins.registry import register_metrics_provider
class PrometheusPlugin(Plugin):
name = "prometheus"
provides = ["monitoring"]
def start(self, settings):
from my_exporter import run_exporter
run_exporter(port=settings.get("prometheus_port", 9150))
def stop(self):
...
Best Practices¶
- Keep plugins self-contained.
- Use
settings
from.env
or custom sources. - Fail fast if required dependencies are missing.
- Avoid blocking inside
start()
— spawn threads if needed. - Don’t forget
stop()
for graceful cleanup.
CLI Support¶
Command | Description |
---|---|
nuvom plugin test |
Validates and loads plugins |
nuvom plugin list |
Lists registered plugin types |
nuvom plugin inspect |
Shows metadata for one plugin |
Roadmap (Future Plugin Hooks)¶
Feature | Status |
---|---|
before_job , after_job |
[ ] Planned (via plugin) |
metrics_provider interface |
✅ Prometheus supported |
CLI plugin extensions | [ ] Future |
Multi-process plugin runners | [ ] Future |
Summary¶
Plugins allow you to:
- Add new backends (queue, result)
- Hook into Nuvom’s lifecycle
- Export runtime metrics
- Customize behavior without modifying Nuvom core
Plugins make Nuvom truly pluggable. Add what you need — nothing more.