{"record":{"id":"5b62d72773520959","repo":"alibaba/Sentinel","slug":"interval-cannot-be-less-than-1","errorCode":null,"errorMessage":"Interval cannot be less than 1","messagePattern":"Interval cannot be less than 1","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"sentinel-core/src/main/java/com/alibaba/csp/sentinel/eagleeye/StatLoggerBuilder.java","lineNumber":97,"sourceCode":"\n        EagleEyeAppender appender = this.appender;\n        if (appender == null) {\n            EagleEyeRollingFileAppender rfAppender = new EagleEyeRollingFileAppender(filePath, maxFileSize);\n            appender = new SyncAppender(rfAppender);\n        }\n\n        EagleEyeLogDaemon.watch(appender);\n        return new StatLogger(loggerName, appender, intervalMillis, maxEntryCount,\n            entryDelimiter, keyDelimiter, valueDelimiter);\n    }\n\n    public StatLogger buildSingleton() {\n        return StatLogController.createLoggerIfNotExists(this);\n    }\n\n    static void validateInterval(final long intervalSeconds) throws IllegalArgumentException {\n        if (intervalSeconds < 1) {\n            throw new IllegalArgumentException(\"Interval cannot be less than 1\" + intervalSeconds);\n        } else if (intervalSeconds < 60) {\n            if (60 % intervalSeconds != 0) {\n                throw new IllegalArgumentException(\"Invalid second interval (cannot divide by 60): \" + intervalSeconds);\n            }\n        } else if (intervalSeconds <= 5 * 60) {\n            if (intervalSeconds % 60 != 0) {\n                throw new IllegalArgumentException(\"Invalid second interval (cannot divide by 60): \" + intervalSeconds);\n            }\n            if (60 % intervalSeconds != 0) {\n                throw new IllegalArgumentException(\"Invalid second interval (cannot divide by 60): \" + intervalSeconds);\n            }\n        } else if (intervalSeconds > 5 * 60) {\n            throw new IllegalArgumentException(\"Interval should be less than 5 min: \" + intervalSeconds);\n        }\n    }\n}\n","sourceCodeStart":79,"sourceCodeEnd":114,"githubUrl":"https://github.com/alibaba/Sentinel/blob/a3f40ba8e900c8489bd520274739f17235a7721c/sentinel-core/src/main/java/com/alibaba/csp/sentinel/eagleeye/StatLoggerBuilder.java#L79-L114","documentation":"StatLoggerBuilder.validateInterval rejects flush intervals below 1 second. EagleEye stat loggers aggregate and flush on a fixed whole-second interval (converted to intervalMillis = intervalSeconds * 1000), so zero or negative intervals have no valid meaning and throw IllegalArgumentException. Note the message concatenates the value without a separator (\"Interval cannot be less than 1\" + intervalSeconds).","triggerScenarios":"Calling intervalSeconds(0) or a negative number on the builder — typically an interval loaded from config that is unset, defaults to 0, or is computed (e.g. ms vs s unit confusion: passing 500 meaning milliseconds).","commonSituations":"Configuration expresses the interval in milliseconds but the API takes seconds, so 500ms becomes 500s or a 0 slips through. A new environment omits the interval property and the fallback is 0. Refactoring changes the default from a valid value to 0.","solutions":["Pass a whole-second interval between 1 and 300 that divides 60 (e.g. 1, 2, 5, 10, 60).","Check the unit of the configured value; convert milliseconds to seconds before calling the builder.","Validate interval config at startup against the same rules validateInterval enforces."],"exampleFix":"// before\nint interval = config.getInt(\"stat.flush.ms\", 0); // ms, API wants seconds\nbuilder.intervalSeconds(interval); // throws\n\n// after\nint intervalMs = config.getInt(\"stat.flush.ms\", 1000);\nint intervalSec = Math.max(1, intervalMs / 1000);\nbuilder.intervalSeconds(intervalSec);","handlingStrategy":"validation","validationCode":"long sec = intervalMillis / 1000;\nif (sec < 1 || sec > 60) { throw new IllegalArgumentException(\"interval out of range: \" + sec); }\nbuilder.intervalSeconds((int) sec);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Confirm the API unit is seconds, not milliseconds, before wiring config.","Default interval configs to 1 or 60 seconds.","Reuse StatLoggerBuilder.validateInterval (package-visible) semantics in your own config checker."],"tags":["eagleeye","stat-logger","config","interval","illegal-argument","sentinel"],"backgroundTag":null,"analyzedSha":"a3f40ba8e900c8489bd520274739f17235a7721c","analyzedAt":"2026-08-14T11:10:30.678Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}