Skip to content

Commit 8a00ac8

Browse files
Catching IllegalStateException in case of failed deserialization
1 parent e503584 commit 8a00ac8

File tree

7 files changed

+202
-3
lines changed

7 files changed

+202
-3
lines changed

disk-buffering/src/main/java/io/opentelemetry/contrib/disk/buffering/internal/serialization/deserializers/LogRecordDataDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public List<LogRecordData> deserialize(byte[] source) throws DeserializationExce
2626
try {
2727
return ProtoLogsDataMapper.getInstance()
2828
.fromProto(ExportLogsServiceRequest.ADAPTER.decode(source));
29-
} catch (IOException e) {
29+
} catch (IOException | IllegalStateException e) {
3030
throw new DeserializationException(e);
3131
}
3232
}

disk-buffering/src/main/java/io/opentelemetry/contrib/disk/buffering/internal/serialization/deserializers/MetricDataDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public List<MetricData> deserialize(byte[] source) throws DeserializationExcepti
2626
try {
2727
return ProtoMetricsDataMapper.getInstance()
2828
.fromProto(ExportMetricsServiceRequest.ADAPTER.decode(source));
29-
} catch (IOException e) {
29+
} catch (IOException | IllegalStateException e) {
3030
throw new DeserializationException(e);
3131
}
3232
}

disk-buffering/src/main/java/io/opentelemetry/contrib/disk/buffering/internal/serialization/deserializers/SpanDataDeserializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public List<SpanData> deserialize(byte[] source) throws DeserializationException
2626
try {
2727
return ProtoSpansDataMapper.getInstance()
2828
.fromProto(ExportTraceServiceRequest.ADAPTER.decode(source));
29-
} catch (IOException e) {
29+
} catch (IOException | IllegalStateException e) {
3030
throw new DeserializationException(e);
3131
}
3232
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.contrib.disk.buffering.internal.serialization.deserializers;
7+
8+
import static org.junit.jupiter.api.Assertions.assertThrows;
9+
10+
import org.junit.jupiter.api.Test;
11+
12+
import io.opentelemetry.api.common.Value;
13+
import io.opentelemetry.api.logs.Severity;
14+
import io.opentelemetry.contrib.disk.buffering.internal.serialization.mapping.logs.models.LogRecordDataImpl;
15+
import io.opentelemetry.contrib.disk.buffering.internal.serialization.serializers.SignalSerializer;
16+
import io.opentelemetry.contrib.disk.buffering.testutils.BaseSignalSerializerTest;
17+
import io.opentelemetry.contrib.disk.buffering.testutils.TestData;
18+
import io.opentelemetry.sdk.logs.data.LogRecordData;
19+
20+
class LogRecordDataDeserializerTest extends BaseSignalSerializerTest<LogRecordData> {
21+
private static final LogRecordData LOG_RECORD =
22+
LogRecordDataImpl.builder()
23+
.setResource(TestData.RESOURCE_FULL)
24+
.setSpanContext(TestData.SPAN_CONTEXT)
25+
.setInstrumentationScopeInfo(TestData.INSTRUMENTATION_SCOPE_INFO_FULL)
26+
.setAttributes(TestData.ATTRIBUTES)
27+
.setBodyValue(Value.of("Log body"))
28+
.setSeverity(Severity.DEBUG)
29+
.setSeverityText("Log severity text")
30+
.setTimestampEpochNanos(100L)
31+
.setObservedTimestampEpochNanos(200L)
32+
.setTotalAttributeCount(3)
33+
.setEventName("event")
34+
.build();
35+
36+
@Test
37+
void verifyDeserialization() {
38+
assertSerializeDeserialize(LOG_RECORD, LOG_RECORD);
39+
}
40+
41+
@Test
42+
void whenDecodingMalformedMessage_wrapIntoDeserializationException() {
43+
assertThrows(
44+
DeserializationException.class,
45+
() -> getDeserializer().deserialize(TestData.makeMalformedSignalBinary())
46+
);
47+
}
48+
49+
@Test
50+
void whenDecodingTooShortMessage_wrapIntoDeserializationException() {
51+
assertThrows(
52+
DeserializationException.class,
53+
() -> getDeserializer().deserialize(TestData.makeTooShortSignalBinary())
54+
);
55+
}
56+
57+
@Override
58+
protected SignalSerializer<LogRecordData> getSerializer() {
59+
return SignalSerializer.ofLogs();
60+
}
61+
62+
@Override
63+
protected SignalDeserializer<LogRecordData> getDeserializer() {
64+
return SignalDeserializer.ofLogs();
65+
}
66+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.contrib.disk.buffering.internal.serialization.deserializers;
7+
8+
import static org.junit.jupiter.api.Assertions.assertThrows;
9+
10+
import io.opentelemetry.contrib.disk.buffering.internal.serialization.serializers.SignalSerializer;
11+
import io.opentelemetry.contrib.disk.buffering.testutils.BaseSignalSerializerTest;
12+
import io.opentelemetry.contrib.disk.buffering.testutils.TestData;
13+
import io.opentelemetry.sdk.metrics.data.MetricData;
14+
import org.junit.jupiter.api.Test;
15+
16+
class MetricDataDeserializerTest extends BaseSignalSerializerTest<MetricData> {
17+
18+
@Test
19+
void whenDecodingMalformedMessage_wrapIntoDeserializationException() {
20+
assertThrows(
21+
DeserializationException.class,
22+
() -> getDeserializer().deserialize(TestData.makeMalformedSignalBinary())
23+
);
24+
}
25+
26+
@Test
27+
void whenDecodingTooShortMessage_wrapIntoDeserializationException() {
28+
assertThrows(
29+
DeserializationException.class,
30+
() -> getDeserializer().deserialize(TestData.makeTooShortSignalBinary())
31+
);
32+
}
33+
34+
@Override
35+
protected SignalSerializer<MetricData> getSerializer() {
36+
return SignalSerializer.ofMetrics();
37+
}
38+
39+
@Override
40+
protected SignalDeserializer<MetricData> getDeserializer() {
41+
return SignalDeserializer.ofMetrics();
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.contrib.disk.buffering.internal.serialization.deserializers;
7+
8+
import static org.junit.jupiter.api.Assertions.assertThrows;
9+
10+
import io.opentelemetry.api.trace.SpanKind;
11+
import io.opentelemetry.contrib.disk.buffering.internal.serialization.mapping.spans.models.SpanDataImpl;
12+
import io.opentelemetry.contrib.disk.buffering.internal.serialization.serializers.SignalSerializer;
13+
import io.opentelemetry.contrib.disk.buffering.testutils.BaseSignalSerializerTest;
14+
import io.opentelemetry.contrib.disk.buffering.testutils.TestData;
15+
import io.opentelemetry.sdk.trace.data.SpanData;
16+
import io.opentelemetry.sdk.trace.data.StatusData;
17+
18+
import org.junit.jupiter.api.Test;
19+
20+
import java.util.Collections;
21+
22+
class SpanDataDeserializerTest extends BaseSignalSerializerTest<SpanData> {
23+
private static final SpanData SPAN_DATA = SpanDataImpl.builder()
24+
.setSpanContext(TestData.SPAN_CONTEXT)
25+
.setParentSpanContext(TestData.PARENT_SPAN_CONTEXT)
26+
.setName("Test span")
27+
.setKind(SpanKind.SERVER)
28+
.setStartEpochNanos(100L)
29+
.setEndEpochNanos(200L)
30+
.setStatus(StatusData.ok())
31+
.setAttributes(TestData.ATTRIBUTES)
32+
.setResource(TestData.RESOURCE_FULL)
33+
.setInstrumentationScopeInfo(TestData.INSTRUMENTATION_SCOPE_INFO_FULL)
34+
.setTotalRecordedLinks(0)
35+
.setTotalRecordedEvents(0)
36+
.setTotalAttributeCount(0)
37+
.setEvents(Collections.emptyList())
38+
.setLinks(Collections.emptyList())
39+
.build();
40+
41+
@Test
42+
void verifyDeserialization() {
43+
assertSerializeDeserialize(SPAN_DATA, SPAN_DATA);
44+
}
45+
46+
@Test
47+
void whenDecodingMalformedMessage_wrapIntoDeserializationException() {
48+
assertThrows(
49+
DeserializationException.class,
50+
() -> getDeserializer().deserialize(TestData.makeMalformedSignalBinary())
51+
);
52+
}
53+
54+
@Test
55+
void whenDecodingTooShortMessage_wrapIntoDeserializationException() {
56+
assertThrows(
57+
DeserializationException.class,
58+
() -> getDeserializer().deserialize(TestData.makeTooShortSignalBinary())
59+
);
60+
}
61+
62+
@Override
63+
protected SignalSerializer<SpanData> getSerializer() {
64+
return SignalSerializer.ofSpans();
65+
}
66+
67+
@Override
68+
protected SignalDeserializer<SpanData> getDeserializer() {
69+
return SignalDeserializer.ofSpans();
70+
}
71+
}

disk-buffering/src/test/java/io/opentelemetry/contrib/disk/buffering/testutils/TestData.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,5 +131,24 @@ private static LongExemplarData makeLongExemplarData(TraceFlags flags) {
131131
return ImmutableLongExemplarData.create(ATTRIBUTES, 100L, context, 1L);
132132
}
133133

134+
@NotNull
135+
public static byte[] makeTooShortSignalBinary() {
136+
return new byte[]{
137+
(byte) 0x0A, // type
138+
(byte) 0xFF, // defining length 255, but message is shorter
139+
(byte) 0x01 // content
140+
};
141+
}
142+
143+
@NotNull
144+
public static byte[] makeMalformedSignalBinary() {
145+
return new byte[] {
146+
(byte) 0x0A, // type
147+
(byte) 0x02, // length
148+
(byte) 0x08, // field 1, wire type 0 (varint) - this should be a nested message but isn't
149+
(byte) 0x01 // content
150+
};
151+
}
152+
134153
private TestData() {}
135154
}

0 commit comments

Comments
 (0)