refactor(analysis): 去掉排行 10/30/50 选择器,改为一次取 50 + 前端分页;零点结算昨天
=== 1. 为什么去掉「显示条数」选择器 === topk 的 N 不影响查询成本(扫描的 chunk 集合完全相同),实测: topk(10) 17833ms / 11 条 topk(30) 18019ms / 34 条 topk(50) 7394ms / 54 条 topk(100) 17553ms / 74 条 波动来自集群负载,与 N 无关 —— 它只决定最后返回多少序列。 所以"选 30"既不更快也不更慢,本质是个翻页开关; 而选它还要重新等一次十几秒的查询,纯亏。 改为:一次 topk(50),前端 10 条/页 → 5 页只需 1 次查询。 附带收益:占比的分母从"前 10 合计"变成"前 50 合计",更接近真实占比。 副标题明确写清"一次取前 50 个应用(占比按这 50 个合计计算)"。 === 2. 零点结算昨天(daily volume)=== 原来只有 30 分钟 ticker 回补,且启动时间不对齐整点 → 昨天最早的一段可能已经超出 Loki 24h 保留期被删, 结算结果系统性偏低,图上却标"完整一天",属静默错数。 新增 nextMidnightFinalize():每天 00:01 触发 FinalizeYesterdayVolume() - 昨天定稿 partial=false - 补一次条数(index/stats,一天一次可接受) - 顺带刷新今天 partial=true 的柱子 ticker 仍保留,负责当天数据的 30 分钟刷新。 === 3. 顺带 === - 去掉每日量"其中 N 天平台没有留存记录"的提示文案(按用户要求) - 修 QuickQueryTemplates.tsx 的未使用变量导致 tsc -b 失败 - 工作区里上一轮中断的"排行体积列"改动一并纳入(app-ranking 返回 bytes, TopAppsTable 增加体积列,快照记录 per-app 字节数) Pod = Hub latest = a16978d2f88b
This commit is contained in:
1 parent
63dd491c5b
commit
d4422f1541
22 files changed
+715
-117
No files matched your search
@@ -17,6 +17,15 @@ func setupDailyVolumeDB(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(func() { _ = repository.Shutdown() })
|
||||
|
||||
// 每天的快照都挂着数据源,prune 会清掉"数据源已删除"的孤儿快照,
|
||||
// 所以测试里先登记好 id=1 的数据源。
|
||||
db := repository.GetDB()
|
||||
db.Lock()
|
||||
if len(db.LogSources) == 0 {
|
||||
db.LogSources = append(db.LogSources, models.LogSource{ID: 1, Name: "test-loki", TargetType: "url"})
|
||||
}
|
||||
db.Unlock()
|
||||
}
|
||||
|
||||
func snapshotsByDate(t *testing.T) map[string]models.DailyVolumeSnapshot {
|
||||
@@ -56,6 +65,8 @@ func TestPruneDailyVolumeNormalizesPartialAndDropsExpired(t *testing.T) {
|
||||
{ID: 3, Date: dateKey(now), SourceID: 1, Bytes: 10, Partial: true},
|
||||
// 超过留存期 → 必须被清理
|
||||
{ID: 4, Date: dateKey(expired), SourceID: 1, Bytes: 999},
|
||||
// 数据源已删除的孤儿快照 → 必须被清理
|
||||
{ID: 5, Date: dateKey(yesterday), SourceID: 99, Bytes: 888},
|
||||
}
|
||||
db.Unlock()
|
||||
|
||||
@@ -65,6 +76,15 @@ func TestPruneDailyVolumeNormalizesPartialAndDropsExpired(t *testing.T) {
|
||||
if _, ok := got[dateKey(expired)]; ok {
|
||||
t.Error("超过留存期的快照没有被清理")
|
||||
}
|
||||
// 孤儿快照(SourceID=99 的数据源已不存在)必须被清掉
|
||||
db = repository.GetDB()
|
||||
db.RLock()
|
||||
for _, snap := range db.DailyVolumeSnapshots {
|
||||
if snap.SourceID == 99 {
|
||||
t.Error("数据源已删除的孤儿快照没有被清理")
|
||||
}
|
||||
}
|
||||
db.RUnlock()
|
||||
if snap := got[dateKey(yesterday)]; snap.Partial {
|
||||
t.Error("昨天结束之后抓的快照应标记为完整(partial=false)")
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user