Метрика в микрометре в шаблоне URI. Некоторая переменная пути должна быть заменена из URL
Я хочу собрать показатели для конкретного API REST. Предположим, у меня есть URL-адрес, такой как /company/{companyName}/person/{id}
Можно ли собирать метрики для /company/test/person/{id} /compaby/test2/person/{id}
1 ответ
Там нет встроенной поддержки для него, но вы можете предоставить свой собственный WebMvcTagsProvider
реализовать это через Spring bean.
Обратите внимание, что это может привести к взрыву метки и в конечном итоге к OOM, если есть какая-либо возможность companyName
Взрыв переменной пути по ошибке или атаке.
Если вы используете Spring и RestTemplate для http-вызова, вы можете зарегистрировать MetricsClientHttpRequestInterceptor с вашим RestTemplate .
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
import org.springframework.boot.actuate.metrics.web.client.MetricsRestTemplateCustomizer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Component
@AutoConfigureAfter({MetricsAutoConfiguration.class})
public class RestClientMetricConfiguration {
private final ApplicationContext applicationContext;
@Autowired
public RestClientMetricConfiguration(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@PostConstruct
public void init() {
MetricsRestTemplateCustomizer restTemplateCustomizer =
applicationContext.getBean(MetricsRestTemplateCustomizer.class);
applicationContext.getBeansOfType(RestTemplate.class).values().forEach(restTemplateCustomizer::customize);
}
}
И используйте метод ниже, предоставляемый spring RestTemplate, чтобы сделать http-вызов.
public <T> ResponseEntity<T> exchange(String url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, ParameterizedTypeReference<T> responseType, Map<String, ?> uriVariables) throws RestClientException {
Type type = responseType.getType();
RequestCallback requestCallback = this.httpEntityCallback(requestEntity, type);
ResponseExtractor<ResponseEntity<T>> responseExtractor = this.responseEntityExtractor(type);
return (ResponseEntity)nonNull(this.execute(url, method, requestCallback, responseExtractor, uriVariables));
}