feat: 原始上报数据存储(raw_batch 表/脱敏/访客关联/详情页 Tab/30天清理)
Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -107,6 +107,30 @@ class Event(models.Model):
|
||||
]
|
||||
|
||||
|
||||
class RawBatch(models.Model):
|
||||
"""原始上报批次存档:每次 collect/batch 接收都落一行(含被拒批次)。
|
||||
|
||||
用途:排查"事件为何没进报表"——原始 JSON 与入库结果(event_count/rejected_count/status)
|
||||
并排可对照白名单/超批/幂等拒绝原因。body 是脱敏后快照(敏感键值 → [FILTERED],结构保留);
|
||||
被拒批次截断 4KB。保留期 30 天由 cleanup_raw 命令管理(生产 cron 每日执行)。
|
||||
写入是 best-effort:失败不影响主采集流程(见 collect.py)。
|
||||
"""
|
||||
site = models.ForeignKey(Site, on_delete=models.CASCADE, related_name="raw_batches")
|
||||
visitor = models.ForeignKey(Visitor, on_delete=models.CASCADE, related_name="raw_batches", null=True)
|
||||
batch_id = models.CharField(max_length=64, blank=True, default="")
|
||||
body = models.TextField() # 脱敏后的整包 JSON 文本
|
||||
event_count = models.PositiveIntegerField(default=0)
|
||||
rejected_count = models.PositiveIntegerField(default=0)
|
||||
status = models.CharField(max_length=16, default="accepted") # accepted/partial/rejected
|
||||
received_at = models.DateTimeField(auto_now_add=True)
|
||||
ip = models.GenericIPAddressField(null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
db_table = "raw_batch"
|
||||
indexes = [models.Index(fields=["visitor", "-received_at"]),
|
||||
models.Index(fields=["site", "-received_at"])]
|
||||
|
||||
|
||||
class DailyStat(models.Model):
|
||||
site = models.ForeignKey(Site, on_delete=models.CASCADE, related_name="daily_stats", db_index=False) # uq_site_date 前缀覆盖
|
||||
date = models.DateField()
|
||||
|
||||
Reference in New Issue
Block a user