Skip to content

Commit

Permalink
Handle vert.x sub routes (open-telemetry#11535)
Browse files Browse the repository at this point in the history
  • Loading branch information
laurit authored and zeitlinger committed Jun 12, 2024
1 parent ff8c56b commit 8af76aa
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ public void end(HttpServerResponse response, String message) {
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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -20,6 +24,8 @@
/** 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) {
Expand All @@ -29,13 +35,13 @@ public RoutingContextHandlerWrapper(Handler<RoutingContext> handler) {
@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);
Expand All @@ -47,7 +53,9 @@ public void handle(RoutingContext context) {
}

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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,12 @@ public void end(HttpServerResponse response, String message) {
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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

0 comments on commit 8af76aa

Please sign in to comment.