fix(web-probe): focus analysis after latest new session (#833)
Co-authored-by: Codex <codex@noreply.local>
This commit is contained in:
@@ -2116,15 +2116,18 @@ const reportJsonPath = path.join(analysisDir, "report.json");
|
||||
const reportMdPath = path.join(analysisDir, "report.md");
|
||||
const jsonlReadIssues = [];
|
||||
const sourceSamples = await readJsonl(dataFile("samples.jsonl"), { compact: compactSampleForAnalysis, tail: analyzeTailSamples });
|
||||
const samples = sourceSamples;
|
||||
const sampleWindow = sampleTimeWindow(samples, 60_000);
|
||||
const relatedJsonlTailLimit = analyzeTailSamples > 0 ? Math.max(1200, analyzeTailSamples * 50) : 0;
|
||||
const smallJsonlTailLimit = analyzeTailSamples > 0 ? Math.max(500, analyzeTailSamples * 8) : 0;
|
||||
const control = filterRowsByTimeWindow(await readJsonl(dataFile("control.jsonl"), { tail: relatedJsonlTailLimit }), sampleWindow);
|
||||
const network = filterRowsByTimeWindow(await readJsonl(dataFile("network.jsonl"), { tail: relatedJsonlTailLimit }), sampleWindow);
|
||||
const consoleEvents = filterRowsByTimeWindow(await readJsonl(dataFile("console.jsonl"), { tail: smallJsonlTailLimit }), sampleWindow);
|
||||
const errors = filterRowsByTimeWindow(await readJsonl(dataFile("errors.jsonl"), { tail: smallJsonlTailLimit }), sampleWindow);
|
||||
const artifacts = filterRowsByTimeWindow(await readJsonl(dataFile("artifacts.jsonl"), { tail: smallJsonlTailLimit }), sampleWindow);
|
||||
const sourceSampleWindow = sampleTimeWindow(sourceSamples, 60_000);
|
||||
const sourceControl = filterRowsByTimeWindow(await readJsonl(dataFile("control.jsonl"), { tail: relatedJsonlTailLimit }), sourceSampleWindow);
|
||||
const analysisFocus = analysisFocusFromControl(sourceControl);
|
||||
const samples = applyAnalysisFocus(sourceSamples, analysisFocus);
|
||||
const sampleWindow = sampleTimeWindow(samples, 60_000);
|
||||
const control = applyAnalysisFocus(filterRowsByTimeWindow(sourceControl, sampleWindow), analysisFocus, 1000);
|
||||
const network = applyAnalysisFocus(filterRowsByTimeWindow(await readJsonl(dataFile("network.jsonl"), { tail: relatedJsonlTailLimit }), sampleWindow), analysisFocus);
|
||||
const consoleEvents = applyAnalysisFocus(filterRowsByTimeWindow(await readJsonl(dataFile("console.jsonl"), { tail: smallJsonlTailLimit }), sampleWindow), analysisFocus);
|
||||
const errors = applyAnalysisFocus(filterRowsByTimeWindow(await readJsonl(dataFile("errors.jsonl"), { tail: smallJsonlTailLimit }), sampleWindow), analysisFocus);
|
||||
const artifacts = applyAnalysisFocus(filterRowsByTimeWindow(await readJsonl(dataFile("artifacts.jsonl"), { tail: smallJsonlTailLimit }), sampleWindow), analysisFocus);
|
||||
const manifest = await readJson(path.join(stateDir, "manifest.json"));
|
||||
const heartbeat = await readJson(path.join(stateDir, "heartbeat.json"));
|
||||
|
||||
@@ -2185,7 +2188,7 @@ const report = {
|
||||
command: "web-probe-observe analyze",
|
||||
generatedAt: new Date().toISOString(),
|
||||
stateDir,
|
||||
jsonlScope: { mode: archivePrefix ? "archive" : "current", archivePrefix: archivePrefix || null, dataDir, analyzeTailSamples, sourceSampleCount: sourceSamples.length, effectiveSampleCount: samples.length, sampleWindow, valuesRedacted: true },
|
||||
jsonlScope: { mode: archivePrefix ? "archive" : "current", archivePrefix: archivePrefix || null, dataDir, analyzeTailSamples, sourceSampleCount: sourceSamples.length, effectiveSampleCount: samples.length, sampleWindow, focus: analysisFocus, valuesRedacted: true },
|
||||
alertThresholds,
|
||||
manifest: compactManifest(manifest),
|
||||
heartbeat: compactHeartbeat(heartbeat),
|
||||
@@ -2601,6 +2604,33 @@ function filterRowsByTimeWindow(rows, window) {
|
||||
});
|
||||
}
|
||||
|
||||
function analysisFocusFromControl(control) {
|
||||
const completedNewSessions = (Array.isArray(control) ? control : [])
|
||||
.filter((item) => item?.type === "newSession" && item?.phase === "completed" && Number.isFinite(Date.parse(String(item.ts || ""))))
|
||||
.sort((a, b) => Date.parse(String(a.ts || "")) - Date.parse(String(b.ts || "")));
|
||||
const latest = completedNewSessions.at(-1) ?? null;
|
||||
if (!latest) return { mode: "all", reason: "no-new-session-command", startAt: null, startMs: null, commandId: null, valuesRedacted: true };
|
||||
const startMs = Date.parse(String(latest.ts));
|
||||
return {
|
||||
mode: "after-new-session",
|
||||
reason: "latest-completed-new-session",
|
||||
startAt: new Date(startMs).toISOString(),
|
||||
startMs,
|
||||
commandId: latest.commandId ?? null,
|
||||
valuesRedacted: true
|
||||
};
|
||||
}
|
||||
|
||||
function applyAnalysisFocus(rows, focus, graceMs = 0) {
|
||||
if (!focus || !Number.isFinite(focus.startMs)) return rows;
|
||||
const minMs = focus.startMs - Math.max(0, Number(graceMs) || 0);
|
||||
return (Array.isArray(rows) ? rows : []).filter((item) => {
|
||||
const value = item && (item.ts || item.observedAt || item.startedAt || item.finishedAt || item.createdAt || item.updatedAt);
|
||||
const ms = Date.parse(String(value || ""));
|
||||
return Number.isFinite(ms) ? ms >= minMs : true;
|
||||
});
|
||||
}
|
||||
|
||||
function compactSampleForAnalysis(sample) {
|
||||
if (!sample || typeof sample !== "object") return sample;
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user