{"record":{"id":"4dadd08260f3ea57","repo":"crowdsecurity/crowdsec","slug":"invalid-max-failure-duration-in-dsn-w-4dadd0","errorCode":null,"errorMessage":"invalid max_failure_duration in dsn: %w","messagePattern":"invalid max_failure_duration in dsn: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/acquisition/modules/victorialogs/config.go","lineNumber":168,"sourceCode":"\t\ts.Config.WaitForReady, err = time.ParseDuration(w)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\ts.Config.WaitForReady = 10 * time.Second\n\t}\n\n\tif since := params.Get(\"since\"); since != \"\" {\n\t\ts.Config.Since, err = time.ParseDuration(since)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"invalid since in dsn: %w\", err)\n\t\t}\n\t}\n\n\tif maxFailureDuration := params.Get(\"max_failure_duration\"); maxFailureDuration != \"\" {\n\t\tduration, err := time.ParseDuration(maxFailureDuration)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"invalid max_failure_duration in dsn: %w\", err)\n\t\t}\n\n\t\ts.Config.MaxFailureDuration = duration\n\t} else {\n\t\ts.Config.MaxFailureDuration = 5 * time.Second // for OneShot mode it doesn't make sense to have longer duration\n\t}\n\n\tif limit := params.Get(\"limit\"); limit != \"\" {\n\t\tlimit, err := strconv.Atoi(limit)\n\t\tif err != nil {\n\t\t\treturn fmt.Errorf(\"invalid limit in dsn: %w\", err)\n\t\t}\n\n\t\ts.Config.Limit = limit\n\t}\n\n\tif logLevel := params.Get(\"log_level\"); logLevel != \"\" {\n\t\tlevel, err := log.ParseLevel(logLevel)","sourceCodeStart":150,"sourceCodeEnd":186,"githubUrl":"https://github.com/crowdsecurity/crowdsec/blob/909b5157986a2b2c2163300fdaef5ed01289f7d2/pkg/acquisition/modules/victorialogs/config.go#L150-L186","documentation":"ConfigureByDSN validates the optional `max_failure_duration` DSN parameter with time.ParseDuration. If the value cannot be parsed as a Go duration, the error is wrapped with \"invalid max_failure_duration in dsn\" and the source fails to configure.","triggerScenarios":"Providing `max_failure_duration=` in the DSN with a non-parseable duration string such as `max_failure_duration=infinite`, `max_failure_duration=30`, or `max_failure_duration=2d`.","commonSituations":"Users assuming days are a supported unit, omitting the unit entirely, or pasting a number when a duration string is expected; the default is 5s when the parameter is omitted.","solutions":["Use a valid Go duration string, e.g. `max_failure_duration=30s`","Convert unsupported units (days/weeks) to hours manually, e.g. 2d -> 48h","Remove the parameter to fall back to the built-in default of 5s","Check the wrapped error text for the exact character that failed parsing"],"exampleFix":"// before\nurl: victorialogs+http://127.0.0.1:8428?max_failure_duration=5m30\n// after\nurl: victorialogs+http://127.0.0.1:8428?max_failure_duration=5m30s","handlingStrategy":"validation","validationCode":"const v = p.searchParams.get(\"max_failure_duration\")\nif (v && !/^\\d+(ns|us|ms|s|m|h)([\\d.]+(ns|us|ms|s|m|h))*$/.test(v)) {\n  throw new Error(`invalid max_failure_duration: ${v}`)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use complete duration strings like 30s or 5m, never bare numbers","Remember the default is 5s if you omit the parameter","Validate all DSN params in a linter or CI check before deploy"],"tags":["config","duration-parsing","victorialogs"],"backgroundTag":"invalid-duration-format","analyzedSha":"909b5157986a2b2c2163300fdaef5ed01289f7d2","analyzedAt":"2026-09-06T12:27:26.012Z","contentChangedAt":"2026-09-06T12:27:26.012Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}