667cda566f
新手引导埋点的服务端: - 表 analytics_event(五维硬性列 + props JSON 扩展字段;event/device_id/user_id/session_id/created_at 带索引) - POST /api/v1/analytics/events:客户端批量上报(不鉴权、body 读可选 user_id、补 client_ip + server_at) - admin GET /admin/api/event-logs:列表 + 按 事件/设备/用户/会话/时间 筛选(offset 分页,照 list_feedbacks) - alembic migration 建表(autogenerate 顺带检出的 ad/cps 历史索引漂移已手动剔除) app 主后端 :8770 与 admin :8771 共用同一 SQLite,admin 同库直接查、无需跨库。 配套客户端五维上报 + admin 日志页(另两仓库 PR)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: zzhyyyyy <2685922758@qq.com> Reviewed-on: #81 Co-authored-by: zhuzihao <zhuzihao@wonderable.ai> Co-committed-by: zhuzihao <zhuzihao@wonderable.ai>
35 lines
1.1 KiB
Python
35 lines
1.1 KiB
Python
"""埋点事件批量落库。append-only,一次 commit 提交整批。"""
|
|
from __future__ import annotations
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.models.analytics_event import AnalyticsEvent
|
|
from app.schemas.analytics import AnalyticsBatchIn
|
|
|
|
|
|
def record_batch(db: Session, batch: AnalyticsBatchIn, *, client_ip: str | None) -> int:
|
|
"""把一批上报事件展开成多行落库(公共维度复制到每行),返回写入条数。"""
|
|
rows = [
|
|
AnalyticsEvent(
|
|
event=e.event,
|
|
props=e.props or None,
|
|
device_id=batch.device_id,
|
|
user_id=batch.user_id,
|
|
session_id=e.session_id,
|
|
client_ts=e.client_ts,
|
|
sent_at=batch.sent_at,
|
|
page=e.page,
|
|
client_ip=client_ip or None,
|
|
oem=batch.oem,
|
|
os=batch.os,
|
|
model=batch.model,
|
|
app_ver=batch.app_ver,
|
|
network=e.network,
|
|
channel=batch.channel,
|
|
)
|
|
for e in batch.events
|
|
]
|
|
db.add_all(rows)
|
|
db.commit()
|
|
return len(rows)
|