diff --git a/docs/changelog/128314.yaml b/docs/changelog/128314.yaml new file mode 100644 index 000000000000..f63a06e68177 --- /dev/null +++ b/docs/changelog/128314.yaml @@ -0,0 +1,5 @@ +pr: 128314 +summary: Fix NPE in APMTracer through `RestController` +area: Infra/REST API +type: bug +issues: [] diff --git a/modules/apm/src/main/java/org/elasticsearch/telemetry/apm/internal/tracing/APMTracer.java b/modules/apm/src/main/java/org/elasticsearch/telemetry/apm/internal/tracing/APMTracer.java index cdb3a481482e..4c2f1f740693 100644 --- a/modules/apm/src/main/java/org/elasticsearch/telemetry/apm/internal/tracing/APMTracer.java +++ b/modules/apm/src/main/java/org/elasticsearch/telemetry/apm/internal/tracing/APMTracer.java @@ -304,6 +304,8 @@ public class APMTracer extends AbstractLifecycleComponent implements org.elastic spanBuilder.setAttribute(key, (Double) value); } else if (value instanceof Boolean) { spanBuilder.setAttribute(key, (Boolean) value); + } else if (value == null) { + throw new IllegalArgumentException("span attributes cannot have a null value"); } else { throw new IllegalArgumentException( "span attributes do not support value type of [" + value.getClass().getCanonicalName() + "]" diff --git a/server/src/main/java/org/elasticsearch/rest/RestController.java b/server/src/main/java/org/elasticsearch/rest/RestController.java index a7c59e92bfbf..b60d9dd5a633 100644 --- a/server/src/main/java/org/elasticsearch/rest/RestController.java +++ b/server/src/main/java/org/elasticsearch/rest/RestController.java @@ -61,6 +61,7 @@ import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; @@ -560,10 +561,10 @@ public class RestController implements HttpServerTransport.Dispatcher { final Map attributes = Maps.newMapWithExpectedSize(req.getHeaders().size() + 3); req.getHeaders().forEach((key, values) -> { final String lowerKey = key.toLowerCase(Locale.ROOT).replace('-', '_'); - attributes.put("http.request.headers." + lowerKey, values.size() == 1 ? values.get(0) : String.join("; ", values)); + attributes.put("http.request.headers." + lowerKey, values == null ? "" : String.join("; ", values)); }); - attributes.put("http.method", method); - attributes.put("http.url", req.uri()); + attributes.put("http.method", Objects.requireNonNullElse(method, "")); + attributes.put("http.url", Objects.requireNonNullElse(req.uri(), "")); switch (req.getHttpRequest().protocolVersion()) { case HTTP_1_0 -> attributes.put("http.flavour", "1.0"); case HTTP_1_1 -> attributes.put("http.flavour", "1.1");