diff --git a/hbd/server/http.py b/hbd/server/http.py index 25d0a24..34294b9 100644 --- a/hbd/server/http.py +++ b/hbd/server/http.py @@ -389,10 +389,14 @@ async def start( ej = journal_mod.get_events_journal(config) if ej.enabled and ej.journal_path.is_file(): - events, more = 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, + # File scan can be large; keep it off the loop that services UDP/WS + events, more = await asyncio.get_running_loop().run_in_executor( + None, + 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: # Journal disabled or not yet written: serve the in-memory ring diff --git a/hbd/server/journal.py b/hbd/server/journal.py index 3450c65..5b25030 100644 --- a/hbd/server/journal.py +++ b/hbd/server/journal.py @@ -379,6 +379,8 @@ def filter_events( q_l = q.lower() if q else None out: List[Dict[str, Any]] = [] for ev in events: + if not isinstance(ev, dict): + continue ts = ev.get('ts') if before is not None and (not isinstance(ts, (int, float)) or ts >= before): continue diff --git a/hbd/server/notify.py b/hbd/server/notify.py index e53aa1c..c5b9f27 100644 --- a/hbd/server/notify.py +++ b/hbd/server/notify.py @@ -142,8 +142,8 @@ def _journal_event(msg: dict): if _loop is None or not _loop.is_running(): return from . import journal as journal_mod - ej = journal_mod.get_events_journal() - if not ej.enabled: + ej = journal_mod._events_journal_instance + if ej is None or not ej.enabled: return try: asyncio.run_coroutine_threadsafe(ej.log_event(msg), _loop) diff --git a/tests/test_events_journal.py b/tests/test_events_journal.py index 444409e..2de05b2 100644 --- a/tests/test_events_journal.py +++ b/tests/test_events_journal.py @@ -220,6 +220,18 @@ def test_filter_events_over_in_memory_ring(): 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 --------------------------------------------------------