URI模板中的千分尺度量。需要从URL

时间:2018-10-04 07:22:17

标签: spring-micrometer

我想收集特定REST API的指标 假设我有一个网址,例如/ company / {companyName} / person / {id}

是否有可能收集跨 / company / test / person / {id} / compaby / test2 / person / {id}

2 个答案:

答案 0 :(得分:0)

它没有现成的支持,但是您可以提供自己的WebMvcTagsProvider来通过Spring bean实现它。

请注意,如果有可能由于错误或攻击而companyName进行路径变量爆炸,则可能导致标签爆炸并最终导致OOM。

答案 1 :(得分:0)

如果您使用Spring和RestTemplate进行http调用,则可以向RestTemplate注册MetricsClientHttpRequestInterceptor。

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提供的below方法进行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));
}