1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import time
23
24 from twisted.internet import reactor
25
26 from flumotion.common import log
27
28
29
30 MIN_REQUEST_SIZE = 64 * 1024 + 1
31
32 STATS_UPDATE_PERIOD = 10
33
34
36
38 self._stats = serverStats
39 self.bytesSent = 0L
40 self._stats._onRequestStart(self)
41
45
48
49
51
52 _updater = None
53 _callId = None
54
56 now = time.time()
57 self.startTime = now
58 self.currentRequestCount = 0
59 self.totalRequestCount = 0
60 self.requestCountPeak = 0
61 self.requestCountPeakTime = now
62 self.finishedRequestCount = 0
63 self.totalBytesSent = 0L
64
65
66 self.meanRequestCount = 0
67 self.currentRequestRate = 0
68 self.requestRatePeak = 0
69 self.requestRatePeakTime = now
70 self.meanRequestRate = 0.0
71 self.currentBitrate = 0
72 self.meanBitrate = 0
73 self.bitratePeak = 0
74 self.bitratePeakTime = now
75
76 self._fileReadRatios = 0.0
77 self._lastUpdateTime = now
78 self._lastRequestCount = 0
79 self._lastBytesSent = 0L
80
82 self._updater = updater
83 self._set("bitrate-peak-time", self.bitratePeakTime)
84 self._set("request-rate-peak-time", self.requestRatePeakTime)
85 self._set("request-count-peak-time", self.requestCountPeakTime)
86 if self._callId is None:
87 self._update()
88
94
96 if self.finishedRequestCount > 0:
97 return self._fileReadRatios / self.finishedRequestCount
98 return 0.0
99 meanFileReadRatio = property(getMeanFileReadRatio)
100
102 now = time.time()
103 updateDelta = now - self._lastUpdateTime
104
105 meanReqCount = self._updateAverage(self._lastUpdateTime, now,
106 self.meanRequestCount,
107 self.currentRequestCount)
108
109 countDiff = self.totalRequestCount - self._lastRequestCount
110 newReqRate = float(countDiff) / updateDelta
111
112 meanReqRate = self._updateAverage(self._lastUpdateTime, now,
113 self.currentRequestRate, newReqRate)
114
115 bytesDiff = (self.totalBytesSent - self._lastBytesSent) * 8
116 newBitrate = bytesDiff / updateDelta
117
118 meanBitrate = self._updateAverage(self._lastUpdateTime, now,
119 self.currentBitrate, newBitrate)
120
121 self.meanRequestCount = meanReqCount
122 self.currentRequestRate = newReqRate
123 self.meanRequestRate = meanReqRate
124 self.currentBitrate = newBitrate
125 self.meanBitrate = meanBitrate
126
127
128 self._set("mean-request-count", meanReqCount)
129 self._set("current-request-rate", newReqRate)
130 self._set("mean-request-rate", meanReqRate)
131 self._set("current-bitrate", newBitrate)
132 self._set("mean-bitrate", meanBitrate)
133
134
135 if newReqRate > self.requestRatePeak:
136 self.requestRatePeak = newReqRate
137 self.requestRatePeakTime = now
138
139 self._set("request-rate-peak", newReqRate)
140 self._set("request-rate-peak-time", now)
141
142
143 if newBitrate > self.bitratePeak:
144 self.bitratePeak = newBitrate
145 self.bitratePeakTime = now
146
147 self._set("bitrate-peak", newBitrate)
148 self._set("bitrate-peak-time", now)
149
150
151 self._set("total-bytes-sent", self.totalBytesSent)
152
153 self._lastRequestCount = self.totalRequestCount
154 self._lastBytesSent = self.totalBytesSent
155 self._lastUpdateTime = now
156
157 self._logStatsLine()
158 self._callId = reactor.callLater(STATS_UPDATE_PERIOD, self._update)
159
160 - def _set(self, key, value):
163
165
166 self.currentRequestCount += 1
167 self.totalRequestCount += 1
168 self._set("current-request-count", self.currentRequestCount)
169 self._set("total-request-count", self.totalRequestCount)
170
171 if self.currentRequestCount > self.requestCountPeak:
172 now = time.time()
173 self.requestCountPeak = self.currentRequestCount
174 self.requestCountPeakTime = now
175 self._set("request-count-peak", self.currentRequestCount)
176 self._set("request-count-peak-time", now)
177
179 self.totalBytesSent += size
180
182 self.currentRequestCount -= 1
183 self.finishedRequestCount += 1
184 self._set("current-request-count", self.currentRequestCount)
185 if (size > 0) and (stats.bytesSent > MIN_REQUEST_SIZE):
186 self._fileReadRatios += float(stats.bytesSent) / size
187 self._set("mean-file-read-ratio", self.meanFileReadRatio)
188
190 lastDelta = lastTime - self.startTime
191 newDelta = newTime - lastTime
192 if lastDelta > 0:
193 delta = lastDelta + newDelta
194 before = (lastValue * lastDelta) / delta
195 after = (newValue * newDelta) / delta
196 return before + after
197 return lastValue
198
200 """
201 Statistic fields names:
202 TRC: Total Request Count
203 CRC: Current Request Count
204 CRR: Current Request Rate
205 MRR: Mean Request Rate
206 FRR: File Read Ratio
207 MBR: Mean Bitrate
208 CBR: Current Bitrate
209 """
210 log.debug("stats-http-server",
211 "TRC: %s; CRC: %d; CRR: %.2f; MRR: %.2f; "
212 "FRR: %.4f; MBR: %d; CBR: %d",
213 self.totalRequestCount, self.currentRequestCount,
214 self.currentRequestRate, self.meanRequestRate,
215 self.meanFileReadRatio, self.meanBitrate,
216 self.currentBitrate)
217