Skip to content

Commit f4e659a

Browse files
retamarcingrzejszczak
authored andcommitted
Check if management server (actuator) is running on different port while constructing skip patterns (#1208)
* Check if management server (actuator) is running on different port while constructing skip patterns * Update spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebAutoConfiguration.java Co-Authored-By: reta <[email protected]>
1 parent aa01a5c commit f4e659a

File tree

2 files changed

+113
-18
lines changed

2 files changed

+113
-18
lines changed

spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/instrument/web/TraceWebAutoConfiguration.java

+18-9
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727

2828
import org.springframework.beans.factory.annotation.Autowired;
2929
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
30+
import org.springframework.boot.actuate.autoconfigure.web.server.ConditionalOnManagementPort;
31+
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
3032
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties;
3133
import org.springframework.boot.actuate.endpoint.EndpointsSupplier;
3234
import org.springframework.boot.actuate.endpoint.web.ExposableWebEndpoint;
@@ -101,13 +103,12 @@ public SingleSkipPattern skipPatternForManagementServerProperties(
101103
}
102104

103105
@Configuration
104-
@ConditionalOnClass({ ServerProperties.class, EndpointsSupplier.class,
105-
ExposableWebEndpoint.class })
106+
@ConditionalOnClass({ ServerProperties.class, EndpointsSupplier.class, ExposableWebEndpoint.class })
106107
@ConditionalOnBean(ServerProperties.class)
107108
@ConditionalOnProperty(value = "spring.sleuth.web.ignoreAutoConfiguredSkipPatterns", havingValue = "false", matchIfMissing = true)
108109
protected static class ActuatorSkipPatternProviderConfig {
109110

110-
static Optional<Pattern> getEndpointsPatterns(ServerProperties serverProperties,
111+
static Optional<Pattern> getEndpointsPatterns(String contextPath,
111112
WebEndpointProperties webEndpointProperties,
112113
EndpointsSupplier<ExposableWebEndpoint> endpointsSupplier) {
113114
Collection<ExposableWebEndpoint> endpoints = endpointsSupplier.getEndpoints();
@@ -116,8 +117,6 @@ static Optional<Pattern> getEndpointsPatterns(ServerProperties serverProperties,
116117
return Optional.empty();
117118
}
118119

119-
String contextPath = serverProperties.getServlet().getContextPath();
120-
121120
String pattern = endpoints.stream().map(PathMappedEndpoint::getRootPath)
122121
.map(path -> path + "|" + path + "/.*").collect(
123122
Collectors.joining("|",
@@ -142,14 +141,24 @@ private static String getPathPrefix(String contextPath, String actuatorBasePath)
142141
}
143142

144143
@Bean
145-
public SingleSkipPattern skipPatternForActuatorEndpoints(
144+
@ConditionalOnManagementPort(ManagementPortType.SAME)
145+
public SingleSkipPattern skipPatternForActuatorEndpointsSamePort(
146146
final ServerProperties serverProperties,
147147
final WebEndpointProperties webEndpointProperties,
148148
final EndpointsSupplier<ExposableWebEndpoint> endpointsSupplier) {
149-
return () -> getEndpointsPatterns(serverProperties, webEndpointProperties,
150-
endpointsSupplier);
149+
return () -> getEndpointsPatterns(serverProperties.getServlet().getContextPath(),
150+
webEndpointProperties, endpointsSupplier);
151+
}
152+
153+
@Bean
154+
@ConditionalOnManagementPort(ManagementPortType.DIFFERENT)
155+
@ConditionalOnProperty(name = "management.server.servlet.context-path", havingValue = "/", matchIfMissing = true)
156+
public SingleSkipPattern skipPatternForActuatorEndpointsDifferentPort(
157+
final ServerProperties serverProperties,
158+
final WebEndpointProperties webEndpointProperties,
159+
final EndpointsSupplier<ExposableWebEndpoint> endpointsSupplier) {
160+
return () -> getEndpointsPatterns(null, webEndpointProperties, endpointsSupplier);
151161
}
152-
153162
}
154163

155164
@Configuration

spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/instrument/web/SkipPatternProviderConfigTest.java

+95-9
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public void should_return_management_context_with_context_path() throws Exceptio
8888
public void should_return_empty_when_no_endpoints() {
8989
EndpointsSupplier<ExposableWebEndpoint> endpointsSupplier = Collections::emptyList;
9090
Optional<Pattern> pattern = new TraceWebAutoConfiguration.ActuatorSkipPatternProviderConfig()
91-
.skipPatternForActuatorEndpoints(new ServerProperties(),
91+
.skipPatternForActuatorEndpointsSamePort(new ServerProperties(),
9292
new WebEndpointProperties(), endpointsSupplier)
9393
.skipPattern();
9494

@@ -107,8 +107,7 @@ public void should_return_endpoints_without_context_path() {
107107
};
108108

109109
Optional<Pattern> pattern = new TraceWebAutoConfiguration.ActuatorSkipPatternProviderConfig()
110-
.skipPatternForActuatorEndpoints(properties, webEndpointProperties,
111-
endpointsSupplier)
110+
.skipPatternForActuatorEndpointsSamePort(properties, webEndpointProperties, endpointsSupplier)
112111
.skipPattern();
113112

114113
then(pattern).isNotEmpty();
@@ -130,8 +129,7 @@ public void should_return_endpoints_with_context_path() {
130129
};
131130

132131
Optional<Pattern> pattern = new TraceWebAutoConfiguration.ActuatorSkipPatternProviderConfig()
133-
.skipPatternForActuatorEndpoints(properties, webEndpointProperties,
134-
endpointsSupplier)
132+
.skipPatternForActuatorEndpointsSamePort(properties, webEndpointProperties, endpointsSupplier)
135133
.skipPattern();
136134

137135
then(pattern).isNotEmpty();
@@ -153,8 +151,7 @@ public void should_return_endpoints_without_context_path_and_base_path_set_to_ro
153151
};
154152

155153
Optional<Pattern> pattern = new TraceWebAutoConfiguration.ActuatorSkipPatternProviderConfig()
156-
.skipPatternForActuatorEndpoints(properties, webEndpointProperties,
157-
endpointsSupplier)
154+
.skipPatternForActuatorEndpointsSamePort(properties, webEndpointProperties, endpointsSupplier)
158155
.skipPattern();
159156

160157
then(pattern).isNotEmpty();
@@ -176,14 +173,103 @@ public void should_return_endpoints_with_context_path_and_base_path_set_to_root(
176173
};
177174

178175
Optional<Pattern> pattern = new TraceWebAutoConfiguration.ActuatorSkipPatternProviderConfig()
179-
.skipPatternForActuatorEndpoints(properties, webEndpointProperties,
180-
endpointsSupplier)
176+
.skipPatternForActuatorEndpointsSamePort(properties, webEndpointProperties, endpointsSupplier)
181177
.skipPattern();
182178

183179
then(pattern).isNotEmpty();
184180
then(pattern.get().pattern()).isEqualTo("foo/(info|info/.*|health|health/.*)");
185181
}
186182

183+
@Test
184+
public void should_return_endpoints_with_actuator_context_path_set_to_root() {
185+
WebEndpointProperties webEndpointProperties = new WebEndpointProperties();
186+
webEndpointProperties.setBasePath("/");
187+
ServerProperties properties = new ServerProperties();
188+
properties.getServlet().setContextPath("foo");
189+
190+
EndpointsSupplier<ExposableWebEndpoint> endpointsSupplier = () -> {
191+
ExposableWebEndpoint infoEndpoint = createEndpoint("info");
192+
ExposableWebEndpoint healthEndpoint = createEndpoint("health");
193+
194+
return Arrays.asList(infoEndpoint, healthEndpoint);
195+
};
196+
197+
Optional<Pattern> patternDifferentPort = new TraceWebAutoConfiguration.ActuatorSkipPatternProviderConfig()
198+
.skipPatternForActuatorEndpointsDifferentPort(properties, webEndpointProperties, endpointsSupplier)
199+
.skipPattern();
200+
201+
then(patternDifferentPort).isNotEmpty();
202+
then(patternDifferentPort.get().pattern()).isEqualTo("/(info|info/.*|health|health/.*)");
203+
204+
Optional<Pattern> patternSamePort = new TraceWebAutoConfiguration.ActuatorSkipPatternProviderConfig()
205+
.skipPatternForActuatorEndpointsSamePort(properties, webEndpointProperties, endpointsSupplier)
206+
.skipPattern();
207+
208+
then(patternSamePort).isNotEmpty();
209+
then(patternSamePort.get().pattern())
210+
.isEqualTo("foo/(info|info/.*|health|health/.*)");
211+
}
212+
213+
@Test
214+
public void should_return_endpoints_with_actuator_context_path_only() {
215+
WebEndpointProperties webEndpointProperties = new WebEndpointProperties();
216+
webEndpointProperties.setBasePath("/mgt");
217+
ServerProperties properties = new ServerProperties();
218+
properties.getServlet().setContextPath("foo");
219+
220+
EndpointsSupplier<ExposableWebEndpoint> endpointsSupplier = () -> {
221+
ExposableWebEndpoint infoEndpoint = createEndpoint("info");
222+
ExposableWebEndpoint healthEndpoint = createEndpoint("health");
223+
224+
return Arrays.asList(infoEndpoint, healthEndpoint);
225+
};
226+
227+
Optional<Pattern> patternDifferentPort = new TraceWebAutoConfiguration.ActuatorSkipPatternProviderConfig()
228+
.skipPatternForActuatorEndpointsDifferentPort(properties, webEndpointProperties, endpointsSupplier)
229+
.skipPattern();
230+
231+
then(patternDifferentPort).isNotEmpty();
232+
then(patternDifferentPort.get().pattern())
233+
.isEqualTo("/mgt/(info|info/.*|health|health/.*)");
234+
235+
Optional<Pattern> patternSamePort = new TraceWebAutoConfiguration.ActuatorSkipPatternProviderConfig()
236+
.skipPatternForActuatorEndpointsSamePort(properties, webEndpointProperties, endpointsSupplier)
237+
.skipPattern();
238+
239+
then(patternSamePort).isNotEmpty();
240+
then(patternSamePort.get().pattern())
241+
.isEqualTo("foo/mgt/(info|info/.*|health|health/.*)");
242+
}
243+
244+
@Test
245+
public void should_return_endpoints_with_actuator_default_context_path() {
246+
WebEndpointProperties webEndpointProperties = new WebEndpointProperties();
247+
ServerProperties properties = new ServerProperties();
248+
properties.getServlet().setContextPath("/foo");
249+
properties.setPort(8080);
250+
251+
EndpointsSupplier<ExposableWebEndpoint> endpointsSupplier = () -> {
252+
ExposableWebEndpoint infoEndpoint = createEndpoint("info");
253+
ExposableWebEndpoint healthEndpoint = createEndpoint("health");
254+
255+
return Arrays.asList(infoEndpoint, healthEndpoint);
256+
};
257+
258+
Optional<Pattern> patternDifferentPort = new TraceWebAutoConfiguration.ActuatorSkipPatternProviderConfig()
259+
.skipPatternForActuatorEndpointsDifferentPort(properties, webEndpointProperties, endpointsSupplier)
260+
.skipPattern();
261+
262+
then(patternDifferentPort).isNotEmpty();
263+
then(patternDifferentPort.get().pattern()).isEqualTo("/actuator/(info|info/.*|health|health/.*)");
264+
265+
Optional<Pattern> patternSamePort = new TraceWebAutoConfiguration.ActuatorSkipPatternProviderConfig()
266+
.skipPatternForActuatorEndpointsSamePort(properties, webEndpointProperties, endpointsSupplier)
267+
.skipPattern();
268+
269+
then(patternSamePort).isNotEmpty();
270+
then(patternSamePort.get().pattern()).isEqualTo("/foo/actuator/(info|info/.*|health|health/.*)");
271+
}
272+
187273
@Test
188274
public void should_combine_skip_patterns_from_list() throws Exception {
189275
TraceWebAutoConfiguration configuration = new TraceWebAutoConfiguration();

0 commit comments

Comments
 (0)