mentalwellness / utils /analytics_logger.py
invincible-jha's picture
Add comprehensive logging system and analytics with log rotation
f83b968
from typing import Dict, Any, Optional
import json
import time
from datetime import datetime
from utils.log_manager import LogManager
class AnalyticsLogger:
"""Handles logging of analytics events and metrics"""
def __init__(self):
self.log_manager = LogManager()
self.logger = self.log_manager.get_analytics_logger("events")
self.metrics_logger = self.log_manager.get_analytics_logger("metrics")
def log_user_interaction(self,
user_id: str,
interaction_type: str,
agent_type: str,
duration: float,
success: bool,
details: Optional[Dict] = None):
"""Log user interaction events"""
event = {
"event_type": "user_interaction",
"user_id": user_id,
"interaction_type": interaction_type,
"agent_type": agent_type,
"duration": duration,
"success": success,
"timestamp": datetime.now().isoformat(),
"details": details or {}
}
self.logger.info(f"User Interaction: {json.dumps(event, indent=2)}")
def log_agent_performance(self,
agent_type: str,
operation: str,
response_time: float,
success: bool,
error: Optional[str] = None):
"""Log agent performance metrics"""
metric = {
"metric_type": "agent_performance",
"agent_type": agent_type,
"operation": operation,
"response_time": response_time,
"success": success,
"error": error,
"timestamp": datetime.now().isoformat()
}
self.metrics_logger.info(f"Agent Performance: {json.dumps(metric, indent=2)}")
def log_system_health(self,
cpu_usage: float,
memory_usage: float,
active_users: int,
active_sessions: int):
"""Log system health metrics"""
metric = {
"metric_type": "system_health",
"cpu_usage": cpu_usage,
"memory_usage": memory_usage,
"active_users": active_users,
"active_sessions": active_sessions,
"timestamp": datetime.now().isoformat()
}
self.metrics_logger.info(f"System Health: {json.dumps(metric, indent=2)}")
def log_error(self,
error_type: str,
error_message: str,
severity: str,
context: Optional[Dict] = None):
"""Log error events"""
event = {
"event_type": "error",
"error_type": error_type,
"error_message": error_message,
"severity": severity,
"context": context or {},
"timestamp": datetime.now().isoformat()
}
self.logger.error(f"Error Event: {json.dumps(event, indent=2)}")
def log_security_event(self,
event_type: str,
user_id: str,
success: bool,
details: Optional[Dict] = None):
"""Log security-related events"""
event = {
"event_type": "security",
"security_event_type": event_type,
"user_id": user_id,
"success": success,
"details": details or {},
"timestamp": datetime.now().isoformat()
}
self.logger.info(f"Security Event: {json.dumps(event, indent=2)}")
def log_model_performance(self,
model_name: str,
operation: str,
input_tokens: int,
output_tokens: int,
response_time: float,
success: bool):
"""Log AI model performance metrics"""
metric = {
"metric_type": "model_performance",
"model_name": model_name,
"operation": operation,
"input_tokens": input_tokens,
"output_tokens": output_tokens,
"response_time": response_time,
"success": success,
"timestamp": datetime.now().isoformat()
}
self.metrics_logger.info(f"Model Performance: {json.dumps(metric, indent=2)}")
def log_user_feedback(self,
user_id: str,
interaction_id: str,
rating: int,
feedback_text: Optional[str] = None):
"""Log user feedback"""
event = {
"event_type": "user_feedback",
"user_id": user_id,
"interaction_id": interaction_id,
"rating": rating,
"feedback_text": feedback_text,
"timestamp": datetime.now().isoformat()
}
self.logger.info(f"User Feedback: {json.dumps(event, indent=2)}")
def log_session_metrics(self,
session_id: str,
user_id: str,
session_type: str,
start_time: str,
end_time: str,
metrics: Dict[str, Any]):
"""Log session-specific metrics"""
session_data = {
"metric_type": "session_metrics",
"session_id": session_id,
"user_id": user_id,
"session_type": session_type,
"start_time": start_time,
"end_time": end_time,
"duration": self._calculate_duration(start_time, end_time),
"metrics": metrics,
"timestamp": datetime.now().isoformat()
}
self.metrics_logger.info(f"Session Metrics: {json.dumps(session_data, indent=2)}")
def _calculate_duration(self, start_time: str, end_time: str) -> float:
"""Calculate duration between two ISO format timestamps"""
start = datetime.fromisoformat(start_time)
end = datetime.fromisoformat(end_time)
return (end - start).total_seconds()