{"record":{"id":"88505d796109b7f0","repo":"crowdsecurity/crowdsec","slug":"cannot-specify-both-group-id-and-partition","errorCode":null,"errorMessage":"cannot specify both group_id and partition","messagePattern":"cannot specify both group_id and partition","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/acquisition/modules/kafka/config.go","lineNumber":174,"sourceCode":"\t\t}\n\n\t\tdialer.TLS = tlsConfig\n\t}\n\n\treturn dialer, nil\n}\n\nfunc (c *Configuration) NewReader(dialer *kafka.Dialer, logger *log.Entry) (*kafka.Reader, error) {\n\trConf := kafka.ReaderConfig{\n\t\tBrokers:     c.Brokers,\n\t\tTopic:       c.Topic,\n\t\tDialer:      dialer,\n\t\tLogger:      kafka.LoggerFunc(logger.Debugf),\n\t\tErrorLogger: kafka.LoggerFunc(logger.Errorf),\n\t}\n\n\tif c.GroupID != \"\" && c.Partition != 0 {\n\t\treturn &kafka.Reader{}, errors.New(\"cannot specify both group_id and partition\")\n\t}\n\n\tif c.GroupID != \"\" {\n\t\trConf.GroupID = c.GroupID\n\t\t// kafka-go does not support calling SetOffset while using a consumer group\n\t\trConf.StartOffset = kafka.LastOffset\n\t} else if c.Partition != 0 {\n\t\trConf.Partition = c.Partition\n\t} else {\n\t\tlogger.Warnf(\"no group_id specified, crowdsec will only read from the 1st partition of the topic\")\n\t}\n\n\tif c.BatchConfiguration.BatchMinBytes != 0 {\n\t\trConf.MinBytes = c.BatchConfiguration.BatchMinBytes\n\t}\n\n\tif c.BatchConfiguration.BatchMaxBytes != 0 {\n\t\trConf.MaxBytes = c.BatchConfiguration.BatchMaxBytes","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/crowdsecurity/crowdsec/blob/909b5157986a2b2c2163300fdaef5ed01289f7d2/pkg/acquisition/modules/kafka/config.go#L156-L192","documentation":"kafka-go readers work either as a consumer group (GroupID set, partitions auto-assigned) or pinned to a specific Partition (no group). NewReader (pkg/acquisition/modules/kafka/config.go:174) treats setting both as contradictory configuration and returns an empty reader plus this error.","triggerScenarios":"Creating a kafka source/reader whose Configuration has both a non-empty group_id and a non-zero partition, via YAML config or by calling NewReader directly.","commonSituations":"Merging a consumer-group template config with a manual-partition example; leftover group_id from an earlier config while partition was added for offset control; copy-paste combining two acquisition snippets.","solutions":["Decide on one mode: keep group_id and remove partition (group consumption, offsets managed by the group), or keep partition and remove group_id.","Remember partition: 0 is also treated as 'unset' — to use partition 0 with no group, omit group_id entirely.","Review the acquisition YAML so only one of the two keys is present."],"exampleFix":"// before (acquis.yaml)\nkafka:\n  group_id: mygroup\n  partition: 3\n\n// after (group mode)\nkafka:\n  group_id: mygroup\n// or (manual partition mode)\nkafka:\n  partition: 3","handlingStrategy":"validation","validationCode":"if cfg.GroupID != \"\" && cfg.Partition != 0 {\n    return errors.New(\"kafka source: set group_id OR partition, not both\")\n}","typeGuard":"func validKafkaConsumerMode(cfg struct{ GroupID string; Partition int }) bool {\n    return !(cfg.GroupID != \"\" && cfg.Partition != 0)\n}","tryCatchPattern":"r, err := kafka.NewReader(conf)\nif err != nil && strings.Contains(err.Error(), \"cannot specify both group_id and partition\") {\n    // drop one of the two settings and rebuild the reader\n}","preventionTips":["Pick consumer-group mode or manual-partition mode per source and document it.","Remember partition: 0 means unset here — omit group_id to pin partition 0.","Don't merge consumer-group and manual-partition example configs."],"tags":["kafka","config","validation"],"backgroundTag":"mutually-exclusive-options","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"}