Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Handle vert.x sub routes #11535

Merged
merged 1 commit into from
Jun 6, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)
}
}
Loading