1919import static com .google .common .base .Preconditions .checkNotNull ;
2020
2121import io .opencensus .common .ExperimentalApi ;
22+ import io .opencensus .common .Scope ;
2223import io .opencensus .contrib .http .HttpRequestContext ;
2324import io .opencensus .contrib .http .HttpServerHandler ;
25+ import io .opencensus .trace .Tracing ;
2426import java .io .Closeable ;
27+ import javax .annotation .Nullable ;
2528import javax .servlet .AsyncContext ;
2629import javax .servlet .AsyncEvent ;
2730import javax .servlet .AsyncListener ;
@@ -37,6 +40,7 @@ public final class OcHttpServletListener implements Closeable, AsyncListener {
3740 private final HttpRequestContext context ;
3841 private final HttpServerHandler <HttpServletRequest , HttpServletResponse , HttpServletRequest >
3942 handler ;
43+ @ Nullable private Scope scope = null ;
4044
4145 OcHttpServletListener (
4246 HttpServerHandler <HttpServletRequest , HttpServletResponse , HttpServletRequest > handler ,
@@ -56,6 +60,9 @@ public void onComplete(AsyncEvent event) {
5660 if (response instanceof HttpServletResponse ) {
5761 OcHttpServletUtil .recordMessageSentEvent (handler , context , (HttpServletResponse ) response );
5862 }
63+ if (scope != null ) {
64+ scope .close ();
65+ }
5966 handler .handleEnd (
6067 context ,
6168 (HttpServletRequest ) event .getSuppliedRequest (),
@@ -66,6 +73,9 @@ public void onComplete(AsyncEvent event) {
6673
6774 @ Override
6875 public void onError (AsyncEvent event ) {
76+ if (scope != null ) {
77+ scope .close ();
78+ }
6979 handler .handleEnd (
7080 context ,
7181 (HttpServletRequest ) event .getSuppliedRequest (),
@@ -74,15 +84,21 @@ public void onError(AsyncEvent event) {
7484 }
7585
7686 @ Override
87+ @ SuppressWarnings (
88+ "MustBeClosedChecker" ) // Close will happen in onTimeout or onError or onComplete method
7789 public void onStartAsync (AsyncEvent event ) {
7890 AsyncContext eventAsyncContext = event .getAsyncContext ();
7991 if (eventAsyncContext != null ) {
92+ this .scope = Tracing .getTracer ().withSpan (handler .getSpanFromContext (context ));
8093 eventAsyncContext .addListener (this , event .getSuppliedRequest (), event .getSuppliedResponse ());
8194 }
8295 }
8396
8497 @ Override
8598 public void onTimeout (AsyncEvent event ) {
99+ if (scope != null ) {
100+ scope .close ();
101+ }
86102 handler .handleEnd (
87103 context ,
88104 (HttpServletRequest ) event .getSuppliedRequest (),
0 commit comments