-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapi.py
More file actions
70 lines (54 loc) · 2.06 KB
/
Copy pathapi.py
File metadata and controls
70 lines (54 loc) · 2.06 KB
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
import logging
import metrics # noqa: F401 - imported to register prometheus metrics
from fastapi import FastAPI, HTTPException, Query
from prometheus_client import generate_latest, CONTENT_TYPE_LATEST
from starlette.responses import Response
from analytics.user_analytics import UserAnalytics
from analytics.user_per_day_analytics import UserPerDayAnalytics
from db import DB
logger = logging.getLogger(__name__)
app = FastAPI(title="groceror-users analytics", version="1.0")
@app.get("/health")
def health():
return {"status": "ok"}
@app.get("/metrics")
def get_metrics():
return Response(generate_latest(), media_type=CONTENT_TYPE_LATEST)
def _analytics():
db = DB()
return db, UserAnalytics(db), UserPerDayAnalytics(db)
@app.get("/analytics/registrations-per-day")
def registrations_per_day(limit: int = Query(default=30, ge=1, le=365)):
db, _, per_day = _analytics()
try:
return {"days": per_day.registrations_per_day(limit)}
except Exception as exc:
logger.error("registrations_per_day failed: %s", exc)
raise HTTPException(status_code=500, detail="Analytics query failed")
finally:
db.close()
@app.get("/analytics/events-per-day")
def events_per_day(limit: int = Query(default=30, ge=1, le=365)):
db, _, per_day = _analytics()
try:
return {"days": per_day.events_per_day(limit)}
except Exception as exc:
logger.error("events_per_day failed: %s", exc)
raise HTTPException(status_code=500, detail="Analytics query failed")
finally:
db.close()
@app.get("/analytics/summary")
def summary():
db, analytics, _ = _analytics()
try:
return {
"total_users": analytics.total_users(),
"active_users": analytics.active_users(),
"users_by_entity_type": analytics.users_by_entity_type(),
"event_counts": analytics.event_counts(),
}
except Exception as exc:
logger.error("summary failed: %s", exc)
raise HTTPException(status_code=500, detail="Analytics query failed")
finally:
db.close()