Skip to content

Commit 9432001

Browse files
committed
sling: final cleanups and final refactorings
1 parent c67d146 commit 9432001

File tree

4 files changed

+21
-48
lines changed

4 files changed

+21
-48
lines changed

instrumentation/sling/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/sling/ServletResolverInstrumentation.java

+1-12
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@
1111

1212
import javax.servlet.Servlet;
1313

14-
import java.util.Deque;
15-
import java.util.LinkedList;
16-
1714
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
1815
import static io.opentelemetry.javaagent.instrumentation.sling.SlingSingletons.REQUEST_ATTR_RESOLVED_SERVLET_NAME;
1916
import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@@ -49,7 +46,6 @@ public static void onExit(
4946
@Advice.Local("otelContext") Context context,
5047
@Advice.Local("otelScope") Scope scope) {
5148

52-
// TODO - copied from RequestUtil
5349
String name = null;
5450

5551
if (servlet.getServletConfig() != null) {
@@ -62,14 +58,7 @@ public static void onExit(
6258
name = servlet.getClass().getName();
6359
}
6460

65-
@SuppressWarnings("unchecked")
66-
Deque<String> servletNames = (Deque<String>) request.getAttribute(REQUEST_ATTR_RESOLVED_SERVLET_NAME);
67-
if ( servletNames == null ) {
68-
servletNames = new LinkedList<>();
69-
request.setAttribute(REQUEST_ATTR_RESOLVED_SERVLET_NAME, servletNames);
70-
}
71-
servletNames.addLast(name);
72-
System.out.format("SLING TRACE resolved name %s for uri=%s, current stack is %s%n", name, request.getRequestURI(), servletNames);
61+
request.setAttribute(REQUEST_ATTR_RESOLVED_SERVLET_NAME, name);
7362
}
7463
}
7564
}

instrumentation/sling/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/sling/SlingInstrumentationModule.java

-5
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,4 @@ public SlingInstrumentationModule() {
1717
public List<TypeInstrumentation> typeInstrumentations() {
1818
return Arrays.asList(new ServletResolverInstrumentation(), new SlingSafeMethodsServletInstrumentation());
1919
}
20-
21-
@Override
22-
public int order() {
23-
return -1;
24-
}
2520
}

instrumentation/sling/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/sling/SlingSafeMethodsServletInstrumentation.java

+15-22
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,31 @@
11
package io.opentelemetry.javaagent.instrumentation.sling;
22

33
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
4+
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
45
import static io.opentelemetry.javaagent.instrumentation.sling.SlingSingletons.REQUEST_ATTR_RESOLVED_SERVLET_NAME;
56
import static io.opentelemetry.javaagent.instrumentation.sling.SlingSingletons.helper;
67
import static net.bytebuddy.matcher.ElementMatchers.named;
78
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
89
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
910

10-
import io.opentelemetry.api.trace.Span;
1111
import io.opentelemetry.context.Context;
1212
import io.opentelemetry.context.Scope;
1313
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRoute;
1414
import io.opentelemetry.instrumentation.api.instrumenter.http.HttpServerRouteSource;
1515
import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge;
1616
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1717
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
18-
import io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers;
1918
import net.bytebuddy.asm.Advice;
2019
import net.bytebuddy.description.type.TypeDescription;
2120
import net.bytebuddy.matcher.ElementMatcher;
2221
import org.apache.sling.api.SlingHttpServletRequest;
2322
import javax.servlet.ServletRequest;
2423
import javax.servlet.ServletResponse;
25-
import java.util.Deque;
2624

2725
public class SlingSafeMethodsServletInstrumentation implements TypeInstrumentation {
2826
@Override
2927
public ElementMatcher<TypeDescription> typeMatcher() {
30-
return AgentElementMatchers.implementsInterface(named("javax.servlet.Servlet"));
28+
return implementsInterface(named("javax.servlet.Servlet"));
3129
}
3230

3331
@Override
@@ -60,19 +58,29 @@ public static void onEnter(
6058
return;
6159
}
6260

63-
System.out.format("SLING TRACE Handling request %s%n", request);
64-
6561
SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
6662

6763
Context parentContext = Java8BytecodeBridge.currentContext();
6864

6965
if (!helper().shouldStart(parentContext, slingRequest)) {
70-
System.out.format("SLING TRACE should not handle %s%n", request);
7166
return;
7267
}
7368

69+
// written by ServletResolverInstrumentation
70+
Object servletName = request.getAttribute(REQUEST_ATTR_RESOLVED_SERVLET_NAME);
71+
if ( !(servletName instanceof String) ) {
72+
return;
73+
}
74+
75+
// TODO - figure out why don't we have matches for all requests and find a better way to filter
7476
context = helper().start(parentContext, slingRequest);
7577
scope = context.makeCurrent();
78+
79+
// ensure that the top-level route is Sling-specific
80+
HttpServerRoute.update(context, HttpServerRouteSource.CONTROLLER, (String) servletName);
81+
82+
// cleanup and ensure we don't have reuse the resolved Servlet name by accident for other requests
83+
request.removeAttribute(REQUEST_ATTR_RESOLVED_SERVLET_NAME);
7684
}
7785

7886
@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class)
@@ -83,27 +91,12 @@ public static void onExit(
8391
@Advice.Local("otelContext") Context context,
8492
@Advice.Local("otelScope") Scope scope) {
8593

86-
System.out.format("SLING TRACE on exit for %s%n", request);
87-
8894
if (scope == null) {
8995
return;
9096
}
9197
scope.close();
9298

9399
SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
94-
// written by ServletResolverInstrumentation
95-
Object servletNameStack = request.getAttribute(REQUEST_ATTR_RESOLVED_SERVLET_NAME);
96-
97-
System.out.format("SLING TRACE servletName attr for %s is %s%n", request, servletNameStack);
98-
99-
if ( servletNameStack instanceof Deque<?>) {
100-
Deque<?> nameStack = (Deque<?>) servletNameStack;
101-
if ( ! nameStack.isEmpty() ) {
102-
String servletName = (String) nameStack.removeLast();
103-
Span.fromContext(context).updateName(servletName);
104-
HttpServerRoute.update(context, HttpServerRouteSource.CONTROLLER,servletName);
105-
}
106-
}
107100
helper().end(context, slingRequest, null, throwable);
108101
}
109102
}

instrumentation/sling/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/sling/SlingSingletons.java

+5-9
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,19 @@
77

88
import io.opentelemetry.api.GlobalOpenTelemetry;
99
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
10+
import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor;
1011
import org.apache.sling.api.SlingHttpServletRequest;
1112

1213
public final class SlingSingletons {
1314
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.sling-1.0";
14-
private static final String SPAN_NAME = "sling.request";
1515

16-
static final String REQUEST_ATTR_RESOLVED_SERVLET_NAME = INSTRUMENTATION_NAME + ".resovledServletName";
16+
static final String REQUEST_ATTR_RESOLVED_SERVLET_NAME = INSTRUMENTATION_NAME + ".resolvedServletName";
17+
18+
private static final SpanNameExtractor<SlingHttpServletRequest> SPAN_NAME_EXTRACTOR = s -> (String) s.getAttribute(REQUEST_ATTR_RESOLVED_SERVLET_NAME);
1719
private static final Instrumenter<SlingHttpServletRequest, Void>
18-
INSTRUMENTER = Instrumenter.
19-
<SlingHttpServletRequest, Void> builder(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, s -> SPAN_NAME)
20+
INSTRUMENTER = Instrumenter.<SlingHttpServletRequest, Void> builder(GlobalOpenTelemetry.get(), INSTRUMENTATION_NAME, SPAN_NAME_EXTRACTOR)
2021
.buildInstrumenter();
2122

22-
/* ServletInstrumenterBuilder.<HttpServletRequest, HttpServletResponse>create()
23-
.addContextCustomizer(
24-
(context, request, attributes) -> new AppServerBridge.Builder().init(context))
25-
.build(INSTRUMENTATION_NAME, Servlet3Accessor.INSTANCE);*/
26-
2723
public static Instrumenter<SlingHttpServletRequest, Void> helper() {
2824
return INSTRUMENTER;
2925
}

0 commit comments

Comments
 (0)