Skip to content

Commit 8a36247

Browse files
authored
Add json serialization for DefaultTraceGroupFields (#5991)
* Add json serialization for DefaultTraceGroupFields Signed-off-by: Krishna Kondaka <krishkdk@amazon.com> * Fixed code coverage by adding more tests Signed-off-by: Krishna Kondaka <krishkdk@amazon.com> * Addressed review comments Signed-off-by: Krishna Kondaka <krishkdk@amazon.com> --------- Signed-off-by: Krishna Kondaka <krishkdk@amazon.com>
1 parent 8e37ee5 commit 8a36247

4 files changed

Lines changed: 97 additions & 11 deletions

File tree

data-prepper-api/src/main/java/org/opensearch/dataprepper/model/trace/DefaultTraceGroupFields.java

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,65 @@
55

66
package org.opensearch.dataprepper.model.trace;
77

8+
import com.fasterxml.jackson.databind.ObjectMapper;
9+
10+
11+
import java.io.ObjectOutputStream;
12+
import java.io.ObjectInputStream;
13+
14+
import java.io.IOException;
15+
import java.io.Serializable;
16+
import java.util.Objects;
17+
818
/**
919
* The default implementation of {@link TraceGroupFields}, the attributes associated with an entire trace.
1020
*
1121
* @since 1.2
1222
*/
13-
public class DefaultTraceGroupFields implements TraceGroupFields {
23+
public class DefaultTraceGroupFields implements TraceGroupFields, Serializable {
1424

25+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
1526
private String endTime;
1627
private Long durationInNanos;
1728
private Integer statusCode;
1829

1930
// required for serialization
2031
DefaultTraceGroupFields() {}
2132

33+
DefaultTraceGroupFields(final String endTime, final Long durationInNanos, final Integer statusCode) {
34+
this.endTime = endTime;
35+
this.durationInNanos = durationInNanos;
36+
this.statusCode = statusCode;
37+
}
38+
2239
private DefaultTraceGroupFields(final Builder builder) {
2340

2441
this.endTime = builder.endTime;
2542
this.durationInNanos = builder.durationInNanos;
2643
this.statusCode = builder.statusCode;
2744
}
2845

46+
private void writeObject(ObjectOutputStream out) throws IOException {
47+
String json = OBJECT_MAPPER.writeValueAsString(this);
48+
out.writeUTF(json);
49+
}
50+
51+
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
52+
String json = in.readUTF();
53+
DefaultTraceGroupFields temp = OBJECT_MAPPER.readValue(json, DefaultTraceGroupFields.class);
54+
this.endTime = temp.endTime;
55+
this.durationInNanos = temp.durationInNanos;
56+
this.statusCode = temp.statusCode;
57+
}
58+
59+
@Override
60+
public boolean equals(Object o) {
61+
if (this == o) return true;
62+
if (o == null || getClass() != o.getClass()) return false;
63+
DefaultTraceGroupFields that = (DefaultTraceGroupFields) o;
64+
return Objects.equals(endTime, that.endTime) && Objects.equals(durationInNanos, that.durationInNanos) && Objects.equals(statusCode, that.statusCode);
65+
}
66+
2967
@Override
3068
public String getEndTime() {
3169
return endTime;
@@ -41,15 +79,6 @@ public Integer getStatusCode() {
4179
return statusCode;
4280
}
4381

44-
@Override
45-
public boolean equals(Object other) {
46-
if (other instanceof DefaultTraceGroupFields) {
47-
final DefaultTraceGroupFields o = (DefaultTraceGroupFields) other;
48-
return (endTime.equals(o.endTime) && durationInNanos.equals(o.durationInNanos) && statusCode.equals(o.statusCode));
49-
}
50-
return false;
51-
}
52-
5382
public static Builder builder() {
5483
return new Builder();
5584
}

data-prepper-api/src/main/java/org/opensearch/dataprepper/model/trace/JacksonSpan.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,13 @@ public void setTraceGroup(final String traceGroup) {
232232

233233
@Override
234234
public void setTraceGroupFields(final TraceGroupFields traceGroupFields) {
235-
this.put(TRACE_GROUP_FIELDS_KEY, traceGroupFields);
235+
EventMetadata metadata = getMetadata();
236+
Object oldTraceGroupFields = metadata.getAttribute(TRACE_GROUP_FIELDS_KEY);
237+
if (oldTraceGroupFields != null) {
238+
metadata.setAttribute(TRACE_GROUP_FIELDS_KEY, traceGroupFields);
239+
} else {
240+
this.put(TRACE_GROUP_FIELDS_KEY, traceGroupFields);
241+
}
236242
}
237243

238244
public static Builder builder() {

data-prepper-api/src/test/java/org/opensearch/dataprepper/model/trace/DefaultTraceGroupFieldsTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,14 @@
99
import org.junit.jupiter.api.Test;
1010
import org.opensearch.dataprepper.model.event.TestObject;
1111

12+
import java.io.ByteArrayOutputStream;
13+
import java.io.ByteArrayInputStream;
14+
import java.io.ObjectOutputStream;
15+
import java.io.ObjectInputStream;
1216
import java.util.UUID;
1317

18+
import com.fasterxml.jackson.databind.ObjectMapper;
19+
1420
import static org.hamcrest.MatcherAssert.assertThat;
1521
import static org.hamcrest.Matchers.equalTo;
1622
import static org.hamcrest.Matchers.is;
@@ -19,6 +25,7 @@
1925

2026
public class DefaultTraceGroupFieldsTest {
2127

28+
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
2229
private static final String TEST_END_TIME = UUID.randomUUID().toString();
2330
private static final Long TEST_DURATION = 123L;
2431
private static final Integer TEST_STATUS_CODE = 200;
@@ -70,6 +77,15 @@ public void testEquals_withDifferentDurationInNanos() {
7077
assertThat(defaultTraceGroupFields, is(not(equalTo(traceGroupFields))));
7178
}
7279

80+
@Test
81+
public void testEquals_withDifferentValues() {
82+
final DefaultTraceGroupFields traceGroupFields =
83+
new DefaultTraceGroupFields(TEST_END_TIME, TEST_DURATION - 1, TEST_STATUS_CODE);
84+
assertThat(traceGroupFields, is(not(equalTo(null))));
85+
Integer tmp = 5;
86+
assertThat(traceGroupFields, is(not(equalTo(tmp))));
87+
}
88+
7389
@Test
7490
public void testEquals_withDifferentStatusCode() {
7591
final DefaultTraceGroupFields traceGroupFields = DefaultTraceGroupFields.builder()
@@ -111,4 +127,25 @@ public void testBuilder_withAllParameters_createsTraceGroupFields() {
111127

112128
assertThat(result, is(notNullValue()));
113129
}
130+
131+
@Test
132+
public void testSerialization() throws Exception {
133+
final DefaultTraceGroupFields result = DefaultTraceGroupFields.builder()
134+
.withDurationInNanos(TEST_DURATION)
135+
.withStatusCode(TEST_STATUS_CODE)
136+
.withEndTime(TEST_END_TIME)
137+
.build();
138+
ByteArrayOutputStream baos = new ByteArrayOutputStream();
139+
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
140+
oos.writeObject(result);
141+
}
142+
143+
byte[] data = baos.toByteArray();
144+
145+
try (ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data))) {
146+
DefaultTraceGroupFields result2 = (DefaultTraceGroupFields) ois.readObject();
147+
assertThat(result, equalTo(result2));
148+
}
149+
}
150+
114151
}

data-prepper-api/src/test/java/org/opensearch/dataprepper/model/trace/JacksonSpanTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,20 @@ public void testSetAndGetTraceGroupFields() {
297297
assertThat(traceGroupFields, is(equalTo(testTraceGroupFields)));
298298
}
299299

300+
@Test
301+
public void testSetAndGetTraceGroupFieldsInMetadata() {
302+
final TraceGroupFields testTraceGroupFields = DefaultTraceGroupFields.builder()
303+
.withDurationInNanos(200L)
304+
.withStatusCode(404)
305+
.withEndTime("Different end time")
306+
.build();
307+
jacksonSpan.getMetadata().setAttribute(JacksonSpan.TRACE_GROUP_FIELDS_KEY, new DefaultTraceGroupFields());
308+
jacksonSpan.setTraceGroupFields(testTraceGroupFields);
309+
final TraceGroupFields traceGroupFields = jacksonSpan.getTraceGroupFields();
310+
assertThat(traceGroupFields, is(equalTo(traceGroupFields)));
311+
assertThat(traceGroupFields, is(equalTo(testTraceGroupFields)));
312+
}
313+
300314
@Test
301315
public void testToJsonStringAllParameters() throws JsonProcessingException, JSONException {
302316
final String jsonResult = jacksonSpan.toJsonString();

0 commit comments

Comments
 (0)