diff --git a/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpGrpcSender.java b/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpGrpcSender.java index 65a75b33ad2..82b4a169270 100644 --- a/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpGrpcSender.java +++ b/exporters/sender/okhttp/src/main/java/io/opentelemetry/exporter/sender/okhttp/internal/OkHttpGrpcSender.java @@ -200,7 +200,7 @@ public byte[] getResponseMessage() { } private static byte[] getResponseMessageBytes(byte[] bodyBytes) throws IOException { - if (bodyBytes.length > 5) { + if (bodyBytes.length >= 5) { ByteArrayInputStream bodyStream = new ByteArrayInputStream(bodyBytes); bodyStream.skip(5); if (bodyBytes[0] == 1) { diff --git a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java index 25f6881d371..75202072524 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java +++ b/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSampler.java @@ -139,7 +139,7 @@ private static void onError(Throwable e) { } } - private static Sampler updateSampler(SamplingStrategyResponse response) { + private static Sampler updateSampler(SamplingStrategyResponse response) throws IOException { SamplingStrategyResponse.PerOperationSamplingStrategies operationSampling = response.perOperationSamplingStrategies; if (operationSampling.strategies.size() > 0) { @@ -156,9 +156,9 @@ private static Sampler updateSampler(SamplingStrategyResponse response) { return Sampler.parentBased( new RateLimitingSampler(response.rateLimitingSamplingStrategy.maxTracesPerSecond)); case UNRECOGNIZED: - throw new AssertionError("unrecognized sampler type"); + throw new IOException("unrecognized sampler type"); } - throw new AssertionError("unrecognized sampler type"); + throw new IOException("unrecognized sampler type"); } @Override diff --git a/sdk-extensions/jaeger-remote-sampler/src/test/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerTest.java b/sdk-extensions/jaeger-remote-sampler/src/test/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerTest.java index 370e6e23929..0e9cafbcc0b 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/test/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerTest.java +++ b/sdk-extensions/jaeger-remote-sampler/src/test/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerTest.java @@ -317,6 +317,26 @@ void pollingInterval_duration() { } } + @Test + void emptyResponse() { + Sampling.SamplingStrategyResponse response = + Sampling.SamplingStrategyResponse.newBuilder().build(); + responses.add(response); + + try (JaegerRemoteSampler sampler = + JaegerRemoteSampler.builder() + .setEndpoint(server.httpUri().toString()) + .setServiceName(SERVICE_NAME) + // Make sure only polls once. + .setPollingInterval(500, TimeUnit.SECONDS) + .build()) { + assertThat(sampler).extracting("grpcSender").isInstanceOf(OkHttpGrpcSender.class); + + // Empty response results in an unmarshaling exception which is handled by logging a warning + await().untilAsserted(() -> logs.assertContains("Failed to unmarshal strategy response")); + } + } + @Test void perOperationSampling() { Sampling.SamplingStrategyResponse response = diff --git a/sdk-extensions/jaeger-remote-sampler/src/testGrpcNetty/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerGrpcNettyTest.java b/sdk-extensions/jaeger-remote-sampler/src/testGrpcNetty/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerGrpcNettyTest.java index 85297fa4afb..06eb299e913 100644 --- a/sdk-extensions/jaeger-remote-sampler/src/testGrpcNetty/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerGrpcNettyTest.java +++ b/sdk-extensions/jaeger-remote-sampler/src/testGrpcNetty/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerGrpcNettyTest.java @@ -198,6 +198,26 @@ void pollingInterval_duration() { } } + @Test + void emptyResponse() { + Sampling.SamplingStrategyResponse response = + Sampling.SamplingStrategyResponse.newBuilder().build(); + responses.add(response); + + try (JaegerRemoteSampler sampler = + JaegerRemoteSampler.builder() + .setChannel(managedChannel()) + .setServiceName(SERVICE_NAME) + // Make sure only polls once. + .setPollingInterval(500, TimeUnit.SECONDS) + .build()) { + assertThat(sampler).extracting("grpcSender").isInstanceOf(UpstreamGrpcSender.class); + + // Empty response results in an unmarshaling exception which is handled by logging a warning + await().untilAsserted(() -> logs.assertContains("Failed to unmarshal strategy response")); + } + } + @Test void perOperationSampling() { Sampling.SamplingStrategyResponse response =