feat: per-sink delivery, journal forwarding, and operational API
CI / lint (push) Canceled after 0s
CI / test (push) Canceled after 0s
CI / release (push) Canceled after 0s

Persistence:
- one delivery state per sink, with claim, crash recovery, and index replacement
- retention for delivered and dead records
- LMDB writes moved off the event loop

Pipeline:
- one attempt per dispatch, with the next try scheduled by next_retry_at
- backpressure through max_queue_size
- reload re-reads YAML; SIGTERM drains and SIGHUP reloads

Plugins:
- journald source, enricher and filter processors, Loki sink
- built-ins register when entry points are missing

API and CLI:
- health, metrics, per-sink queue, and dead-letter replay
- startup prints the pipeline on one line

Tests:
- dispatch, plugins, metrics, CLI, and persistence coverage
This commit is contained in:
ahp
2026-10-14 01:58:07 +03:30
parent 5e081144d5
commit 06d233054b
38 changed files with 3282 additions and 557 deletions
+4
View File
@@ -50,13 +50,17 @@ daena-serve = "daena.app:serve"
[project.entry-points."daena.sources"]
dummy = "daena.pipeline.sources.dummy:DummySource"
journald = "daena.pipeline.sources.journald:JournaldSource"
[project.entry-points."daena.sinks"]
dummy = "daena.pipeline.sinks.dummy:DummySink"
http = "daena.pipeline.sinks.http:HTTPSink"
loki = "daena.pipeline.sinks.loki:LokiSink"
[project.entry-points."daena.processors"]
passthrough = "daena.pipeline.processors.passthrough:PassthroughProcessor"
enricher = "daena.pipeline.processors.enricher:EnricherProcessor"
filter = "daena.pipeline.processors.filter:FilterProcessor"
[tool.pyproject-fmt]
max_blank_lines = 1