vip11017's picture
Added logged in access funtcionality
5749e42
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
}