public static Object onServletEnter()

in apm-agent-plugins/apm-servlet-plugin/src/main/java/co/elastic/apm/agent/servlet/ServletApiAdvice.java [69:169]


    public static <HttpServletRequest, HttpServletResponse, ServletContext, ServletContextEvent, FilterConfig, ServletConfig> Object onServletEnter(
        ServletApiAdapter<HttpServletRequest, HttpServletResponse, ServletContext, ServletContextEvent, FilterConfig, ServletConfig> adapter,
        Object servletRequest) {

        Tracer tracer = GlobalTracer.get().require(Tracer.class);
        if (tracer == null) {
            return null;
        }

        final HttpServletRequest httpServletRequest = adapter.asHttpServletRequest(servletRequest);
        if (httpServletRequest == null) {
            return null;
        }
        AbstractSpan<?> ret = null;
        // re-activate transactions for async requests
        final Transaction<?> transactionAttr = (Transaction<?>) adapter.getAttribute(httpServletRequest, TRANSACTION_ATTRIBUTE);
        if (tracer.currentTransaction() == null && transactionAttr != null) {
            return transactionAttr.activateInScope();
        }

        if (!tracer.isRunning()) {
            return null;
        }

        CoreConfiguration coreConfig = tracer.getConfig(CoreConfiguration.class);

        if (adapter.isRequestDispatcherType(httpServletRequest)) {
            if (Boolean.TRUE == excluded.get()) {
                return null;
            }

            ServletServiceNameHelper.determineServiceName(adapter, adapter.getServletContext(httpServletRequest), tracer);

            Transaction<?> transaction = servletTransactionHelper.createAndActivateTransaction(adapter, adapter, httpServletRequest);

            if (transaction == null) {
                // if the httpServletRequest is excluded, avoid matching all exclude patterns again on each filter invocation
                excluded.set(Boolean.TRUE);
                return null;
            }

            final Request req = transaction.getContext().getRequest();
            if (transaction.isSampled() && coreConfig.isCaptureHeaders()) {
                adapter.handleCookies(req, httpServletRequest);

                final Enumeration<String> headerNames = adapter.getRequestHeaderNames(httpServletRequest);
                if (headerNames != null) {
                    while (headerNames.hasMoreElements()) {
                        final String headerName = headerNames.nextElement();
                        req.addHeader(headerName, adapter.getRequestHeaders(httpServletRequest, headerName));
                    }
                }
            }
            transaction.setFrameworkName(FRAMEWORK_NAME);

            servletTransactionHelper.fillRequestContext(transaction, adapter.getProtocol(httpServletRequest), adapter.getMethod(httpServletRequest), adapter.isSecure(httpServletRequest),
                adapter.getScheme(httpServletRequest), adapter.getServerName(httpServletRequest), adapter.getServerPort(httpServletRequest), adapter.getRequestURI(httpServletRequest), adapter.getQueryString(httpServletRequest),
                adapter.getRemoteAddr(httpServletRequest), adapter.getHeader(httpServletRequest, "Content-Type"));

            ret = transaction;
        } else if (!adapter.isAsyncDispatcherType(httpServletRequest) && coreConfig.isInstrumentationEnabled(Constants.SERVLET_API_DISPATCH)) {
            final TraceState<?> activeContext = tracer.currentContext();
            final AbstractSpan<?> parentSpan = activeContext.getSpan();
            if (parentSpan != null) {
                Object servletPath = null;
                Object pathInfo = null;
                RequestDispatcherSpanType spanType = null;
                if (adapter.isForwardDispatcherType(httpServletRequest)) {
                    spanType = RequestDispatcherSpanType.FORWARD;
                    servletPath = adapter.getServletPath(httpServletRequest);
                    pathInfo = adapter.getPathInfo(httpServletRequest);
                } else if (adapter.isIncludeDispatcherType(httpServletRequest)) {
                    spanType = RequestDispatcherSpanType.INCLUDE;
                    servletPath = adapter.getIncludeServletPathAttribute(httpServletRequest);
                    pathInfo = adapter.getIncludePathInfoAttribute(httpServletRequest);
                } else if (adapter.isErrorDispatcherType(httpServletRequest)) {
                    spanType = RequestDispatcherSpanType.ERROR;
                    servletPath = adapter.getServletPath(httpServletRequest);
                }

                if (spanType != null && (areNotEqual(servletPathTL.get(), servletPath) || areNotEqual(pathInfoTL.get(), pathInfo))) {
                    ret = activeContext.createSpan()
                        .appendToName(spanType.getNamePrefix())
                        .withAction(spanType.getAction())
                        .withType(SPAN_TYPE)
                        .withSubtype(SPAN_SUBTYPE);

                    if (servletPath != null) {
                        ret.appendToName(servletPath.toString());
                        servletPathTL.set(servletPath);
                    }
                    if (pathInfo != null) {
                        ret.appendToName(pathInfo.toString());
                        pathInfoTL.set(pathInfo);
                    }
                    ret.activate();
                }
            }
        }
        return ret;
    }