View Javadoc

1   //========================================================================
2   //Copyright 2006 Mort Bay Consulting Pty. Ltd.
3   //------------------------------------------------------------------------
4   //Licensed under the Apache License, Version 2.0 (the "License");
5   //you may not use this file except in compliance with the License.
6   //You may obtain a copy of the License at 
7   //http://www.apache.org/licenses/LICENSE-2.0
8   //Unless required by applicable law or agreed to in writing, software
9   //distributed under the License is distributed on an "AS IS" BASIS,
10  //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11  //See the License for the specific language governing permissions and
12  //limitations under the License.
13  //========================================================================
14  
15  package org.mortbay.jetty.handler;
16  
17  import java.io.IOException;
18  
19  import javax.servlet.ServletException;
20  import javax.servlet.http.HttpServletRequest;
21  import javax.servlet.http.HttpServletResponse;
22  
23  import org.mortbay.jetty.HttpConnection;
24  import org.mortbay.jetty.Request;
25  import org.mortbay.jetty.Response;
26  
27  public class StatisticsHandler extends HandlerWrapper
28  {
29      transient long _statsStartedAt;
30      
31      transient int _requests;
32      
33      transient long _requestsDurationMin;         // min request duration
34      transient long _requestsDurationMax;         // max request duration
35      transient long _requestsDurationTotal;       // total request duration
36      
37      transient int _requestsActive;
38      transient int _requestsActiveMin;            // min number of connections handled simultaneously
39      transient int _requestsActiveMax;
40      transient int _responses1xx; // Informal
41      transient int _responses2xx; // Success
42      transient int _responses3xx; // Redirection
43      transient int _responses4xx; // Client Error
44      transient int _responses5xx; // Server Error
45      
46  
47      /* ------------------------------------------------------------ */
48      public void statsReset()
49      {
50          synchronized(this)
51          {
52              if (isStarted())
53                  _statsStartedAt=System.currentTimeMillis();
54              _requests=0;
55              _requestsActiveMax=_requestsActive;
56              _responses1xx=0;
57              _responses2xx=0;
58              _responses3xx=0;
59              _responses4xx=0;
60              _responses5xx=0;
61            
62              _requestsActiveMin=_requestsActive;
63              _requestsActiveMax=_requestsActive;
64              _requestsActive=0;
65  
66              _requestsDurationMin=0;
67              _requestsDurationMax=0;
68              _requestsDurationTotal=0;
69          }
70      }
71  
72  
73      /* ------------------------------------------------------------ */
74      public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException
75      {
76          final Request base_request=(request instanceof Request)?((Request)request):HttpConnection.getCurrentConnection().getRequest();
77          final Response base_response=(response instanceof Response)?((Response)response):HttpConnection.getCurrentConnection().getResponse();
78          
79          try
80          {
81              synchronized(this)
82              {
83                  _requests++;
84                  _requestsActive++;
85                  if (_requestsActive>_requestsActiveMax)
86                      _requestsActiveMax=_requestsActive;
87              }
88              
89              super.handle(target, request, response, dispatch);
90          }
91          finally
92          {
93              synchronized(this)
94              {
95                  _requestsActive--;
96                  if (_requestsActive<0)
97                      _requestsActive=0;
98                  if (_requestsActive < _requestsActiveMin)
99                      _requestsActiveMin=_requestsActive;
100                 
101                 long duration = System.currentTimeMillis()-base_request.getTimeStamp();
102                 
103                 _requestsDurationTotal+=duration;
104                 if (_requestsDurationMin==0 || duration<_requestsDurationMin)
105                     _requestsDurationMin=duration;
106                 if (duration>_requestsDurationMax)
107                     _requestsDurationMax=duration;
108                 
109                 switch(base_response.getStatus()/100)
110                 {
111                     case 1: _responses1xx++;break;
112                     case 2: _responses2xx++;break;
113                     case 3: _responses3xx++;break;
114                     case 4: _responses4xx++;break;
115                     case 5: _responses5xx++;break;
116                 }
117                 
118             }
119         }
120     }
121 
122     /* ------------------------------------------------------------ */
123     protected void doStart() throws Exception
124     {
125         super.doStart();
126         _statsStartedAt=System.currentTimeMillis();
127     }
128 
129     /* ------------------------------------------------------------ */
130     protected void doStop() throws Exception
131     {
132         super.doStop();
133     }
134 
135     /* ------------------------------------------------------------ */
136     /**
137      * @return Get the number of requests handled by this context
138      * since last call of statsReset(). If setStatsOn(false) then this
139      * is undefined.
140      */
141     public int getRequests() {return _requests;}
142 
143     /* ------------------------------------------------------------ */
144     /**
145      * @return Number of requests currently active.
146      * Undefined if setStatsOn(false).
147      */
148     public int getRequestsActive() {return _requestsActive;}
149 
150     /* ------------------------------------------------------------ */
151     /**
152      * @return Maximum number of active requests
153      * since statsReset() called. Undefined if setStatsOn(false).
154      */
155     public int getRequestsActiveMax() {return _requestsActiveMax;}
156 
157     /* ------------------------------------------------------------ */
158     /**
159      * @return Get the number of responses with a 2xx status returned
160      * by this context since last call of statsReset(). Undefined if
161      * if setStatsOn(false).
162      */
163     public int getResponses1xx() {return _responses1xx;}
164 
165     /* ------------------------------------------------------------ */
166     /**
167      * @return Get the number of responses with a 100 status returned
168      * by this context since last call of statsReset(). Undefined if
169      * if setStatsOn(false).
170      */
171     public int getResponses2xx() {return _responses2xx;}
172 
173     /* ------------------------------------------------------------ */
174     /**
175      * @return Get the number of responses with a 3xx status returned
176      * by this context since last call of statsReset(). Undefined if
177      * if setStatsOn(false).
178      */
179     public int getResponses3xx() {return _responses3xx;}
180 
181     /* ------------------------------------------------------------ */
182     /**
183      * @return Get the number of responses with a 4xx status returned
184      * by this context since last call of statsReset(). Undefined if
185      * if setStatsOn(false).
186      */
187     public int getResponses4xx() {return _responses4xx;}
188 
189     /* ------------------------------------------------------------ */
190     /**
191      * @return Get the number of responses with a 5xx status returned
192      * by this context since last call of statsReset(). Undefined if
193      * if setStatsOn(false).
194      */
195     public int getResponses5xx() {return _responses5xx;}
196 
197     /* ------------------------------------------------------------ */
198     /** 
199      * @return Timestamp stats were started at.
200      */
201     public long getStatsOnMs()
202     {
203         return System.currentTimeMillis()-_statsStartedAt;
204     }
205 
206     /* ------------------------------------------------------------ */
207     /**
208      * @return Returns the requestsActiveMin.
209      */
210     public int getRequestsActiveMin()
211     {
212         return _requestsActiveMin;
213     }
214 
215     /* ------------------------------------------------------------ */
216     /**
217      * @return Returns the requestsDurationMin.
218      */
219     public long getRequestsDurationMin()
220     {
221         return _requestsDurationMin;
222     }
223 
224     /* ------------------------------------------------------------ */
225     /**
226      * @return Returns the requestsDurationTotal.
227      */
228     public long getRequestsDurationTotal()
229     {
230         return _requestsDurationTotal;
231     }
232 
233     /* ------------------------------------------------------------ */
234     /** 
235      * @return Average duration of request handling in milliseconds 
236      * since statsReset() called. Undefined if setStatsOn(false).
237      */
238     public long getRequestsDurationAve() {return _requests==0?0:(_requestsDurationTotal/_requests);}
239 
240     /* ------------------------------------------------------------ */
241     /** 
242      * @return Get maximum duration in milliseconds of request handling
243      * since statsReset() called. Undefined if setStatsOn(false).
244      */
245     public long getRequestsDurationMax() {return _requestsDurationMax;}
246     
247 
248 }