2015-09-11 23 views
2

我們想要測量API端點的請求和響應大小。因爲它確定RequestEventListener持續時間recommended我們採取了這種方法。確定Jersey中的請求/響應大小度量值RequestEventListener

使用檢查器,我們可以看到requestEvent包含一個屬性containerResponse.messageContext.commitingOutputStream.adoptedOutput.delegate.outputStream.count,其中包含實際響應大小(以字節爲單位)。但是,我們無法使用公共方法和字段訪問此字段。可訪問的方法containerResponse.getLength()總是返回-1containerRequest.getLength()也一樣。

我們如何訪問實際的請求和響應大小,最好是沒有反射?

private class EndPointPerformanceFilter implements RequestEventListener { 
    private long start; 

    @Override 
    public void onEvent(final RequestEvent requestEvent) { 
     switch (requestEvent.getType()) { 
      case START: 
       start = timeProvider.currentTimeMillis(); 
       break; 
      case FINISHED: 
       final long duration = timeProvider.currentTimeMillis() - start; 

       final ContainerRequest containerRequest = requestEvent.getContainerRequest(); 
       final ContainerResponse containerResponse = requestEvent.getContainerResponse(); 

       System.out.println("Req: [" + containerRequest.getLength() + "] Rep: [" + containerResponse.getLength() +"]"); 
       break; 
     } 
    } 
} 

回答

2

我試圖做同樣的事情之前。我從未找到涉及直接從澤西島獲取數據的解決方案。我剛剛實施了WriterInterceptor,我將OutputStream設置爲Apache Commons的CountingOutputStream。然後在作家完成後得到點數。

我沒有手頭上的具體實現,但複製的功能,它幾乎是這樣的

@Provider 
public class ContentLengthLoggingProvider implements ReaderInterceptor, WriterInterceptor { 

    private static final Logger logger = Logger.getLogger(ContentLengthLoggingProvider.class.getName()); 
    private static final String REQUEST_LENGTH_PROPERTY = "Request.Content.Length"; 

    @Override 
    public void aroundWriteTo(WriterInterceptorContext writerContext) 
      throws IOException, WebApplicationException { 

     CountingOutputStream outputStream 
       = new CountingOutputStream(writerContext.getOutputStream()); 
     writerContext.setOutputStream(outputStream); 

     writerContext.proceed(); 

     long responseCount = outputStream.getCount(); 
     String requestCount = (String)writerContext.getProperty(REQUEST_LENGTH_PROPERTY); 
     String log = "Req: [" + requestCount + "] Rep: [" + responseCount +"]"; 
     logger.info(log); 
    } 

    @Override 
    public Object aroundReadFrom(ReaderInterceptorContext readerContext) 
      throws IOException, WebApplicationException { 
     String requestLength = readerContext.getHeaders().getFirst(HttpHeaders.CONTENT_LENGTH); 
     readerContext.setProperty(REQUEST_LENGTH_PROPERTY, requestLength); 
     return readerContext.proceed(); 
    } 
} 

這是我用

<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.4</version> 
</dependency> 

的依賴,我認爲番石榴一個類似的CountingOutputStream類。所以如果你使用番石榴,你也可以使用它。