opsx
5f42ac5486
CI / Backend (go vet + test) (push) Canceled after 0s
CI / Frontend (lint + build + test) (push) Canceled after 0s
perf(logs): 快捷 LogQL 下拉加前后端双层缓存,重复打开不再转圈
=== 先测清楚瓶颈在哪 ===
后端单点实测(都很快,不是问题所在):
/logs/my-scope 10ms
/logs/label/namespace/values 25ms
/logs/label-values?scoped astralx 23ms
/logs/label/app/values scoped 18ms
结论:慢的是**前端每次都重新走一遍请求链**(切数据源 / 切命名空间 / 重开面板
都会触发),三四次往返串起来 + 每次都有 loading 态,用户看到的就是转圈。
=== 后端:label 候选值短缓存 ===
services/log_query.go:60 秒 TTL,key = sourceId|label|selector|时间窗(按 5 分钟取整),
上限 500 条并做过期清理。理由:下拉值的时效性要求很低——
新上线的 app 晚 1 分钟出现在候选里完全可以接受。
LokiLabelValuesBatch 内部逐个走 LokiLabelValues,所以批量接口自动受益。
=== 前端:内存缓存 + 飞行中请求合并 ===
api/logs/index.ts:60 秒 TTL 的 Map,**缓存 Promise 而不是结果**,
所以并发的相同请求共享同一次飞行(去重);失败立刻剔除缓存,避免缓存错误。
带 AbortSignal 的调用不参与缓存(用户主动取消的请求不应共享给别人)。
额外导出 invalidateLabelCache(),数据源变更时可手动清。
=== 预期效果 ===
首次打开:与之前相同(~100ms 量级)
再次切换 / 重开面板:直接命中内存,0 请求
服务端重复请求:25~40ms → 微秒级
2026-10-31 18:22:38 +00:00
..
2026-10-31 22:51:55 +08:00
2026-11-01 01:59:17 +08:00
2026-10-31 06:39:01 +00:00
2026-11-01 01:59:17 +08:00
2026-11-01 00:46:38 +08:00
2026-10-31 06:39:01 +00:00
2026-10-31 22:51:55 +08:00
2026-10-29 03:38:30 +00:00
2026-10-30 03:42:03 +00:00
2026-10-31 02:20:34 +08:00
2026-10-29 04:16:52 +00:00
2026-10-27 17:11:38 +08:00
2026-10-27 17:11:38 +08:00
2026-10-29 04:16:52 +00:00
2026-10-27 17:11:38 +08:00
2026-10-30 01:17:26 +08:00
2026-10-28 20:27:48 +00:00
2026-10-28 20:01:38 +00:00
2026-10-28 20:01:38 +00:00
2026-10-30 16:10:51 +00:00
2026-10-30 16:10:51 +00:00
2026-10-25 21:28:32 +08:00
2026-10-25 21:28:32 +08:00
2026-10-29 04:16:52 +00:00
2026-10-31 01:56:15 +00:00
2026-10-29 04:16:52 +00:00
2026-10-30 17:13:18 +00:00
2026-10-30 17:13:18 +00:00
2026-10-30 17:13:18 +00:00
2026-10-28 17:05:57 +00:00
2026-10-27 17:11:38 +08:00
2026-10-27 17:11:38 +08:00
2026-10-25 21:28:32 +08:00
2026-10-29 15:16:18 +08:00
2026-10-29 13:02:11 +08:00
2026-10-30 15:28:30 +00:00
2026-10-29 16:36:21 +08:00
2026-10-28 18:41:39 +00:00
2026-10-28 20:01:38 +00:00
2026-10-30 01:17:26 +08:00
2026-10-27 17:11:38 +08:00
2026-10-25 21:28:32 +08:00
2026-10-27 17:11:38 +08:00
2026-10-29 04:16:52 +00:00
2026-10-29 04:16:52 +00:00
2026-10-27 17:11:38 +08:00
2026-10-27 17:11:38 +08:00
2026-10-31 23:08:06 +08:00
2026-10-31 23:08:06 +08:00
2026-10-28 22:43:57 +08:00
2026-10-27 17:11:38 +08:00
2026-10-27 17:11:38 +08:00
2026-10-31 18:22:38 +00:00
2026-10-30 15:28:30 +00:00
2026-10-29 13:02:11 +08:00
2026-11-01 00:46:38 +08:00
2026-10-30 15:41:38 +00:00
2026-10-29 13:29:25 +08:00
2026-10-27 17:11:38 +08:00
2026-10-27 17:11:38 +08:00
2026-10-28 17:58:30 +00:00
2026-10-27 17:11:38 +08:00
2026-10-28 21:27:01 +00:00
2026-10-27 17:11:38 +08:00
2026-10-28 22:54:12 +00:00
2026-10-30 16:03:24 +00:00
2026-10-29 13:02:11 +08:00
2026-10-29 13:02:11 +08:00
2026-10-28 18:41:39 +00:00
2026-10-27 04:16:55 +00:00
2026-10-28 20:27:48 +00:00
2026-10-28 20:27:48 +00:00
2026-10-29 04:16:52 +00:00
2026-10-29 04:16:52 +00:00
2026-10-29 14:48:25 +08:00
2026-10-28 17:58:30 +00:00
2026-10-27 17:11:38 +08:00
2026-10-29 04:16:52 +00:00
2026-10-27 17:11:38 +08:00
2026-10-30 01:17:26 +08:00