mirror of
https://github.com/spring-projects/spring-boot.git
synced 2024-08-29 03:06:45 +08:00
Avoid uri tag explosion when use of path variable is undetected
This commit aligns the Spring WebFlux instrumentation on Spring MVC since gh-12447. From now on, if the best matching path pattern is not found, the recorded uri tag will be "UNKNOWN". Note that for WebFlux.fn, the pattern information is properly recorded as of SPR-17395. Closes gh-15609
This commit is contained in:
parent
0e13fd039d
commit
95e26ffcb9
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@ -40,6 +40,8 @@ public final class WebFluxTags {
|
||||
|
||||
private static final Tag URI_ROOT = Tag.of("uri", "root");
|
||||
|
||||
private static final Tag URI_UNKNOWN = Tag.of("uri", "UNKNOWN");
|
||||
|
||||
private static final Tag EXCEPTION_NONE = Tag.of("exception", "None");
|
||||
|
||||
private WebFluxTags() {
|
||||
@ -73,7 +75,10 @@ public final class WebFluxTags {
|
||||
|
||||
/**
|
||||
* Creates a {@code uri} tag based on the URI of the given {@code exchange}. Uses the
|
||||
* {@link HandlerMapping#BEST_MATCHING_PATTERN_ATTRIBUTE} best matching pattern.
|
||||
* {@link HandlerMapping#BEST_MATCHING_PATTERN_ATTRIBUTE} best matching pattern if
|
||||
* available. Falling back to {@code REDIRECTION} for 3xx responses, {@code NOT_FOUND}
|
||||
* for 404 responses, {@code root} for requests with no path info, and {@code UNKNOWN}
|
||||
* for all other requests.
|
||||
* @param exchange the exchange
|
||||
* @return the uri tag derived from the exchange
|
||||
*/
|
||||
@ -92,11 +97,17 @@ public final class WebFluxTags {
|
||||
return URI_NOT_FOUND;
|
||||
}
|
||||
}
|
||||
String path = exchange.getRequest().getPath().value();
|
||||
String path = getPathInfo(exchange);
|
||||
if (path.isEmpty()) {
|
||||
return URI_ROOT;
|
||||
}
|
||||
return Tag.of("uri", path);
|
||||
return URI_UNKNOWN;
|
||||
}
|
||||
|
||||
private static String getPathInfo(ServerWebExchange exchange) {
|
||||
String path = exchange.getRequest().getPath().value();
|
||||
String uri = StringUtils.hasText(path) ? path : "/";
|
||||
return uri.replaceAll("//+", "/").replaceAll("/$", "");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2018 the original author or authors.
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@ -78,6 +78,28 @@ public class WebFluxTagsTests {
|
||||
assertThat(tag.getValue()).isEqualTo("root");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void uriTagValueIsRootWhenRequestHasNoPatternOrPathInfo() {
|
||||
Tag tag = WebFluxTags.uri(this.exchange);
|
||||
assertThat(tag.getValue()).isEqualTo("root");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void uriTagValueIsRootWhenRequestHasNoPatternAndSlashPathInfo() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("/").build();
|
||||
ServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
Tag tag = WebFluxTags.uri(exchange);
|
||||
assertThat(tag.getValue()).isEqualTo("root");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void uriTagValueIsUnknownWhenRequestHasNoPatternAndNonRootPathInfo() {
|
||||
MockServerHttpRequest request = MockServerHttpRequest.get("/example").build();
|
||||
ServerWebExchange exchange = MockServerWebExchange.from(request);
|
||||
Tag tag = WebFluxTags.uri(exchange);
|
||||
assertThat(tag.getValue()).isEqualTo("UNKNOWN");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void methodTagToleratesNonStandardHttpMethods() {
|
||||
ServerWebExchange exchange = mock(ServerWebExchange.class);
|
||||
|
Loading…
Reference in New Issue
Block a user