Skip to content

Commit 2ee0768

Browse files
Catching IllegalStateException in case of failed deserialization (open-telemetry#2157)
Co-authored-by: otelbot <[email protected]>
1 parent cbcfa92 commit 2ee0768

File tree

7 files changed

+194
-3
lines changed

7 files changed

+194
-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,63 @@
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.common.Value;
11+
import io.opentelemetry.api.logs.Severity;
12+
import io.opentelemetry.contrib.disk.buffering.internal.serialization.mapping.logs.models.LogRecordDataImpl;
13+
import io.opentelemetry.contrib.disk.buffering.internal.serialization.serializers.SignalSerializer;
14+
import io.opentelemetry.contrib.disk.buffering.testutils.BaseSignalSerializerTest;
15+
import io.opentelemetry.contrib.disk.buffering.testutils.TestData;
16+
import io.opentelemetry.sdk.logs.data.LogRecordData;
17+
import org.junit.jupiter.api.Test;
18+
19+
class LogRecordDataDeserializerTest extends BaseSignalSerializerTest<LogRecordData> {
20+
private static final LogRecordData LOG_RECORD =
21+
LogRecordDataImpl.builder()
22+
.setResource(TestData.RESOURCE_FULL)
23+
.setSpanContext(TestData.SPAN_CONTEXT)
24+
.setInstrumentationScopeInfo(TestData.INSTRUMENTATION_SCOPE_INFO_FULL)
25+
.setAttributes(TestData.ATTRIBUTES)
26+
.setBodyValue(Value.of("Log body"))
27+
.setSeverity(Severity.DEBUG)
28+
.setSeverityText("Log severity text")
29+
.setTimestampEpochNanos(100L)
30+
.setObservedTimestampEpochNanos(200L)
31+
.setTotalAttributeCount(3)
32+
.setEventName("event")
33+
.build();
34+
35+
@Test
36+
void verifyDeserialization() {
37+
assertSerializeDeserialize(LOG_RECORD, LOG_RECORD);
38+
}
39+
40+
@Test
41+
void whenDecodingMalformedMessage_wrapIntoDeserializationException() {
42+
assertThrows(
43+
DeserializationException.class,
44+
() -> getDeserializer().deserialize(TestData.makeMalformedSignalBinary()));
45+
}
46+
47+
@Test
48+
void whenDecodingTooShortMessage_wrapIntoDeserializationException() {
49+
assertThrows(
50+
DeserializationException.class,
51+
() -> getDeserializer().deserialize(TestData.makeTooShortSignalBinary()));
52+
}
53+
54+
@Override
55+
protected SignalSerializer<LogRecordData> getSerializer() {
56+
return SignalSerializer.ofLogs();
57+
}
58+
59+
@Override
60+
protected SignalDeserializer<LogRecordData> getDeserializer() {
61+
return SignalDeserializer.ofLogs();
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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+
@Test
26+
void whenDecodingTooShortMessage_wrapIntoDeserializationException() {
27+
assertThrows(
28+
DeserializationException.class,
29+
() -> getDeserializer().deserialize(TestData.makeTooShortSignalBinary()));
30+
}
31+
32+
@Override
33+
protected SignalSerializer<MetricData> getSerializer() {
34+
return SignalSerializer.ofMetrics();
35+
}
36+
37+
@Override
38+
protected SignalDeserializer<MetricData> getDeserializer() {
39+
return SignalDeserializer.ofMetrics();
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
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+
import java.util.Collections;
18+
import org.junit.jupiter.api.Test;
19+
20+
class SpanDataDeserializerTest extends BaseSignalSerializerTest<SpanData> {
21+
private static final SpanData SPAN_DATA =
22+
SpanDataImpl.builder()
23+
.setSpanContext(TestData.SPAN_CONTEXT)
24+
.setParentSpanContext(TestData.PARENT_SPAN_CONTEXT)
25+
.setName("Test span")
26+
.setKind(SpanKind.SERVER)
27+
.setStartEpochNanos(100L)
28+
.setEndEpochNanos(200L)
29+
.setStatus(StatusData.ok())
30+
.setAttributes(TestData.ATTRIBUTES)
31+
.setResource(TestData.RESOURCE_FULL)
32+
.setInstrumentationScopeInfo(TestData.INSTRUMENTATION_SCOPE_INFO_FULL)
33+
.setTotalRecordedLinks(0)
34+
.setTotalRecordedEvents(0)
35+
.setTotalAttributeCount(0)
36+
.setEvents(Collections.emptyList())
37+
.setLinks(Collections.emptyList())
38+
.build();
39+
40+
@Test
41+
void verifyDeserialization() {
42+
assertSerializeDeserialize(SPAN_DATA, SPAN_DATA);
43+
}
44+
45+
@Test
46+
void whenDecodingMalformedMessage_wrapIntoDeserializationException() {
47+
assertThrows(
48+
DeserializationException.class,
49+
() -> getDeserializer().deserialize(TestData.makeMalformedSignalBinary()));
50+
}
51+
52+
@Test
53+
void whenDecodingTooShortMessage_wrapIntoDeserializationException() {
54+
assertThrows(
55+
DeserializationException.class,
56+
() -> getDeserializer().deserialize(TestData.makeTooShortSignalBinary()));
57+
}
58+
59+
@Override
60+
protected SignalSerializer<SpanData> getSerializer() {
61+
return SignalSerializer.ofSpans();
62+
}
63+
64+
@Override
65+
protected SignalDeserializer<SpanData> getDeserializer() {
66+
return SignalDeserializer.ofSpans();
67+
}
68+
}

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)