fix: harden events log — non-dict ring entries, off-loop journal reads, no default-config singleton
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+8
-4
@@ -389,10 +389,14 @@ async def start(
|
|||||||
|
|
||||||
ej = journal_mod.get_events_journal(config)
|
ej = journal_mod.get_events_journal(config)
|
||||||
if ej.enabled and ej.journal_path.is_file():
|
if ej.enabled and ej.journal_path.is_file():
|
||||||
events, more = journal_mod.read_events(
|
# File scan can be large; keep it off the loop that services UDP/WS
|
||||||
ej.journal_dir, ej.journal_file,
|
events, more = await asyncio.get_running_loop().run_in_executor(
|
||||||
limit=limit, before=before, host=host_f, level=level_f, q=q_f,
|
None,
|
||||||
predicate=visible,
|
lambda: journal_mod.read_events(
|
||||||
|
ej.journal_dir, ej.journal_file,
|
||||||
|
limit=limit, before=before, host=host_f, level=level_f, q=q_f,
|
||||||
|
predicate=visible,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
# Journal disabled or not yet written: serve the in-memory ring
|
# Journal disabled or not yet written: serve the in-memory ring
|
||||||
|
|||||||
@@ -379,6 +379,8 @@ def filter_events(
|
|||||||
q_l = q.lower() if q else None
|
q_l = q.lower() if q else None
|
||||||
out: List[Dict[str, Any]] = []
|
out: List[Dict[str, Any]] = []
|
||||||
for ev in events:
|
for ev in events:
|
||||||
|
if not isinstance(ev, dict):
|
||||||
|
continue
|
||||||
ts = ev.get('ts')
|
ts = ev.get('ts')
|
||||||
if before is not None and (not isinstance(ts, (int, float)) or ts >= before):
|
if before is not None and (not isinstance(ts, (int, float)) or ts >= before):
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -142,8 +142,8 @@ def _journal_event(msg: dict):
|
|||||||
if _loop is None or not _loop.is_running():
|
if _loop is None or not _loop.is_running():
|
||||||
return
|
return
|
||||||
from . import journal as journal_mod
|
from . import journal as journal_mod
|
||||||
ej = journal_mod.get_events_journal()
|
ej = journal_mod._events_journal_instance
|
||||||
if not ej.enabled:
|
if ej is None or not ej.enabled:
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
asyncio.run_coroutine_threadsafe(ej.log_event(msg), _loop)
|
asyncio.run_coroutine_threadsafe(ej.log_event(msg), _loop)
|
||||||
|
|||||||
@@ -220,6 +220,18 @@ def test_filter_events_over_in_memory_ring():
|
|||||||
assert more is True
|
assert more is True
|
||||||
|
|
||||||
|
|
||||||
|
def test_filter_events_skips_non_dict_entries():
|
||||||
|
ring = [
|
||||||
|
{"ts": 1.0, "host": "h", "level": "INFO", "service": None, "message": "a"},
|
||||||
|
"legacy string entry",
|
||||||
|
None,
|
||||||
|
{"ts": 2.0, "host": "h", "level": "INFO", "service": None, "message": "b"},
|
||||||
|
]
|
||||||
|
events, more = journal.filter_events(reversed(ring), limit=10)
|
||||||
|
assert [e["ts"] for e in events] == [2.0, 1.0]
|
||||||
|
assert more is False
|
||||||
|
|
||||||
|
|
||||||
# ---- eventlog wiring --------------------------------------------------------
|
# ---- eventlog wiring --------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user