Update observability docs and task utilities

- Add Observability.md documentation
- Standardize task logging with correlation_id support
- Add log_sanitizer utility for PII masking
- Update Tasks.md tracking
- Update geo_cache tasks and other task modules with correlation_id

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-05-03 11:52:09 +02:00
parent 7b93499551
commit 0133489920
17 changed files with 582 additions and 124 deletions

View File

@@ -2,11 +2,15 @@
Periodically copies new records from the fail2ban sqlite database into the
BanGUI application archive table to prevent gaps when fail2ban purges old rows.
Correlation IDs are propagated through the task using :mod:`app.utils.correlation`
so that task logs can be correlated across runs.
"""
from __future__ import annotations
import datetime
import uuid
from typing import TYPE_CHECKING
import structlog
@@ -14,6 +18,7 @@ import structlog
from app.services import history_service
from app.tasks.db import task_db
from app.tasks.timeout_utils import run_with_timeout
from app.utils.correlation import get_correlation_id, reset_correlation_id, set_correlation_id
from app.utils.runtime_state import get_effective_settings
if TYPE_CHECKING:
@@ -36,16 +41,32 @@ BACKFILL_WINDOW: int = 648000
TASK_TIMEOUT_SECONDS: int = 60
async def _run_sync_with_settings(settings: Settings) -> None:
async def _run_sync_with_settings(
settings: Settings,
correlation_id: str | None = None,
) -> None:
"""Run the history sync with correlation ID context."""
if correlation_id is None:
correlation_id = str(uuid.uuid4())
token = set_correlation_id(correlation_id)
try:
await _do_sync_with_settings(settings)
finally:
reset_correlation_id(token)
async def _do_sync_with_settings(settings: Settings) -> None:
"""Inner sync logic that runs with correlation context set."""
socket_path: str = settings.fail2ban_socket
async def _do_sync() -> None:
try:
async with task_db(settings) as db:
synced = await history_service.sync_from_fail2ban_db(db, socket_path)
log.info("history_sync_complete", synced=synced)
log.info("history_sync_complete", correlation_id=get_correlation_id(), synced=synced)
except Exception:
log.exception("history_sync_failed")
log.exception("history_sync_failed", correlation_id=get_correlation_id())
await run_with_timeout("history_sync", _do_sync(), TASK_TIMEOUT_SECONDS)