Skip to content

Commit 975e3d5

Browse files
authored
Add instrumentation unit tests for servlet 2.3 (#35)
* Add instrumentation unit tests Signed-off-by: Pavol Loffay <p.loffay@gmail.com> * Working tests for servlet 2.3 Signed-off-by: Pavol Loffay <p.loffay@gmail.com> * Add url Signed-off-by: Pavol Loffay <p.loffay@gmail.com>
1 parent 561c682 commit 975e3d5

File tree

8 files changed

+571
-5
lines changed

8 files changed

+571
-5
lines changed

instrumentation/servlet/servlet-2.3/build.gradle.kts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,17 @@ dependencies {
4747
instrumentationMuzzle("com.blogspot.mydailyjava:weak-lock-free:0.15")
4848
instrumentationMuzzle("com.google.auto.service:auto-service:1.0-rc7")
4949
instrumentationMuzzle("org.slf4j:slf4j-api:1.7.30")
50+
51+
testImplementation("org.eclipse.jetty:jetty-server:7.5.4.v20111024")
52+
testImplementation("org.eclipse.jetty:jetty-servlet:7.5.4.v20111024")
53+
testImplementation("io.opentelemetry:opentelemetry-sdk:0.9.1")
54+
testImplementation("io.opentelemetry.javaagent:opentelemetry-javaagent-api:0.9.0")
55+
testImplementation("io.opentelemetry.javaagent:opentelemetry-javaagent-tooling:0.9.0")
56+
testImplementation("com.squareup.okhttp3:okhttp:4.9.0")
57+
testImplementation("cglib:cglib:3.2.5")
58+
testImplementation("ch.qos.logback:logback-classic:1.2.3")
59+
testImplementation("org.slf4j:log4j-over-slf4j:1.7.30")
60+
testImplementation("org.slf4j:jcl-over-slf4j:1.7.30")
61+
testImplementation("org.slf4j:jul-to-slf4j:1.7.30")
62+
5063
}

instrumentation/servlet/servlet-2.3/src/main/java/io/opentelemetry/instrumentation/hypertrace/servlet/v2_3/BufferingHttpServletResponse.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,12 @@ public void addCookie(Cookie cookie) {
127127
safelyAddCookieHeader(cookie);
128128
}
129129

130+
@Override
131+
public void setContentType(String type) {
132+
super.setContentType(type);
133+
this.contentType = type;
134+
}
135+
130136
private void safelyAddCookieHeader(Cookie cookie) {
131137
try {
132138
HttpCookie httpCookie = new HttpCookie(cookie.getName(), cookie.getValue());
@@ -146,9 +152,6 @@ private void safelyAddCookieHeader(Cookie cookie) {
146152
}
147153

148154
private void safelyCaptureHeader(String name, Object value) {
149-
if (name != null && "content-type".equals(name.toLowerCase())) {
150-
this.contentType = String.valueOf(value);
151-
}
152155
try {
153156
List<String> values = headers.getOrDefault(name, new ArrayList<>());
154157
values.add(String.valueOf(value));

instrumentation/servlet/servlet-2.3/src/main/java/io/opentelemetry/instrumentation/hypertrace/servlet/v2_3/Servlet2BodyInstrumentation.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,8 +203,7 @@ public static void stopSpan(
203203
}
204204
// Bodies are captured at the end after all user processing.
205205
currentSpan.setAttribute(
206-
HypertraceSemanticAttributes.REQUEST_BODY,
207-
bufferingRequest.getByteBuffer().getBufferAsString());
206+
HypertraceSemanticAttributes.REQUEST_BODY, bufferingRequest.getBufferedBodyAsString());
208207
currentSpan.setAttribute(
209208
HypertraceSemanticAttributes.RESPONSE_BODY, bufferingResponse.getBufferAsString());
210209
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* Copyright The Hypertrace Authors
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package io.opentelemetry.instrymentation.hypertrace.servlet.v2_3;
18+
19+
import ch.qos.logback.classic.Level;
20+
import ch.qos.logback.classic.Logger;
21+
import io.opentelemetry.OpenTelemetry;
22+
import io.opentelemetry.context.propagation.DefaultContextPropagators;
23+
import io.opentelemetry.javaagent.tooling.AgentInstaller;
24+
import io.opentelemetry.javaagent.tooling.config.ConfigInitializer;
25+
import io.opentelemetry.sdk.OpenTelemetrySdk;
26+
import io.opentelemetry.trace.Tracer;
27+
import io.opentelemetry.trace.propagation.HttpTraceContext;
28+
import java.lang.instrument.ClassFileTransformer;
29+
import java.lang.instrument.Instrumentation;
30+
import net.bytebuddy.agent.ByteBuddyAgent;
31+
import org.junit.jupiter.api.BeforeAll;
32+
import org.slf4j.LoggerFactory;
33+
34+
public abstract class AbstractAgentTest {
35+
36+
/**
37+
* For test runs, agent's global tracer will report to this list writer.
38+
*
39+
* <p>Before the start of each test the reported traces will be reset.
40+
*/
41+
public static final InMemoryExporter TEST_WRITER;
42+
43+
protected static final Tracer TEST_TRACER;
44+
private static final Instrumentation INSTRUMENTATION;
45+
46+
static {
47+
ConfigInitializer.initialize();
48+
// always run with the thread propagation debugger to help track down sporadic test failures
49+
System.setProperty("otel.threadPropagationDebugger", "true");
50+
System.setProperty("otel.internal.failOnContextLeak", "true");
51+
52+
INSTRUMENTATION = ByteBuddyAgent.install();
53+
54+
((Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)).setLevel(Level.WARN);
55+
((Logger) LoggerFactory.getLogger("io.opentelemetry")).setLevel(Level.DEBUG);
56+
57+
TEST_WRITER = new InMemoryExporter();
58+
if (OpenTelemetry.getPropagators()
59+
.getTextMapPropagator()
60+
.getClass()
61+
.getSimpleName()
62+
.equals("NoopTextMapPropagator")) {
63+
OpenTelemetry.setPropagators(
64+
DefaultContextPropagators.builder()
65+
.addTextMapPropagator(HttpTraceContext.getInstance())
66+
.build());
67+
}
68+
OpenTelemetrySdk.getTracerManagement().addSpanProcessor(TEST_WRITER);
69+
TEST_TRACER = OpenTelemetry.getTracer("io.opentelemetry.auto");
70+
}
71+
72+
private static ClassFileTransformer classFileTransformer;
73+
74+
@BeforeAll
75+
public static void beforeAll() {
76+
if (classFileTransformer == null) {
77+
classFileTransformer = AgentInstaller.installBytebuddyAgent(INSTRUMENTATION, false);
78+
}
79+
}
80+
}

0 commit comments

Comments
 (0)