33import io .prometheus .client .Histogram ;
44import org .springframework .beans .factory .annotation .Autowired ;
55import 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 ;
711import org .springframework .web .servlet .HandlerInterceptor ;
812import org .springframework .web .servlet .ModelAndView ;
9- import org .springframework .web .servlet .mvc .method . RequestMappingInfo ;
13+ import org .springframework .web .servlet .mvc .condition . PatternsRequestCondition ;
1014import org .springframework .web .servlet .mvc .method .annotation .RequestMappingHandlerMapping ;
1115
1216import javax .servlet .http .HttpServletRequest ;
1317import javax .servlet .http .HttpServletResponse ;
14- import java .util .Map ;
18+ import java .util .HashSet ;
19+ import java .util .Set ;
1520
1621public class HTTPMonitoringInterceptor implements HandlerInterceptor {
1722 static final Histogram requestLatency = Histogram .build ()
@@ -21,12 +26,19 @@ public class HTTPMonitoringInterceptor implements HandlerInterceptor {
2126 .register ();
2227
2328 private static final String startTimeKey = "startTime" ;
24-
25- @ Value ("${spring.application.name:carts}" )
26- private String serviceName ;
27-
2829 @ Autowired
29- private RequestMappingHandlerMapping requestMappingHandlerMapping ;
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 ;
40+ @ Value ("${spring.application.name:orders}" )
41+ private String serviceName ;
3042
3143 @ Override
3244 public boolean preHandle (HttpServletRequest httpServletRequest , HttpServletResponse
@@ -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,31 @@ 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 ()
78+ .next ();
6879 break ;
6980 }
7081 }
7182 return res ;
7283 }
84+
85+ private Set <PatternsRequestCondition > getUrlPatterns () {
86+ if (this .urlPatterns == null ) {
87+ this .urlPatterns = new HashSet <>();
88+ requestMappingHandlerMapping .getHandlerMethods ().forEach ((mapping , handlerMethod ) ->
89+ urlPatterns .add (mapping .getPatternsCondition ()));
90+ RepositoryRestHandlerMapping repositoryRestHandlerMapping = new
91+ RepositoryRestHandlerMapping (mappings , repositoryConfiguration );
92+ repositoryRestHandlerMapping .setJpaHelper (jpaHelper );
93+ repositoryRestHandlerMapping .setApplicationContext (applicationContext );
94+ repositoryRestHandlerMapping .afterPropertiesSet ();
95+ repositoryRestHandlerMapping .getHandlerMethods ().forEach ((mapping , handlerMethod ) ->
96+ urlPatterns .add (mapping .getPatternsCondition ()));
97+ }
98+ return this .urlPatterns ;
99+ }
73100}
0 commit comments