Skip to content

Commit 38d8a07

Browse files
committed
address review comments
1 parent 6bd569b commit 38d8a07

File tree

4 files changed

+68
-7
lines changed

4 files changed

+68
-7
lines changed

instrumentation/spring/spring-web/spring-web-6.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/web/v6_0/SpringRestTemplateTest.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,18 @@
66
package io.opentelemetry.javaagent.instrumentation.spring.web.v6_0;
77

88
import static java.util.Collections.singletonList;
9+
import static org.assertj.core.api.Assertions.assertThat;
910

1011
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
1112
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpClientTest;
1213
import io.opentelemetry.instrumentation.testing.junit.http.HttpClientInstrumentationExtension;
1314
import io.opentelemetry.instrumentation.testing.junit.http.HttpClientResult;
1415
import io.opentelemetry.instrumentation.testing.junit.http.HttpClientTestOptions;
16+
import io.opentelemetry.sdk.trace.data.StatusData;
1517
import java.io.InputStream;
1618
import java.net.URI;
1719
import java.util.Map;
20+
import org.junit.jupiter.api.Test;
1821
import org.junit.jupiter.api.extension.RegisterExtension;
1922
import org.springframework.http.HttpEntity;
2023
import org.springframework.http.HttpHeaders;
@@ -100,6 +103,41 @@ protected void configure(HttpClientTestOptions.Builder optionsBuilder) {
100103

101104
// no enum value for TEST
102105
optionsBuilder.disableTestNonStandardHttpMethod();
103-
optionsBuilder.setExpectedClientSpanNameMapper((uri, method) -> method + " " + uri.getPath());
106+
optionsBuilder.setExpectedClientSpanNameMapper(
107+
(uri, method) -> method + " " + getTemplate(uri));
108+
optionsBuilder.setExpectedUrlTemplateMapper(SpringRestTemplateTest::getTemplate);
109+
optionsBuilder.setHasUrlTemplate(true);
110+
}
111+
112+
private static String getTemplate(URI uri) {
113+
String path = uri.getPath();
114+
if (path.startsWith("/hello/")) {
115+
return "/hello/{name}";
116+
}
117+
return path;
118+
}
119+
120+
@Test
121+
void requestWithTemplate() {
122+
URI rootUri = resolveAddress("/");
123+
URI uri = resolveAddress("/hello/world");
124+
String method = "GET";
125+
int responseCode =
126+
restTemplate
127+
.exchange(
128+
rootUri + "hello/{name}", HttpMethod.valueOf(method), null, String.class, "world")
129+
.getStatusCode()
130+
.value();
131+
132+
assertThat(responseCode).isEqualTo(200);
133+
134+
testing.waitAndAssertTraces(
135+
trace ->
136+
trace.hasSpansSatisfyingExactly(
137+
span ->
138+
assertClientSpan(span, uri, method, responseCode, null)
139+
.hasNoParent()
140+
.hasStatus(StatusData.unset()),
141+
span -> assertServerSpan(span).hasParent(trace.getSpan(0))));
104142
}
105143
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,8 +1059,7 @@ void spanEndsAfterHeadersReceived() throws Exception {
10591059
});
10601060
}
10611061

1062-
// Visible for spock bridge.
1063-
SpanDataAssert assertClientSpan(
1062+
protected SpanDataAssert assertClientSpan(
10641063
SpanDataAssert span,
10651064
URI uri,
10661065
String method,
@@ -1120,9 +1119,11 @@ SpanDataAssert assertClientSpan(
11201119
if (httpClientAttributes.contains(UrlAttributes.URL_FULL)) {
11211120
assertThat(attrs).containsEntry(UrlAttributes.URL_FULL, uri.toString());
11221121
}
1123-
if (httpClientAttributes.contains(UrlIncubatingAttributes.URL_TEMPLATE)) {
1122+
if (options.getHasUrlTemplate()) {
11241123
assertThat(attrs)
1125-
.containsEntry(UrlIncubatingAttributes.URL_TEMPLATE, uri.getPath());
1124+
.containsEntry(
1125+
UrlIncubatingAttributes.URL_TEMPLATE,
1126+
options.getExpectedUrlTemplateMapper().apply(uri));
11261127
}
11271128
if (httpClientAttributes.contains(HttpAttributes.HTTP_REQUEST_METHOD)) {
11281129
assertThat(attrs).containsEntry(HttpAttributes.HTTP_REQUEST_METHOD, method);
@@ -1153,8 +1154,7 @@ SpanDataAssert assertClientSpan(
11531154
});
11541155
}
11551156

1156-
// Visible for spock bridge.
1157-
static SpanDataAssert assertServerSpan(SpanDataAssert span) {
1157+
protected static SpanDataAssert assertServerSpan(SpanDataAssert span) {
11581158
return span.hasName("test-http-server").hasKind(SpanKind.SERVER);
11591159
}
11601160

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ public abstract class HttpClientTestOptions {
3939
public static final BiFunction<URI, String, String> DEFAULT_EXPECTED_CLIENT_SPAN_NAME_MAPPER =
4040
(uri, method) -> HttpConstants._OTHER.equals(method) ? "HTTP" : method;
4141

42+
public static final Function<URI, String> DEFAULT_EXPECTED_URL_TEMPLATE_MAPPER = URI::getPath;
43+
4244
public static final int FOUND_STATUS_CODE = HttpStatus.FOUND.code();
4345

4446
public abstract Function<URI, Set<AttributeKey<?>>> getHttpAttributes();
@@ -56,6 +58,8 @@ public abstract class HttpClientTestOptions {
5658

5759
public abstract BiFunction<URI, String, String> getExpectedClientSpanNameMapper();
5860

61+
public abstract Function<URI, String> getExpectedUrlTemplateMapper();
62+
5963
abstract HttpClientInstrumentationType getInstrumentationType();
6064

6165
public boolean isLowLevelInstrumentation() {
@@ -95,6 +99,8 @@ public boolean isLowLevelInstrumentation() {
9599

96100
public abstract Function<URI, String> getHttpProtocolVersion();
97101

102+
public abstract boolean getHasUrlTemplate();
103+
98104
@Nullable
99105
abstract SpanEndsAfterType getSpanEndsAfterType();
100106

@@ -120,6 +126,7 @@ default Builder withDefaults() {
120126
.setClientSpanErrorMapper((uri, exception) -> exception)
121127
.setSingleConnectionFactory((host, port) -> null)
122128
.setExpectedClientSpanNameMapper(DEFAULT_EXPECTED_CLIENT_SPAN_NAME_MAPPER)
129+
.setExpectedUrlTemplateMapper(DEFAULT_EXPECTED_URL_TEMPLATE_MAPPER)
123130
.setInstrumentationType(HttpClientInstrumentationType.HIGH_LEVEL)
124131
.setSpanEndsAfterType(SpanEndsAfterType.HEADERS)
125132
.setTestWithClientParent(true)
@@ -137,6 +144,7 @@ default Builder withDefaults() {
137144
.setTestNonStandardHttpMethod(true)
138145
.setTestCaptureHttpHeaders(true)
139146
.setHasSendRequest(true)
147+
.setHasUrlTemplate(false)
140148
.setHttpProtocolVersion(uri -> "1.1");
141149
}
142150

@@ -152,6 +160,8 @@ default Builder withDefaults() {
152160

153161
Builder setExpectedClientSpanNameMapper(BiFunction<URI, String, String> value);
154162

163+
Builder setExpectedUrlTemplateMapper(Function<URI, String> value);
164+
155165
Builder setInstrumentationType(HttpClientInstrumentationType instrumentationType);
156166

157167
Builder setSpanEndsAfterType(SpanEndsAfterType spanEndsAfterType);
@@ -184,6 +194,8 @@ default Builder withDefaults() {
184194

185195
Builder setHasSendRequest(boolean value);
186196

197+
Builder setHasUrlTemplate(boolean value);
198+
187199
Builder setHttpProtocolVersion(Function<URI, String> value);
188200

189201
@CanIgnoreReturnValue
@@ -261,6 +273,11 @@ default Builder spanEndsAfterBody() {
261273
return setSpanEndsAfterType(SpanEndsAfterType.BODY);
262274
}
263275

276+
@CanIgnoreReturnValue
277+
default Builder enableUrlTemplate() {
278+
return setHasUrlTemplate(true);
279+
}
280+
264281
HttpClientTestOptions build();
265282
}
266283

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,12 @@ protected void configure(ServerBuilder sb) throws Exception {
124124

125125
return writer;
126126
})
127+
.service(
128+
"/hello/{name}",
129+
(ctx, req) -> {
130+
String name = ctx.pathParam("name");
131+
return HttpResponse.of("Hello, %s!", name != null ? name : "unknown");
132+
})
127133
.decorator(
128134
(delegate, ctx, req) -> {
129135
for (String field : openTelemetry.getPropagators().getTextMapPropagator().fields()) {

0 commit comments

Comments
 (0)