File size: 3,359 Bytes
5749e42
7994b38
 
5749e42
7994b38
 
 
 
 
5749e42
7994b38
5749e42
 
7994b38
 
 
 
 
5749e42
7994b38
b472a0e
5749e42
 
b472a0e
5749e42
 
 
 
 
 
 
 
 
 
 
 
 
7994b38
b472a0e
7994b38
5749e42
7994b38
 
b472a0e
5749e42
b472a0e
7994b38
 
 
5749e42
7994b38
 
 
 
b472a0e
7994b38
5749e42
7994b38
 
b472a0e
5749e42
b472a0e
7994b38
 
 
 
 
 
 
 
b472a0e
 
 
13e24c4
7994b38
b472a0e
7994b38
 
b472a0e
5749e42
b472a0e
7994b38
 
 
5749e42
7994b38
 
 
 
 
 
 
 
5749e42
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
from fastapi import APIRouter, Query, Depends, HTTPException
from app.mongodb import chat_logs
from datetime import datetime
from app.verify_access import verify_access

router = APIRouter(prefix="/api/analytics", tags=["Analytics"])

@router.get("/overview")
async def get_analytics_overview(
    chatbot_id: str,
    start_date: str | None = Query(None, description="Start date YYYY-MM-DD"),
    end_date: str | None = Query(None, description="End date YYYY-MM-DD"),
    access=Depends(verify_access)
):
    """
    Returns aggregated analytics data for charts:
    - sessions_per_day
    - requests_per_day
    - avg_latency_per_day
    """

    # --- Build match filter ---
    match_filter = {"chatbot_id": chatbot_id}

    if start_date:
        try:
            match_filter["timestamp"] = match_filter.get("timestamp", {})
            match_filter["timestamp"]["$gte"] = datetime.strptime(start_date, "%Y-%m-%d")
        except ValueError:
            raise HTTPException(status_code=400, detail="Invalid start_date format. Use YYYY-MM-DD")

    if end_date:
        try:
            match_filter["timestamp"] = match_filter.get("timestamp", {})
            match_filter["timestamp"]["$lte"] = datetime.strptime(end_date, "%Y-%m-%d")
        except ValueError:
            raise HTTPException(status_code=400, detail="Invalid end_date format. Use YYYY-MM-DD")

    # --- Sessions per day ---
    pipeline_sessions = [
        {"$match": match_filter},
        {
            "$group": {
                "_id": {
                    "$dateToString": {"format": "%Y-%m-%d", "date": "$timestamp", "timezone": "America/Los_Angeles"}
                },
                "unique_sessions": {"$addToSet": "$session_id"}
            }
        },
        {"$project": {"date": "$_id", "count": {"$size": "$unique_sessions"}, "_id": 0}},
        {"$sort": {"date": 1}}
    ]
    sessions_per_day = await chat_logs.aggregate(pipeline_sessions).to_list(length=None)

    # --- Requests per day ---
    pipeline_requests = [
        {"$match": match_filter},
        {
            "$group": {
                "_id": {
                    "$dateToString": {"format": "%Y-%m-%d", "date": "$timestamp", "timezone": "America/Los_Angeles"}
                },
                "count": {"$sum": 1}
            }
        },
        {"$project": {"date": "$_id", "count": 1, "_id": 0}},
        {"$sort": {"date": 1}}
    ]
    requests_per_day = await chat_logs.aggregate(pipeline_requests).to_list(length=None)

    # --- Average latency per day ---
    latency_filter = match_filter.copy()
    latency_filter["latency_ms"] = {"$exists": True}

    pipeline_latency = [
        {"$match": latency_filter},
        {
            "$group": {
                "_id": {
                    "$dateToString": {"format": "%Y-%m-%d", "date": "$timestamp", "timezone": "America/Los_Angeles"}
                },
                "avg_latency": {"$avg": "$latency_ms"}
            }
        },
        {"$project": {"date": "$_id", "avg_latency": {"$divide": ["$avg_latency", 1000]}, "_id": 0}},
        {"$sort": {"date": 1}}
    ]
    avg_latency_per_day = await chat_logs.aggregate(pipeline_latency).to_list(length=None)

    return {
        "sessions_per_day": sessions_per_day,
        "requests_per_day": requests_per_day,
        "avg_latency_per_day": avg_latency_per_day
    }