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,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