Skip to content

Commit 284a71c

Browse files
committed
improvement(log): 补充聊天消息与会话加载阶段日志
- 为会话加载、刷新和联系人初始化补充阶段性 trace - 为消息加载、归一化、状态提交和媒体刷新补充耗时日志 - 便于定位聊天页卡顿和加载异常
1 parent d999153 commit 284a71c

2 files changed

Lines changed: 127 additions & 32 deletions

File tree

frontend/composables/chat/useChatMessages.js

Lines changed: 41 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
getVoiceDurationInSeconds,
66
getVoiceWidth
77
} from '~/lib/chat/formatters'
8+
import { createPerfTrace } from '~/lib/chat/perf-logger'
89
import { createMessageNormalizer, dedupeMessagesById } from '~/lib/chat/message-normalizer'
910

1011
export const useChatMessages = ({
@@ -410,9 +411,15 @@ export const useChatMessages = ({
410411
const loadMessages = async ({ username, reset }) => {
411412
if (!username || !selectedAccount.value) return
412413

413-
logMessagePhase('loadMessages:enter', {
414-
username,
415-
reset
414+
const trace = createPerfTrace('chat-messages', {
415+
account: String(selectedAccount.value || '').trim(),
416+
selectedUsername: String(selectedContact.value?.username || '').trim(),
417+
username: String(username || '').trim(),
418+
reset: !!reset
419+
})
420+
421+
trace.log('loadMessages:enter', {
422+
activeMessagesFor: String(activeMessagesFor.value || '').trim()
416423
})
417424
messagesError.value = ''
418425
isLoadingMessages.value = true
@@ -438,46 +445,37 @@ export const useChatMessages = ({
438445
if (realtimeEnabled.value) {
439446
params.source = 'realtime'
440447
}
441-
logMessagePhase('loadMessages:request:start', {
442-
username,
443-
reset,
448+
trace.log('loadMessages:request:start', {
444449
offset,
445450
existingCount: existing.length,
446451
renderTypeFilter: messageTypeFilter.value,
447452
realtime: !!realtimeEnabled.value
448453
})
449454
const response = await api.listChatMessages(params)
450-
logMessagePhase('loadMessages:request:end', {
451-
username,
452-
reset,
455+
trace.log('loadMessages:request:end', {
453456
rawCount: Array.isArray(response?.messages) ? response.messages.length : 0,
454457
total: Number(response?.total || 0),
455458
hasMore: response?.hasMore
456459
})
457460

458461
const raw = response?.messages || []
459-
logMessagePhase('loadMessages:normalize:start', {
460-
username,
462+
trace.log('loadMessages:normalize:start', {
461463
rawCount: raw.length
462464
})
463465
const mapped = dedupeMessagesById(raw.map(normalizeMessage))
464-
logMessagePhase('loadMessages:normalize:end', {
465-
username,
466+
trace.log('loadMessages:normalize:end', {
466467
mappedCount: mapped.length,
467468
renderTypeCounts: summarizeRenderTypes(mapped)
468469
})
469470

470471
if (activeMessagesFor.value !== username) {
471-
logMessagePhase('loadMessages:abort-stale', {
472-
username,
472+
trace.log('loadMessages:abort-stale', {
473473
activeMessagesFor: activeMessagesFor.value
474474
})
475475
return
476476
}
477477

478-
logMessagePhase('loadMessages:state-commit:start', {
479-
username,
480-
reset,
478+
trace.log('loadMessages:state-commit:start', {
481479
mappedCount: mapped.length
482480
})
483481
if (reset) {
@@ -496,8 +494,7 @@ export const useChatMessages = ({
496494
[username]: [...older, ...existing]
497495
}
498496
}
499-
logMessagePhase('loadMessages:state-commit:end', {
500-
username,
497+
trace.log('loadMessages:state-commit:end', {
501498
storedCount: (allMessages.value[username] || []).length
502499
})
503500

@@ -508,18 +505,14 @@ export const useChatMessages = ({
508505
hasMore: response?.hasMore
509506
}
510507
}
511-
logMessagePhase('loadMessages:meta-commit:end', {
512-
username,
508+
trace.log('loadMessages:meta-commit:end', {
513509
total: Number(response?.total || 0),
514510
hasMore: response?.hasMore
515511
})
516512

517-
logMessagePhase('loadMessages:nextTick:start', {
518-
username
519-
})
513+
trace.log('loadMessages:nextTick:start')
520514
await nextTick()
521-
logMessagePhase('loadMessages:nextTick:end', {
522-
username,
515+
trace.log('loadMessages:nextTick:end', {
523516
renderedCount: (allMessages.value[username] || []).length
524517
})
525518
const nextContainer = messageContainerRef.value
@@ -532,13 +525,16 @@ export const useChatMessages = ({
532525
}
533526
}
534527
updateJumpToBottomState()
535-
logMessagePhase('loadMessages:scroll:end', {
536-
username,
528+
trace.log('loadMessages:scroll:end', {
537529
hasContainer: !!nextContainer,
538530
scrollTop: nextContainer ? nextContainer.scrollTop : null,
539531
scrollHeight: nextContainer ? nextContainer.scrollHeight : null
540532
})
541533
} catch (error) {
534+
trace.log('loadMessages:error', {
535+
message: String(error?.message || ''),
536+
errorName: String(error?.name || '')
537+
})
542538
console.error('[chat-messages] loadMessages:error', {
543539
account: String(selectedAccount.value || '').trim(),
544540
username: String(username || '').trim(),
@@ -548,9 +544,7 @@ export const useChatMessages = ({
548544
messagesError.value = error?.message || '加载聊天记录失败'
549545
} finally {
550546
isLoadingMessages.value = false
551-
logMessagePhase('loadMessages:exit', {
552-
username,
553-
reset,
547+
trace.log('loadMessages:exit', {
554548
loading: isLoadingMessages.value,
555549
error: messagesError.value
556550
})
@@ -571,9 +565,24 @@ export const useChatMessages = ({
571565

572566
const refreshCurrentMessageMedia = async () => {
573567
if (!selectedContact.value?.username) return
568+
const trace = createPerfTrace('chat-messages', {
569+
account: String(selectedAccount.value || '').trim(),
570+
username: String(selectedContact.value?.username || '').trim(),
571+
action: 'refreshCurrentMessageMedia'
572+
})
573+
trace.log('refreshCurrentMessageMedia:start', {
574+
localMediaVersion: Number(localMediaVersion.value || 0)
575+
})
574576
bumpLocalMediaVersion()
577+
trace.log('refreshCurrentMessageMedia:version-bumped', {
578+
localMediaVersion: Number(localMediaVersion.value || 0)
579+
})
575580
renormalizeLoadedMessages(selectedContact.value.username)
581+
trace.log('refreshCurrentMessageMedia:renormalized', {
582+
renderedCount: (allMessages.value[selectedContact.value.username] || []).length
583+
})
576584
await nextTick()
585+
trace.log('refreshCurrentMessageMedia:end')
577586
}
578587

579588
const refreshRealtimeIncremental = async () => {

frontend/composables/chat/useChatSessions.js

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { computed, onMounted, ref } from 'vue'
22
import { normalizeSessionPreview } from '~/lib/chat/formatters'
3+
import { createPerfTrace } from '~/lib/chat/perf-logger'
34

45
const SESSION_LIST_WIDTH_KEY = 'ui.chat.session_list_width_physical'
56
const SESSION_LIST_WIDTH_KEY_LEGACY = 'ui.chat.session_list_width'
@@ -170,6 +171,14 @@ export const useChatSessions = ({ chatAccounts, selectedAccount, realtimeEnabled
170171
return []
171172
}
172173

174+
const trace = createPerfTrace('chat-sessions', {
175+
account: String(selectedAccount.value || '').trim(),
176+
action: 'loadSessionsForSelectedAccount'
177+
})
178+
trace.log('loadSessions:start', {
179+
realtimeEnabled: !!realtimeEnabled?.value
180+
})
181+
173182
const fetchSessions = async (source) => {
174183
const params = {
175184
account: selectedAccount.value,
@@ -184,18 +193,38 @@ export const useChatSessions = ({ chatAccounts, selectedAccount, realtimeEnabled
184193
let sessionsResp = null
185194
if (realtimeEnabled?.value) {
186195
try {
196+
trace.log('loadSessions:request:start', {
197+
source: 'realtime'
198+
})
187199
sessionsResp = await fetchSessions('realtime')
200+
trace.log('loadSessions:request:end', {
201+
source: 'realtime',
202+
rawCount: Array.isArray(sessionsResp?.sessions) ? sessionsResp.sessions.length : 0
203+
})
188204
} catch {
189205
sessionsResp = null
206+
trace.log('loadSessions:request:error', {
207+
source: 'realtime'
208+
})
190209
}
191210
}
192211
if (!sessionsResp) {
212+
trace.log('loadSessions:request:start', {
213+
source: 'default'
214+
})
193215
sessionsResp = await fetchSessions('')
216+
trace.log('loadSessions:request:end', {
217+
source: 'default',
218+
rawCount: Array.isArray(sessionsResp?.sessions) ? sessionsResp.sessions.length : 0
219+
})
194220
}
195221

196222
const sessions = Array.isArray(sessionsResp?.sessions) ? sessionsResp.sessions : []
197223
contacts.value = mapSessions(sessions)
198224
contactsError.value = ''
225+
trace.log('loadSessions:end', {
226+
contactCount: contacts.value.length
227+
})
199228
return contacts.value
200229
}
201230

@@ -208,6 +237,14 @@ export const useChatSessions = ({ chatAccounts, selectedAccount, realtimeEnabled
208237
const desiredSource = (sourceOverride != null)
209238
? String(sourceOverride || '').trim()
210239
: (realtimeEnabled?.value ? 'realtime' : '')
240+
const trace = createPerfTrace('chat-sessions', {
241+
account: String(selectedAccount.value || '').trim(),
242+
action: 'refreshSessionsForSelectedAccount',
243+
desiredSource
244+
})
245+
trace.log('refreshSessions:start', {
246+
previousUsername
247+
})
211248

212249
const params = {
213250
account: selectedAccount.value,
@@ -219,15 +256,35 @@ export const useChatSessions = ({ chatAccounts, selectedAccount, realtimeEnabled
219256
let sessionsResp = null
220257
if (desiredSource) {
221258
try {
259+
trace.log('refreshSessions:request:start', {
260+
source: desiredSource
261+
})
222262
sessionsResp = await api.listChatSessions({ ...params, source: desiredSource })
263+
trace.log('refreshSessions:request:end', {
264+
source: desiredSource,
265+
rawCount: Array.isArray(sessionsResp?.sessions) ? sessionsResp.sessions.length : 0
266+
})
223267
} catch {
224268
sessionsResp = null
269+
trace.log('refreshSessions:request:error', {
270+
source: desiredSource
271+
})
225272
}
226273
}
227274
if (!sessionsResp) {
228275
try {
276+
trace.log('refreshSessions:request:start', {
277+
source: 'default'
278+
})
229279
sessionsResp = await api.listChatSessions(params)
280+
trace.log('refreshSessions:request:end', {
281+
source: 'default',
282+
rawCount: Array.isArray(sessionsResp?.sessions) ? sessionsResp.sessions.length : 0
283+
})
230284
} catch {
285+
trace.log('refreshSessions:request:error', {
286+
source: 'default'
287+
})
231288
return
232289
}
233290
}
@@ -240,6 +297,10 @@ export const useChatSessions = ({ chatAccounts, selectedAccount, realtimeEnabled
240297
const matched = nextContacts.find((contact) => contact.username === previousUsername)
241298
if (matched) selectedContact.value = matched
242299
}
300+
trace.log('refreshSessions:end', {
301+
contactCount: nextContacts.length,
302+
selectedUsername: String(selectedContact.value?.username || '').trim()
303+
})
243304
}
244305

245306
const loadContacts = async () => {
@@ -249,25 +310,50 @@ export const useChatSessions = ({ chatAccounts, selectedAccount, realtimeEnabled
249310

250311
isLoadingContacts.value = true
251312
contactsError.value = ''
313+
const trace = createPerfTrace('chat-sessions', {
314+
account: String(selectedAccount.value || '').trim(),
315+
action: 'loadContacts'
316+
})
317+
trace.log('loadContacts:start', {
318+
cachedContacts: contacts.value.length
319+
})
252320
try {
253321
const hadLoadedAccountSnapshot = !!chatAccounts.loaded
254322
await chatAccounts.ensureLoaded()
323+
trace.log('loadContacts:accounts-ready', {
324+
hadLoadedAccountSnapshot,
325+
availableAccounts: Array.isArray(chatAccounts?.accounts) ? chatAccounts.accounts.length : 0
326+
})
255327
if (!selectedAccount.value && hadLoadedAccountSnapshot) {
256328
await chatAccounts.ensureLoaded({ force: true })
329+
trace.log('loadContacts:accounts-refreshed')
257330
}
258331

259332
if (!selectedAccount.value) {
260333
clearContactsState(chatAccounts.error || '未检测到已解密账号,请先解密数据库。')
334+
trace.log('loadContacts:no-account', {
335+
error: contactsError.value
336+
})
261337
return { usedPrefetched: false }
262338
}
263339

264340
await loadSessionsForSelectedAccount()
341+
trace.log('loadContacts:end', {
342+
contactCount: contacts.value.length
343+
})
265344
return { usedPrefetched: false }
266345
} catch (error) {
267346
clearContactsState(error?.message || '加载联系人失败')
347+
trace.log('loadContacts:error', {
348+
message: String(error?.message || '')
349+
})
268350
return { usedPrefetched: false }
269351
} finally {
270352
isLoadingContacts.value = false
353+
trace.log('loadContacts:exit', {
354+
loading: isLoadingContacts.value,
355+
error: contactsError.value
356+
})
271357
}
272358
}
273359

0 commit comments

Comments
 (0)