Hi all, The `ProducerRecord` type has many optional fields and the list has grown over different revisions of Kafka. Kafka supports `ProducerInterceptor`s, which often need to construct new `ProducerRecord`s, based on those passed in, copying most fields from the old to the new record, e.g.:
```java public ProducerRecord<K,V> onSend(ProducerRecord<K,V> record) { return new ProducerRecord<>(record.topic(), record.partition(), getSpecificTimestampIWantToSet(), record.key(), record.value()) } ``` If/when a new field is next added to the `ProducerRecord` all existing interceptor implementations will fail to copy across the new field, assuming a backwards compatible constructors exist that allow the old code to compile, (which the tend to do). This makes the code brittle and leaves me with a bad taste in my mouth. Additionally, the set of `ProducerRecord` constructors is multiplying as new optional fields are being added and not all combinations are supported, though they may be valid. I was wondering what peoples thoughts would be to introducing a builder pattern on the producer record? If we did and a pre-initialised builder could be obtained from any existing record, then interceptors can just set/oeverwrite the fields they care about, without additional fields being lost, so the above code becomes: ```java public ProducerRecord<K,V> onSend(ProducerRecord<K,V> record) { return record.asBuilder() .setTimestamp(getSpecificTimestampIWantToSet()) .build(); } ``` This has the benefits of less and more clear interceptor code, and the code will pass along new fields, added in a newer version, without modification. (Though interceptor authors can still make the choice to use a constructor instead, dropping new fields - but now they’d have a choice). If people like this idea then I can create a Jira and a PR. (Would a KIP be required also?). If people don’t, I’ll move along quietly… Thanks, Andy