"""API route modules""" """Routes for aggregate metrics""" from fastapi import APIRouter, HTTPException from app.models.jira_schema import MetricsResponse from app.services.vector_store import vector_store from app.utils.logger import setup_logger import pandas as pd logger = setup_logger(__name__) router = APIRouter() @router.get("/metrics", response_model=MetricsResponse) async def get_metrics(): """ Get aggregate metrics from Jira data - Average resolution time - Open/closed ticket counts - SLA compliance percentage """ try: logger.info("Calculating metrics...") info = vector_store.get_collection_info() total_tickets = info.get('vectors_count', 0) if total_tickets == 0: raise HTTPException(status_code=404, detail="No data available. Please ingest data first.") payloads = vector_store.get_payloads_sample(limit=100) if not payloads: raise HTTPException(status_code=404, detail="No tickets found in Faiss payloads") # Calculate metrics open_statuses = {'Open', 'In Progress', 'To Do'} closed_statuses = {'Closed', 'Done', 'Resolved'} open_tickets = sum(1 for p in payloads if (p.get('status') or '') in open_statuses) closed_tickets = sum(1 for p in payloads if (p.get('status') or '') in closed_statuses) # Average resolution time (days) resolution_times = [] for p in payloads: created = p.get('created_date') resolved = p.get('resolved_date') if created and resolved: try: c = pd.to_datetime(created) r = pd.to_datetime(resolved) delta = (r - c).days if delta >= 0: resolution_times.append(delta) except Exception: pass avg_resolution = (sum(resolution_times) / len(resolution_times)) if resolution_times else 0.0 avg_resolution_str = f"{avg_resolution:.1f} days" # SLA compliance: resolved within 5 days sla_threshold = 5 sla_compliant = sum(1 for t in resolution_times if t <= sla_threshold) sla_pct = (sla_compliant / len(resolution_times) * 100) if resolution_times else 0.0 sla_compliance_str = f"{sla_pct:.0f}%" return MetricsResponse( avg_resolution_time=avg_resolution_str, open_tickets=open_tickets, closed_tickets=closed_tickets, sla_compliance=sla_compliance_str, total_tickets=total_tickets ) except HTTPException: raise except Exception as e: logger.error(f"Metrics calculation failed: {str(e)}") raise HTTPException(status_code=500, detail=str(e))