1
2
3
4
5
6
7
8
9
10
11
12
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 import org.mortbay.util.LazyList;
27
28 public class StatisticsHandler extends HandlerWrapper implements CompleteHandler
29 {
30 transient long _statsStartedAt;
31
32 transient int _requests;
33
34 transient long _requestsDurationMin;
35 transient long _requestsDurationMax;
36 transient long _requestsDurationTotal;
37 transient long _requestsActiveDurationMin;
38 transient long _requestsActiveDurationMax;
39 transient long _requestsActiveDurationTotal;
40
41 transient int _requestsActive;
42 transient int _requestsActiveMin;
43 transient int _requestsActiveMax;
44 transient int _requestsResumed;
45 transient int _requestsTimedout;
46 transient int _responses1xx;
47 transient int _responses2xx;
48 transient int _responses3xx;
49 transient int _responses4xx;
50 transient int _responses5xx;
51
52 transient long _responsesBytesTotal;
53
54
55 public void statsReset()
56 {
57 synchronized(this)
58 {
59 if (isStarted())
60 _statsStartedAt=System.currentTimeMillis();
61 _requests=0;
62 _responses1xx=0;
63 _responses2xx=0;
64 _responses3xx=0;
65 _responses4xx=0;
66 _responses5xx=0;
67
68 _requestsActiveMin=_requestsActive;
69 _requestsActiveMax=_requestsActive;
70
71 _requestsDurationMin=0;
72 _requestsDurationMax=0;
73 _requestsDurationTotal=0;
74
75 _requestsActiveDurationMin=0;
76 _requestsActiveDurationMax=0;
77 _requestsActiveDurationTotal=0;
78 }
79 }
80
81
82
83 public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException
84 {
85 final Request base_request=(request instanceof Request)?((Request)request):HttpConnection.getCurrentConnection().getRequest();
86 final Response base_response=(response instanceof Response)?((Response)response):HttpConnection.getCurrentConnection().getResponse();
87
88 long timestamp0=base_request.getTimeStamp();
89 long timestamp1=timestamp0;
90 try
91 {
92 synchronized(this)
93 {
94 if(base_request.isInitial())
95 _requests++;
96 else
97 timestamp1=System.currentTimeMillis();
98
99 if(base_request.isTimeout())
100 _requestsTimedout++;
101 if(base_request.isResumed())
102 _requestsResumed++;
103
104 _requestsActive++;
105 if (_requestsActive>_requestsActiveMax)
106 _requestsActiveMax=_requestsActive;
107 }
108
109 super.handle(target, request, response, dispatch);
110 }
111 finally
112 {
113 synchronized(this)
114 {
115 _requestsActive--;
116 if (_requestsActive<0)
117 _requestsActive=0;
118 if (_requestsActive < _requestsActiveMin)
119 _requestsActiveMin=_requestsActive;
120
121 long duration = System.currentTimeMillis()-timestamp1;
122 _requestsActiveDurationTotal+=duration;
123 if (_requestsActiveDurationMin==0 || duration<_requestsActiveDurationMin)
124 _requestsActiveDurationMin=duration;
125 if (duration>_requestsActiveDurationMax)
126 _requestsActiveDurationMax=duration;
127
128
129 if(base_request.isSuspended())
130 {
131 Object list = base_request.getAttribute(COMPLETE_HANDLER_ATTR);
132 base_request.setAttribute(COMPLETE_HANDLER_ATTR, LazyList.add(list, this));
133 }
134 else
135 {
136 duration = System.currentTimeMillis()-timestamp0;
137 addRequestsDurationTotal(duration);
138
139 switch(base_response.getStatus()/100)
140 {
141 case 1: _responses1xx++;break;
142 case 2: _responses2xx++;break;
143 case 3: _responses3xx++;break;
144 case 4: _responses4xx++;break;
145 case 5: _responses5xx++;break;
146 }
147
148 _responsesBytesTotal += base_response.getContentCount();
149 }
150 }
151 }
152 }
153
154
155 protected void doStart() throws Exception
156 {
157 super.doStart();
158 _statsStartedAt=System.currentTimeMillis();
159 }
160
161
162 protected void doStop() throws Exception
163 {
164 super.doStop();
165 }
166
167
168
169
170
171
172
173 public int getRequests() {return _requests;}
174
175
176
177
178
179
180 public int getRequestsActive() {return _requestsActive;}
181
182
183
184
185
186
187 public int getRequestsResumed() {return _requestsResumed;}
188
189
190
191
192
193
194 public int getRequestsTimedout() {return _requestsTimedout;}
195
196
197
198
199
200
201 public int getRequestsActiveMax() {return _requestsActiveMax;}
202
203
204
205
206
207
208
209 public int getResponses1xx() {return _responses1xx;}
210
211
212
213
214
215
216
217 public int getResponses2xx() {return _responses2xx;}
218
219
220
221
222
223
224
225 public int getResponses3xx() {return _responses3xx;}
226
227
228
229
230
231
232
233 public int getResponses4xx() {return _responses4xx;}
234
235
236
237
238
239
240
241 public int getResponses5xx() {return _responses5xx;}
242
243
244
245
246
247 public long getStatsOnMs()
248 {
249 return System.currentTimeMillis()-_statsStartedAt;
250 }
251
252
253
254
255
256 public int getRequestsActiveMin()
257 {
258 return _requestsActiveMin;
259 }
260
261
262
263
264
265 public long getRequestsDurationMin()
266 {
267 return _requestsDurationMin;
268 }
269
270
271
272
273
274 public long getRequestsDurationTotal()
275 {
276 return _requestsDurationTotal;
277 }
278
279
280
281
282
283
284 public long getRequestsDurationAve() {return _requests==0?0:(_requestsDurationTotal/_requests);}
285
286
287
288
289
290
291 public long getRequestsDurationMax() {return _requestsDurationMax;}
292
293
294
295
296
297 public long getRequestsActiveDurationMin()
298 {
299 return _requestsActiveDurationMin;
300 }
301
302
303
304
305
306 public long getRequestsActiveDurationTotal()
307 {
308 return _requestsActiveDurationTotal;
309 }
310
311
312
313
314
315
316 public long getRequestsActiveDurationAve() {return _requests==0?0:(_requestsActiveDurationTotal/_requests);}
317
318
319
320
321
322
323 public long getRequestsActiveDurationMax() {return _requestsActiveDurationMax;}
324
325
326
327
328
329 public long getResponsesBytesTotal() {return _responsesBytesTotal; }
330
331 private void addRequestsDurationTotal(long duration)
332 {
333 synchronized(this)
334 {
335 _requestsDurationTotal+=duration;
336 if (_requestsDurationMin==0 || duration<_requestsDurationMin)
337 _requestsDurationMin=duration;
338 if (duration>_requestsDurationMax)
339 _requestsDurationMax=duration;
340 }
341 }
342
343
344
345
346
347
348
349
350
351 public void complete(Request request)
352 {
353 long duration = System.currentTimeMillis() - request.getTimeStamp();
354 addRequestsDurationTotal(duration);
355 }
356
357 }