refactor(frontend): Live Tail 重构 + alerts 拆分 + NotifySection 去重
- Live Tail:输入 500ms 防抖后才切换轮询查询;轮询 AbortController 取消 + 版本号丢弃乱序响应 - alerts/index 508→286 行:表单与模板拆出 RuleFormDialog(浏览器实测模板/通道/提交可用) - NotifySection 两份逐字节副本合一为共享组件;settings 词典注册进 domains(alerts 直访不再裸键)
This commit is contained in:
1 parent
572efc89a4
commit
a69142fbfe
7 files changed
+283
-489
No files matched your search
@@ -19,6 +19,7 @@ import { LogContextDialog, type LogContext } from './components/LogContextDialog
|
||||
import { LogResultsPanel } from './components/LogResultsPanel'
|
||||
import { literalFilters } from './query-utils'
|
||||
import { readQueryHistory, rememberQuery } from './query-history'
|
||||
import { useDebouncedValue } from '@/hooks/useDebouncedValue'
|
||||
|
||||
const toLocal = (date: Date) => new Date(date.getTime() - date.getTimezoneOffset() * 60000).toISOString().slice(0, 19)
|
||||
const ns = (ms: number) => Math.round(ms).toString() + '000000'
|
||||
@@ -220,15 +221,22 @@ export default function LogsPage() {
|
||||
} catch (e) { if (!quiet && version === requestVersion.current) setError(e instanceof Error ? e.message : t('toolbar.queryFailed')) }
|
||||
finally { if (version === requestVersion.current) { setLoading(false); setLoadingStartedAt(null) } }
|
||||
}
|
||||
// tail 期间编辑 LogQL 不逐键触发:防抖 500ms 后才让轮询换查询
|
||||
const tailQuery = useDebouncedValue(query, 500)
|
||||
useEffect(() => {
|
||||
if (!tail || !sourceId || !query.trim()) return
|
||||
if (!tail || !sourceId || !tailQuery.trim()) return
|
||||
// 取消 + 版本号双防护:停止 tail/换查询时在途请求作废;慢响应不覆盖新一轮
|
||||
const controller = new AbortController()
|
||||
let version = 0
|
||||
const poll = async () => {
|
||||
const now = Date.now()
|
||||
const current = ++version
|
||||
setEnd(toLocal(new Date(now)))
|
||||
setStart(toLocal(new Date(now - 300000)))
|
||||
try {
|
||||
const result = await logsApi.query({ sourceId, query, start: Number(ns(now - 300000)), end: Number(ns(now)), limit, direction: 'backward' })
|
||||
setExecutedQuery(query)
|
||||
const result = await logsApi.query({ sourceId, query: tailQuery, start: Number(ns(now - 300000)), end: Number(ns(now)), limit, direction: 'backward' }, { signal: controller.signal })
|
||||
if (current !== version) return
|
||||
setExecutedQuery(tailQuery)
|
||||
setSearched(true)
|
||||
setEntries(result.entries)
|
||||
setCursor(result.hasMore ? result.nextCursor : '')
|
||||
@@ -237,8 +245,8 @@ export default function LogsPage() {
|
||||
}
|
||||
void poll()
|
||||
const timer = window.setInterval(() => void poll(), 3000)
|
||||
return () => window.clearInterval(timer)
|
||||
}, [tail, sourceId, query, limit])
|
||||
return () => { controller.abort(); window.clearInterval(timer) }
|
||||
}, [tail, sourceId, tailQuery, limit])
|
||||
|
||||
/** 上下文前后条数:默认 5 条(Java 一个异常常拆成 4 条日志,2 条拼不完整),选择后记住 */
|
||||
const [contextLines, setContextLines] = useState<number>(() => {
|
||||
|
||||
Reference in new issue
Block a user