Thanks for the suggestion.  I never really thought of using a filter.

Cheers,
Ross 

-----Original Message-----
From: Konstantin Ignatyev [mailto:[EMAIL PROTECTED] 
Sent: Thursday, December 01, 2005 5:53 PM
To: Tapestry users
Subject: Re: Performance Metrics

Simple rendering meter does not tell the whole story therefore I have
created a simplistic PageMeter that calculates the whole time to render
a page including all the artifacts.

For example for my test index page it prints:
1296 ms - /pagemeter/
1 ms - /pagemeter/images/TrafficOff.gif
0 ms - /pagemeter/images/TrafficRed.gif
1 ms - /pagemeter/images/TrafficYellow.gif
0 ms - /pagemeter/images/TrafficGreen.gif
1454 ms - Length of the sequence


As you may notice the total time is not equal to the sum of render times
because it takes into account time for browser to think and time for
stuff to go over the network.

I hope you may want it useful during development. 
Note: current assumptions are
- the filter works for single client environment only;
- requests for the page parts are not delayyed more than 500 ms
(increase quietPeriodMS if your network is too slow ) 

In the web.xml
<web-app>
  <filter>
    <filter-name>meter</filter-name>
   
<filter-class>com.kgionline.web.filter.PageMeter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>meter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


package com.kgionline.web.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by IntelliJ IDEA.
 * User: konstantinignatyev
 * Date: Nov 22, 2005
 * Time: 1:46:31 PM
 */
public class PageMeter implements Filter {
  Timer t ;
  long quietPeriodMS = 500;
  long firstInTheChain = -1;
  long lastRequest = -1;

  PrintStream  out = System.out;

  private boolean inRequest = false;

  public synchronized boolean isInRequest(){
    return inRequest;
  }

  public synchronized void setInRequest( boolean inRequest ){
    this.inRequest = inRequest;
  }


  public void init( FilterConfig filterConfig ) throws ServletException{
    reset();
    t = new Timer( true );
    TimerTask task = new TimerTask(){

      public void run(){
        if( ! isInRequest() ){
         checkQuietness();
        }
        //System.out.println( "." );
      }
    };
    t.scheduleAtFixedRate( task, 0, 300);

  }

  public void doFilter( ServletRequest servletRequest, ServletResponse
servletResponse, FilterChain filterChain ) throws IOException,
ServletException{
    long start = System.currentTimeMillis() ;
    requestStarted();
    filterChain.doFilter( servletRequest, servletResponse );
    requestFinished( start,
System.currentTimeMillis(), servletRequest );

  }

  private void requestStarted(){
    setInRequest( true );
    if( firstInTheChain == -1 ){
      firstInTheChain = System.currentTimeMillis();
    }
  }

  private void requestFinished( long start, long end, ServletRequest
servletRequest ){
    setInRequest( false );
    lastRequest = System.currentTimeMillis();
    if( servletRequest instanceof HttpServletRequest){
      HttpServletRequest r = ( HttpServletRequest ) servletRequest;
      printLength( end - start, r.getRequestURI() );
    }
  }

  private void printLength( long l, String requestInfo ){
    out.println( l + " ms - " + requestInfo);
  }

  public void destroy(){

  }

  private void checkQuietness(){
    if( firstInTheChain == -1 ) return;
    if( System.currentTimeMillis() - lastRequest> quietPeriodMS ){
      reset();
    }
  }

  private void reset(){
    printLength( lastRequest - firstInTheChain, "Length of the
sequence\n\n\n\n\n");
    firstInTheChain = -1;
    lastRequest = -1;

  }

}





---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to