AskXeno / src /utils.py
github-actions
Sync from GitHub
3cdce90
"""
Utilities module for XENO Bot
Handles logging and timing functionality
"""
import logging
import sys
import time
from contextlib import contextmanager
from datetime import datetime
from typing import Dict
# ===== Configure Logging =====
logging.basicConfig(
filename="app.log",
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s",
)
def log_exception(exc_type, exc_value, exc_traceback):
"""Log uncaught exceptions"""
if issubclass(exc_type, KeyboardInterrupt):
return
logging.critical(
"Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback)
)
sys.excepthook = log_exception
logging.info("App started successfully.")
# ===== Time Tracking Class =====
class PipelineTimer:
"""Timer for tracking pipeline execution steps"""
def __init__(self):
self.reset()
def reset(self):
"""Reset all timing data for a new request"""
self.start_time = time.time()
self.step_times = {}
self.step_start = None
self.current_step = None
@contextmanager
def time_step(self, step_name: str):
"""Context manager to time a specific step"""
step_start = time.time()
self.current_step = step_name
try:
yield
finally:
step_end = time.time()
self.step_times[step_name] = round(
(step_end - step_start) * 1000, 2
) # Convert to milliseconds
self.current_step = None
def get_total_time(self):
"""Get total elapsed time since reset"""
return round((time.time() - self.start_time) * 1000, 2)
def get_timing_summary(self) -> Dict:
"""Get a summary of all timing data"""
total_time = self.get_total_time()
return {
"total_time_ms": total_time,
"step_times": self.step_times,
"timestamp": datetime.now().isoformat(),
}