Spaces:
Sleeping
Sleeping
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
} |