Files
daena/pyproject.toml
T
ahp 06d233054b
CI / lint (push) Canceled after 0s
CI / test (push) Canceled after 0s
CI / release (push) Canceled after 0s
feat: per-sink delivery, journal forwarding, and operational API
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
2026-10-14 01:58:07 +03:30

97 lines
2.3 KiB
TOML

[project]
name = "daena"
version = "0.1.0"
description = "Collect, buffer, and forward logs and events from Linux to central observability backends"
readme = "README.md"
license = { file = "LICENSE" }
requires-python = ">=3.13"
authors = [
{ name = "Amir Husayn Panahifar", email = "ahp@panahifar.ir" },
]
keywords = ["logging", "observability", "linux", "daemon", "events"]
classifiers = [
"Development Status :: 3 - Alpha",
"Environment :: Console",
"Intended Audience :: System Administrators",
"License :: OSI Approved :: MIT License",
"Operating System :: POSIX :: Linux",
"Programming Language :: Python :: 3.13",
"Topic :: System :: Logging",
"Topic :: System :: Monitoring",
]
dependencies = [
"grpcio>=1.70",
"grpcio-tools>=1.70",
"protobuf>=5.28",
"pydantic>=2.0",
"pydantic-settings>=2.0",
"PyYAML>=6.0",
"structlog>=24.0",
"typer>=0.12",
"httpx>=0.28",
"lmdb>=1.5",
"tenacity>=8.0",
"rich>=13.0",
]
[project.optional-dependencies]
dev = [
"pytest>=8.0",
"pytest-asyncio>=0.24",
"pytest-cov>=5.0",
"mypy>=1.10",
"ruff>=0.5",
]
[project.scripts]
daena = "daena.cli.main:app"
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
[tool.ruff]
target-version = "py313"
line-length = 100
[tool.ruff.lint]
select = ["E", "F", "I", "N", "W", "UP", "B", "SIM", "ARG"]
[tool.ruff.format]
quote-style = "double"
[tool.mypy]
python_version = "3.13"
strict = true
warn_unused_ignores = true
exclude = [
"tests/",
".venv/",
]
[tool.pytest.ini_options]
testpaths = ["tests"]
asyncio_mode = "auto"
filterwarnings = [
"ignore::DeprecationWarning",
]
[build-system]
requires = ["hatchling>=1.25"]
build-backend = "hatchling.build"