Skip to content

Commit 8ada04a

Browse files
authored
Handle vert.x sub routes (#11535)
1 parent b0e3646 commit 8ada04a

File tree

4 files changed

+29
-9
lines changed

4 files changed

+29
-9
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ public void end(HttpServerResponse response, String message) {
2525
public void start(Promise<Void> startPromise) {
2626
int port = config().getInteger(CONFIG_HTTP_SERVER_PORT);
2727
Router router = buildRouter();
28+
Router mainRouter = Router.router(vertx);
29+
mainRouter.route("/vertx-app/*").subRouter(router);
2830

29-
vertx.createHttpServer().requestHandler(router).listen(port, it -> startPromise.complete());
31+
vertx.createHttpServer().requestHandler(mainRouter).listen(port, it -> startPromise.complete());
3032
}
3133
}

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@
55

66
package io.opentelemetry.javaagent.instrumentation.vertx;
77

8+
import static io.opentelemetry.context.ContextKey.named;
9+
810
import io.opentelemetry.api.trace.Span;
911
import io.opentelemetry.context.Context;
12+
import io.opentelemetry.context.ContextKey;
13+
import io.opentelemetry.context.Scope;
1014
import io.opentelemetry.instrumentation.api.instrumenter.LocalRootSpan;
1115
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRoute;
1216
import io.opentelemetry.instrumentation.api.semconv.http.HttpServerRouteSource;
@@ -20,6 +24,8 @@
2024
/** This is used to wrap Vert.x Handlers to provide nice user-friendly SERVER span names */
2125
public final class RoutingContextHandlerWrapper implements Handler<RoutingContext> {
2226

27+
private static final ContextKey<String> ROUTE_KEY = named("opentelemetry-vertx-route");
28+
2329
private final Handler<RoutingContext> handler;
2430

2531
public RoutingContextHandlerWrapper(Handler<RoutingContext> handler) {
@@ -29,13 +35,13 @@ public RoutingContextHandlerWrapper(Handler<RoutingContext> handler) {
2935
@Override
3036
public void handle(RoutingContext context) {
3137
Context otelContext = Context.current();
32-
HttpServerRoute.update(
33-
otelContext,
34-
HttpServerRouteSource.CONTROLLER,
35-
RoutingContextHandlerWrapper::getRoute,
36-
context);
38+
String route = getRoute(otelContext, context);
39+
if (route != null && route.endsWith("/")) {
40+
route = route.substring(0, route.length() - 1);
41+
}
42+
HttpServerRoute.update(otelContext, HttpServerRouteSource.NESTED_CONTROLLER, route);
3743

38-
try {
44+
try (Scope ignore = otelContext.with(ROUTE_KEY, route).makeCurrent()) {
3945
handler.handle(context);
4046
} catch (Throwable throwable) {
4147
Span serverSpan = LocalRootSpan.fromContextOrNull(otelContext);
@@ -47,7 +53,9 @@ public void handle(RoutingContext context) {
4753
}
4854

4955
private static String getRoute(Context otelContext, RoutingContext routingContext) {
50-
return routingContext.currentRoute().getPath();
56+
String route = routingContext.currentRoute().getPath();
57+
String existingRoute = otelContext.get(ROUTE_KEY);
58+
return existingRoute != null ? existingRoute + route : route;
5159
}
5260

5361
private static Throwable unwrapThrowable(Throwable throwable) {

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ public void end(HttpServerResponse response, String message) {
2525
public void start(Future<Void> startFuture) {
2626
int port = config().getInteger(CONFIG_HTTP_SERVER_PORT);
2727
Router router = buildRouter();
28+
Router mainRouter = Router.router(vertx);
29+
mainRouter.mountSubRouter("/vertx-app", router);
2830

2931
vertx
3032
.createHttpServer()
31-
.requestHandler(router::accept)
33+
.requestHandler(mainRouter::accept)
3234
.listen(port, it -> startFuture.complete());
3335
}
3436
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,19 @@ abstract class AbstractVertxHttpServerTest extends HttpServerTest<Vertx> impleme
5858
return false
5959
}
6060

61+
@Override
62+
String getContextPath() {
63+
"/vertx-app"
64+
}
65+
6166
@Override
6267
String expectedHttpRoute(ServerEndpoint endpoint, String method) {
6368
if (method == HttpConstants._OTHER) {
6469
return getContextPath() + endpoint.path
6570
}
71+
if (endpoint == ServerEndpoint.NOT_FOUND) {
72+
return getContextPath()
73+
}
6674
return super.expectedHttpRoute(endpoint, method)
6775
}
6876
}

0 commit comments

Comments
 (0)