2525import org .springframework .cloud .client .loadbalancer .RequestDataContext ;
2626import org .springframework .cloud .client .loadbalancer .ResponseData ;
2727import org .springframework .util .StringUtils ;
28+ import org .springframework .web .reactive .function .client .WebClient ;
2829
2930/**
3031 * Utility class for building metrics tags for load-balanced calls.
3132 *
3233 * @author Olga Maciaszek-Sharma
34+ * @author Jaroslaw Dembek
3335 * @since 3.0.0
3436 */
3537final class LoadBalancerTags {
3638
3739 static final String UNKNOWN = "UNKNOWN" ;
3840
41+ static final String URI_TEMPLATE_ATTRIBUTE = WebClient .class .getName () + ".uriTemplate" ;
42+
3943 private LoadBalancerTags () {
4044 throw new UnsupportedOperationException ("Cannot instantiate utility class" );
4145 }
4246
43- static Iterable <Tag > buildSuccessRequestTags (CompletionContext <Object , ServiceInstance , Object > completionContext ) {
47+ static Iterable <Tag > buildSuccessRequestTags (CompletionContext <Object , ServiceInstance , Object > completionContext ,
48+ boolean useUriTemplateAttribute ) {
4449 ServiceInstance serviceInstance = completionContext .getLoadBalancerResponse ().getServer ();
4550 Tags tags = Tags .of (buildServiceInstanceTags (serviceInstance ));
4651 Object clientResponse = completionContext .getClientResponse ();
4752 if (clientResponse instanceof ResponseData responseData ) {
4853 RequestData requestData = responseData .getRequestData ();
4954 if (requestData != null ) {
5055 tags = tags .and (valueOrUnknown ("method" , requestData .getHttpMethod ()),
51- valueOrUnknown ("uri" , getPath (requestData )));
56+ valueOrUnknown ("uri" , getPath (requestData , useUriTemplateAttribute )));
5257 }
5358 else {
5459 tags = tags .and (Tag .of ("method" , UNKNOWN ), Tag .of ("uri" , UNKNOWN ));
@@ -69,18 +74,25 @@ private static int statusValue(ResponseData responseData) {
6974 return responseData .getHttpStatus () != null ? responseData .getHttpStatus ().value () : 200 ;
7075 }
7176
72- private static String getPath (RequestData requestData ) {
77+ private static String getPath (RequestData requestData , boolean useUriTemplateAttribute ) {
78+ if (useUriTemplateAttribute && requestData .getAttributes () != null ) {
79+ var uriTemplate = (String ) requestData .getAttributes ().get (URI_TEMPLATE_ATTRIBUTE );
80+ if (uriTemplate != null ) {
81+ return uriTemplate ;
82+ }
83+ }
7384 return requestData .getUrl () != null ? requestData .getUrl ().getPath () : UNKNOWN ;
7485 }
7586
76- static Iterable <Tag > buildDiscardedRequestTags (
77- CompletionContext < Object , ServiceInstance , Object > completionContext ) {
87+ static Iterable <Tag > buildDiscardedRequestTags (CompletionContext < Object , ServiceInstance , Object > completionContext ,
88+ boolean useUriTemplateAttribute ) {
7889 if (completionContext .getLoadBalancerRequest ().getContext () instanceof RequestDataContext ) {
7990 RequestData requestData = ((RequestDataContext ) completionContext .getLoadBalancerRequest ().getContext ())
8091 .getClientRequest ();
8192 if (requestData != null ) {
8293 return Tags .of (valueOrUnknown ("method" , requestData .getHttpMethod ()),
83- valueOrUnknown ("uri" , getPath (requestData )), valueOrUnknown ("serviceId" , getHost (requestData )));
94+ valueOrUnknown ("uri" , getPath (requestData , useUriTemplateAttribute )),
95+ valueOrUnknown ("serviceId" , getHost (requestData )));
8496 }
8597 }
8698 return Tags .of (valueOrUnknown ("method" , UNKNOWN ), valueOrUnknown ("uri" , UNKNOWN ),
@@ -92,15 +104,16 @@ private static String getHost(RequestData requestData) {
92104 return requestData .getUrl () != null ? requestData .getUrl ().getHost () : UNKNOWN ;
93105 }
94106
95- static Iterable <Tag > buildFailedRequestTags (CompletionContext <Object , ServiceInstance , Object > completionContext ) {
107+ static Iterable <Tag > buildFailedRequestTags (CompletionContext <Object , ServiceInstance , Object > completionContext ,
108+ boolean useUriTemplateAttribute ) {
96109 ServiceInstance serviceInstance = completionContext .getLoadBalancerResponse ().getServer ();
97110 Tags tags = Tags .of (buildServiceInstanceTags (serviceInstance )).and (exception (completionContext .getThrowable ()));
98111 if (completionContext .getLoadBalancerRequest ().getContext () instanceof RequestDataContext ) {
99112 RequestData requestData = ((RequestDataContext ) completionContext .getLoadBalancerRequest ().getContext ())
100113 .getClientRequest ();
101114 if (requestData != null ) {
102115 return tags .and (Tags .of (valueOrUnknown ("method" , requestData .getHttpMethod ()),
103- valueOrUnknown ("uri" , getPath (requestData ))));
116+ valueOrUnknown ("uri" , getPath (requestData , useUriTemplateAttribute ))));
104117 }
105118 }
106119 return tags .and (Tags .of (valueOrUnknown ("method" , UNKNOWN ), valueOrUnknown ("uri" , UNKNOWN )));
0 commit comments