Lauri Tulmin 9 місяців тому
батько
коміт
8ada04aab7

+ 3 - 1
instrumentation/vertx/vertx-web-3.0/javaagent/src/latestDepTest/java/server/VertxLatestWebServer.java

@@ -25,7 +25,9 @@ public class VertxLatestWebServer extends AbstractVertxWebServer {
   public void start(Promise<Void> startPromise) {
     int port = config().getInteger(CONFIG_HTTP_SERVER_PORT);
     Router router = buildRouter();
+    Router mainRouter = Router.router(vertx);
+    mainRouter.route("/vertx-app/*").subRouter(router);
 
-    vertx.createHttpServer().requestHandler(router).listen(port, it -> startPromise.complete());
+    vertx.createHttpServer().requestHandler(mainRouter).listen(port, it -> startPromise.complete());
   }
 }

+ 15 - 7
instrumentation/vertx/vertx-web-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/RoutingContextHandlerWrapper.java

@@ -5,8 +5,12 @@
 
 package io.opentelemetry.javaagent.instrumentation.vertx;
 
+import static io.opentelemetry.context.ContextKey.named;
+
 import io.opentelemetry.api.trace.Span;
 import io.opentelemetry.context.Context;
+import io.opentelemetry.context.ContextKey;
+import io.opentelemetry.context.Scope;
 import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan;
 import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute;
 import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource;
@@ -20,6 +24,8 @@ import java.util.concurrent.ExecutionException;
 /** This is used to wrap Vert.x Handlers to provide nice user-friendly SERVER span names */
 public final class RoutingContextHandlerWrapper implements Handler<RoutingContext> {
 
+  private static final ContextKey<String> ROUTE_KEY = named("opentelemetry-vertx-route");
+
   private final Handler<RoutingContext> handler;
 
   public RoutingContextHandlerWrapper(Handler<RoutingContext> handler) {
@@ -29,13 +35,13 @@ public final class RoutingContextHandlerWrapper implements Handler<RoutingContex
   @Override
   public void handle(RoutingContext context) {
     Context otelContext = Context.current();
-    HttpServerRoute.update(
-        otelContext,
-        HttpServerRouteSource.CONTROLLER,
-        RoutingContextHandlerWrapper::getRoute,
-        context);
+    String route = getRoute(otelContext, context);
+    if (route != null && route.endsWith("/")) {
+      route = route.substring(0, route.length() - 1);
+    }
+    HttpServerRoute.update(otelContext, HttpServerRouteSource.NESTED_CONTROLLER, route);
 
-    try {
+    try (Scope ignore = otelContext.with(ROUTE_KEY, route).makeCurrent()) {
       handler.handle(context);
     } catch (Throwable throwable) {
       Span serverSpan = LocalRootSpan.fromContextOrNull(otelContext);
@@ -47,7 +53,9 @@ public final class RoutingContextHandlerWrapper implements Handler<RoutingContex
   }
 
   private static String getRoute(Context otelContext, RoutingContext routingContext) {
-    return routingContext.currentRoute().getPath();
+    String route = routingContext.currentRoute().getPath();
+    String existingRoute = otelContext.get(ROUTE_KEY);
+    return existingRoute != null ? existingRoute + route : route;
   }
 
   private static Throwable unwrapThrowable(Throwable throwable) {

+ 3 - 1
instrumentation/vertx/vertx-web-3.0/javaagent/src/version3Test/java/server/VertxWebServer.java

@@ -25,10 +25,12 @@ public class VertxWebServer extends AbstractVertxWebServer {
   public void start(Future<Void> startFuture) {
     int port = config().getInteger(CONFIG_HTTP_SERVER_PORT);
     Router router = buildRouter();
+    Router mainRouter = Router.router(vertx);
+    mainRouter.mountSubRouter("/vertx-app", router);
 
     vertx
         .createHttpServer()
-        .requestHandler(router::accept)
+        .requestHandler(mainRouter::accept)
         .listen(port, it -> startFuture.complete());
   }
 }

+ 8 - 0
instrumentation/vertx/vertx-web-3.0/testing/src/main/groovy/server/AbstractVertxHttpServerTest.groovy

@@ -58,11 +58,19 @@ abstract class AbstractVertxHttpServerTest extends HttpServerTest<Vertx> impleme
     return false
   }
 
+  @Override
+  String getContextPath() {
+    "/vertx-app"
+  }
+
   @Override
   String expectedHttpRoute(ServerEndpoint endpoint, String method) {
     if (method == HttpConstants._OTHER) {
       return getContextPath() + endpoint.path
     }
+    if (endpoint == ServerEndpoint.NOT_FOUND) {
+      return getContextPath()
+    }
     return super.expectedHttpRoute(endpoint, method)
   }
 }