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 a767c08cd0e..645b685d5db 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 @@ -23,6 +23,7 @@ import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; +import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes; import jakarta.enterprise.inject.spi.CDI; import org.apache.commons.lang3.StringUtils; import org.jboss.resteasy.reactive.common.model.ResourceClass; @@ -57,8 +58,9 @@ public final class KeycloakTracingCustomizer implements HandlerChainCustomizer { Tracer myTracer = openTelemetry.getTracer(this.getClass().getName(), Version.VERSION); SpanBuilder spanBuilder = myTracer.spanBuilder(spanName); spanBuilder.setParent(Context.current().with(Span.current())); - spanBuilder.setAttribute("code.function", methodName); - spanBuilder.setAttribute("code.namespace", className); + // for semconv >= 1.32 use CODE_FUNCTION_NAME instead + spanBuilder.setAttribute(CodeIncubatingAttributes.CODE_FUNCTION, methodName); + spanBuilder.setAttribute(CodeIncubatingAttributes.CODE_NAMESPACE, className); Span span = spanBuilder.startSpan(); requestContext.setProperty("span", span); requestContext.setProperty("scope", span.makeCurrent()); diff --git a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/tracing/OTelTracingProvider.java b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/tracing/OTelTracingProvider.java index 4e1301c0011..7ef2bdb5892 100644 --- a/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/tracing/OTelTracingProvider.java +++ b/quarkus/runtime/src/main/java/org/keycloak/quarkus/runtime/tracing/OTelTracingProvider.java @@ -18,6 +18,7 @@ package org.keycloak.quarkus.runtime.tracing; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanBuilder; @@ -100,7 +101,7 @@ public class OTelTracingProvider implements TracingProvider { public void error(Throwable exception) { var span = getCurrentSpan(); var exceptionAttributes = Attributes.builder() // based on OTel Semantic Conventions - .put(ExceptionAttributes.EXCEPTION_ESCAPED, true) + .put(AttributeKey.booleanKey("exception.escaped"), true) // remove once semconv >= 1.32 is used .put(ExceptionAttributes.EXCEPTION_MESSAGE, exception.getMessage()) .put(ExceptionAttributes.EXCEPTION_TYPE, exception.getClass().getCanonicalName()) .put(ExceptionAttributes.EXCEPTION_STACKTRACE, ExceptionUtils.getStackTrace(exception)) diff --git a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/tracing/OTelTracingProviderTest.java b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/tracing/OTelTracingProviderTest.java index bcea6018e21..55205032900 100644 --- a/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/tracing/OTelTracingProviderTest.java +++ b/testsuite/integration-arquillian/tests/base/src/test/java/org/keycloak/testsuite/tracing/OTelTracingProviderTest.java @@ -202,8 +202,7 @@ public class OTelTracingProviderTest extends AbstractTestRealmKeycloakTest { var exceptionData = (ExceptionEventData) eventData; var exceptionAttributes = exceptionData.getAttributes(); assertThat(exceptionAttributes, notNullValue()); - - assertThat(exceptionAttributes.get(ExceptionAttributes.EXCEPTION_ESCAPED), is(true)); + assertThat(exceptionAttributes.get(AttributeKey.booleanKey("exception.escaped")), is(true)); assertThat(exceptionAttributes.get(ExceptionAttributes.EXCEPTION_MESSAGE), is("something bad happened")); assertThat(exceptionAttributes.get(ExceptionAttributes.EXCEPTION_STACKTRACE), not(emptyOrNullString())); assertThat(exceptionAttributes.get(ExceptionAttributes.EXCEPTION_TYPE), is(RuntimeException.class.getCanonicalName()));