diff --git a/quarkus/deployment/src/main/java/org/keycloak/quarkus/deployment/KeycloakProcessor.java b/quarkus/deployment/src/main/java/org/keycloak/quarkus/deployment/KeycloakProcessor.java index d1750eabdb8..e840700964b 100644 --- a/quarkus/deployment/src/main/java/org/keycloak/quarkus/deployment/KeycloakProcessor.java +++ b/quarkus/deployment/src/main/java/org/keycloak/quarkus/deployment/KeycloakProcessor.java @@ -47,6 +47,7 @@ import io.quarkus.hibernate.orm.deployment.spi.AdditionalJpaModelBuildItem; import io.quarkus.narayana.jta.runtime.TransactionManagerBuildTimeConfig; import io.quarkus.narayana.jta.runtime.TransactionManagerBuildTimeConfig.UnsafeMultipleLastResourcesMode; import io.quarkus.resteasy.reactive.server.spi.MethodScannerBuildItem; +import io.quarkus.resteasy.reactive.server.spi.PreExceptionMapperHandlerBuildItem; import io.quarkus.runtime.configuration.ConfigurationException; import io.quarkus.vertx.http.deployment.HttpRootPathBuildItem; import io.quarkus.vertx.http.deployment.NonApplicationRootPathBuildItem; @@ -745,7 +746,8 @@ class KeycloakProcessor { @BuildStep void configureResteasy(CombinedIndexBuildItem index, BuildProducer buildTimeConditionBuildItemBuildProducer, - BuildProducer scanner) { + BuildProducer scanner, + BuildProducer preExceptionMapperHandlerBuildItemBuildProducer) { if (!Profile.isFeatureEnabled(Profile.Feature.ADMIN_API)) { buildTimeConditionBuildItemBuildProducer.produce(new BuildTimeConditionBuildItem(index.getIndex().getClassByName(DotName.createSimple( AdminRoot.class.getName())), false)); @@ -762,6 +764,10 @@ class KeycloakProcessor { if (Configuration.isTrue(TracingOptions.TRACING_ENABLED)) { chainCustomizers.add(new KeycloakTracingCustomizer()); + // Exception handler is necessary to handle exceptions that are thrown by the bean methods, + // otherwise the spans will not be closed. + preExceptionMapperHandlerBuildItemBuildProducer + .produce(new PreExceptionMapperHandlerBuildItem(new KeycloakTracingCustomizer.EndHandler())); } scanner.produce(new MethodScannerBuildItem(new MethodScanner() { diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/integration/resteasy/KeycloakTracingCustomizer.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/integration/resteasy/KeycloakTracingCustomizer.java index 5667bf47231..a767c08cd0e 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/integration/resteasy/KeycloakTracingCustomizer.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/integration/resteasy/KeycloakTracingCustomizer.java @@ -65,7 +65,7 @@ public final class KeycloakTracingCustomizer implements HandlerChainCustomizer { } } - private static class EndHandler implements ServerRestHandler { + public static class EndHandler implements ServerRestHandler { @Override public void handle(ResteasyReactiveRequestContext requestContext) { Scope scope = (Scope) requestContext.getProperty("scope");