From 4ba0adfab339e74cd579843ec6f294670a4ed832 Mon Sep 17 00:00:00 2001 From: Nikolay Martynov Date: Fri, 25 Jan 2019 12:27:54 -0500 Subject: [PATCH] Catch exception in servlet context getter. Request may finish after check has been perform but before context has been read leading to exception in some implementations. --- .../trace/instrumentation/jetty8/JettyHandlerAdvice.java | 7 ++++++- .../trace/instrumentation/servlet3/Servlet3Advice.java | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/dd-java-agent/instrumentation/jetty-8/src/main/java/datadog/trace/instrumentation/jetty8/JettyHandlerAdvice.java b/dd-java-agent/instrumentation/jetty-8/src/main/java/datadog/trace/instrumentation/jetty8/JettyHandlerAdvice.java index b6e1f0835b..4e6439c314 100644 --- a/dd-java-agent/instrumentation/jetty-8/src/main/java/datadog/trace/instrumentation/jetty8/JettyHandlerAdvice.java +++ b/dd-java-agent/instrumentation/jetty-8/src/main/java/datadog/trace/instrumentation/jetty8/JettyHandlerAdvice.java @@ -81,7 +81,12 @@ public class JettyHandlerAdvice { } else { final AtomicBoolean activated = new AtomicBoolean(false); if (req.isAsyncStarted()) { - req.getAsyncContext().addListener(new TagSettingAsyncListener(activated, span)); + try { + req.getAsyncContext().addListener(new TagSettingAsyncListener(activated, span)); + } catch (final IllegalStateException e) { + // org.eclipse.jetty.server.Request may throw an exception here if request became + // finished after check above. We just ignore that exception and move on. + } } if (!req.isAsyncStarted() && activated.compareAndSet(false, true)) { Tags.HTTP_STATUS.set(span, resp.getStatus()); diff --git a/dd-java-agent/instrumentation/servlet-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java b/dd-java-agent/instrumentation/servlet-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java index 2dabba9821..2be69a8ee5 100644 --- a/dd-java-agent/instrumentation/servlet-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java +++ b/dd-java-agent/instrumentation/servlet-3/src/main/java/datadog/trace/instrumentation/servlet3/Servlet3Advice.java @@ -93,7 +93,12 @@ public class Servlet3Advice { } else { final AtomicBoolean activated = new AtomicBoolean(false); if (req.isAsyncStarted()) { - req.getAsyncContext().addListener(new TagSettingAsyncListener(activated, span)); + try { + req.getAsyncContext().addListener(new TagSettingAsyncListener(activated, span)); + } catch (final IllegalStateException e) { + // org.eclipse.jetty.server.Request may throw an exception here if request became + // finished after check above. We just ignore that exception and move on. + } } // Check again in case the request finished before adding the listener. if (!req.isAsyncStarted() && activated.compareAndSet(false, true)) {