Skip to content

Commit 4efcd9e

Browse files
committed
copy/embed all necessary classes.
1 parent a3e548b commit 4efcd9e

File tree

49 files changed

+2565
-39
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2565
-39
lines changed

instrumentation/servlet/servlet-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/Servlet3Advice.java

Lines changed: 72 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,18 @@
66
package io.opentelemetry.javaagent.instrumentation.servlet.v3_0;
77

88
import static io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3Singletons.getSnippetInjectionHelper;
9+
import static io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3Singletons.helper;
910

11+
import io.opentelemetry.context.Context;
12+
import io.opentelemetry.context.Scope;
1013
import io.opentelemetry.javaagent.bootstrap.CallDepth;
14+
import io.opentelemetry.javaagent.bootstrap.http.HttpServerResponseCustomizerHolder;
1115
import io.opentelemetry.javaagent.bootstrap.servlet.AppServerBridge;
16+
import io.opentelemetry.javaagent.bootstrap.servlet.MappingResolver;
17+
import io.opentelemetry.javaagent.instrumentation.servlet.ServletRequestContext;
1218
import io.opentelemetry.javaagent.instrumentation.servlet.v3_0.snippet.Servlet3SnippetInjectingResponseWrapper;
1319
import javax.annotation.Nullable;
20+
import javax.servlet.Servlet;
1421
import javax.servlet.ServletRequest;
1522
import javax.servlet.ServletResponse;
1623
import javax.servlet.http.HttpServletRequest;
@@ -20,8 +27,70 @@
2027
import net.bytebuddy.asm.Advice.AssignReturned.ToArguments.ToArgument;
2128
import net.bytebuddy.implementation.bytecode.assign.Assigner;
2229

30+
@SuppressWarnings("unused")
2331
public class Servlet3Advice {
2432

33+
public static class AdviceScope {
34+
private final CallDepth callDepth;
35+
private final ServletRequestContext<HttpServletRequest> requestContext;
36+
private final Context context;
37+
private final Scope scope;
38+
39+
public AdviceScope(
40+
CallDepth callDepth,
41+
HttpServletRequest request,
42+
HttpServletResponse response,
43+
Object servletOrFilter) {
44+
this.callDepth = callDepth;
45+
this.callDepth.getAndIncrement();
46+
47+
Context currentContext = Context.current();
48+
Context attachedContext = helper().getServerContext(request);
49+
Context contextToUpdate;
50+
51+
requestContext = new ServletRequestContext<>(request, servletOrFilter);
52+
if (attachedContext == null && helper().shouldStart(currentContext, requestContext)) {
53+
context = helper().start(currentContext, requestContext);
54+
helper().setAsyncListenerResponse(context, response);
55+
56+
contextToUpdate = context;
57+
} else if (attachedContext != null
58+
&& helper().needsRescoping(currentContext, attachedContext)) {
59+
// Given request already has a context associated with it.
60+
// see the needsRescoping() javadoc for more explanation
61+
contextToUpdate = attachedContext;
62+
context = null;
63+
} else {
64+
// We are inside nested servlet/filter/app-server span, don't create new span
65+
contextToUpdate = currentContext;
66+
context = null;
67+
}
68+
69+
// Update context with info from current request to ensure that server span gets the best
70+
// possible name.
71+
// In case server span was created by app server instrumentations calling updateContext
72+
// returns a new context that contains servlet context path that is used in other
73+
// instrumentations for naming server span.
74+
MappingResolver mappingResolver = Servlet3Singletons.getMappingResolver(servletOrFilter);
75+
boolean servlet = servletOrFilter instanceof Servlet;
76+
contextToUpdate = helper().updateContext(contextToUpdate, request, mappingResolver, servlet);
77+
scope = contextToUpdate.makeCurrent();
78+
79+
if (context != null) {
80+
// Only trigger response customizer once, so only if server span was created here
81+
HttpServerResponseCustomizerHolder.getCustomizer()
82+
.customize(contextToUpdate, response, Servlet3Accessor.INSTANCE);
83+
}
84+
}
85+
86+
public void exit(
87+
@Nullable Throwable throwable, HttpServletRequest request, HttpServletResponse response) {
88+
89+
boolean topLevel = callDepth.decrementAndGet() == 0;
90+
helper().end(requestContext, request, response, throwable, topLevel, context, scope);
91+
}
92+
}
93+
2594
@AssignReturned.ToArguments({
2695
@ToArgument(value = 0, index = 1),
2796
@ToArgument(value = 1, index = 2)
@@ -45,8 +114,8 @@ public static Object[] onEnter(
45114
response =
46115
new Servlet3SnippetInjectingResponseWrapper((HttpServletResponse) response, snippet);
47116
}
48-
Servlet3RequestAdviceScope adviceScope =
49-
new Servlet3RequestAdviceScope(
117+
AdviceScope adviceScope =
118+
new AdviceScope(
50119
CallDepth.forClass(AppServerBridge.getCallDepthKey()),
51120
(HttpServletRequest) request,
52121
(HttpServletResponse) response,
@@ -60,7 +129,7 @@ public static void stopSpan(
60129
@Advice.Argument(1) ServletResponse response,
61130
@Advice.Thrown @Nullable Throwable throwable,
62131
@Advice.Enter Object[] enterResult) {
63-
Servlet3RequestAdviceScope adviceScope = (Servlet3RequestAdviceScope) enterResult[0];
132+
AdviceScope adviceScope = (AdviceScope) enterResult[0];
64133
if (adviceScope == null
65134
|| !(request instanceof HttpServletRequest)
66135
|| !(response instanceof HttpServletResponse)) {

instrumentation/servlet/servlet-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/servlet/v3_0/Servlet3ResponseSendAdvice.java

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,67 @@
55

66
package io.opentelemetry.javaagent.instrumentation.servlet.v3_0;
77

8+
import static io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3Singletons.responseInstrumenter;
9+
10+
import io.opentelemetry.context.Context;
11+
import io.opentelemetry.context.Scope;
12+
import io.opentelemetry.instrumentation.api.incubator.semconv.util.ClassAndMethod;
813
import io.opentelemetry.javaagent.bootstrap.CallDepth;
14+
import io.opentelemetry.javaagent.instrumentation.servlet.common.response.HttpServletResponseAdviceHelper;
15+
import javax.annotation.Nullable;
916
import javax.servlet.http.HttpServletResponse;
1017
import net.bytebuddy.asm.Advice;
1118

1219
@SuppressWarnings("unused")
1320
public class Servlet3ResponseSendAdvice {
1421

22+
public static class AdviceScope {
23+
private final CallDepth callDepth;
24+
private final ClassAndMethod classAndMethod;
25+
private final Context context;
26+
private final Scope scope;
27+
28+
public AdviceScope(CallDepth callDepth, Class<?> declaringClass, String methodName) {
29+
this.callDepth = callDepth;
30+
if (callDepth.getAndIncrement() > 0) {
31+
this.classAndMethod = null;
32+
this.context = null;
33+
this.scope = null;
34+
return;
35+
}
36+
HttpServletResponseAdviceHelper.StartResult result =
37+
HttpServletResponseAdviceHelper.startSpan(
38+
responseInstrumenter(), declaringClass, methodName);
39+
if (result != null) {
40+
classAndMethod = result.getClassAndMethod();
41+
context = result.getContext();
42+
scope = result.getScope();
43+
} else {
44+
classAndMethod = null;
45+
context = null;
46+
scope = null;
47+
}
48+
}
49+
50+
public void exit(@Nullable Throwable throwable) {
51+
if (callDepth.decrementAndGet() > 0) {
52+
return;
53+
}
54+
HttpServletResponseAdviceHelper.stopSpan(
55+
responseInstrumenter(), throwable, context, scope, classAndMethod);
56+
}
57+
}
58+
1559
@Advice.OnMethodEnter(suppress = Throwable.class)
16-
public static Servlet3ResponseAdviceScope start(
60+
public static AdviceScope start(
1761
@Advice.Origin("#t") Class<?> declaringClass, @Advice.Origin("#m") String methodName) {
18-
return new Servlet3ResponseAdviceScope(
62+
return new AdviceScope(
1963
CallDepth.forClass(HttpServletResponse.class), declaringClass, methodName);
2064
}
2165

2266
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
2367
public static void stopSpan(
24-
@Advice.Thrown Throwable throwable, @Advice.Enter Servlet3ResponseAdviceScope adviceScope) {
68+
@Advice.Thrown Throwable throwable, @Advice.Enter AdviceScope adviceScope) {
2569
adviceScope.exit(throwable);
2670
}
2771
}

instrumentation/servlet/servlet-3.0/library/build.gradle.kts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,7 @@ plugins {
44

55
dependencies {
66
library("javax.servlet:javax.servlet-api:3.0.1")
7-
8-
// FIXME: These dependencies need to be shadowed into the library.
9-
library(project(":instrumentation:servlet:servlet-3.0:javaagent"))
10-
library(project(":instrumentation:servlet:servlet-common:javaagent"))
11-
library(project(":instrumentation:servlet:servlet-common:bootstrap"))
12-
library(project(":javaagent-extension-api"))
13-
14-
// testImplementation(project(":testing:agent-exporter"))
7+
library("io.opentelemetry.semconv:opentelemetry-semconv-incubating")
158

169
testLibrary("org.eclipse.jetty:jetty-server:8.0.0.v20110901")
1710
testLibrary("org.eclipse.jetty:jetty-servlet:8.0.0.v20110901")
@@ -21,7 +14,7 @@ dependencies {
2114

2215
tasks {
2316
withType<Test>().configureEach {
24-
// required on jdk17 to allow tomcat to shutdown properly.
17+
// required on jdk17+ to allow tomcat to shutdown properly.
2518
jvmArgs("--add-opens=java.base/java.util=ALL-UNNAMED")
2619
jvmArgs("-XX:+IgnoreUnrecognizedVMOptions")
2720
}

instrumentation/servlet/servlet-3.0/library/src/main/java/io/opentelemetry/instrumentation/servlet/v3_0/OpenTelemetryServletFilter.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@
44
*/
55

66
package io.opentelemetry.instrumentation.servlet.v3_0;
7+
import static io.opentelemetry.instrumentation.servlet.v3_0.copied.Servlet3Singletons.FILTER_MAPPING_RESOLVER;
78

8-
import static io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3Singletons.FILTER_MAPPING_RESOLVER;
9-
10-
import io.opentelemetry.javaagent.bootstrap.CallDepth;
11-
import io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3FilterMappingResolverFactory;
12-
import io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3RequestAdviceScope;
9+
import io.opentelemetry.instrumentation.servlet.v3_0.copied.CallDepth;
10+
import io.opentelemetry.instrumentation.servlet.v3_0.copied.Servlet3FilterMappingResolverFactory;
11+
import io.opentelemetry.instrumentation.servlet.v3_0.copied.Servlet3RequestAdviceScope;
1312
import java.io.IOException;
1413
import javax.servlet.Filter;
1514
import javax.servlet.FilterChain;

instrumentation/servlet/servlet-3.0/library/src/main/java/io/opentelemetry/instrumentation/servlet/v3_0/OtelAsyncContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
package io.opentelemetry.instrumentation.servlet.v3_0;
77

8-
import static io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3Singletons.helper;
8+
import static io.opentelemetry.instrumentation.servlet.v3_0.copied.Servlet3Singletons.helper;
99

1010
import javax.servlet.AsyncContext;
1111
import javax.servlet.AsyncListener;

instrumentation/servlet/servlet-3.0/library/src/main/java/io/opentelemetry/instrumentation/servlet/v3_0/OtelHttpServletRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
package io.opentelemetry.instrumentation.servlet.v3_0;
77

8-
import static io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3Singletons.helper;
8+
import static io.opentelemetry.instrumentation.servlet.v3_0.copied.Servlet3Singletons.helper;
99

1010
import io.opentelemetry.context.Context;
1111
import javax.servlet.AsyncContext;

instrumentation/servlet/servlet-3.0/library/src/main/java/io/opentelemetry/instrumentation/servlet/v3_0/OtelHttpServletResponse.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
package io.opentelemetry.instrumentation.servlet.v3_0;
77

8-
import io.opentelemetry.javaagent.bootstrap.CallDepth;
9-
import io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3ResponseAdviceScope;
8+
import io.opentelemetry.instrumentation.servlet.v3_0.copied.CallDepth;
9+
import io.opentelemetry.instrumentation.servlet.v3_0.copied.Servlet3ResponseAdviceScope;
1010
import java.io.IOException;
1111
import javax.servlet.http.HttpServletResponse;
1212
import javax.servlet.http.HttpServletResponseWrapper;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.servlet.v3_0.copied;
7+
8+
import io.opentelemetry.instrumentation.api.incubator.config.internal.CommonConfig;
9+
10+
/**
11+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
12+
* any time.
13+
*/
14+
public class AgentCommonConfig {
15+
private AgentCommonConfig() {}
16+
17+
private static final CommonConfig instance = new CommonConfig(AgentInstrumentationConfig.get());
18+
19+
public static CommonConfig get() {
20+
return instance;
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.servlet.v3_0.copied;
7+
8+
import static java.util.Objects.requireNonNull;
9+
10+
import io.opentelemetry.instrumentation.api.incubator.config.internal.InstrumentationConfig;
11+
import java.util.logging.Logger;
12+
13+
/**
14+
* This class is internal and is hence not for public use. Its APIs are unstable and can change at
15+
* any time.
16+
*/
17+
public class AgentInstrumentationConfig {
18+
private AgentInstrumentationConfig() {}
19+
20+
private static final Logger logger = Logger.getLogger(AgentInstrumentationConfig.class.getName());
21+
22+
private static final InstrumentationConfig DEFAULT = new EmptyInstrumentationConfig();
23+
24+
// lazy initialized, so that javaagent can set it
25+
private static volatile InstrumentationConfig instance = DEFAULT;
26+
27+
/**
28+
* Sets the instrumentation configuration singleton. This method is only supposed to be called
29+
* once, during the agent initialization, just before {@link AgentInstrumentationConfig#get()} is
30+
* used for the first time.
31+
*
32+
* <p>This method is internal and is hence not for public use. Its API is unstable and can change
33+
* at any time.
34+
*/
35+
public static void internalInitializeConfig(InstrumentationConfig config) {
36+
if (instance != DEFAULT) {
37+
logger.warning("InstrumentationConfig#instance was already set earlier");
38+
return;
39+
}
40+
instance = requireNonNull(config);
41+
}
42+
43+
/** Returns the global instrumentation configuration. */
44+
public static InstrumentationConfig get() {
45+
return instance;
46+
}
47+
}

0 commit comments

Comments
 (0)