1
1
package io .opentelemetry .javaagent .instrumentation .sling ;
2
2
3
3
import static io .opentelemetry .javaagent .extension .matcher .AgentElementMatchers .hasClassesNamed ;
4
+ import static io .opentelemetry .javaagent .extension .matcher .AgentElementMatchers .implementsInterface ;
4
5
import static io .opentelemetry .javaagent .instrumentation .sling .SlingSingletons .REQUEST_ATTR_RESOLVED_SERVLET_NAME ;
5
6
import static io .opentelemetry .javaagent .instrumentation .sling .SlingSingletons .helper ;
6
7
import static net .bytebuddy .matcher .ElementMatchers .named ;
7
8
import static net .bytebuddy .matcher .ElementMatchers .takesArgument ;
8
9
import static net .bytebuddy .matcher .ElementMatchers .takesArguments ;
9
10
10
- import io .opentelemetry .api .trace .Span ;
11
11
import io .opentelemetry .context .Context ;
12
12
import io .opentelemetry .context .Scope ;
13
13
import io .opentelemetry .instrumentation .api .instrumenter .http .HttpServerRoute ;
14
14
import io .opentelemetry .instrumentation .api .instrumenter .http .HttpServerRouteSource ;
15
15
import io .opentelemetry .javaagent .bootstrap .Java8BytecodeBridge ;
16
16
import io .opentelemetry .javaagent .extension .instrumentation .TypeInstrumentation ;
17
17
import io .opentelemetry .javaagent .extension .instrumentation .TypeTransformer ;
18
- import io .opentelemetry .javaagent .extension .matcher .AgentElementMatchers ;
19
18
import net .bytebuddy .asm .Advice ;
20
19
import net .bytebuddy .description .type .TypeDescription ;
21
20
import net .bytebuddy .matcher .ElementMatcher ;
22
21
import org .apache .sling .api .SlingHttpServletRequest ;
23
22
import javax .servlet .ServletRequest ;
24
23
import javax .servlet .ServletResponse ;
25
- import java .util .Deque ;
26
24
27
25
public class SlingSafeMethodsServletInstrumentation implements TypeInstrumentation {
28
26
@ Override
29
27
public ElementMatcher <TypeDescription > typeMatcher () {
30
- return AgentElementMatchers . implementsInterface (named ("javax.servlet.Servlet" ));
28
+ return implementsInterface (named ("javax.servlet.Servlet" ));
31
29
}
32
30
33
31
@ Override
@@ -60,19 +58,29 @@ public static void onEnter(
60
58
return ;
61
59
}
62
60
63
- System .out .format ("SLING TRACE Handling request %s%n" , request );
64
-
65
61
SlingHttpServletRequest slingRequest = (SlingHttpServletRequest ) request ;
66
62
67
63
Context parentContext = Java8BytecodeBridge .currentContext ();
68
64
69
65
if (!helper ().shouldStart (parentContext , slingRequest )) {
70
- System .out .format ("SLING TRACE should not handle %s%n" , request );
71
66
return ;
72
67
}
73
68
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
74
76
context = helper ().start (parentContext , slingRequest );
75
77
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 );
76
84
}
77
85
78
86
@ Advice .OnMethodExit (suppress = Throwable .class , onThrowable = Throwable .class )
@@ -83,27 +91,12 @@ public static void onExit(
83
91
@ Advice .Local ("otelContext" ) Context context ,
84
92
@ Advice .Local ("otelScope" ) Scope scope ) {
85
93
86
- System .out .format ("SLING TRACE on exit for %s%n" , request );
87
-
88
94
if (scope == null ) {
89
95
return ;
90
96
}
91
97
scope .close ();
92
98
93
99
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
- }
107
100
helper ().end (context , slingRequest , null , throwable );
108
101
}
109
102
}
0 commit comments