Skip to content

Commit 8ad004d

Browse files
authored
Encode decimal values as numeric rather than base64 (#46)
Currently incoming `BigDecimal` values (e.g. from avro decoding) are encoded as base64 strings (the default) by the JsonConverter. Instead, it seems to make more sense to encode them as numeric values when publishing to Datadog. I considered making this configurable, but it seems unlikely that users would want the current behavior since it makes the data much less scruitable in Datadog. If we find this not to be the case (through an issue report) we can add a configuration option later. As it stands, I think it is a bug. Fixes: #27 Signed-off-by: Jesse Szwedko <[email protected]>
1 parent f9ca534 commit 8ad004d

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<url>https://www.datadoghq.com/</url>
1212
</organization>
1313
<name>datadog-kafka-connect-logs</name>
14-
<version>1.1.2</version>
14+
<version>1.1.3-SNAPSHOT</version>
1515
<description>A Kafka Connect Connector that sends Kafka Connect records as logs to the Datadog API.</description>
1616
<url>https://github.com/DataDog/datadog-kafka-connect-logs</url>
1717

src/main/java/com/datadoghq/connect/logs/sink/DatadogLogsApiWriter.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,12 @@ public DatadogLogsApiWriter(DatadogLogsSinkConnectorConfig config) {
3232
this.config = config;
3333
this.batches = new HashMap<>();
3434
this.jsonConverter = new JsonConverter();
35-
jsonConverter.configure(Collections.singletonMap("schemas.enable", "false"), false);
35+
36+
Map<String,String> jsonConverterConfig = new HashMap<String,String>();
37+
jsonConverterConfig.put("schemas.enable", "false");
38+
jsonConverterConfig.put("decimal.format", "NUMERIC");
39+
40+
jsonConverter.configure(jsonConverterConfig, false);
3641
}
3742

3843
/**

src/test/java/com/datadoghq/connect/logs/sink/DatadogLogsApiWriterTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ This product includes software developed at Datadog (https://www.datadoghq.com/)
1010
import com.datadoghq.connect.logs.util.Project;
1111

1212
import org.apache.kafka.connect.sink.SinkRecord;
13+
import org.apache.kafka.connect.data.Decimal;
14+
import org.apache.kafka.connect.data.Schema;
1315
import org.junit.After;
1416
import org.junit.Assert;
1517
import org.junit.Before;
@@ -22,6 +24,8 @@ This product includes software developed at Datadog (https://www.datadoghq.com/)
2224
import java.util.List;
2325
import java.util.Map;
2426
import java.util.Set;
27+
import java.math.BigDecimal;
28+
import java.math.BigInteger;
2529

2630
public class DatadogLogsApiWriterTest {
2731
private Map<String, String> props;
@@ -65,6 +69,22 @@ public void writer_givenConfigs_sendsPOSTToURL() throws IOException {
6569
Assert.assertTrue(request.getHeaders().contains("User-Agent:datadog-kafka-connect-logs/" + Project.getVersion()));
6670
}
6771

72+
@Test
73+
public void writer_handles_bigDecimal() throws IOException {
74+
DatadogLogsSinkConnectorConfig config = new DatadogLogsSinkConnectorConfig(false, 500, props);
75+
DatadogLogsApiWriter writer = new DatadogLogsApiWriter(config);
76+
77+
Schema schema = Decimal.schema(2);
78+
BigDecimal value = new BigDecimal(new BigInteger("156"), 2);
79+
80+
records.add(new SinkRecord("someTopic", 0, null, "someKey", schema, value, 0));
81+
writer.write(records);
82+
83+
Assert.assertEquals(1, restHelper.getCapturedRequests().size());
84+
RequestInfo request = restHelper.getCapturedRequests().get(0);
85+
Assert.assertEquals("[{\"message\":1.56,\"ddsource\":\"kafka-connect\",\"ddtags\":\"topic:someTopic\"}]", request.getBody());
86+
}
87+
6888
@Test
6989
public void writer_batchAtMax_shouldSendBatched() throws IOException {
7090
DatadogLogsSinkConnectorConfig config = new DatadogLogsSinkConnectorConfig(false, 2, props);

0 commit comments

Comments
 (0)