Skip to content

Commit f877ec9

Browse files
authored
Add baggage test to AbstractHttpServerTest (#13027)
1 parent 84cacb3 commit f877ec9

File tree

8 files changed

+124
-9
lines changed

8 files changed

+124
-9
lines changed

conventions/src/main/kotlin/io.opentelemetry.instrumentation.javaagent-testing.gradle.kts

+14-3
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ class JavaagentTestArgumentsProvider(
9393
"-Dio.opentelemetry.javaagent.slf4j.simpleLogger.log.io.grpc.internal.ServerImplBuilder=INFO",
9494
"-Dio.opentelemetry.javaagent.slf4j.simpleLogger.log.io.grpc.internal.ManagedChannelImplBuilder=INFO",
9595
"-Dio.opentelemetry.javaagent.slf4j.simpleLogger.log.io.perfmark.PerfMark=INFO",
96-
"-Dio.opentelemetry.javaagent.slf4j.simpleLogger.log.io.grpc.Context=INFO"
96+
"-Dio.opentelemetry.javaagent.slf4j.simpleLogger.log.io.grpc.Context=INFO",
97+
"-Dotel.java.experimental.span-attributes.copy-from-baggage.include=test-baggage-key-1,test-baggage-key-2"
9798
)
9899
}
99100

@@ -108,12 +109,22 @@ afterEvaluate {
108109
// this dependency.
109110
dependsOn(agentForTesting.buildDependencies)
110111

111-
jvmArgumentProviders.add(JavaagentTestArgumentsProvider(agentShadowJar, shadowJar.archiveFile.get().asFile))
112+
jvmArgumentProviders.add(
113+
JavaagentTestArgumentsProvider(
114+
agentShadowJar,
115+
shadowJar.archiveFile.get().asFile
116+
)
117+
)
112118

113119
// We do fine-grained filtering of the classpath of this codebase's sources since Gradle's
114120
// configurations will include transitive dependencies as well, which tests do often need.
115121
classpath = classpath.filter {
116-
if (file(layout.buildDirectory.dir("resources/main")).equals(it) || file(layout.buildDirectory.dir("classes/java/main")).equals(it)) {
122+
if (file(layout.buildDirectory.dir("resources/main")).equals(it) || file(
123+
layout.buildDirectory.dir(
124+
"classes/java/main"
125+
)
126+
).equals(it)
127+
) {
117128
// The sources are packaged into the testing jar, so we need to exclude them from the test
118129
// classpath, which automatically inherits them, to ensure our shaded versions are used.
119130
return@filter false

instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/main/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/JavaxHttpServletRequestGetter.java

+26-2
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@
55

66
package io.opentelemetry.instrumentation.spring.webmvc.v5_3;
77

8-
import io.opentelemetry.context.propagation.TextMapGetter;
8+
import static java.util.Collections.emptyIterator;
9+
10+
import io.opentelemetry.context.propagation.internal.ExtendedTextMapGetter;
911
import java.util.Collections;
12+
import java.util.Enumeration;
13+
import java.util.Iterator;
1014
import javax.servlet.http.HttpServletRequest;
1115

12-
enum JavaxHttpServletRequestGetter implements TextMapGetter<HttpServletRequest> {
16+
enum JavaxHttpServletRequestGetter implements ExtendedTextMapGetter<HttpServletRequest> {
1317
INSTANCE;
1418

1519
@Override
@@ -21,4 +25,24 @@ public Iterable<String> keys(HttpServletRequest carrier) {
2125
public String get(HttpServletRequest carrier, String key) {
2226
return carrier.getHeader(key);
2327
}
28+
29+
@Override
30+
public Iterator<String> getAll(HttpServletRequest carrier, String key) {
31+
Enumeration<String> values = carrier.getHeaders(key);
32+
if (values == null) {
33+
return emptyIterator();
34+
}
35+
36+
return new Iterator<String>() {
37+
@Override
38+
public boolean hasNext() {
39+
return values.hasMoreElements();
40+
}
41+
42+
@Override
43+
public String next() {
44+
return values.nextElement();
45+
}
46+
};
47+
}
2448
}

instrumentation/spring/spring-webmvc/spring-webmvc-5.3/library/src/test/java/io/opentelemetry/instrumentation/spring/webmvc/v5_3/WebMvcHttpServerTest.java

+2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ protected void configure(HttpServerTestOptions options) {
5353
}
5454
return expectedHttpRoute(endpoint, method);
5555
});
56+
57+
options.setTestExtractMultiBaggage(true);
5658
}
5759

5860
@Test

testing-common/build.gradle.kts

+9-2
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,16 @@ group = "io.opentelemetry.javaagent"
99
sourceSets {
1010
main {
1111
val armeriaShadedDeps = project(":testing:armeria-shaded-for-testing")
12-
output.dir(armeriaShadedDeps.file("build/extracted/shadow"), "builtBy" to ":testing:armeria-shaded-for-testing:extractShadowJar")
12+
output.dir(
13+
armeriaShadedDeps.file("build/extracted/shadow"),
14+
"builtBy" to ":testing:armeria-shaded-for-testing:extractShadowJar"
15+
)
1316

1417
val protoShadedDeps = project(":testing:proto-shaded-for-testing")
15-
output.dir(protoShadedDeps.file("build/extracted/shadow"), "builtBy" to ":testing:proto-shaded-for-testing:extractShadowJar")
18+
output.dir(
19+
protoShadedDeps.file("build/extracted/shadow"),
20+
"builtBy" to ":testing:proto-shaded-for-testing:extractShadowJar"
21+
)
1622
}
1723
}
1824

@@ -62,6 +68,7 @@ dependencies {
6268
implementation("org.slf4j:jcl-over-slf4j")
6369
implementation("org.slf4j:jul-to-slf4j")
6470
implementation("io.opentelemetry:opentelemetry-exporter-logging")
71+
implementation("io.opentelemetry.contrib:opentelemetry-baggage-processor")
6572
api(project(":instrumentation-api-incubator"))
6673

6774
annotationProcessor("com.google.auto.service:auto-service")

testing-common/src/main/java/io/opentelemetry/instrumentation/testing/LibraryTestRunner.java

+15-1
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,20 @@
55

66
package io.opentelemetry.instrumentation.testing;
77

8+
import static java.util.Arrays.asList;
9+
810
import io.opentelemetry.api.GlobalOpenTelemetry;
911
import io.opentelemetry.api.OpenTelemetry;
12+
import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
1013
import io.opentelemetry.api.logs.LoggerProvider;
1114
import io.opentelemetry.api.metrics.MeterProvider;
1215
import io.opentelemetry.api.trace.TracerBuilder;
1316
import io.opentelemetry.api.trace.TracerProvider;
1417
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
1518
import io.opentelemetry.context.Context;
1619
import io.opentelemetry.context.propagation.ContextPropagators;
20+
import io.opentelemetry.context.propagation.TextMapPropagator;
21+
import io.opentelemetry.contrib.baggage.processor.BaggageSpanProcessor;
1722
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
1823
import io.opentelemetry.sdk.OpenTelemetrySdk;
1924
import io.opentelemetry.sdk.common.CompletableResultCode;
@@ -73,13 +78,22 @@ public final class LibraryTestRunner extends InstrumentationTestRunner {
7378
.addSpanProcessor(new FlushTrackingSpanProcessor())
7479
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
7580
.addSpanProcessor(SimpleSpanProcessor.create(testSpanExporter))
81+
.addSpanProcessor(
82+
new BaggageSpanProcessor(
83+
baggageKey ->
84+
asList("test-baggage-key-1", "test-baggage-key-2")
85+
.contains(baggageKey)))
7686
.build())
7787
.setMeterProvider(SdkMeterProvider.builder().registerMetricReader(metricReader).build())
7888
.setLoggerProvider(
7989
SdkLoggerProvider.builder()
8090
.addLogRecordProcessor(SimpleLogRecordProcessor.create(testLogRecordExporter))
8191
.build())
82-
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
92+
.setPropagators(
93+
ContextPropagators.create(
94+
TextMapPropagator.composite(
95+
W3CTraceContextPropagator.getInstance(),
96+
W3CBaggagePropagator.getInstance())))
8397
.buildAndRegisterGlobal();
8498
openTelemetry = wrap(openTelemetrySdk);
8599
}

testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/InstrumentationExtension.java

-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
package io.opentelemetry.instrumentation.testing.junit;
77

88
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
9-
import static org.assertj.core.api.Assertions.assertThat;
109
import static org.awaitility.Awaitility.await;
1110

1211
import io.opentelemetry.api.OpenTelemetry;

testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/AbstractHttpServerTest.java

+51
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,57 @@ void requestWithNonStandardHttpMethod() throws InterruptedException {
543543
}
544544
}
545545

546+
@Test
547+
void extractSingleBaggage() {
548+
String method = "GET";
549+
AggregatedHttpRequest request =
550+
AggregatedHttpRequest.of(
551+
request(SUCCESS, method).headers().toBuilder()
552+
// adding baggage header in w3c baggage format
553+
.set("baggage", "test-baggage-key-1=test-baggage-value-1")
554+
.build());
555+
AggregatedHttpResponse response = client.execute(request).aggregate().join();
556+
557+
assertThat(response.status().code()).isEqualTo(SUCCESS.getStatus());
558+
assertThat(response.contentUtf8()).isEqualTo(SUCCESS.getBody());
559+
560+
testing.waitAndAssertTraces(
561+
trace ->
562+
trace.anySatisfy(
563+
span ->
564+
assertServerSpan(assertThat(span), method, SUCCESS, SUCCESS.status)
565+
.hasAttribute(
566+
AttributeKey.stringKey("test-baggage-key-1"), "test-baggage-value-1")));
567+
}
568+
569+
@Test
570+
void extractMultiBaggage() {
571+
assumeTrue(options.testExtractMultiBaggage);
572+
573+
String method = "GET";
574+
AggregatedHttpRequest request =
575+
AggregatedHttpRequest.of(
576+
request(SUCCESS, method).headers().toBuilder()
577+
// adding baggage header in w3c baggage format
578+
.add("baggage", "test-baggage-key-1=test-baggage-value-1")
579+
.add("baggage", "test-baggage-key-2=test-baggage-value-2")
580+
.build());
581+
AggregatedHttpResponse response = client.execute(request).aggregate().join();
582+
583+
assertThat(response.status().code()).isEqualTo(SUCCESS.getStatus());
584+
assertThat(response.contentUtf8()).isEqualTo(SUCCESS.getBody());
585+
586+
testing.waitAndAssertTraces(
587+
trace ->
588+
trace.anySatisfy(
589+
span ->
590+
assertServerSpan(assertThat(span), method, SUCCESS, SUCCESS.status)
591+
.hasAttribute(
592+
AttributeKey.stringKey("test-baggage-key-1"), "test-baggage-value-1")
593+
.hasAttribute(
594+
AttributeKey.stringKey("test-baggage-key-2"), "test-baggage-value-2")));
595+
}
596+
546597
private static Bootstrap buildBootstrap(EventLoopGroup eventLoopGroup) {
547598
Bootstrap bootstrap = new Bootstrap();
548599
bootstrap

testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/http/HttpServerTestOptions.java

+7
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public final class HttpServerTestOptions {
6464
boolean testNonStandardHttpMethod = true;
6565
boolean verifyServerSpanEndTime = true;
6666
boolean useHttp2 = false;
67+
boolean testExtractMultiBaggage = false;
6768

6869
HttpServerTestOptions() {}
6970

@@ -230,6 +231,12 @@ public HttpServerTestOptions useHttp2() {
230231
return setUseHttp2(true);
231232
}
232233

234+
@CanIgnoreReturnValue
235+
public HttpServerTestOptions setTestExtractMultiBaggage(boolean testExtractMultiBaggage) {
236+
this.testExtractMultiBaggage = testExtractMultiBaggage;
237+
return this;
238+
}
239+
233240
@FunctionalInterface
234241
public interface SpanNameMapper {
235242

0 commit comments

Comments
 (0)