1 package org.mortbay.jetty.handler;
2
3 import java.io.IOException;
4 import java.util.concurrent.atomic.AtomicInteger;
5 import java.util.concurrent.atomic.AtomicLong;
6 import javax.servlet.ServletException;
7 import javax.servlet.http.HttpServletRequest;
8 import javax.servlet.http.HttpServletResponse;
9
10 import org.mortbay.jetty.HttpConnection;
11 import org.mortbay.jetty.Response;
12
13
14
15
16 public class AtomicStatisticsHandler extends AbstractStatisticsHandler
17 {
18 private transient final AtomicLong _statsStartedAt = new AtomicLong();
19 private transient final AtomicInteger _requests = new AtomicInteger();
20 private transient final AtomicLong _minRequestTime = new AtomicLong();
21 private transient final AtomicLong _maxRequestTime = new AtomicLong();
22 private transient final AtomicLong _totalRequestTime = new AtomicLong();
23 private transient final AtomicInteger _requestsActive = new AtomicInteger();
24 private transient final AtomicInteger _requestsActiveMax = new AtomicInteger();
25 private transient final AtomicInteger _responses1xx = new AtomicInteger();
26 private transient final AtomicInteger _responses2xx = new AtomicInteger();
27 private transient final AtomicInteger _responses3xx = new AtomicInteger();
28 private transient final AtomicInteger _responses4xx = new AtomicInteger();
29 private transient final AtomicInteger _responses5xx = new AtomicInteger();
30
31 public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException
32 {
33 _requests.incrementAndGet();
34 int actives = _requestsActive.incrementAndGet();
35
36 int oldMaxActives = _requestsActiveMax.get();
37 while (actives > oldMaxActives)
38 {
39 if (_requestsActiveMax.compareAndSet(oldMaxActives, actives)) break;
40 oldMaxActives = _requestsActiveMax.get();
41 }
42
43 long requestStartTime = System.currentTimeMillis();
44 try
45 {
46 super.handle(target, request, response, dispatch);
47 }
48 finally
49 {
50 long requestTime = System.currentTimeMillis() - requestStartTime;
51
52
53 actives = _requestsActive.decrementAndGet();
54 while (actives < 0)
55 {
56 if (_requestsActive.compareAndSet(actives, 0)) break;
57 actives = _requestsActive.get();
58 }
59
60
61 long oldMinTime = _minRequestTime.get();
62 while (requestTime < oldMinTime)
63 {
64 if (_minRequestTime.compareAndSet(oldMinTime, requestTime)) break;
65 oldMinTime = _minRequestTime.get();
66 }
67 long oldMaxTime = _maxRequestTime.get();
68 while (requestTime > oldMaxTime)
69 {
70 if (_maxRequestTime.compareAndSet(oldMaxTime, requestTime)) break;
71 oldMaxTime = _maxRequestTime.get();
72 }
73 _totalRequestTime.addAndGet(requestTime);
74
75 Response jettyResponse = (response instanceof Response) ? (Response) response : HttpConnection.getCurrentConnection().getResponse();
76 switch (jettyResponse.getStatus() / 100)
77 {
78 case 1:
79 _responses1xx.incrementAndGet();
80 break;
81 case 2:
82 _responses2xx.incrementAndGet();
83 break;
84 case 3:
85 _responses3xx.incrementAndGet();
86 break;
87 case 4:
88 _responses4xx.incrementAndGet();
89 break;
90 case 5:
91 _responses5xx.incrementAndGet();
92 break;
93 default:
94 break;
95 }
96 }
97 }
98
99 public void statsReset()
100 {
101 _statsStartedAt.set(System.currentTimeMillis());
102 _requests.set(0);
103 _minRequestTime.set(Long.MAX_VALUE);
104 _maxRequestTime.set(0L);
105 _totalRequestTime.set(0L);
106 _requestsActive.set(0);
107 _requestsActiveMax.set(0);
108 _responses1xx.set(0);
109 _responses2xx.set(0);
110 _responses3xx.set(0);
111 _responses4xx.set(0);
112 _responses5xx.set(0);
113 }
114
115 public int getRequests()
116 {
117 return _requests.get();
118 }
119
120 public int getRequestsActive()
121 {
122 return _requestsActive.get();
123 }
124
125 public int getRequestsActiveMax()
126 {
127 return _requestsActiveMax.get();
128 }
129
130 public int getResponses1xx()
131 {
132 return _responses1xx.get();
133 }
134
135 public int getResponses2xx()
136 {
137 return _responses2xx.get();
138 }
139
140 public int getResponses3xx()
141 {
142 return _responses3xx.get();
143 }
144
145 public int getResponses4xx()
146 {
147 return _responses4xx.get();
148 }
149
150 public int getResponses5xx()
151 {
152 return _responses5xx.get();
153 }
154
155 public long getStatsOnMs()
156 {
157 return System.currentTimeMillis() - _statsStartedAt.get();
158 }
159
160 public long getRequestTimeMin()
161 {
162 return _minRequestTime.get();
163 }
164
165 public long getRequestTimeMax()
166 {
167 return _maxRequestTime.get();
168 }
169
170 public long getRequestTimeTotal()
171 {
172 return _totalRequestTime.get();
173 }
174
175 public long getRequestTimeAverage()
176 {
177 int requests = getRequests();
178 return requests == 0 ? 0 : getRequestTimeTotal() / requests;
179 }
180 }