{"record":{"id":"19eb8dcbc7156ca8","repo":"VictoriaMetrics/VictoriaMetrics","slug":"cannot-parse-dedup-interval-q-w","errorCode":null,"errorMessage":"cannot parse `dedup_interval: %q`: %w","messagePattern":"cannot parse `dedup_interval: %q`: %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"lib/streamaggr/streamaggr.go","lineNumber":494,"sourceCode":"\t}\n\tinterval, err := time.ParseDuration(cfg.Interval)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"cannot parse `interval: %q`: %w\", cfg.Interval, err)\n\t}\n\tif interval < time.Second {\n\t\treturn nil, fmt.Errorf(\"aggregation interval cannot be smaller than 1s; got %s\", interval)\n\t}\n\n\tif opts == nil {\n\t\topts = &Options{}\n\t}\n\n\t// check cfg.DedupInterval\n\tdedupInterval := opts.DedupInterval\n\tif cfg.DedupInterval != \"\" {\n\t\tdi, err := time.ParseDuration(cfg.DedupInterval)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"cannot parse `dedup_interval: %q`: %w\", cfg.DedupInterval, err)\n\t\t}\n\t\tdedupInterval = di\n\t}\n\tif dedupInterval > interval {\n\t\treturn nil, fmt.Errorf(\"dedup_interval=%s cannot exceed interval=%s\", dedupInterval, interval)\n\t}\n\tif dedupInterval > 0 && interval%dedupInterval != 0 {\n\t\treturn nil, fmt.Errorf(\"interval=%s must be a multiple of dedup_interval=%s\", interval, dedupInterval)\n\t}\n\n\t// set the default staleness interval as the aggregation interval, to be consistent with query lookbehind window in metricsQL,\n\t// see https://github.com/VictoriaMetrics/VictoriaMetrics/issues/11102\n\tstalenessInterval := interval\n\tif cfg.StalenessInterval != \"\" {\n\t\tstalenessInterval, err = time.ParseDuration(cfg.StalenessInterval)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"cannot parse `staleness_interval: %q`: %w\", cfg.StalenessInterval, err)\n\t\t}","sourceCodeStart":476,"sourceCodeEnd":512,"githubUrl":"https://github.com/VictoriaMetrics/VictoriaMetrics/blob/5079fb58f1e8e62113f90c945ad71586c797d770/lib/streamaggr/streamaggr.go#L476-L512","documentation":"The optional `dedup_interval` must itself be a valid Go duration. If cfg.DedupInterval is set but fails time.ParseDuration, the parse error is wrapped. It controls how duplicate samples within an interval are collapsed.","triggerScenarios":"Config entry with `dedup_interval: 5` (missing unit), `dedup_interval: 5mins`, or any other unparseable duration string.","commonSituations":"Same duration-format mistakes as interval but on the dedup option; copy-paste leaving placeholder text in the value.","solutions":["Use a valid Go duration, e.g. `dedup_interval: 10s`.","Always include a unit (s/m/h); bare numbers are invalid.","Remove the option entirely if deduplication is not needed."],"exampleFix":"// before\ndedup_interval: 10\n// after\ndedup_interval: 10s","handlingStrategy":"validation","validationCode":"if cfg.DedupInterval != \"\" {\n\tif _, err := time.ParseDuration(cfg.DedupInterval); err != nil {\n\t\treturn fmt.Errorf(\"dedup_interval %q is not a Go duration like 10s\", cfg.DedupInterval)\n\t}\n}","typeGuard":null,"tryCatchPattern":"as, err := streamaggr.LoadFromFile(path, pushFn, opts, alias)\nif err != nil {\n\tif strings.Contains(err.Error(), \"cannot parse `dedup_interval\") {\n\t\treturn fmt.Errorf(\"fix dedup_interval to a Go duration like 10s: %w\", err)\n\t}\n\treturn err\n}","preventionTips":["Append a unit (s/m/h) to dedup_interval values.","Pre-validate duration fields with time.ParseDuration.","Remove dedup_interval if deduplication is not needed."],"tags":["config","duration-parsing","dedup"],"backgroundTag":"invalid-duration-format","analyzedSha":"5079fb58f1e8e62113f90c945ad71586c797d770","analyzedAt":"2026-09-03T18:10:26.153Z","contentChangedAt":"2026-09-03T18:10:26.153Z","schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}