All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.opentelemetry.javaagent.instrumentation.jaxrs.v3_0.ResteasyRequestContextInstrumentation Maven / Gradle / Ivy

There is a newer version: 2.12.0-alpha
Show newest version
/*
 * Copyright The OpenTelemetry Authors
 * SPDX-License-Identifier: Apache-2.0
 */

package io.opentelemetry.javaagent.instrumentation.jaxrs.v3_0;

import io.opentelemetry.context.Context;
import io.opentelemetry.context.Scope;
import io.opentelemetry.javaagent.instrumentation.jaxrs.JaxrsConstants;
import jakarta.ws.rs.container.ContainerRequestContext;
import java.lang.reflect.Method;
import net.bytebuddy.asm.Advice;
import net.bytebuddy.asm.Advice.Local;
import org.jboss.resteasy.core.ResourceMethodInvoker;
import org.jboss.resteasy.core.interception.jaxrs.PostMatchContainerRequestContext;

/**
 * RESTEasy specific context instrumentation.
 *
 * 

JAX-RS does not define a way to get the matched resource method from the * ContainerRequestContext * *

In the RESTEasy implementation, ContainerRequestContext is implemented by * PostMatchContainerRequestContext. This class provides a way to get the matched resource * method through getResourceMethod(). */ public class ResteasyRequestContextInstrumentation extends AbstractRequestContextInstrumentation { @Override protected String abortAdviceName() { return getClass().getName() + "$ContainerRequestContextAdvice"; } @SuppressWarnings("unused") public static class ContainerRequestContextAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void decorateAbortSpan( @Advice.This ContainerRequestContext requestContext, @Local("otelHandlerData") Jaxrs3HandlerData handlerData, @Local("otelContext") Context context, @Local("otelScope") Scope scope) { if (requestContext.getProperty(JaxrsConstants.ABORT_HANDLED) != null || !(requestContext instanceof PostMatchContainerRequestContext)) { return; } ResourceMethodInvoker resourceMethodInvoker = ((PostMatchContainerRequestContext) requestContext).getResourceMethod(); Method method = resourceMethodInvoker.getMethod(); Class resourceClass = resourceMethodInvoker.getResourceClass(); handlerData = new Jaxrs3HandlerData(resourceClass, method); context = Jaxrs3RequestContextHelper.createOrUpdateAbortSpan( ResteasySingletons.instrumenter(), requestContext, handlerData); if (context != null) { scope = context.makeCurrent(); } } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopSpan( @Local("otelHandlerData") Jaxrs3HandlerData handlerData, @Local("otelContext") Context context, @Local("otelScope") Scope scope, @Advice.Thrown Throwable throwable) { if (scope == null) { return; } scope.close(); ResteasySingletons.instrumenter().end(context, handlerData, null, throwable); } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy