package models import "time" // DailyVolumeSnapshot 每日日志量快照(平台自己留存的历史)。 // // 为什么必须落库: // // Loki 的 retention_period 是 24 小时(运维可改,但默认就该短), // 意味着「近 7 天每日日志量」直接查 Loki 时,只有最近 1 天有数据, // 其余 6 天是空的 —— 界面上看着像坏了,实际是数据已经不在了。 // 想要 30 天 / 1 年趋势,只能在数据被删前每天抓一次存进平台库。 // // 粒度说明: // - 只按「数据源 + 命名空间」存。index/volume 系列接口只能按 selector 标签聚合, // 拿不到按 app 的拆分(Loki 3.4 不支持 aggregateBy), // 所以按 app 的历史量暂时无法落库,应用维度请看实时排行(有 20~30s 成本)。 // - 每天一条,日期用**本地时区**的 YYYY-MM-DD,避免跨时区对不上。 type DailyVolumeSnapshot struct { ID uint `json:"id"` Date string `json:"date"` // YYYY-MM-DD(本地时区) SourceID uint `json:"sourceId"` // 数据源 Namespace string `json:"namespace"` // "" 表示该数据源全量 Bytes int64 `json:"bytes"` // 日志体积 Entries int64 `json:"entries"` // 日志条数 // Partial 该日期是否为"不完整的一天"(当天抓取时还没过完)。 // 前端用它区分"真实低峰"和"只统计到一半"。 // // ⚠️ 只表示"今天还没过完"。早期实现把"起点超出 24 小时"也算成 partial, // 导致昨天、前天的柱子也画成虚线空心,看起来像"每天都在进行中"(已修)。 Partial bool `json:"partial"` // EntriesAttempts 条数(index/stats)已尝试次数。 // 整天跨度统计很贵(实测 6ms ~ 20s,取决于实例负载), // 所以只对"已经过完的天"补,且最多重试 entriesMaxAttempts 次, // 避免每 30 分钟的定时任务无脑重跑一遍。 EntriesAttempts int `json:"entriesAttempts"` LastEntriesAttempt time.Time `json:"lastEntriesAttempt"` CapturedAt time.Time `json:"capturedAt"` }