Complete implementation of the daena log/event collection service:
Core runtime:
- DaenaRuntime service lifecycle (start/stop/reload)
- Pipeline orchestrator with source/persist/dispatch flow
- LMDB persistence backend with key-prefix partitioning
- Plugin discovery via Python entry points
Pipeline:
- Source/Processor/Sink ABC interfaces with DeliveryResult
- DummySource for testing and development
- DummySink and HTTPSink implementations
- PassthroughProcessor
- Record dataclass for in-memory records
- StoredRecord model with RecordState tracking
REST API (FastAPI, v1):
- GET /system/{status,health,config}
- GET /plugins
- GET /queue, /queue/{pending,dead}
- GET /sinks
- Versioned under /api/v1 prefix
CLI (Typer):
- status, health, queue, sinks, plugins, config, version
Persistence (LMDB):
- Single-database key-prefix design (no named DBs)
- Index keys: idx:{state}:{ts}\x00{id}
- Record keys: rec:{id}
- Full CRUD: put/get/ack/nack/dead/update_state
- Pending/retry/dead-letter queries with state filtering
- delete_old for TTL-based retention
Deployment:
- systemd unit file (deploy/daena.service)
- Example YAML config (config/daena.yaml)
- Entry points: daena (CLI), daena-serve (uvicorn server)
Quality:
- 23 unit tests covering config, persistence, pipeline
- ruff linting and formatting pass clean
- Py3.13 compatible, uv-managed, pyenv-pinned
- GPG-signed commit on dev branch
48 lines
698 B
YAML
48 lines
698 B
YAML
# daena configuration
|
|
# Path: /etc/daena/daena.yaml
|
|
|
|
data_dir: /var/lib/daena
|
|
log_dir: /var/log/daena
|
|
pid_file: /run/daena/daena.pid
|
|
|
|
logging:
|
|
level: info
|
|
format: json
|
|
|
|
api:
|
|
http:
|
|
host: 127.0.0.1
|
|
port: 8642
|
|
workers: 1
|
|
|
|
pipeline:
|
|
batch_size: 100
|
|
flush_interval: 5.0
|
|
max_queue_size: 10000
|
|
|
|
persistence:
|
|
backend: lmdb
|
|
lmdb:
|
|
path: /var/lib/daena/data
|
|
map_size: 104857600
|
|
max_databases: 16
|
|
|
|
sources:
|
|
- name: dummy
|
|
type: dummy
|
|
enabled: true
|
|
options:
|
|
interval: 5.0
|
|
message: "daena heartbeat"
|
|
|
|
processors:
|
|
- name: passthrough
|
|
type: passthrough
|
|
enabled: true
|
|
|
|
sinks:
|
|
- name: log
|
|
type: dummy
|
|
enabled: true
|
|
options: {}
|