Unrealon SDK - Service management for Django backend (registration, heartbeat, logging, commands)
Project description
Unrealon SDK
Python SDK for monitoring and managing services via the Unrealon platform.
Features
- Monitoring — real-time service status visibility
- Cloud Logs — all logs accessible in the web interface
- Control — pause/resume/stop directly from the dashboard
- Metrics — counters for processed items and errors
- Scheduling — automatic cron-based task execution
Installation
pip install unrealon
Quick Start
Minimal Example
from unrealon import ServiceClient
with ServiceClient(api_key="pk_xxx", service_name="my-service") as client:
client.info("Started")
for item in items:
process(item)
client.increment_processed()
client.info("Done")
The service will register, logs will stream to cloud, and metrics will be displayed.
With Pause/Resume Support
from unrealon import ServiceClient
with ServiceClient(api_key="pk_xxx", service_name="my-parser") as client:
client.info("Started")
for item in items:
client.check_interrupt() # Parser pauses here if Pause is clicked
process(item)
client.increment_processed()
client.info("Done")
check_interrupt() does two things:
- If Pause was clicked — waits until Resume
- If Stop was clicked — raises
StopInterrupt
Continuous Mode
A service that waits for commands from the dashboard:
import time
from unrealon import ServiceClient
from unrealon.exceptions import StopInterrupt
with ServiceClient(api_key="pk_xxx", service_name="my-parser") as client:
def handle_run(params: dict) -> dict:
limit = params.get("limit", 100)
client.set_busy()
try:
for i in range(limit):
client.check_interrupt()
do_work()
client.increment_processed()
return {"status": "ok"}
except StopInterrupt:
return {"status": "stopped"}
finally:
client.set_idle()
client.on_command("run", handle_run)
# Wait for commands
client.set_idle()
while not client.should_stop:
time.sleep(1)
Now from the dashboard you can:
- Click Run — executes
handle_run - Click Pause — parser stops at
check_interrupt() - Click Resume — continues from where it left off
- Click Stop — graceful shutdown
API
Logging
client.debug("Debug message")
client.info("Info message", key="value")
client.warning("Warning")
client.error("Error", code=500)
Logs go to three places: console (Rich), file, and cloud.
Metrics
client.increment_processed() # +1 processed
client.increment_processed(10) # +10 processed
client.increment_errors() # +1 error
Status
client.set_busy() # Shows "Busy" in dashboard
client.set_idle() # Shows "Idle"
State
client.is_paused # True if paused
client.should_stop # True if stop requested
client.is_connected # True if connected to server
Commands
# Register handler
client.on_command("run", handle_run)
client.on_command("custom", handle_custom)
# Handler receives params and returns result
def handle_run(params: dict) -> dict:
limit = params.get("limit", 10)
# ... do work ...
return {"status": "ok", "processed": 100}
Schedules
Schedules run automatically based on cron expressions.
If the schedule's action_type matches a registered command,
the same handler is used:
# This handler works for both manual Run and scheduled runs
client.on_command("run", handle_run)
For different behavior, register a schedule-specific handler:
@client.on_schedule("process")
def handle_scheduled_process(schedule, params):
# schedule.name, schedule.id are available
return {"items_processed": 100}
Configuration
Via Environment Variables
export UNREALON_API_KEY=pk_xxx
export UNREALON_SERVICE_NAME=my-service
# Picks up from env
with ServiceClient() as client:
...
Dev Mode (Local Server)
with ServiceClient(
api_key="dk_xxx",
service_name="my-service",
dev_mode=True, # Connects to localhost:50051
) as client:
...
Exceptions
from unrealon.exceptions import (
StopInterrupt, # Stop requested (inherits BaseException!)
UnrealonError, # Base SDK error
AuthenticationError, # Bad API key
RegistrationError, # Can't register
)
try:
with ServiceClient(...) as client:
for item in items:
client.check_interrupt()
process(item)
except StopInterrupt:
print("Stopped by command")
Important: StopInterrupt inherits from BaseException, not Exception.
This means except Exception won't catch it — by design, so generic
error handlers don't swallow the stop command.
Standalone Logger
You can use the logger separately from the SDK:
from unrealon.logging import get_logger
log = get_logger("myapp")
log.info("Starting", version="1.0")
log.error("Failed", error="connection timeout")
Logs go to console and file (without cloud).
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 unrealon-0.1.19.tar.gz.
File metadata
- Download URL: unrealon-0.1.19.tar.gz
- Upload date:
- Size: 75.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a5cc49666dcb2771c17b350d1450e7f07927a2a4cd7d9ae918408e3d61fff9ff
|
|
| MD5 |
4c5f1e030f18986e722644c8486f770e
|
|
| BLAKE2b-256 |
7b0b06fd1cef26cf9631d3c676436df825b0f9b68b425e43744b32cb8e830655
|
File details
Details for the file unrealon-0.1.19-py3-none-any.whl.
File metadata
- Download URL: unrealon-0.1.19-py3-none-any.whl
- Upload date:
- Size: 127.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eb0ae3d646953e1665c53e20bf5989abdffa6472f717bcd31864d8900e0a8e50
|
|
| MD5 |
f8b7c79033824ca0221d2b4a2361c0af
|
|
| BLAKE2b-256 |
33ef916033f1864378f0eefa809e09050d332a55f96d9fb52a1513ad25f758ff
|