2012-11-08 19 views
6

RestTemplate.getForObjectコールのHTTP GETリクエストの時間を、レスポンスの解析に必要な時間なしに測定したいとします。リモートHTTPコールに必要な時間です。私はすでにClientHttpRequestInterceptorを設定しようとしたが、私は、これは時間が間違っているように見えるようにそれを行うための正しい方法であると思ういけない:Measure Spring RestTemplate HTTPリクエスト時間

public class PerfRequestSyncInterceptor implements ClientHttpRequestInterceptor { 
private Logger log = Logger.getLogger(this.getClass()); 

@Override 
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, 
     ClientHttpRequestExecution execution) throws IOException { 

    long start = System.nanoTime(); 
    ClientHttpResponse resp = execution.execute(request, body); 

    log.debug("remote request time: " 
      + ((System.nanoTime() - start) * Math.pow(10, -9))); 
    return resp; 
    } 
} 


はコール:

RestTemplate rest = new RestTemplate(); 
List<ClientHttpRequestInterceptor> interceptors = new ArrayList<ClientHttpRequestInterceptor>(); 
interceptors.add(new PerfRequestSyncInterceptor()); 
rest.setInterceptors(interceptors); 

Response inob = rest.getForObject(xmlURL, Response.class); 

どのように私は時間を測定することができますRestTemplate HTTPリクエスト?

+0

私は同じ問題を抱えていました。レスポンスが利用可能になるまで、実行をブロックするには、レスポンスオブジェクトに対してメソッド呼び出しを行う必要があります。 – jaydfwtx

答えて

4

AOPと、Springの組み込みのPerformanceMonitorInterceptorを使用できます。どの仲介者のメソッドを傍受してから測定できるのかを正しく定義する必要があります。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
     http://www.springframework.org/schema/aop 
     http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> 
    <bean id="springMonitoredService" 
     class="com.myorg.service.springmon.MyServiceSpringImpl"/> 


    <bean id="springMonitoringAspectInterceptor"   
class="org.springframework.aop.interceptor.PerformanceMonitorInterceptor"> 
     <property name="loggerName"  
       value="com.myorg.SPRING_MONITOR"/>  
    </bean> 


    <aop:config> 
      <aop:pointcut id="springMonitoringPointcut" 
        expression="execution(* java.net.HttpURLConnection.connect(..))"/> 




       <aop:advisor pointcut-ref="springMonitoringPointcut" 
      advice-ref="springMonitoringAspectInterceptor"/>  
    </aop:config> 

</beans> 
+0

測定にはどの方法を設定する必要がありますか? – Mannaz

+0

内部的にRestTemplateはjava.net.HttpURLConnectionを使用してconnect()メソッドを測定する必要があります。さらに、getDoOutput()メソッドを試すこともできます –

+0

このメソッドを指すように答えを更新するようにお願いしますか? – Mannaz

1

これを行うには、StopWatchを使用できます。

public class PerfRequestSyncInterceptor implements ClientHttpRequestInterceptor { 

    private final static Logger LOG = LoggerFactory.getLogger(PerfRequestSyncInterceptor.class); 

    @Override 
    public ClientHttpResponse intercept(HttpRequest hr, byte[] bytes, ClientHttpRequestExecution chre) throws IOException { 
     Stopwatch stopwatch = Stopwatch.createStarted(); 
     ClientHttpResponse response = chre.execute(hr, bytes); 
     stopwatch.stop(); 

     LOG.info("method=" + hr.getMethod() + ", uri="+hr.getURI() + ", response_time=" + stopwatch.elapsed(TimeUnit.MILLISECONDS) + ", response_code=" + response.getStatusCode().value()); 

     return response; 
    } 
} 

そしてrestTemplateが

private final List<ClientHttpRequestInterceptor> requestInterceptors = new ArrayList<>(); 
requestInterceptors.add(new PerfRequestSyncInterceptor()); 
this.restTemplate.setInterceptors(requestInterceptors); 
0

をインスタンス化されるクラスで私が を解析するために必要な時間なし RestTemplate.getForObjectコールのHTTP GETリクエストの時間を測定したいです応答

私は同じ要件を持っていました。 RestTemplateレスポンス処理なしでサーバーが応答するのにどれくらいの時間がかかるかを測定するサーバーの応答時間を知りたい。マップを使ってHttpClientBuilderに2つのインターセプタを追加しました。低レベルの要求と応答の間の時間を測定できました。ここで

HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); 

// Attach interceptors 
ResponseTimeInterceptor interceptor = new ResponseTimeInterceptor(); 
httpClientBuilder.addInterceptorFirst((HttpRequestInterceptor) interceptor); 
httpClientBuilder.addInterceptorFirst((HttpResponseInterceptor) interceptor); 

// Use client with RestTemplate or on its own 
HttpClient client = httpClientBuilder.build(); 

が最小のデュアルデューティインターセプタです:応答インターセプター戻った後

public class ResponseTimeInterceptor implements HttpRequestInterceptor, HttpResponseInterceptor { 
    private final Map<HttpContext, Long> requestMap = new MaxSizeHashMap<>(50); 

    @Override 
    public void process(HttpRequest httpRequest, HttpContext httpContext) throws HttpException, IOException { 
     requestMap.put(httpContext, System.currentTimeMillis()); 
    } 

    @Override 
    public void process(HttpResponse httpResponse, HttpContext httpContext) throws HttpException, IOException { 
     long startTime = requestMap.getOrDefault(httpContext, 0L); 
     long diff = System.currentTimeMillis() - startTime; 
     System.out.println("Response time: " + diff + "ms"); 
    } 
} 

、応答データはRestTemplate応答ハンドラに継続されます。

注:MaxSizeHashMaphttps://stackoverflow.com/a/5601377から取られます。

関連する問題