Skip to content

Commit 464b4eb

Browse files
authored
Merge pull request quarkusio#53807 from brunobat/fix-null-pointers
Fix potential NPE and warn if trustall is being used in the exporter
2 parents b88bca9 + 1c4115f commit 464b4eb

5 files changed

Lines changed: 75 additions & 5 deletions

File tree

extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/OpenTelemetryUtil.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ public static Map<String, String> convertKeyValueListToMap(List<String> headers)
4848
continue;
4949
}
5050
String[] parts = header.split("=", 2);
51+
if (parts.length < 2) {
52+
continue;
53+
}
5154
String key = parts[0].trim();
5255
String value = parts[1].trim();
5356
result.put(key, value);

extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/exporter/otlp/OTelExporterRecorder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import jakarta.enterprise.inject.Instance;
1919
import jakarta.enterprise.util.TypeLiteral;
2020

21+
import org.jboss.logging.Logger;
22+
2123
import io.opentelemetry.api.metrics.MeterProvider;
2224
import io.opentelemetry.exporter.internal.ExporterBuilderUtil;
2325
import io.opentelemetry.exporter.internal.grpc.GrpcExporter;
@@ -74,6 +76,7 @@
7476
@SuppressWarnings("deprecation")
7577
@Recorder
7678
public class OTelExporterRecorder {
79+
private static final Logger LOG = Logger.getLogger(OTelExporterRecorder.class);
7780
public static final String BASE2EXPONENTIAL_AGGREGATION_NAME = AggregationUtil
7881
.aggregationName(Aggregation.base2ExponentialBucketHistogram());
7982

@@ -404,6 +407,9 @@ private static Map<String, String> populateTracingExportHttpHeaders(OtlpExporter
404407
continue;
405408
}
406409
String[] parts = header.split("=", 2);
410+
if (parts.length < 2) {
411+
continue;
412+
}
407413
String key = parts[0].trim();
408414
String value = parts[1].trim();
409415
headersMap.put(key, value);
@@ -507,6 +513,9 @@ public Boolean get() {
507513
}
508514
});
509515
if (trustAll) {
516+
LOG.warn("OpenTelemetry exporter TLS is configured with trustAll=true." +
517+
" This disables certificate and hostname verification, making the connection vulnerable to" +
518+
" MITM attacks. This should not be used in production.");
510519
options.setTrustAll(true);
511520
options.setVerifyHost(false);
512521
}

extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/DropTargetsSampler.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,14 @@ public SamplingResult shouldSample(Context parentContext, String traceId, String
3737

3838
if (spanKind.equals(SpanKind.SERVER)) {
3939
// HTTP_TARGET was split into url.path and url.query
40-
String query = attributes.get(URL_QUERY);
41-
String target = attributes.get(URL_PATH) + (query == null ? "" : "?" + query);
40+
String path = attributes.get(URL_PATH);
41+
if (path != null) {
42+
String query = attributes.get(URL_QUERY);
43+
String target = path + (query == null ? "" : "?" + query);
4244

43-
if (shouldDrop(target)) {
44-
return SamplingResult.drop();
45+
if (shouldDrop(target)) {
46+
return SamplingResult.drop();
47+
}
4548
}
4649
}
4750

extensions/opentelemetry/runtime/src/main/java/io/quarkus/opentelemetry/runtime/tracing/cdi/WithSpanInterceptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ public String extract(final MethodRequest methodRequest) {
220220
break;
221221
}
222222
}
223-
if (spanName.isEmpty()) {
223+
if (spanName == null || spanName.isEmpty()) {
224224
spanName = SpanNames.fromMethod(methodRequest.getMethod());
225225
}
226226
return spanName;

extensions/opentelemetry/runtime/src/test/java/io/quarkus/opentelemetry/runtime/exporter/otlp/HttpClientOptionsConsumerTest.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@
77

88
import java.net.URI;
99
import java.time.Duration;
10+
import java.util.ArrayList;
1011
import java.util.List;
1112
import java.util.Optional;
1213
import java.util.OptionalInt;
14+
import java.util.logging.Handler;
15+
import java.util.logging.LogRecord;
16+
import java.util.logging.Logger;
1317

1418
import org.junit.jupiter.api.Test;
19+
import org.mockito.Mockito;
1520

1621
import io.quarkus.opentelemetry.runtime.config.runtime.exporter.CompressionType;
1722
import io.quarkus.opentelemetry.runtime.config.runtime.exporter.OtlpExporterTracesConfig;
@@ -49,6 +54,46 @@ void testWithProxy() {
4954
assertThat(httpClientOptions.getProxyOptions().getPassword(), is("proxy-password"));
5055
}
5156

57+
@Test
58+
void testTrustAllLogsWarning() {
59+
Logger logger = Logger.getLogger(OTelExporterRecorder.class.getName());
60+
List<LogRecord> records = new ArrayList<>();
61+
Handler handler = new Handler() {
62+
@Override
63+
public void publish(LogRecord record) {
64+
records.add(record);
65+
}
66+
67+
@Override
68+
public void flush() {
69+
}
70+
71+
@Override
72+
public void close() {
73+
}
74+
};
75+
logger.addHandler(handler);
76+
try {
77+
OTelExporterRecorder.HttpClientOptionsConsumer consumer = new OTelExporterRecorder.HttpClientOptionsConsumer(
78+
createExporterConfig(false),
79+
URI.create("https://localhost:4317"),
80+
createTrustAllRegistry());
81+
82+
HttpClientOptions httpClientOptions = new HttpClientOptions();
83+
consumer.accept(httpClientOptions);
84+
85+
assertThat(httpClientOptions.isTrustAll(), is(true));
86+
assertThat(httpClientOptions.isVerifyHost(), is(false));
87+
assertThat(records.stream()
88+
.anyMatch(r -> r.getMessage().contains("trustAll=true") &&
89+
r.getMessage().contains("This should not be used in production.") &&
90+
r.getLevel().equals(java.util.logging.Level.WARNING)),
91+
is(true));
92+
} finally {
93+
logger.removeHandler(handler);
94+
}
95+
}
96+
5297
private OtlpExporterTracesConfig createExporterConfig(final boolean isEnabled) {
5398
return new OtlpExporterTracesConfig() {
5499
@Override
@@ -154,4 +199,14 @@ public void register(String name, TlsConfiguration configuration) {
154199

155200
}
156201
}
202+
203+
private static TlsConfigurationRegistry createTrustAllRegistry() {
204+
TlsConfiguration tlsConfig = Mockito.mock(TlsConfiguration.class);
205+
Mockito.when(tlsConfig.isTrustAll()).thenReturn(true);
206+
207+
TlsConfigurationRegistry registry = Mockito.mock(TlsConfigurationRegistry.class);
208+
Mockito.when(registry.getDefault()).thenReturn(Optional.of(tlsConfig));
209+
Mockito.when(registry.get(Mockito.anyString())).thenReturn(Optional.empty());
210+
return registry;
211+
}
157212
}

0 commit comments

Comments
 (0)