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