{"record":{"id":"0f48deafd14712e4","repo":"crowdsecurity/crowdsec","slug":"invalid-since-in-dsn-w-0f48de","errorCode":null,"errorMessage":"invalid since in dsn: %w","messagePattern":"invalid since in dsn: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/acquisition/modules/victorialogs/config.go","lineNumber":161,"sourceCode":"\t}\n\n\tif q := params.Get(\"query\"); q != \"\" {\n\t\ts.Config.Query = q\n\t}\n\n\tif w := params.Get(\"wait_for_ready\"); w != \"\" {\n\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)","sourceCodeStart":143,"sourceCodeEnd":179,"githubUrl":"https://github.com/crowdsecurity/crowdsec/blob/909b5157986a2b2c2163300fdaef5ed01289f7d2/pkg/acquisition/modules/victorialogs/config.go#L143-L179","documentation":"ConfigureByDSN parses DSN parameters for the VictoriaLogs acquisition source. The `since` parameter must be a valid Go duration string (e.g. \"5m\", \"1h\"); when time.ParseDuration fails to parse the provided value, the error is wrapped with \"invalid since in dsn\" and configuration is aborted.","triggerScenarios":"Calling ConfigureByDSN (or cscli/crowdsec loading the acquis.yaml DSN) with a `since=` URL parameter that is not a parseable duration, e.g. `since=yesterday`, `since=24h`, `since=3600` (missing unit).","commonSituations":"Typo in the duration unit, copying a Unix timestamp or human phrase into `since`, or setting `since` in a config file without realizing Go duration syntax requires a unit suffix.","solutions":["Fix the `since` value in the DSN/acquis.yaml to a valid Go duration, e.g. `since=1h`","Remember valid units are ns, us, ms, s, m, h — days/weeks are not supported; convert manually (e.g. 1d -> 24h)","Check the wrapped error message for the exact position where parsing failed","Omit the `since` parameter entirely to use the default"],"exampleFix":"// before\nurl: victorialogs+http://127.0.0.1:8428?since=24h\n// after\nurl: victorialogs+http://127.0.0.1:8428?since=24h0m0s # or a valid unit like 1h","handlingStrategy":"validation","validationCode":"const dsn = \"victorialogs+http://127.0.0.1:8428?since=1h\"\nconst p = new URL(dsn.slice(\"victorialogs+\".length))\nconst since = p.searchParams.get(\"since\")\nif (since && !/^-?\\d+(ns|us|ms|s|m|h)([\\d.]+(ns|us|ms|s|m|h))*$/.test(since)) {\n  throw new Error(`invalid since duration: ${since}`)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always include a unit suffix in duration values (1h, 30m, 90s)","Convert days/weeks to hours manually — Go durations lack d/w units","Run config validation (cscli) before starting the service"],"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"}