phase 4
This commit is contained in:
52
core/gpu/emit.py
Normal file
52
core/gpu/emit.py
Normal file
@@ -0,0 +1,52 @@
|
||||
"""
|
||||
Lightweight event emitter for the GPU inference server.
|
||||
|
||||
Pushes debug logs to the same Redis stream as the pipeline orchestrator,
|
||||
so GPU-side details (model load, VRAM, inference timing) appear in the
|
||||
same log panel.
|
||||
|
||||
Only active when the request includes X-Job-Id header.
|
||||
No dependency on the detect package.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import os
|
||||
from datetime import datetime, timezone
|
||||
|
||||
import redis
|
||||
|
||||
REDIS_URL = os.environ.get("REDIS_URL", "redis://localhost:6379/0")
|
||||
EVENTS_PREFIX = "detect_events"
|
||||
|
||||
_LEVEL_ORDER = {"DEBUG": 0, "INFO": 1, "WARN": 2, "ERROR": 3}
|
||||
|
||||
_redis_client = None
|
||||
|
||||
|
||||
def _get_redis():
|
||||
global _redis_client
|
||||
if _redis_client is None:
|
||||
_redis_client = redis.from_url(REDIS_URL, decode_responses=True)
|
||||
return _redis_client
|
||||
|
||||
|
||||
def log(job_id: str, stage: str, level: str, msg: str, log_level: str = "INFO"):
|
||||
"""Push a log event to Redis if the level meets the threshold."""
|
||||
if not job_id:
|
||||
return
|
||||
if _LEVEL_ORDER.get(level.upper(), 1) < _LEVEL_ORDER.get(log_level.upper(), 1):
|
||||
return
|
||||
|
||||
r = _get_redis()
|
||||
key = f"{EVENTS_PREFIX}:{job_id}"
|
||||
event = json.dumps({
|
||||
"event": "log",
|
||||
"level": level,
|
||||
"stage": stage,
|
||||
"msg": msg,
|
||||
"ts": datetime.now(timezone.utc).isoformat(),
|
||||
})
|
||||
r.rpush(key, event)
|
||||
r.expire(key, 3600)
|
||||
Reference in New Issue
Block a user