fix: add web-probe finding drilldown (#733)
Co-authored-by: Codex <codex@noreply.local>
This commit is contained in:
@@ -1541,6 +1541,42 @@ async function sampleOnePage(targetPage, { reason, groupSeq, pageRole, targetPag
|
||||
const title = element.getAttribute("title") || "";
|
||||
return tag === "button" || role === "button" || /诊断/u.test(aria) || /诊断/u.test(title);
|
||||
};
|
||||
const stableMessageText = (element) => {
|
||||
const bodySelectors = [
|
||||
".message-markdown.message-text",
|
||||
".message-text",
|
||||
"[data-message-body]",
|
||||
"[data-testid='message-body']",
|
||||
"[data-testid*='message-text' i]",
|
||||
"[data-testid*='final-response' i]"
|
||||
];
|
||||
const parts = [];
|
||||
for (const selector of bodySelectors) {
|
||||
for (const candidate of Array.from(element.querySelectorAll(selector))) {
|
||||
if (!visible(candidate)) continue;
|
||||
const text = trim(candidate.textContent || "", 1200);
|
||||
if (text && !parts.includes(text)) parts.push(text);
|
||||
}
|
||||
}
|
||||
if (parts.length > 0) return parts.join(" ");
|
||||
const clone = element.cloneNode(true);
|
||||
for (const selector of [
|
||||
".message-duration-meta",
|
||||
".message-activity-meta",
|
||||
".api-error-diagnostic",
|
||||
"[class*='diagnostic' i]",
|
||||
"[class*='trace' i]",
|
||||
"[data-trace-id]",
|
||||
"[data-testid*='trace' i]",
|
||||
"[data-testid*='event' i]",
|
||||
"[role='status']",
|
||||
"[role='alert']",
|
||||
"button"
|
||||
]) {
|
||||
for (const child of Array.from(clone.querySelectorAll(selector))) child.remove();
|
||||
}
|
||||
return trim(clone.textContent || "", 1200);
|
||||
};
|
||||
const summarize = (selector, limit) => Array.from(document.querySelectorAll(selector)).filter(visible).slice(-limit).map((element, index) => {
|
||||
const rect = element.getBoundingClientRect();
|
||||
return {
|
||||
@@ -1557,6 +1593,22 @@ async function sampleOnePage(targetPage, { reason, groupSeq, pageRole, targetPag
|
||||
rect: { x: Math.round(rect.x), y: Math.round(rect.y), width: Math.round(rect.width), height: Math.round(rect.height) },
|
||||
};
|
||||
});
|
||||
const summarizeMessages = (selector, limit) => Array.from(document.querySelectorAll(selector)).filter(visible).slice(-limit).map((element, index) => {
|
||||
const rect = element.getBoundingClientRect();
|
||||
return {
|
||||
index,
|
||||
tag: element.tagName.toLowerCase(),
|
||||
testId: element.getAttribute("data-testid"),
|
||||
role: element.getAttribute("role"),
|
||||
status: element.getAttribute("data-status") || element.getAttribute("aria-busy") || null,
|
||||
sessionId: element.getAttribute("data-session-id") || null,
|
||||
messageId: element.getAttribute("data-message-id") || element.getAttribute("id") || null,
|
||||
traceId: element.getAttribute("data-trace-id") || null,
|
||||
turnId: element.getAttribute("data-turn-id") || null,
|
||||
text: stableMessageText(element),
|
||||
rect: { x: Math.round(rect.x), y: Math.round(rect.y), width: Math.round(rect.width), height: Math.round(rect.height) },
|
||||
};
|
||||
});
|
||||
const resourceTimingSample = (entry) => ({
|
||||
name: entry.name.split(/[?#]/u)[0].slice(0, 240),
|
||||
initiatorType: entry.initiatorType,
|
||||
@@ -1592,7 +1644,7 @@ async function sampleOnePage(targetPage, { reason, groupSeq, pageRole, targetPag
|
||||
const messageSelector = 'article.message-card, .message-card[data-message-id], article[data-message-id]';
|
||||
const traceSelector = '[data-testid*="trace" i], [class*="trace" i], [data-trace-id], [data-testid*="event" i]';
|
||||
const diagnosticSelector = '.api-error-diagnostic, [class*="api-error-diagnostic" i], [class*="message-diagnostic" i], [class*="projection-diagnostic" i], [data-testid="api-error-diagnostic" i], [data-testid="error-diagnostic" i], [data-testid*="diagnostic" i], [role="alert"], [aria-live="assertive"]';
|
||||
const messages = summarize(messageSelector, 20);
|
||||
const messages = summarizeMessages(messageSelector, 20);
|
||||
const traceRows = summarize(traceSelector, 30);
|
||||
const loadings = collectLoadingNodes();
|
||||
const sessionRail = collectSessionRailTitles();
|
||||
@@ -4714,8 +4766,11 @@ function detectCrossPageProjectionDiffs(samples) {
|
||||
const controlZero = detectTerminalZeroElapsed([control]).length > 0;
|
||||
const observerZero = detectTerminalZeroElapsed([observer]).length > 0;
|
||||
const sameSession = (control.routeSessionId || control.activeSessionId || null) && (control.routeSessionId || control.activeSessionId || null) === (observer.routeSessionId || observer.activeSessionId || null);
|
||||
const projectionDivergent = sameSession && (missingInObserver.length > 0 || Math.abs(controlMessages - observerMessages) > 0 || controlZero !== observerZero || digestMessageTexts(control) !== digestMessageTexts(observer));
|
||||
const traceVisibilityDivergent = sameSession && !projectionDivergent && Math.abs(controlTraceRows - observerTraceRows) > 0;
|
||||
const controlMessageDigest = digestMessageTexts(control);
|
||||
const observerMessageDigest = digestMessageTexts(observer);
|
||||
const messageTextDigestDiff = controlMessageDigest !== observerMessageDigest;
|
||||
const projectionDivergent = sameSession && (Math.abs(controlMessages - observerMessages) > 0 || controlZero !== observerZero || messageTextDigestDiff);
|
||||
const traceVisibilityDivergent = sameSession && !projectionDivergent && (missingInObserver.length > 0 || Math.abs(controlTraceRows - observerTraceRows) > 0);
|
||||
if (!projectionDivergent && !traceVisibilityDivergent) continue;
|
||||
rows.push({
|
||||
sampleGroupSeq,
|
||||
@@ -4727,7 +4782,10 @@ function detectCrossPageProjectionDiffs(samples) {
|
||||
observerMessageCount: observerMessages,
|
||||
controlTraceRowCount: controlTraceRows,
|
||||
observerTraceRowCount: observerTraceRows,
|
||||
terminalZeroElapsedDiff: controlZero !== observerZero
|
||||
terminalZeroElapsedDiff: controlZero !== observerZero,
|
||||
messageTextDigestDiff,
|
||||
controlMessageDigest,
|
||||
observerMessageDigest
|
||||
});
|
||||
}
|
||||
return rows;
|
||||
@@ -4779,8 +4837,11 @@ function detectAdjacentCrossPageProjectionDiffs(samples) {
|
||||
const controlZero = detectTerminalZeroElapsed([control]).length > 0;
|
||||
const observerZero = detectTerminalZeroElapsed([observer]).length > 0;
|
||||
const missingInObserver = [...visibleTraceIds(control)].filter((item) => !visibleTraceIds(observer).has(item));
|
||||
const projectionDivergent = missingInObserver.length > 0 || controlMessages !== observerMessages || controlZero !== observerZero || digestMessageTexts(control) !== digestMessageTexts(observer);
|
||||
const traceVisibilityDivergent = !projectionDivergent && controlTraceRows !== observerTraceRows;
|
||||
const controlMessageDigest = digestMessageTexts(control);
|
||||
const observerMessageDigest = digestMessageTexts(observer);
|
||||
const messageTextDigestDiff = controlMessageDigest !== observerMessageDigest;
|
||||
const projectionDivergent = controlMessages !== observerMessages || controlZero !== observerZero || messageTextDigestDiff;
|
||||
const traceVisibilityDivergent = !projectionDivergent && (missingInObserver.length > 0 || controlTraceRows !== observerTraceRows);
|
||||
if (!projectionDivergent && !traceVisibilityDivergent) continue;
|
||||
rows.push({
|
||||
sampleGroupSeq: control.sampleGroupSeq ?? observer.sampleGroupSeq ?? null,
|
||||
@@ -4793,7 +4854,10 @@ function detectAdjacentCrossPageProjectionDiffs(samples) {
|
||||
observerMessageCount: observerMessages,
|
||||
controlTraceRowCount: controlTraceRows,
|
||||
observerTraceRowCount: observerTraceRows,
|
||||
terminalZeroElapsedDiff: controlZero !== observerZero
|
||||
terminalZeroElapsedDiff: controlZero !== observerZero,
|
||||
messageTextDigestDiff,
|
||||
controlMessageDigest,
|
||||
observerMessageDigest
|
||||
});
|
||||
}
|
||||
return rows;
|
||||
|
||||
Reference in New Issue
Block a user