Skip to content

Commit 9287343

Browse files
Merge pull request #115 from lensesio-dev/bugfix/header-translation
Header translation
2 parents e0d925d + d8bae26 commit 9287343

File tree

5 files changed

+47
-36
lines changed

5 files changed

+47
-36
lines changed

java-connectors/kafka-connect-sink-reporting/src/main/java/io/lenses/streamreactor/connect/reporting/model/ReportHeadersConstants.java

+1
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,6 @@ public class ReportHeadersConstants {
2323
public static final String INPUT_TOPIC = "input_topic";
2424
public static final String INPUT_KEY = "input_key";
2525
public static final String INPUT_PAYLOAD = "input_payload";
26+
public static final String ERROR = "error_message";
2627

2728
}

java-connectors/kafka-connect-sink-reporting/src/main/java/io/lenses/streamreactor/connect/reporting/model/generic/ProducerRecordConverter.java

+13-10
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,19 @@
1515
*/
1616
package io.lenses.streamreactor.connect.reporting.model.generic;
1717

18-
import static io.lenses.streamreactor.common.util.ByteConverters.toBytes;
19-
20-
import cyclops.control.Option;
2118
import cyclops.control.Try;
2219
import io.lenses.streamreactor.connect.reporting.model.ReportHeadersConstants;
23-
import java.io.IOException;
24-
import java.util.List;
25-
import java.util.Optional;
2620
import lombok.AccessLevel;
2721
import lombok.NoArgsConstructor;
2822
import lombok.extern.slf4j.Slf4j;
2923
import org.apache.kafka.clients.producer.ProducerRecord;
3024
import org.apache.kafka.common.header.Header;
3125
import org.apache.kafka.common.header.internals.RecordHeader;
3226

27+
import java.io.IOException;
28+
import java.util.List;
29+
import java.util.Optional;
30+
3331
@NoArgsConstructor(access = AccessLevel.PRIVATE)
3432
@Slf4j
3533
public class ProducerRecordConverter {
@@ -48,11 +46,16 @@ private static Optional<ProducerRecord<byte[], String>> createRecord(List<Header
4846

4947
private static Optional<List<Header>> convertToHeaders(ReportingRecord originalRecord) {
5048
return Try.withCatch(() -> List.<Header>of(
51-
new RecordHeader(ReportHeadersConstants.INPUT_TOPIC, toBytes(originalRecord.getTopicPartition().topic())),
52-
new RecordHeader(ReportHeadersConstants.INPUT_OFFSET, toBytes(originalRecord.getOffset())),
53-
new RecordHeader(ReportHeadersConstants.INPUT_TIMESTAMP, toBytes(originalRecord.getTimestamp())),
49+
new RecordHeader(ReportHeadersConstants.INPUT_TOPIC, originalRecord.getTopicPartition().topic().getBytes()),
50+
new RecordHeader(ReportHeadersConstants.INPUT_PARTITION, String.valueOf(originalRecord.getTopicPartition()
51+
.partition()).getBytes()),
52+
new RecordHeader(ReportHeadersConstants.INPUT_OFFSET, String.valueOf(originalRecord.getOffset()).getBytes()),
53+
new RecordHeader(ReportHeadersConstants.INPUT_TIMESTAMP, String.valueOf(originalRecord.getTimestamp())
54+
.getBytes()),
5455
new RecordHeader(ReportHeadersConstants.INPUT_KEY, null),
55-
new RecordHeader(ReportHeadersConstants.INPUT_PAYLOAD, toBytes(originalRecord.getPayload()))
56+
new RecordHeader(ReportHeadersConstants.INPUT_PAYLOAD, originalRecord.getPayload().getBytes()),
57+
new RecordHeader(ReportHeadersConstants.ERROR, originalRecord.getError().map(String::getBytes).orElseGet(
58+
""::getBytes))
5659
), IOException.class)
5760
.peekFailed(f -> log.warn(
5861
String.format("Couldn't transform record to Report. Report won't be sent. Topic=%s, Offset=%s",

java-connectors/kafka-connect-sink-reporting/src/main/java/io/lenses/streamreactor/connect/reporting/model/generic/ReportingRecord.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,16 @@
1515
*/
1616
package io.lenses.streamreactor.connect.reporting.model.generic;
1717

18-
import cyclops.data.Seq;
18+
import cyclops.control.Option;
1919
import cyclops.data.tuple.Tuple2;
2020
import io.lenses.streamreactor.connect.reporting.model.RecordReport;
21-
import java.util.List;
2221
import lombok.AllArgsConstructor;
2322
import lombok.Data;
2423
import lombok.Getter;
25-
import lombok.val;
2624
import org.apache.kafka.clients.producer.ProducerRecord;
2725
import org.apache.kafka.common.TopicPartition;
2826

27+
import java.util.List;
2928
import java.util.Optional;
3029

3130
@AllArgsConstructor
@@ -40,6 +39,7 @@ public class ReportingRecord implements RecordReport {
4039
private String endpoint;
4140
private String payload;
4241
private List<Tuple2<String, String>> headers;
42+
private Option<String> error;
4343

4444
@Override
4545
public Optional<ProducerRecord<byte[], String>> produceReportRecord(String reportingTopic) {

java-connectors/kafka-connect-sink-reporting/src/test/java/io/lenses/streamreactor/connect/reporting/model/generic/ProducerRecordConverterTest.java

+22-19
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,25 @@
1515
*/
1616
package io.lenses.streamreactor.connect.reporting.model.generic;
1717

18-
import static io.lenses.streamreactor.common.util.ByteConverters.toBytes;
19-
import static org.assertj.core.api.Assertions.from;
20-
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
21-
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
22-
import static org.junit.jupiter.api.Assertions.assertEquals;
23-
import static org.junit.jupiter.api.Assertions.assertNotNull;
24-
import static org.junit.jupiter.api.Assertions.assertTrue;
25-
26-
import cyclops.data.Seq;
27-
import cyclops.data.tuple.Tuple2;
18+
import cyclops.control.Option;
2819
import io.lenses.streamreactor.connect.reporting.model.ReportHeadersConstants;
29-
import java.io.IOException;
30-
import java.util.Collections;
31-
import java.util.Optional;
3220
import org.apache.kafka.clients.producer.ProducerRecord;
3321
import org.apache.kafka.common.TopicPartition;
3422
import org.apache.kafka.common.header.Header;
3523
import org.apache.kafka.common.header.internals.RecordHeader;
3624
import org.junit.jupiter.api.Test;
3725

26+
import java.io.IOException;
27+
import java.util.Collections;
28+
import java.util.Optional;
29+
30+
import static org.assertj.core.api.Assertions.from;
31+
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
32+
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
33+
import static org.junit.jupiter.api.Assertions.assertEquals;
34+
import static org.junit.jupiter.api.Assertions.assertNotNull;
35+
import static org.junit.jupiter.api.Assertions.assertTrue;
36+
3837
class ProducerRecordConverterTest {
3938

4039
private static final String REPORTING_TOPIC = "reporting";
@@ -44,6 +43,7 @@ class ProducerRecordConverterTest {
4443
private static final long TIMESTAMP = 222L;
4544
private static final String ENDPOINT = "endpoint.local";
4645
private static final String JSON_PAYLOAD = "{\"payload\": \"somevalue\"}";
46+
private static final String ERROR = "Bad things happened";
4747

4848
@Test
4949
void convertShouldProduceProducerRecord() throws IOException {
@@ -60,7 +60,7 @@ void convertShouldProduceProducerRecord() throws IOException {
6060

6161
assertNotNull(record.headers());
6262
Header[] headers = record.headers().toArray();
63-
assertEquals(5, headers.length);
63+
assertEquals(7, headers.length);
6464

6565
assertThat(record)
6666
.returns(REPORTING_TOPIC, from(ProducerRecord::topic))
@@ -72,17 +72,20 @@ void convertShouldProduceProducerRecord() throws IOException {
7272

7373
private Header[] buildExpectedHeaders() throws IOException {
7474
return new Header[]{
75-
new RecordHeader(ReportHeadersConstants.INPUT_TOPIC, toBytes(TOPIC)),
76-
new RecordHeader(ReportHeadersConstants.INPUT_OFFSET, toBytes(OFFSET)),
77-
new RecordHeader(ReportHeadersConstants.INPUT_TIMESTAMP, toBytes(TIMESTAMP)),
75+
new RecordHeader(ReportHeadersConstants.INPUT_TOPIC, TOPIC.getBytes()),
76+
new RecordHeader(ReportHeadersConstants.INPUT_PARTITION, String.valueOf(PARTITION).getBytes()),
77+
new RecordHeader(ReportHeadersConstants.INPUT_OFFSET, String.valueOf(OFFSET).getBytes()),
78+
new RecordHeader(ReportHeadersConstants.INPUT_TIMESTAMP, String.valueOf(TIMESTAMP).getBytes()),
7879
new RecordHeader(ReportHeadersConstants.INPUT_KEY, null),
79-
new RecordHeader(ReportHeadersConstants.INPUT_PAYLOAD, toBytes(JSON_PAYLOAD))
80+
new RecordHeader(ReportHeadersConstants.INPUT_PAYLOAD, JSON_PAYLOAD.getBytes()),
81+
new RecordHeader(ReportHeadersConstants.ERROR, "".getBytes())
8082
};
8183
}
8284

8385
private ReportingRecord createReportingRecord() {
8486
return new ReportingRecord(new TopicPartition(TOPIC, PARTITION), OFFSET,
85-
TIMESTAMP, ENDPOINT, JSON_PAYLOAD, Collections.emptyList()
87+
TIMESTAMP, ENDPOINT, JSON_PAYLOAD, Collections.emptyList(),
88+
Option.none()
8689
);
8790
}
8891
}

kafka-connect-http/src/main/scala/io/lenses/streamreactor/connect/http/sink/HttpWriter.scala

+8-4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package io.lenses.streamreactor.connect.http.sink
1818
import cats.effect.IO
1919
import cats.effect.Ref
2020
import cats.effect.unsafe.implicits.global
21+
import cats.implicits.catsSyntaxOptionId
22+
import cats.implicits.none
2123
import com.typesafe.scalalogging.LazyLogging
2224
import cyclops.data.tuple
2325
import io.lenses.streamreactor.connect.cloud.common.model.TopicPartition
@@ -37,6 +39,7 @@ import org.apache.kafka.clients.consumer.OffsetAndMetadata
3739
import java.util
3840
import scala.collection.immutable.Queue
3941
import scala.jdk.CollectionConverters.SeqHasAsJava
42+
import scala.jdk.OptionConverters.RichOption
4043

4144
class HttpWriter(
4245
sinkName: String,
@@ -189,20 +192,21 @@ class HttpWriter(
189192
): IO[Unit] = {
190193
val maxRecord = OffsetMergeUtils.maxRecord(renderedRecords)
191194

192-
val reportRecord = (templateContent: String) =>
195+
val reportRecord = (error: Option[String]) =>
193196
new ReportingRecord(
194197
maxRecord.topicPartitionOffset.toTopicPartition.toKafka,
195198
maxRecord.topicPartitionOffset.offset.value,
196199
maxRecord.timestamp,
197200
processedTemplate.endpoint,
198-
templateContent,
201+
processedTemplate.content,
199202
convertToCyclopsTuples(processedTemplate.headers),
203+
cyclops.control.Option.fromOptional(error.toJava),
200204
)
201205

202206
responseIo.flatTap { _ =>
203-
IO(successReporter.enqueue(reportRecord(processedTemplate.content)))
207+
IO(successReporter.enqueue(reportRecord(none)))
204208
}.handleErrorWith { error =>
205-
IO(errorReporter.enqueue(reportRecord(error.getMessage))) *> IO.raiseError(error)
209+
IO(errorReporter.enqueue(reportRecord(error.getMessage.some))) *> IO.raiseError(error)
206210
}
207211
}
208212

0 commit comments

Comments
 (0)