-
Notifications
You must be signed in to change notification settings - Fork 38.8k
Closed
Labels
in: webIssues in web modules (web, webmvc, webflux, websocket)Issues in web modules (web, webmvc, webflux, websocket)theme: observabilityAn issue related to observability and tracingAn issue related to observability and tracingtype: enhancementA general enhancementA general enhancement
Milestone
Description
I have a project where I noticed a behavior in the http.client.requests
metric coming from RestClient
that's defined via such interface:
public interface ApiServiceClient {
@GetExchange("/some/api/with/{variable}/and/params")
ApiResultPojo makeApiRequest(
@PathVariable String variable,
@RequestParam(required = false, name=foo) String foo,
@RequestParam(required = false, name=bar) String bar
);
}
resulting in http.client.requests
metric with such uri
tags:
{
"tag": "uri",
"values": [
"/some/api/with/{variable}/and/params",
"/some/api/with/{variable}/and/params?{queryParam0}={queryParam0[0]}",
"/some/api/with/{variable}/and/params?{queryParam0}={queryParam0[0]}&{queryParam1}={queryParam1[0]}"
]
},
depending on how many of the optional query params are non-null.
My issue is mainly with the cryptic names of the query params: queryParam0
& queryParam1
. Could it be somehow possible to default these to use the name
or value
passed in the RequestParam
annotation, and only use these basic placeholder names if custom name/value is not available? So in this case I'd expect the uri
tag to include such items:
{
"tag": "uri",
"values": [
"/some/api/with/{variable}/and/params",
"/some/api/with/{variable}/and/params?foo={foo}",
"/some/api/with/{variable}/and/params?foo={foo}&bar={bar}"
]
},
And currently, to work around this issue I am considering adding such a custom ClientRequestObservationConvention when I build the RestClient:
public class ExtendedClientRequestObservationConvention extends DefaultClientRequestObservationConvention {
@Override
public KeyValues getLowCardinalityKeyValues(ClientRequestObservationContext context) {
return super.getLowCardinalityKeyValues(context).and(additionalTags(context));
}
protected KeyValues additionalTags(ClientRequestObservationContext context) {
String fullUri = Objects.requireNonNull(context.getCarrier()).getURI().toString();
String paramKeys = UriComponentsBuilder
.fromUriString(fullUri).build()
.getQueryParams().keySet()
.stream()
.sorted()
.map(key -> key + "={" + key + "}")
.collect(Collectors.joining("&"));
String uriTemplate = Objects.requireNonNull(context.getUriTemplate()).split("\\?")[0];
String uri = paramKeys.isEmpty() ? uriTemplate : uriTemplate + "?" + paramKeys;
return KeyValues.of(KeyValue.of(URI, uri));
}
}
Metadata
Metadata
Assignees
Labels
in: webIssues in web modules (web, webmvc, webflux, websocket)Issues in web modules (web, webmvc, webflux, websocket)theme: observabilityAn issue related to observability and tracingAn issue related to observability and tracingtype: enhancementA general enhancementA general enhancement