1717import io .vertx .ext .web .impl .RouterImpl ;
1818
1919public class RouteHandlerWrapper implements Handler <RoutingContext > {
20+ static final String PARENT_SPAN_CONTEXT_KEY = AgentSpan .class .getName () + ".parent" ;
2021 static final String HANDLER_SPAN_CONTEXT_KEY = AgentSpan .class .getName () + ".handler" ;
22+ static final String ROUTE_CONTEXT_KEY = "dd." + Tags .HTTP_ROUTE ;
2123
2224 private final Handler <RoutingContext > actual ;
2325 private final boolean spanStarter ;
@@ -40,16 +42,16 @@ public void handle(final RoutingContext routingContext) {
4042 if (spanStarter ) {
4143 if (span == null ) {
4244 AgentSpan parentSpan = activeSpan ();
45+ routingContext .put (PARENT_SPAN_CONTEXT_KEY , parentSpan );
4346
4447 span = startSpan (INSTRUMENTATION_NAME );
4548 routingContext .put (HANDLER_SPAN_CONTEXT_KEY , span );
4649
4750 routingContext .response ().endHandler (new EndHandlerWrapper (routingContext ));
4851 DECORATE .afterStart (span );
4952 span .setResourceName (DECORATE .className (actual .getClass ()));
50-
51- setRoute (parentSpan , routingContext );
5253 }
54+ setRoute (routingContext );
5355 }
5456 try (final AgentScope scope = span != null ? activateSpan (span ) : noopScope ()) {
5557 try {
@@ -61,7 +63,12 @@ public void handle(final RoutingContext routingContext) {
6163 }
6264 }
6365
64- private void setRoute (AgentSpan parentSpan , RoutingContext routingContext ) {
66+ private void setRoute (RoutingContext routingContext ) {
67+ final AgentSpan parentSpan = routingContext .get (PARENT_SPAN_CONTEXT_KEY );
68+ if (parentSpan == null ) {
69+ return ;
70+ }
71+
6572 final String method = routingContext .request ().rawMethod ();
6673 String mountPoint = routingContext .mountPoint ();
6774 String path = routingContext .currentRoute ().getPath ();
@@ -74,15 +81,21 @@ private void setRoute(AgentSpan parentSpan, RoutingContext routingContext) {
7481 }
7582 path = mountPoint + path ;
7683 }
77- if (method != null && path != null && shouldUpdateRoute (parentSpan , path )) {
84+ if (method != null && path != null && shouldUpdateRoute (routingContext , parentSpan , path )) {
85+ routingContext .put (ROUTE_CONTEXT_KEY , path );
7886 HTTP_RESOURCE_DECORATOR .withRoute (parentSpan , method , path , true );
7987 }
8088 }
8189
82- static boolean shouldUpdateRoute (final AgentSpan span , final String path ) {
90+ static boolean shouldUpdateRoute (
91+ final RoutingContext routingContext , final AgentSpan span , final String path ) {
8392 if (span == null ) {
8493 return false ;
8594 }
95+ final String currentRoute = routingContext .get (ROUTE_CONTEXT_KEY );
96+ if (currentRoute != null && currentRoute .equals (path )) {
97+ return false ;
98+ }
8699 // do not override route with a "/" if it's already set (it's probably more meaningful)
87100 return !path .equals ("/" ) || span .getTag (Tags .HTTP_ROUTE ) == null ;
88101 }
0 commit comments