11package works .weave .socks .orders .middleware ;
22
33import io .prometheus .client .Histogram ;
4+ import org .springframework .beans .factory .annotation .Autowired ;
45import org .springframework .beans .factory .annotation .Value ;
6+ import org .springframework .web .method .HandlerMethod ;
57import org .springframework .web .servlet .HandlerInterceptor ;
68import org .springframework .web .servlet .ModelAndView ;
9+ import org .springframework .web .servlet .mvc .method .RequestMappingInfo ;
10+ import org .springframework .web .servlet .mvc .method .annotation .RequestMappingHandlerMapping ;
711
812import javax .servlet .http .HttpServletRequest ;
913import javax .servlet .http .HttpServletResponse ;
14+ import java .util .Map ;
1015
1116public class HTTPMonitoringInterceptor implements HandlerInterceptor {
1217 static final Histogram requestLatency = Histogram .build ()
@@ -20,6 +25,9 @@ public class HTTPMonitoringInterceptor implements HandlerInterceptor {
2025 @ Value ("${spring.application.name:orders}" )
2126 private String serviceName ;
2227
28+ @ Autowired
29+ private RequestMappingHandlerMapping requestMappingHandlerMapping ;
30+
2331 @ Override
2432 public boolean preHandle (HttpServletRequest httpServletRequest , HttpServletResponse
2533 httpServletResponse , Object o ) throws Exception {
@@ -36,7 +44,7 @@ public void postHandle(HttpServletRequest httpServletRequest, HttpServletRespons
3644 requestLatency .labels (
3745 serviceName ,
3846 httpServletRequest .getMethod (),
39- httpServletRequest . getServletPath ( ),
47+ getMatchingURLPattern ( httpServletRequest ),
4048 Integer .toString (httpServletResponse .getStatus ())
4149 ).observe (seconds );
4250 }
@@ -45,4 +53,21 @@ public void postHandle(HttpServletRequest httpServletRequest, HttpServletRespons
4553 public void afterCompletion (HttpServletRequest httpServletRequest , HttpServletResponse
4654 httpServletResponse , Object o , Exception e ) throws Exception {
4755 }
56+
57+ 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 ();
68+ break ;
69+ }
70+ }
71+ return res ;
72+ }
4873}
0 commit comments