diff --git a/server/model/monitor.js b/server/model/monitor.js index 5acea39f4..70e157d68 100644 --- a/server/model/monitor.js +++ b/server/model/monitor.js @@ -1769,8 +1769,20 @@ class Monitor extends BeanModel { // screenshot_delay validation if (this.screenshot_delay !== undefined && this.screenshot_delay !== null) { const delay = Number(this.screenshot_delay); - if (isNaN(delay) || delay < 0 || delay > 30000) { - throw new Error("Screenshot delay must be between 0 and 30000 milliseconds"); + if (isNaN(delay) || delay < 0) { + throw new Error("Screenshot delay must be a non-negative number"); + } + + // Must not exceed 0.8 * timeout (page.goto timeout is interval * 1000 * 0.8) + const maxDelayFromTimeout = this.interval * 1000 * 0.8; + if (delay >= maxDelayFromTimeout) { + throw new Error(`Screenshot delay must be less than ${maxDelayFromTimeout}ms (0.8 × interval)`); + } + + // Must not exceed 0.5 * interval to prevent blocking next check + const maxDelayFromInterval = this.interval * 1000 * 0.5; + if (delay >= maxDelayFromInterval) { + throw new Error(`Screenshot delay must be less than ${maxDelayFromInterval}ms (0.5 × interval)`); } } } diff --git a/src/lang/en.json b/src/lang/en.json index 361b31c49..35c499d8e 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -1058,6 +1058,7 @@ "Screenshot Delay ({ms})": "Screenshot Delay ({ms})", "ms": "ms", "screenshotDelayDescription": "Wait this many milliseconds before taking the screenshot.", + "screenshotDelayMaxInfo": "Maximum: {max}ms (0.5 × interval).", "screenshotDelayWarning": "Higher values keep the browser open longer, which may increase memory usage with many concurrent monitors.", "GrafanaOncallUrl": "Grafana Oncall URL", "systemService": "System Service", diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index e2e0ebedb..7d253f60f 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -274,11 +274,12 @@ type="number" class="form-control" min="0" - max="30000" + :max="Math.floor(monitor.interval * 1000 * 0.5)" step="100" />
{{ $t("screenshotDelayDescription") }} + {{ $t("screenshotDelayMaxInfo", { max: Math.floor(monitor.interval * 1000 * 0.5) }) }}
{{ $t("screenshotDelayWarning") }}