File size: 2,808 Bytes
6ebb923
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
"""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))