mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-09 15:44:31 +00:00
feat(diagnostics): add configurable stuck-session warning threshold
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import fs from "node:fs";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { onDiagnosticEvent, resetDiagnosticEventsForTest } from "../infra/diagnostic-events.js";
|
||||
import {
|
||||
diagnosticSessionStates,
|
||||
getDiagnosticSessionStateCountForTest,
|
||||
@@ -7,6 +8,12 @@ import {
|
||||
pruneDiagnosticSessionStates,
|
||||
resetDiagnosticSessionStateForTest,
|
||||
} from "./diagnostic-session-state.js";
|
||||
import {
|
||||
logSessionStateChange,
|
||||
resetDiagnosticStateForTest,
|
||||
resolveStuckSessionWarnMs,
|
||||
startDiagnosticHeartbeat,
|
||||
} from "./diagnostic.js";
|
||||
|
||||
describe("diagnostic session state pruning", () => {
|
||||
beforeEach(() => {
|
||||
@@ -74,3 +81,60 @@ describe("logger import side effects", () => {
|
||||
expect(mkdirSpy).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe("stuck session diagnostics threshold", () => {
|
||||
beforeEach(() => {
|
||||
vi.useFakeTimers();
|
||||
resetDiagnosticStateForTest();
|
||||
resetDiagnosticEventsForTest();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
resetDiagnosticEventsForTest();
|
||||
resetDiagnosticStateForTest();
|
||||
vi.useRealTimers();
|
||||
});
|
||||
|
||||
it("uses the configured diagnostics.stuckSessionWarnMs threshold", () => {
|
||||
const events: Array<{ type: string }> = [];
|
||||
const unsubscribe = onDiagnosticEvent((event) => {
|
||||
events.push({ type: event.type });
|
||||
});
|
||||
try {
|
||||
startDiagnosticHeartbeat({
|
||||
diagnostics: {
|
||||
enabled: true,
|
||||
stuckSessionWarnMs: 30_000,
|
||||
},
|
||||
});
|
||||
logSessionStateChange({ sessionId: "s1", sessionKey: "main", state: "processing" });
|
||||
vi.advanceTimersByTime(61_000);
|
||||
} finally {
|
||||
unsubscribe();
|
||||
}
|
||||
|
||||
expect(events.filter((event) => event.type === "session.stuck")).toHaveLength(1);
|
||||
});
|
||||
|
||||
it("falls back to default threshold when config is absent", () => {
|
||||
const events: Array<{ type: string }> = [];
|
||||
const unsubscribe = onDiagnosticEvent((event) => {
|
||||
events.push({ type: event.type });
|
||||
});
|
||||
try {
|
||||
startDiagnosticHeartbeat();
|
||||
logSessionStateChange({ sessionId: "s2", sessionKey: "main", state: "processing" });
|
||||
vi.advanceTimersByTime(31_000);
|
||||
} finally {
|
||||
unsubscribe();
|
||||
}
|
||||
|
||||
expect(events.filter((event) => event.type === "session.stuck")).toHaveLength(0);
|
||||
});
|
||||
|
||||
it("uses default threshold for invalid values", () => {
|
||||
expect(resolveStuckSessionWarnMs({ diagnostics: { stuckSessionWarnMs: -1 } })).toBe(120_000);
|
||||
expect(resolveStuckSessionWarnMs({ diagnostics: { stuckSessionWarnMs: 0 } })).toBe(120_000);
|
||||
expect(resolveStuckSessionWarnMs()).toBe(120_000);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user