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;
}