Skip to content
This repository was archived by the owner on Dec 5, 2023. It is now read-only.

Commit e97ec65

Browse files
author
Phil Winder
authored
Merge pull request #47 from microservices-demo/fix/monitoring-all-endpoints
Obtain url matchers for both spring and spring-boot endpoints.
2 parents ff17627 + 1a62049 commit e97ec65

File tree

1 file changed

+49
-23
lines changed

1 file changed

+49
-23
lines changed

src/main/java/works/weave/socks/orders/middleware/HTTPMonitoringInterceptor.java

Lines changed: 49 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,20 @@
33
import io.prometheus.client.Histogram;
44
import org.springframework.beans.factory.annotation.Autowired;
55
import org.springframework.beans.factory.annotation.Value;
6-
import org.springframework.web.method.HandlerMethod;
6+
import org.springframework.context.ApplicationContext;
7+
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
8+
import org.springframework.data.rest.core.mapping.ResourceMappings;
9+
import org.springframework.data.rest.webmvc.RepositoryRestHandlerMapping;
10+
import org.springframework.data.rest.webmvc.support.JpaHelper;
711
import org.springframework.web.servlet.HandlerInterceptor;
812
import org.springframework.web.servlet.ModelAndView;
9-
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
13+
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
1014
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
1115

1216
import javax.servlet.http.HttpServletRequest;
1317
import javax.servlet.http.HttpServletResponse;
14-
import java.util.Map;
18+
import java.util.HashSet;
19+
import java.util.Set;
1520

1621
public class HTTPMonitoringInterceptor implements HandlerInterceptor {
1722
static final Histogram requestLatency = Histogram.build()
@@ -21,13 +26,20 @@ public class HTTPMonitoringInterceptor implements HandlerInterceptor {
2126
.register();
2227

2328
private static final String startTimeKey = "startTime";
24-
29+
@Autowired
30+
ResourceMappings mappings;
31+
@Autowired
32+
JpaHelper jpaHelper;
33+
@Autowired
34+
RepositoryRestConfiguration repositoryConfiguration;
35+
@Autowired
36+
ApplicationContext applicationContext;
37+
@Autowired
38+
RequestMappingHandlerMapping requestMappingHandlerMapping;
39+
private Set<PatternsRequestCondition> urlPatterns;
2540
@Value("${spring.application.name:orders}")
2641
private String serviceName;
2742

28-
@Autowired
29-
private RequestMappingHandlerMapping requestMappingHandlerMapping;
30-
3143
@Override
3244
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse
3345
httpServletResponse, Object o) throws Exception {
@@ -41,12 +53,15 @@ public void postHandle(HttpServletRequest httpServletRequest, HttpServletRespons
4153
long start = (long) httpServletRequest.getAttribute(startTimeKey);
4254
long elapsed = System.nanoTime() - start;
4355
double seconds = (double) elapsed / 1000000000.0;
44-
requestLatency.labels(
45-
serviceName,
46-
httpServletRequest.getMethod(),
47-
getMatchingURLPattern(httpServletRequest),
48-
Integer.toString(httpServletResponse.getStatus())
49-
).observe(seconds);
56+
String matchedUrl = getMatchingURLPattern(httpServletRequest);
57+
if (!matchedUrl.equals("")) {
58+
requestLatency.labels(
59+
serviceName,
60+
httpServletRequest.getMethod(),
61+
matchedUrl,
62+
Integer.toString(httpServletResponse.getStatus())
63+
).observe(seconds);
64+
}
5065
}
5166

5267
@Override
@@ -55,19 +70,30 @@ public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletRe
5570
}
5671

5772
private String getMatchingURLPattern(HttpServletRequest httpServletRequest) {
58-
String res = httpServletRequest.getServletPath();
59-
60-
for (Map.Entry<RequestMappingInfo, HandlerMethod> item : requestMappingHandlerMapping
61-
.getHandlerMethods().entrySet()) {
62-
RequestMappingInfo mapping = item.getKey();
63-
if (mapping.getPatternsCondition().getMatchingCondition(httpServletRequest) != null &&
64-
mapping.getMethodsCondition().getMatchingCondition(httpServletRequest) !=
65-
null) {
66-
res = mapping.getPatternsCondition().getMatchingCondition(httpServletRequest)
67-
.getPatterns().iterator().next();
73+
String res = "";
74+
for (PatternsRequestCondition pattern : getUrlPatterns()) {
75+
if (pattern.getMatchingCondition(httpServletRequest) != null &&
76+
!httpServletRequest.getServletPath().equals("/error")) {
77+
res = pattern.getMatchingCondition(httpServletRequest).getPatterns().iterator().next();
6878
break;
6979
}
7080
}
7181
return res;
7282
}
83+
84+
private Set<PatternsRequestCondition> getUrlPatterns() {
85+
if (this.urlPatterns == null) {
86+
this.urlPatterns = new HashSet<>();
87+
requestMappingHandlerMapping.getHandlerMethods().forEach((mapping, handlerMethod) ->
88+
urlPatterns.add(mapping.getPatternsCondition()));
89+
RepositoryRestHandlerMapping repositoryRestHandlerMapping = new
90+
RepositoryRestHandlerMapping(mappings, repositoryConfiguration);
91+
repositoryRestHandlerMapping.setJpaHelper(jpaHelper);
92+
repositoryRestHandlerMapping.setApplicationContext(applicationContext);
93+
repositoryRestHandlerMapping.afterPropertiesSet();
94+
repositoryRestHandlerMapping.getHandlerMethods().forEach((mapping, handlerMethod) ->
95+
urlPatterns.add(mapping.getPatternsCondition()));
96+
}
97+
return this.urlPatterns;
98+
}
7399
}

0 commit comments

Comments
 (0)