{"record":{"id":"4a4408585e5dda27","repo":"crowdsecurity/crowdsec","slug":"unable-to-parse-s-as-duration-w","errorCode":null,"errorMessage":"unable to parse '%s' as duration: %w","messagePattern":"unable to parse '(.+?)' as duration: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/acquisition/modules/cloudwatch/config.go","lineNumber":269,"sourceCode":"\t\t\tstrdate, startDate := parser.GenDateParse(v[0])\n\t\t\ts.logger.Debugf(\"parsed '%s' as '%s'\", v[0], strdate)\n\t\t\ts.Config.StartTime = &startDate\n\t\tcase \"end_date\":\n\t\t\tif len(v) != 1 {\n\t\t\t\treturn errors.New(\"expected zero or one argument for 'end_date'\")\n\t\t\t}\n\t\t\t// let's reuse our parser helper so that a ton of date formats are supported\n\t\t\tstrdate, endDate := parser.GenDateParse(v[0])\n\t\t\ts.logger.Debugf(\"parsed '%s' as '%s'\", v[0], strdate)\n\t\t\ts.Config.EndTime = &endDate\n\t\tcase \"backlog\":\n\t\t\tif len(v) != 1 {\n\t\t\t\treturn errors.New(\"expected zero or one argument for 'backlog'\")\n\t\t\t}\n\t\t\t// let's reuse our parser helper so that a ton of date formats are supported\n\t\t\tduration, err := time.ParseDuration(v[0])\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"unable to parse '%s' as duration: %w\", v[0], err)\n\t\t\t}\n\n\t\t\ts.logger.Debugf(\"parsed '%s' as '%s'\", v[0], duration)\n\t\t\tstart := time.Now().UTC().Add(-duration)\n\t\t\ts.Config.StartTime = &start\n\t\t\tend := time.Now().UTC()\n\t\t\ts.Config.EndTime = &end\n\t\tdefault:\n\t\t\treturn fmt.Errorf(\"unexpected argument %s\", k)\n\t\t}\n\t}\n\n\ts.logger.Tracef(\"host=%s\", s.Config.GroupName)\n\ts.logger.Tracef(\"stream=%s\", *s.Config.StreamName)\n\ts.Config.GetLogEventsPagesLimit = &def_GetLogEventsPagesLimit\n\n\tif err := s.newClient(ctx); err != nil {\n\t\treturn err","sourceCodeStart":251,"sourceCodeEnd":287,"githubUrl":"https://github.com/crowdsecurity/crowdsec/blob/909b5157986a2b2c2163300fdaef5ed01289f7d2/pkg/acquisition/modules/cloudwatch/config.go#L251-L287","documentation":"The `backlog` DSN parameter must be a Go duration string parsed with time.ParseDuration (e.g. 2h, 30m). When parsing fails the error is wrapped as `unable to parse '<value>' as duration: <underlying error>`. Configuration stops and the datasource is rejected.","triggerScenarios":"ConfigureByDSN called with a DSN like `cloudwatch://group?backlog=2days` or `backlog=3600` — any value without a Go duration unit (h, m, s, etc.) or with an invalid unit.","commonSituations":"Users write '2d' (Go durations have no day unit), plain integers meaning seconds, or human-friendly strings like 'yesterday'.","solutions":["Use a Go-standard duration string: 1h30m, 7200s, 24h — note there is no 'd' unit, so 1 day is 24h","Verify the value has both a number and a unit, e.g. '30m' not '30'","Compute multi-day backlogs as multiples of 24h, e.g. 3 days = 72h"],"exampleFix":"// before\ncloudwatch://my-group?backlog=2d\n// after\ncloudwatch://my-group?backlog=48h","handlingStrategy":"validation","validationCode":"v := \"48h\"\nif _, err := time.ParseDuration(v); err != nil {\n    return fmt.Errorf(\"backlog must be a Go duration (no 'd' unit): %v\", err)\n}","typeGuard":null,"tryCatchPattern":"if err := ds.ConfigureByDSN(ctx, dsn); err != nil {\n    if strings.Contains(err.Error(), \"as duration\") { /* normalize backlog value */ }\n}","preventionTips":["Remember Go durations have no days unit — use 24h multiples","Always include a unit: '30m', not '30'","Validate duration strings in CI config checks"],"tags":["config","aws","duration","cloudwatch"],"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-14T00:17:10.932Z"}