recorder.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. from datetime import datetime, timezone
  2. from enum import Enum
  3. from logging import Logger
  4. from typing import Dict, List, Optional
  5. from gpustack.schemas.models import Model
  6. class EventLevelEnum(str, Enum):
  7. INFO = "info"
  8. WARNING = "warning"
  9. ERROR = "error"
  10. class Event:
  11. def __init__(
  12. self,
  13. level: EventLevelEnum,
  14. action: str,
  15. message: str,
  16. reason: Optional[str] = None,
  17. **kwargs,
  18. ):
  19. self.level = level
  20. self.action = action
  21. self.message = message
  22. self.reason = reason
  23. self.timestamp = datetime.now(timezone.utc).isoformat()
  24. for key, value in kwargs.items():
  25. setattr(self, key, value)
  26. class EventCollector:
  27. def __init__(self, model: Model, event_logger: Optional[Logger] = None):
  28. self.events: List[Event] = []
  29. self._event_logger = event_logger
  30. self._model = model
  31. self._event_keys: Dict[str, True] = {}
  32. def add(self, event_level: EventLevelEnum, action: str, message: str, **kwargs):
  33. key = f"{event_level}-{action}-{message}"
  34. if key in self._event_keys:
  35. return
  36. self.events.append(Event(event_level, action, message, **kwargs))
  37. self._event_keys[key] = True
  38. if self._event_logger:
  39. msg = f"Action: {action}, {message}, {kwargs}, model: {self._model.readable_source}"
  40. if event_level == EventLevelEnum.ERROR:
  41. self._event_logger.error(msg)
  42. elif event_level == EventLevelEnum.WARNING:
  43. self._event_logger.warning(msg)
  44. else:
  45. self._event_logger.info(msg)