Merge lp:~sidnei/txstatsd/no-strings-attached into lp:txstatsd
- no-strings-attached
- Merge into trunk
Proposed by
Sidnei da Silva
Status: | Merged |
---|---|
Approved by: | Sidnei da Silva |
Approved revision: | 55 |
Merged at revision: | 55 |
Proposed branch: | lp:~sidnei/txstatsd/no-strings-attached |
Merge into: | lp:txstatsd |
Diff against target: |
1118 lines (+249/-341) 16 files modified
txstatsd/metrics/countermetric.py (+4/-13) txstatsd/metrics/distinctmetric.py (+11/-16) txstatsd/metrics/extendedmetrics.py (+1/-0) txstatsd/metrics/gaugemetric.py (+3/-11) txstatsd/metrics/histogrammetric.py (+18/-33) txstatsd/metrics/metermetric.py (+13/-21) txstatsd/metrics/timermetric.py (+18/-29) txstatsd/server/configurableprocessor.py (+12/-12) txstatsd/server/loggingprocessor.py (+5/-6) txstatsd/server/processor.py (+26/-50) txstatsd/server/protocol.py (+1/-1) txstatsd/tests/metrics/test_distinct.py (+4/-1) txstatsd/tests/test_configurableprocessor.py (+44/-55) txstatsd/tests/test_loggingprocessor.py (+9/-5) txstatsd/tests/test_processor.py (+77/-85) txstatsd/tests/test_protocol.py (+3/-3) |
To merge this branch: | bzr merge lp:~sidnei/txstatsd/no-strings-attached |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Lucio Torre (community) | Approve | ||
Review via email: mp+84298@code.launchpad.net |
Commit message
- Produce a list of tuples when flushing, format when writing.
Description of the change
Produce a list of tuples when flushing, format when writing.
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'txstatsd/metrics/countermetric.py' |
2 | --- txstatsd/metrics/countermetric.py 2011-09-14 12:01:10 +0000 |
3 | +++ txstatsd/metrics/countermetric.py 2011-12-02 17:13:07 +0000 |
4 | @@ -1,6 +1,4 @@ |
5 | - |
6 | import math |
7 | -from string import Template |
8 | |
9 | from txstatsd.metrics.metric import Metric |
10 | |
11 | @@ -49,9 +47,6 @@ |
12 | class CounterMetricReporter(object): |
13 | """An incrementing and decrementing counter metric.""" |
14 | |
15 | - MESSAGE = ( |
16 | - "$prefix%(key)s.count %(count)s %(timestamp)s\n") |
17 | - |
18 | def __init__(self, name, prefix=""): |
19 | """Construct a metric we expect to be periodically updated. |
20 | |
21 | @@ -60,17 +55,13 @@ |
22 | self.name = name |
23 | |
24 | if prefix: |
25 | - prefix += '.' |
26 | - self.message = Template(CounterMetricReporter.MESSAGE).substitute( |
27 | - prefix=prefix) |
28 | - |
29 | + prefix += "." |
30 | + self.prefix = prefix |
31 | self.count = 0 |
32 | |
33 | def mark(self, value): |
34 | self.count = value |
35 | |
36 | def report(self, timestamp): |
37 | - return self.message % { |
38 | - "key": self.name, |
39 | - "count": math.trunc(self.count), |
40 | - "timestamp": timestamp} |
41 | + return [(self.prefix + self.name + ".count", |
42 | + math.trunc(self.count), timestamp)] |
43 | |
44 | === modified file 'txstatsd/metrics/distinctmetric.py' |
45 | --- txstatsd/metrics/distinctmetric.py 2011-11-18 17:13:52 +0000 |
46 | +++ txstatsd/metrics/distinctmetric.py 2011-12-02 17:13:07 +0000 |
47 | @@ -14,6 +14,7 @@ |
48 | from string import Template |
49 | |
50 | from zope.interface import implements |
51 | + |
52 | from txstatsd.metrics.metric import Metric |
53 | from txstatsd.itxstatsd import IMetric |
54 | |
55 | @@ -106,12 +107,6 @@ |
56 | """ |
57 | implements(IMetric) |
58 | |
59 | - MESSAGE = ( |
60 | - "$prefix%(key)s.count_1min %(count_1min)s %(timestamp)s\n" |
61 | - "$prefix%(key)s.count_1hour %(count_1hour)s %(timestamp)s\n" |
62 | - "$prefix%(key)s.count_1day %(count_1day)s %(timestamp)s\n" |
63 | - "$prefix%(key)s.count %(count)s %(timestamp)s\n") |
64 | - |
65 | def __init__(self, name, wall_time_func=time.time, prefix=""): |
66 | """Construct a metric we expect to be periodically updated. |
67 | |
68 | @@ -124,9 +119,8 @@ |
69 | self.wall_time_func = wall_time_func |
70 | self.counter = SlidingDistinctCounter(32, 32) |
71 | if prefix: |
72 | - prefix += '.' |
73 | - self.message = Template(DistinctMetricReporter.MESSAGE).substitute( |
74 | - prefix=prefix) |
75 | + prefix += "." |
76 | + self.prefix = prefix |
77 | |
78 | def count(self): |
79 | return self.counter.distinct() |
80 | @@ -148,10 +142,11 @@ |
81 | |
82 | def flush(self, interval, timestamp): |
83 | now = self.wall_time_func() |
84 | - return self.message % { |
85 | - "key": self.name, |
86 | - "count": self.count(), |
87 | - "count_1min": self.count_1min(now), |
88 | - "count_1hour": self.count_1hour(now), |
89 | - "count_1day": self.count_1day(now), |
90 | - "timestamp": timestamp} |
91 | + metrics = [] |
92 | + items = {".count": self.count(), |
93 | + ".count_1min": self.count_1min(now), |
94 | + ".count_1hour": self.count_1hour(now), |
95 | + ".count_1day": self.count_1day(now)} |
96 | + for item, value in items.iteritems(): |
97 | + metrics.append((self.prefix + self.name + item, value, timestamp)) |
98 | + return metrics |
99 | |
100 | === modified file 'txstatsd/metrics/extendedmetrics.py' |
101 | --- txstatsd/metrics/extendedmetrics.py 2011-11-28 17:14:10 +0000 |
102 | +++ txstatsd/metrics/extendedmetrics.py 2011-12-02 17:13:07 +0000 |
103 | @@ -5,6 +5,7 @@ |
104 | |
105 | |
106 | class ExtendedMetrics(Metrics): |
107 | + |
108 | def __init__(self, connection=None, namespace=""): |
109 | """A convenience class for reporting metric samples |
110 | to a C{txstatsd} server configured with the |
111 | |
112 | === modified file 'txstatsd/metrics/gaugemetric.py' |
113 | --- txstatsd/metrics/gaugemetric.py 2011-10-01 04:05:34 +0000 |
114 | +++ txstatsd/metrics/gaugemetric.py 2011-12-02 17:13:07 +0000 |
115 | @@ -27,9 +27,6 @@ |
116 | class GaugeMetricReporter(object): |
117 | """A gauge metric is an instantaneous reading of a particular value.""" |
118 | |
119 | - MESSAGE = ( |
120 | - "$prefix%(key)s.value %(value)s %(timestamp)s\n") |
121 | - |
122 | def __init__(self, name, prefix=""): |
123 | """Construct a metric we expect to be periodically updated. |
124 | |
125 | @@ -38,17 +35,12 @@ |
126 | self.name = name |
127 | |
128 | if prefix: |
129 | - prefix += '.' |
130 | - self.message = Template(GaugeMetricReporter.MESSAGE).substitute( |
131 | - prefix=prefix) |
132 | - |
133 | + prefix += "." |
134 | + self.prefix = prefix |
135 | self.value = 0 |
136 | |
137 | def mark(self, value): |
138 | self.value = value |
139 | |
140 | def report(self, timestamp): |
141 | - return self.message % { |
142 | - "key": self.name, |
143 | - "value": self.value, |
144 | - "timestamp": timestamp} |
145 | + return [(self.prefix + self.name + ".value", self.value, timestamp)] |
146 | |
147 | === modified file 'txstatsd/metrics/histogrammetric.py' |
148 | --- txstatsd/metrics/histogrammetric.py 2011-09-14 12:01:10 +0000 |
149 | +++ txstatsd/metrics/histogrammetric.py 2011-12-02 17:13:07 +0000 |
150 | @@ -1,8 +1,4 @@ |
151 | - |
152 | import math |
153 | -import sys |
154 | - |
155 | -from string import Template |
156 | |
157 | from txstatsd.stats.exponentiallydecayingsample \ |
158 | import ExponentiallyDecayingSample |
159 | @@ -18,18 +14,6 @@ |
160 | <http://www.johndcook.com/standard_deviation.html>} |
161 | """ |
162 | |
163 | - MESSAGE = ( |
164 | - "$prefix%(key)s.min %(min)s %(timestamp)s\n" |
165 | - "$prefix%(key)s.max %(max)s %(timestamp)s\n" |
166 | - "$prefix%(key)s.mean %(mean)s %(timestamp)s\n" |
167 | - "$prefix%(key)s.stddev %(lower)s %(timestamp)s\n" |
168 | - "$prefix%(key)s.median %(count)s %(timestamp)s\n" |
169 | - "$prefix%(key)s.75percentile %(75percentile)s %(timestamp)s\n" |
170 | - "$prefix%(key)s.95percentile %(95percentile)s %(timestamp)s\n" |
171 | - "$prefix%(key)s.98percentile %(98percentile)s %(timestamp)s\n" |
172 | - "$prefix%(key)s.99percentile %(99percentile)s %(timestamp)s\n" |
173 | - "$prefix%(key)s.999percentile %(999percentile)s %(timestamp)s\n") |
174 | - |
175 | @classmethod |
176 | def using_uniform_sample(cls, prefix=""): |
177 | """ |
178 | @@ -59,9 +43,8 @@ |
179 | self.sample = sample |
180 | |
181 | if prefix: |
182 | - prefix += '.' |
183 | - self.message = Template(HistogramMetricReporter.MESSAGE).substitute( |
184 | - prefix=prefix) |
185 | + prefix += "." |
186 | + self.prefix = prefix |
187 | |
188 | self._min = 0 |
189 | self._max = 0 |
190 | @@ -98,20 +81,22 @@ |
191 | def report(self, timestamp): |
192 | # median, 75, 95, 98, 99, 99.9 percentile |
193 | percentiles = self.percentiles(0.5, 0.75, 0.95, 0.98, 0.99, 0.999) |
194 | + metrics = [] |
195 | + items = { |
196 | + ".min": self.min(), |
197 | + ".max": self.max(), |
198 | + ".mean": self.mean(), |
199 | + ".stddev": self.std_dev(), |
200 | + ".median": percentiles[0], |
201 | + ".75percentile": percentiles[1], |
202 | + ".95percentile": percentiles[2], |
203 | + ".98percentile": percentiles[3], |
204 | + ".99percentile": percentiles[4], |
205 | + ".999percentile": percentiles[5]} |
206 | |
207 | - return self.message % { |
208 | - "key": self.name, |
209 | - "min": self.min(), |
210 | - "max": self.max(), |
211 | - "mean": self.mean(), |
212 | - "stddev": self.std_dev(), |
213 | - "median": percentiles[0], |
214 | - "75percentile": percentiles[1], |
215 | - "95percentile": percentiles[2], |
216 | - "98percentile": percentiles[3], |
217 | - "99percentile": percentiles[4], |
218 | - "999percentile": percentiles[5], |
219 | - "timestamp": timestamp} |
220 | + for item, value in items.itervalues(): |
221 | + metrics.append((self.prefix + self.name + item, value, timestamp)) |
222 | + return metrics |
223 | |
224 | def min(self): |
225 | """Returns the smallest recorded value.""" |
226 | @@ -192,4 +177,4 @@ |
227 | new_values[0] = new_m |
228 | new_values[1] = new_s |
229 | |
230 | - self.variance = new_values |
231 | \ No newline at end of file |
232 | + self.variance = new_values |
233 | |
234 | === modified file 'txstatsd/metrics/metermetric.py' |
235 | --- txstatsd/metrics/metermetric.py 2011-09-09 15:17:09 +0000 |
236 | +++ txstatsd/metrics/metermetric.py 2011-12-02 17:13:07 +0000 |
237 | @@ -1,6 +1,3 @@ |
238 | - |
239 | -from string import Template |
240 | - |
241 | import time |
242 | |
243 | from txstatsd.metrics.metric import Metric |
244 | @@ -44,13 +41,6 @@ |
245 | <http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average>} |
246 | """ |
247 | |
248 | - MESSAGE = ( |
249 | - "$prefix%(key)s.count %(count)s %(timestamp)s\n" |
250 | - "$prefix%(key)s.mean_rate %(mean_rate)s %(timestamp)s\n" |
251 | - "$prefix%(key)s.1min_rate %(rate_1min)s %(timestamp)s\n" |
252 | - "$prefix%(key)s.5min_rate %(rate_5min)s %(timestamp)s\n" |
253 | - "$prefix%(key)s.15min_rate %(rate_15min)s %(timestamp)s\n") |
254 | - |
255 | def __init__(self, name, wall_time_func=time.time, prefix=""): |
256 | """Construct a metric we expect to be periodically updated. |
257 | |
258 | @@ -61,9 +51,8 @@ |
259 | self.wall_time_func = wall_time_func |
260 | |
261 | if prefix: |
262 | - prefix += '.' |
263 | - self.message = Template(MeterMetricReporter.MESSAGE).substitute( |
264 | - prefix=prefix) |
265 | + prefix += "." |
266 | + self.prefix = prefix |
267 | |
268 | self.m1_rate = Ewma.one_minute_ewma() |
269 | self.m5_rate = Ewma.five_minute_ewma() |
270 | @@ -85,14 +74,17 @@ |
271 | self.m15_rate.tick() |
272 | |
273 | def report(self, timestamp): |
274 | - return self.message % { |
275 | - "key": self.name, |
276 | - "count": self.count, |
277 | - "mean_rate": self.mean_rate(), |
278 | - "rate_1min": self.one_minute_rate(), |
279 | - "rate_5min": self.five_minute_rate(), |
280 | - "rate_15min": self.fifteen_minute_rate(), |
281 | - "timestamp": timestamp} |
282 | + metrics = [] |
283 | + items = {".count": self.count, |
284 | + ".mean_rate": self.mean_rate(), |
285 | + ".1min_rate": self.one_minute_rate(), |
286 | + ".5min_rate": self.five_minute_rate(), |
287 | + ".15min_rate": self.fifteen_minute_rate()} |
288 | + |
289 | + for item, value in items.iteritems(): |
290 | + metrics.append((self.prefix + self.name + item, |
291 | + round(value, 6), timestamp)) |
292 | + return metrics |
293 | |
294 | def fifteen_minute_rate(self): |
295 | return self.m15_rate.rate |
296 | |
297 | === modified file 'txstatsd/metrics/timermetric.py' |
298 | --- txstatsd/metrics/timermetric.py 2011-11-28 16:24:39 +0000 |
299 | +++ txstatsd/metrics/timermetric.py 2011-12-02 17:13:07 +0000 |
300 | @@ -39,18 +39,6 @@ |
301 | statistics, plus throughput statistics via L{MeterMetricReporter}. |
302 | """ |
303 | |
304 | - MESSAGE = ( |
305 | - "$prefix%(key)s.min %(min)s %(timestamp)s\n" |
306 | - "$prefix%(key)s.max %(max)s %(timestamp)s\n" |
307 | - "$prefix%(key)s.mean %(mean)s %(timestamp)s\n" |
308 | - "$prefix%(key)s.stddev %(stddev)s %(timestamp)s\n" |
309 | - "$prefix%(key)s.median %(median)s %(timestamp)s\n" |
310 | - "$prefix%(key)s.75percentile %(75percentile)s %(timestamp)s\n" |
311 | - "$prefix%(key)s.95percentile %(95percentile)s %(timestamp)s\n" |
312 | - "$prefix%(key)s.98percentile %(98percentile)s %(timestamp)s\n" |
313 | - "$prefix%(key)s.99percentile %(99percentile)s %(timestamp)s\n" |
314 | - "$prefix%(key)s.999percentile %(999percentile)s %(timestamp)s\n") |
315 | - |
316 | def __init__(self, name, wall_time_func=time.time, prefix=""): |
317 | """Construct a metric we expect to be periodically updated. |
318 | |
319 | @@ -63,14 +51,13 @@ |
320 | self.wall_time_func = wall_time_func |
321 | |
322 | if prefix: |
323 | - prefix += '.' |
324 | - self.message = Template(TimerMetricReporter.MESSAGE).substitute( |
325 | - prefix=prefix) |
326 | + prefix += "." |
327 | + self.prefix = prefix |
328 | |
329 | sample = ExponentiallyDecayingSample(1028, 0.015) |
330 | self.histogram = HistogramMetricReporter(sample) |
331 | self.meter = MeterMetricReporter( |
332 | - 'calls', wall_time_func=self.wall_time_func) |
333 | + "calls", wall_time_func=self.wall_time_func) |
334 | self.clear() |
335 | |
336 | def clear(self): |
337 | @@ -137,17 +124,19 @@ |
338 | def report(self, timestamp): |
339 | # median, 75, 95, 98, 99, 99.9 percentile |
340 | percentiles = self.percentiles(0.5, 0.75, 0.95, 0.98, 0.99, 0.999) |
341 | + metrics = [] |
342 | + items = {".min": self.min(), |
343 | + ".max": self.max(), |
344 | + ".mean": self.mean(), |
345 | + ".stddev": self.std_dev(), |
346 | + ".median": percentiles[0], |
347 | + ".75percentile": percentiles[1], |
348 | + ".95percentile": percentiles[2], |
349 | + ".98percentile": percentiles[3], |
350 | + ".99percentile": percentiles[4], |
351 | + ".999percentile": percentiles[5]} |
352 | |
353 | - return self.message % { |
354 | - "key": self.name, |
355 | - "min": self.min(), |
356 | - "max": self.max(), |
357 | - "mean": self.mean(), |
358 | - "stddev": self.std_dev(), |
359 | - "median": percentiles[0], |
360 | - "75percentile": percentiles[1], |
361 | - "95percentile": percentiles[2], |
362 | - "98percentile": percentiles[3], |
363 | - "99percentile": percentiles[4], |
364 | - "999percentile": percentiles[5], |
365 | - "timestamp": timestamp} |
366 | + for item, value in items.iteritems(): |
367 | + metrics.append((self.prefix + self.name + item, |
368 | + round(value, 6), timestamp)) |
369 | + return metrics |
370 | |
371 | === modified file 'txstatsd/server/configurableprocessor.py' |
372 | --- txstatsd/server/configurableprocessor.py 2011-11-24 13:15:59 +0000 |
373 | +++ txstatsd/server/configurableprocessor.py 2011-12-02 17:13:07 +0000 |
374 | @@ -23,18 +23,18 @@ |
375 | duration statistics, plus throughput statistics. |
376 | """ |
377 | |
378 | - METRICS_SUMMARY = "statsd.numStats %s %s\n" |
379 | + METRICS_SUMMARY = "statsd.numStats" |
380 | |
381 | def __init__(self, time_function=time.time, message_prefix="", plugins=None): |
382 | super(ConfigurableMessageProcessor, self).__init__( |
383 | time_function=time_function, plugins=plugins) |
384 | |
385 | if message_prefix: |
386 | - self.metrics_summary = message_prefix + '.' + \ |
387 | - ConfigurableMessageProcessor.METRICS_SUMMARY |
388 | + self.metrics_summary = ( |
389 | + message_prefix + "." + |
390 | + ConfigurableMessageProcessor.METRICS_SUMMARY) |
391 | else: |
392 | - self.metrics_summary = \ |
393 | - ConfigurableMessageProcessor.METRICS_SUMMARY |
394 | + self.metrics_summary = ConfigurableMessageProcessor.METRICS_SUMMARY |
395 | |
396 | self.message_prefix = message_prefix |
397 | self.gauge_metrics = {} |
398 | @@ -86,8 +86,8 @@ |
399 | metrics = [] |
400 | events = 0 |
401 | for metric in self.counter_metrics.itervalues(): |
402 | - message = metric.report(timestamp) |
403 | - metrics.append(message) |
404 | + messages = metric.report(timestamp) |
405 | + metrics.extend(messages) |
406 | events += 1 |
407 | |
408 | return (metrics, events) |
409 | @@ -96,8 +96,8 @@ |
410 | metrics = [] |
411 | events = 0 |
412 | for metric in self.gauge_metrics.itervalues(): |
413 | - message = metric.report(timestamp) |
414 | - metrics.append(message) |
415 | + messages = metric.report(timestamp) |
416 | + metrics.extend(messages) |
417 | events += 1 |
418 | |
419 | return (metrics, events) |
420 | @@ -106,14 +106,14 @@ |
421 | metrics = [] |
422 | events = 0 |
423 | for metric in self.timer_metrics.itervalues(): |
424 | - message = metric.report(timestamp) |
425 | - metrics.append(message) |
426 | + messages = metric.report(timestamp) |
427 | + metrics.extend(messages) |
428 | events += 1 |
429 | |
430 | return (metrics, events) |
431 | |
432 | def flush_metrics_summary(self, messages, num_stats, timestamp): |
433 | - messages.append(self.metrics_summary % (num_stats, timestamp)) |
434 | + messages.append((self.metrics_summary, num_stats, timestamp)) |
435 | |
436 | def update_metrics(self): |
437 | super(ConfigurableMessageProcessor, self).update_metrics() |
438 | |
439 | === modified file 'txstatsd/server/loggingprocessor.py' |
440 | --- txstatsd/server/loggingprocessor.py 2011-11-18 17:13:52 +0000 |
441 | +++ txstatsd/server/loggingprocessor.py 2011-12-02 17:13:07 +0000 |
442 | @@ -28,9 +28,9 @@ |
443 | |
444 | def log_metrics(metrics): |
445 | for metric in metrics.itervalues(): |
446 | - report = metric.report(timestamp) |
447 | - for measurement in report.splitlines(): |
448 | - self.logger.info(measurement) |
449 | + messages = metric.report(timestamp) |
450 | + for measurement in messages: |
451 | + self.logger.info("%s %s %s" % measurement) |
452 | |
453 | log_metrics(self.counter_metrics) |
454 | log_metrics(self.gauge_metrics) |
455 | @@ -38,7 +38,6 @@ |
456 | log_metrics(self.timer_metrics) |
457 | |
458 | for metric in self.plugin_metrics.itervalues(): |
459 | - report = metric.flush(interval, timestamp) |
460 | - for measurement in report.splitlines(): |
461 | - self.logger.info(measurement) |
462 | + for measurement in metric.flush(interval, timestamp): |
463 | + self.logger.info("%s %s %s" % measurement) |
464 | |
465 | |
466 | === modified file 'txstatsd/server/processor.py' |
467 | --- txstatsd/server/processor.py 2011-11-24 13:15:59 +0000 |
468 | +++ txstatsd/server/processor.py 2011-12-02 17:13:07 +0000 |
469 | @@ -34,28 +34,15 @@ |
470 | <txstatsd.server.configurableprocessor.ConfigurableMessageProcessor>}). |
471 | """ |
472 | |
473 | - COUNTERS_MESSAGE = ( |
474 | - "stats.%(key)s %(value)s %(timestamp)s\n" |
475 | - "stats_counts.%(key)s %(count)s %(timestamp)s\n") |
476 | - |
477 | - TIMERS_MESSAGE = ( |
478 | - "stats.timers.%(key)s.mean %(mean)s %(timestamp)s\n" |
479 | - "stats.timers.%(key)s.upper %(upper)s %(timestamp)s\n" |
480 | - "stats.timers.%(key)s.upper_%(percent)s %(threshold_upper)s" |
481 | - " %(timestamp)s\n" |
482 | - "stats.timers.%(key)s.lower %(lower)s %(timestamp)s\n" |
483 | - "stats.timers.%(key)s.count %(count)s %(timestamp)s\n") |
484 | - |
485 | - GAUGE_METRIC_MESSAGE = ( |
486 | - "stats.gauge.%(key)s.value %(value)s %(timestamp)s\n") |
487 | - |
488 | def __init__(self, time_function=time.time, plugins=None): |
489 | self.time_function = time_function |
490 | |
491 | - self.counters_message = MessageProcessor.COUNTERS_MESSAGE |
492 | - self.timers_message = MessageProcessor.TIMERS_MESSAGE |
493 | - self.gauge_metric_message = MessageProcessor.GAUGE_METRIC_MESSAGE |
494 | - |
495 | + self.stats_prefix = "stats." |
496 | + self.metrics_summary = "statsd.numStats" |
497 | + self.count_prefix = "stats_counts." |
498 | + self.timer_prefix = self.stats_prefix + "timers." |
499 | + self.gauge_prefix = self.stats_prefix + "gauge." |
500 | + |
501 | self.timer_metrics = {} |
502 | self.counter_metrics = {} |
503 | self.gauge_metrics = deque() |
504 | @@ -197,27 +184,27 @@ |
505 | counter_metrics, events = self.flush_counter_metrics(interval, |
506 | timestamp) |
507 | if events > 0: |
508 | - messages.extend(counter_metrics) |
509 | + messages.extend(sorted(counter_metrics)) |
510 | num_stats += events |
511 | |
512 | timer_metrics, events = self.flush_timer_metrics(percent, timestamp) |
513 | if events > 0: |
514 | - messages.extend(timer_metrics) |
515 | + messages.extend(sorted(timer_metrics)) |
516 | num_stats += events |
517 | |
518 | gauge_metrics, events = self.flush_gauge_metrics(timestamp) |
519 | if events > 0: |
520 | - messages.extend(gauge_metrics) |
521 | + messages.extend(sorted(gauge_metrics)) |
522 | num_stats += events |
523 | |
524 | meter_metrics, events = self.flush_meter_metrics(timestamp) |
525 | if events > 0: |
526 | - messages.extend(meter_metrics) |
527 | + messages.extend(sorted(meter_metrics)) |
528 | num_stats += events |
529 | |
530 | plugin_metrics, events = self.flush_plugin_metrics(interval, timestamp) |
531 | if events > 0: |
532 | - messages.extend(plugin_metrics) |
533 | + messages.extend(sorted(plugin_metrics)) |
534 | num_stats += events |
535 | |
536 | self.flush_metrics_summary(messages, num_stats, timestamp) |
537 | @@ -230,12 +217,8 @@ |
538 | self.counter_metrics[key] = 0 |
539 | |
540 | value = count / interval |
541 | - message = self.counters_message % { |
542 | - "key": key, |
543 | - "value": value, |
544 | - "count": count, |
545 | - "timestamp": timestamp} |
546 | - metrics.append(message) |
547 | + metrics.append((self.stats_prefix + key, value, timestamp)) |
548 | + metrics.append((self.count_prefix + key, count, timestamp)) |
549 | events += 1 |
550 | |
551 | return (metrics, events) |
552 | @@ -264,16 +247,13 @@ |
553 | threshold_upper = timers[-1] |
554 | mean = sum(timers) / index |
555 | |
556 | - message = self.timers_message % { |
557 | - "key": key, |
558 | - "mean": mean, |
559 | - "upper": upper, |
560 | - "percent": percent, |
561 | - "threshold_upper": threshold_upper, |
562 | - "lower": lower, |
563 | - "count": count, |
564 | - "timestamp": timestamp} |
565 | - metrics.append(message) |
566 | + items = {".mean": mean, |
567 | + ".upper": upper, |
568 | + ".upper_%s" % percent: threshold_upper, |
569 | + ".lower": lower, |
570 | + ".count": count} |
571 | + for item, value in items.iteritems(): |
572 | + metrics.append((self.timer_prefix + key + item, value, timestamp)) |
573 | events += 1 |
574 | |
575 | return (metrics, events) |
576 | @@ -285,11 +265,7 @@ |
577 | value = metric[0] |
578 | key = metric[1] |
579 | |
580 | - message = self.gauge_metric_message % { |
581 | - "key": key, |
582 | - "value": value, |
583 | - "timestamp": timestamp} |
584 | - metrics.append(message) |
585 | + metrics.append((self.gauge_prefix + key + ".value", value, timestamp)) |
586 | events += 1 |
587 | |
588 | self.gauge_metrics.clear() |
589 | @@ -300,8 +276,8 @@ |
590 | metrics = [] |
591 | events = 0 |
592 | for metric in self.meter_metrics.itervalues(): |
593 | - message = metric.report(timestamp) |
594 | - metrics.append(message) |
595 | + messages = metric.report(timestamp) |
596 | + metrics.extend(messages) |
597 | events += 1 |
598 | |
599 | return (metrics, events) |
600 | @@ -311,14 +287,14 @@ |
601 | events = 0 |
602 | |
603 | for metric in self.plugin_metrics.itervalues(): |
604 | - message = metric.flush(interval, timestamp) |
605 | - metrics.append(message) |
606 | + messages = metric.flush(interval, timestamp) |
607 | + metrics.extend(messages) |
608 | events += 1 |
609 | |
610 | return (metrics, events) |
611 | |
612 | def flush_metrics_summary(self, messages, num_stats, timestamp): |
613 | - messages.append("statsd.numStats %s %s\n" % (num_stats, timestamp)) |
614 | + messages.append((self.metrics_summary, num_stats, timestamp)) |
615 | |
616 | def update_metrics(self): |
617 | for metric in self.meter_metrics.itervalues(): |
618 | |
619 | === modified file 'txstatsd/server/protocol.py' |
620 | --- txstatsd/server/protocol.py 2011-10-28 16:24:03 +0000 |
621 | +++ txstatsd/server/protocol.py 2011-12-02 17:13:07 +0000 |
622 | @@ -77,7 +77,7 @@ |
623 | """Flush messages queued in the processor to Graphite.""" |
624 | for message in self.processor.flush(interval=self.interval): |
625 | if self.connected and not self.paused: |
626 | - self.transport.write(message) |
627 | + self.transport.write("%s %s %s\n" % message) |
628 | |
629 | self.flush_message_graphite_metric() |
630 | |
631 | |
632 | === modified file 'txstatsd/tests/metrics/test_distinct.py' |
633 | --- txstatsd/tests/metrics/test_distinct.py 2011-11-18 20:03:34 +0000 |
634 | +++ txstatsd/tests/metrics/test_distinct.py 2011-12-02 17:13:07 +0000 |
635 | @@ -12,6 +12,7 @@ |
636 | |
637 | |
638 | class TestHash(TestCase): |
639 | + |
640 | def test_hash_chars(self): |
641 | "For one table, all chars map to different chars" |
642 | results = set() |
643 | @@ -43,6 +44,7 @@ |
644 | |
645 | |
646 | class TestZeros(TestCase): |
647 | + |
648 | def test_zeros(self): |
649 | self.assertEquals(distinct.zeros(1), 0) |
650 | self.assertEquals(distinct.zeros(2), 1) |
651 | @@ -53,6 +55,7 @@ |
652 | |
653 | |
654 | class TestDistinct(TestCase): |
655 | + |
656 | def test_all(self): |
657 | random.seed(1) |
658 | |
659 | @@ -65,6 +68,7 @@ |
660 | |
661 | |
662 | class TestDistinctMetricReporter(TestCase): |
663 | + |
664 | def test_reports(self): |
665 | random.seed(1) |
666 | _wall_time = [0] |
667 | @@ -80,7 +84,6 @@ |
668 | self.assertTrue(abs(dmr.count_1min(now) - 1) < 2) |
669 | self.assertTrue(abs(dmr.count_1hour(now) - 72) < 15) |
670 | self.assertTrue(abs(dmr.count_1day(now) - 1728) < 500) |
671 | - self.assertTrue("count_1hour" in dmr.flush(1, now)) |
672 | |
673 | |
674 | class TestPlugin(TestCase): |
675 | |
676 | === modified file 'txstatsd/tests/test_configurableprocessor.py' |
677 | --- txstatsd/tests/test_configurableprocessor.py 2011-11-18 17:13:52 +0000 |
678 | +++ txstatsd/tests/test_configurableprocessor.py 2011-12-02 17:13:07 +0000 |
679 | @@ -20,9 +20,8 @@ |
680 | configurable_processor.process("gorets:17|c") |
681 | messages = configurable_processor.flush() |
682 | self.assertEqual(2, len(messages)) |
683 | - counters = messages[0].splitlines() |
684 | - self.assertEqual("gorets.count 17 42", counters[0]) |
685 | - self.assertEqual("statsd.numStats 1 42", messages[1].splitlines()[0]) |
686 | + self.assertEqual(("gorets.count", 17, 42), messages[0]) |
687 | + self.assertEqual(("statsd.numStats", 1, 42), messages[1]) |
688 | |
689 | def test_flush_counter_with_prefix(self): |
690 | """ |
691 | @@ -33,10 +32,9 @@ |
692 | configurable_processor.process("gorets:17|c") |
693 | messages = configurable_processor.flush() |
694 | self.assertEqual(2, len(messages)) |
695 | - counters = messages[0].splitlines() |
696 | - self.assertEqual("test.metric.gorets.count 17 42", counters[0]) |
697 | - self.assertEqual("test.metric.statsd.numStats 1 42", |
698 | - messages[1].splitlines()[0]) |
699 | + self.assertEqual(("test.metric.gorets.count", 17, 42), messages[0]) |
700 | + self.assertEqual(("test.metric.statsd.numStats", 1, 42), |
701 | + messages[1]) |
702 | |
703 | def test_flush_plugin(self): |
704 | """ |
705 | @@ -47,8 +45,8 @@ |
706 | plugins=[distinct_metric_factory]) |
707 | configurable_processor.process("gorets:17|pd") |
708 | messages = configurable_processor.flush() |
709 | - self.assertEqual(2, len(messages)) |
710 | - self.assertTrue("test.metric.gorets" in messages[0]) |
711 | + self.assertEqual(5, len(messages)) |
712 | + self.assertEquals(("test.metric.gorets.count", 1, 42), messages[0]) |
713 | |
714 | |
715 | def test_flush_single_timer_single_time(self): |
716 | @@ -62,19 +60,18 @@ |
717 | configurable_processor.process("glork:24|ms") |
718 | messages = configurable_processor.flush() |
719 | |
720 | - self.assertEqual(2, len(messages)) |
721 | - timers = messages[0].splitlines() |
722 | - self.assertEqual("glork.min 24.0 42", timers[0]) |
723 | - self.assertEqual("glork.max 24.0 42", timers[1]) |
724 | - self.assertEqual("glork.mean 24.0 42", timers[2]) |
725 | - self.assertEqual("glork.stddev 0.0 42", timers[3]) |
726 | - self.assertEqual("glork.median 24.0 42", timers[4]) |
727 | - self.assertEqual("glork.75percentile 24.0 42", timers[5]) |
728 | - self.assertEqual("glork.95percentile 24.0 42", timers[6]) |
729 | - self.assertEqual("glork.98percentile 24.0 42", timers[7]) |
730 | - self.assertEqual("glork.99percentile 24.0 42", timers[8]) |
731 | - self.assertEqual("glork.999percentile 24.0 42", timers[9]) |
732 | - self.assertEqual("statsd.numStats 1 42", messages[1].splitlines()[0]) |
733 | + self.assertEqual(11, len(messages)) |
734 | + self.assertEqual(("glork.75percentile", 24.0, 42), messages[0]) |
735 | + self.assertEqual(("glork.95percentile", 24.0, 42), messages[1]) |
736 | + self.assertEqual(("glork.98percentile", 24.0, 42), messages[2]) |
737 | + self.assertEqual(("glork.999percentile", 24.0, 42), messages[3]) |
738 | + self.assertEqual(("glork.99percentile", 24.0, 42), messages[4]) |
739 | + self.assertEqual(("glork.max", 24.0, 42), messages[5]) |
740 | + self.assertEqual(("glork.mean", 24.0, 42), messages[6]) |
741 | + self.assertEqual(("glork.median", 24.0, 42), messages[7]) |
742 | + self.assertEqual(("glork.min", 24.0, 42), messages[8]) |
743 | + self.assertEqual(("glork.stddev", 0.0, 42), messages[9]) |
744 | + self.assertEqual(("statsd.numStats", 1, 42), messages[10]) |
745 | |
746 | def test_flush_single_timer_multiple_times(self): |
747 | """ |
748 | @@ -97,19 +94,18 @@ |
749 | configurable_processor.update_metrics() |
750 | |
751 | messages = configurable_processor.flush() |
752 | - self.assertEqual(2, len(messages)) |
753 | - timers = messages[0].splitlines() |
754 | - self.assertEqual("glork.min 4.0 42", timers[0]) |
755 | - self.assertEqual("glork.max 42.0 42", timers[1]) |
756 | - self.assertEqual("glork.mean 18.0 42", timers[2]) |
757 | - self.assertTrue(timers[3].startswith("glork.stddev 13.4907")) |
758 | - self.assertEqual("glork.median 15.5 42", timers[4]) |
759 | - self.assertEqual("glork.75percentile 27.75 42", timers[5]) |
760 | - self.assertEqual("glork.95percentile 42.0 42", timers[6]) |
761 | - self.assertEqual("glork.98percentile 42.0 42", timers[7]) |
762 | - self.assertEqual("glork.99percentile 42.0 42", timers[8]) |
763 | - self.assertEqual("glork.999percentile 42.0 42", timers[9]) |
764 | - self.assertEqual("statsd.numStats 1 42", messages[1].splitlines()[0]) |
765 | + self.assertEqual(11, len(messages)) |
766 | + self.assertEqual(("glork.75percentile", 27.75, 42), messages[0]) |
767 | + self.assertEqual(("glork.95percentile", 42.0, 42), messages[1]) |
768 | + self.assertEqual(("glork.98percentile", 42.0, 42), messages[2]) |
769 | + self.assertEqual(("glork.999percentile", 42.0, 42), messages[3]) |
770 | + self.assertEqual(("glork.99percentile", 42.0, 42), messages[4]) |
771 | + self.assertEqual(("glork.max", 42.0, 42), messages[5]) |
772 | + self.assertEqual(("glork.mean", 18.0, 42), messages[6]) |
773 | + self.assertEqual(("glork.median", 15.5, 42), messages[7]) |
774 | + self.assertEqual(("glork.min", 4.0, 42), messages[8]) |
775 | + self.assertEqual(("glork.stddev", 13.490738, 42), messages[9]) |
776 | + self.assertEqual(("statsd.numStats", 1, 42), messages[10]) |
777 | |
778 | |
779 | class FlushMeterMetricMessagesTest(TestCase): |
780 | @@ -135,23 +131,16 @@ |
781 | |
782 | self.time_now += 1 |
783 | messages = self.configurable_processor.flush() |
784 | - self.assertEqual(2, len(messages)) |
785 | - meter_metric = messages[0].splitlines() |
786 | - self.assertEqual( |
787 | - "test.metric.gorets.count 3.0 %s" % self.time_now, |
788 | - meter_metric[0]) |
789 | - self.assertEqual( |
790 | - "test.metric.gorets.mean_rate 3.0 %s" % self.time_now, |
791 | - meter_metric[1]) |
792 | - self.assertEqual( |
793 | - "test.metric.gorets.1min_rate 0.0 %s" % self.time_now, |
794 | - meter_metric[2]) |
795 | - self.assertEqual( |
796 | - "test.metric.gorets.5min_rate 0.0 %s" % self.time_now, |
797 | - meter_metric[3]) |
798 | - self.assertEqual( |
799 | - "test.metric.gorets.15min_rate 0.0 %s" % self.time_now, |
800 | - meter_metric[4]) |
801 | - self.assertEqual( |
802 | - "test.metric.statsd.numStats 1 %s" % self.time_now, |
803 | - messages[1].splitlines()[0]) |
804 | + self.assertEqual(6, len(messages)) |
805 | + self.assertEqual(("test.metric.gorets.15min_rate", 0.0, self.time_now), |
806 | + messages[0]) |
807 | + self.assertEqual(("test.metric.gorets.1min_rate", 0.0, self.time_now), |
808 | + messages[1]) |
809 | + self.assertEqual(("test.metric.gorets.5min_rate", 0.0, self.time_now), |
810 | + messages[2]) |
811 | + self.assertEqual(("test.metric.gorets.count", 3.0, self.time_now), |
812 | + messages[3]) |
813 | + self.assertEqual(("test.metric.gorets.mean_rate", 3.0, self.time_now), |
814 | + messages[4]) |
815 | + self.assertEqual(("test.metric.statsd.numStats", 1, self.time_now), |
816 | + messages[5]) |
817 | |
818 | === modified file 'txstatsd/tests/test_loggingprocessor.py' |
819 | --- txstatsd/tests/test_loggingprocessor.py 2011-11-18 17:13:52 +0000 |
820 | +++ txstatsd/tests/test_loggingprocessor.py 2011-12-02 17:13:07 +0000 |
821 | @@ -8,7 +8,7 @@ |
822 | |
823 | class FakeMeterMetric(object): |
824 | def report(self, *args): |
825 | - return 'Sample report' |
826 | + return [('Sample report', 1, 2)] |
827 | |
828 | class TestLogger(object): |
829 | def __init__(self): |
830 | @@ -44,7 +44,9 @@ |
831 | metric = FakeMeterMetric() |
832 | processor.meter_metrics['test'] = metric |
833 | processor.flush() |
834 | - self.assertEqual(metric.report() + "\n", logger.log) |
835 | + expected = "\n".join(["%s %s %s" % message |
836 | + for message in metric.report()]) |
837 | + self.assertEqual(expected + "\n", logger.log) |
838 | |
839 | def test_logger_plugin(self): |
840 | logger = TestLogger() |
841 | @@ -53,7 +55,9 @@ |
842 | time_function=lambda: 42) |
843 | processor.process("gorets:17|pd") |
844 | processor.flush() |
845 | - self.assertEqual(processor.plugin_metrics['gorets'].flush( |
846 | - 10, processor.time_function()), |
847 | - logger.log) |
848 | + messages = processor.plugin_metrics['gorets'].flush( |
849 | + 10, processor.time_function()) |
850 | + expected = "\n".join(["%s %s %s" % message |
851 | + for message in messages]) |
852 | + self.assertEqual(expected + "\n", logger.log) |
853 | |
854 | |
855 | === modified file 'txstatsd/tests/test_processor.py' |
856 | --- txstatsd/tests/test_processor.py 2011-11-18 20:03:34 +0000 |
857 | +++ txstatsd/tests/test_processor.py 2011-12-02 17:13:07 +0000 |
858 | @@ -130,7 +130,7 @@ |
859 | Flushing the message processor when there are no stats available should |
860 | still produce one message where C{statsd.numStats} is set to zero. |
861 | """ |
862 | - self.assertEqual(["statsd.numStats 0 42\n"], self.processor.flush()) |
863 | + self.assertEqual([("statsd.numStats", 0, 42)], self.processor.flush()) |
864 | |
865 | def test_flush_counter(self): |
866 | """ |
867 | @@ -139,11 +139,10 @@ |
868 | """ |
869 | self.processor.counter_metrics["gorets"] = 42 |
870 | messages = self.processor.flush() |
871 | - self.assertEqual(2, len(messages)) |
872 | - counters = messages[0].splitlines() |
873 | - self.assertEqual("stats.gorets 4 42", counters[0]) |
874 | - self.assertEqual("stats_counts.gorets 42 42", counters[1]) |
875 | - self.assertEqual("statsd.numStats 1 42", messages[1].splitlines()[0]) |
876 | + self.assertEqual(3, len(messages)) |
877 | + self.assertEqual(("stats.gorets", 4, 42), messages[0]) |
878 | + self.assertEqual(("stats_counts.gorets", 42, 42), messages[1]) |
879 | + self.assertEqual(("statsd.numStats", 1, 42), messages[2]) |
880 | self.assertEqual(0, self.processor.counter_metrics["gorets"]) |
881 | |
882 | def test_flush_counter_one_second_interval(self): |
883 | @@ -153,11 +152,10 @@ |
884 | """ |
885 | self.processor.counter_metrics["gorets"] = 42 |
886 | messages = self.processor.flush(interval=1000) |
887 | - self.assertEqual(2, len(messages)) |
888 | - counters = messages[0].splitlines() |
889 | - self.assertEqual("stats.gorets 42 42", counters[0]) |
890 | - self.assertEqual("stats_counts.gorets 42 42", counters[1]) |
891 | - self.assertEqual("statsd.numStats 1 42", messages[1].splitlines()[0]) |
892 | + self.assertEqual(3, len(messages)) |
893 | + self.assertEqual(("stats.gorets", 42, 42), messages[0]) |
894 | + self.assertEqual(("stats_counts.gorets", 42, 42), messages[1]) |
895 | + self.assertEqual(("statsd.numStats", 1, 42), messages[2]) |
896 | self.assertEqual(0, self.processor.counter_metrics["gorets"]) |
897 | |
898 | def test_flush_single_timer_single_time(self): |
899 | @@ -168,14 +166,13 @@ |
900 | """ |
901 | self.processor.timer_metrics["glork"] = [24] |
902 | messages = self.processor.flush() |
903 | - self.assertEqual(2, len(messages)) |
904 | - timers = messages[0].splitlines() |
905 | - self.assertEqual("stats.timers.glork.mean 24 42", timers[0]) |
906 | - self.assertEqual("stats.timers.glork.upper 24 42", timers[1]) |
907 | - self.assertEqual("stats.timers.glork.upper_90 24 42", timers[2]) |
908 | - self.assertEqual("stats.timers.glork.lower 24 42", timers[3]) |
909 | - self.assertEqual("stats.timers.glork.count 1 42", timers[4]) |
910 | - self.assertEqual("statsd.numStats 1 42", messages[1].splitlines()[0]) |
911 | + self.assertEqual(6, len(messages)) |
912 | + self.assertEqual(("stats.timers.glork.count", 1, 42), messages[0]) |
913 | + self.assertEqual(("stats.timers.glork.lower", 24, 42), messages[1]) |
914 | + self.assertEqual(("stats.timers.glork.mean", 24, 42), messages[2]) |
915 | + self.assertEqual(("stats.timers.glork.upper", 24, 42), messages[3]) |
916 | + self.assertEqual(("stats.timers.glork.upper_90", 24, 42), messages[4]) |
917 | + self.assertEqual(("statsd.numStats", 1, 42), messages[5]) |
918 | self.assertEqual([], self.processor.timer_metrics["glork"]) |
919 | |
920 | def test_flush_single_timer_multiple_times(self): |
921 | @@ -189,14 +186,13 @@ |
922 | """ |
923 | self.processor.timer_metrics["glork"] = [4, 8, 15, 16, 23, 42] |
924 | messages = self.processor.flush() |
925 | - self.assertEqual(2, len(messages)) |
926 | - timers = messages[0].splitlines() |
927 | - self.assertEqual("stats.timers.glork.mean 13 42", timers[0]) |
928 | - self.assertEqual("stats.timers.glork.upper 42 42", timers[1]) |
929 | - self.assertEqual("stats.timers.glork.upper_90 23 42", timers[2]) |
930 | - self.assertEqual("stats.timers.glork.lower 4 42", timers[3]) |
931 | - self.assertEqual("stats.timers.glork.count 6 42", timers[4]) |
932 | - self.assertEqual("statsd.numStats 1 42", messages[1].splitlines()[0]) |
933 | + self.assertEqual(6, len(messages)) |
934 | + self.assertEqual(("stats.timers.glork.count", 6, 42), messages[0]) |
935 | + self.assertEqual(("stats.timers.glork.lower", 4, 42), messages[1]) |
936 | + self.assertEqual(("stats.timers.glork.mean", 13, 42), messages[2]) |
937 | + self.assertEqual(("stats.timers.glork.upper", 42, 42), messages[3]) |
938 | + self.assertEqual(("stats.timers.glork.upper_90", 23, 42), messages[4]) |
939 | + self.assertEqual(("statsd.numStats", 1, 42), messages[5]) |
940 | self.assertEqual([], self.processor.timer_metrics["glork"]) |
941 | |
942 | def test_flush_single_timer_50th_percentile(self): |
943 | @@ -213,14 +209,13 @@ |
944 | """ |
945 | self.processor.timer_metrics["glork"] = [4, 8, 15, 16, 23, 42] |
946 | messages = self.processor.flush(percent=50) |
947 | - self.assertEqual(2, len(messages)) |
948 | - timers = messages[0].splitlines() |
949 | - self.assertEqual("stats.timers.glork.mean 9 42", timers[0]) |
950 | - self.assertEqual("stats.timers.glork.upper 42 42", timers[1]) |
951 | - self.assertEqual("stats.timers.glork.upper_50 15 42", timers[2]) |
952 | - self.assertEqual("stats.timers.glork.lower 4 42", timers[3]) |
953 | - self.assertEqual("stats.timers.glork.count 6 42", timers[4]) |
954 | - self.assertEqual("statsd.numStats 1 42", messages[1].splitlines()[0]) |
955 | + self.assertEqual(6, len(messages)) |
956 | + self.assertEqual(("stats.timers.glork.count", 6, 42), messages[0]) |
957 | + self.assertEqual(("stats.timers.glork.lower", 4, 42), messages[1]) |
958 | + self.assertEqual(("stats.timers.glork.mean", 9, 42), messages[2]) |
959 | + self.assertEqual(("stats.timers.glork.upper", 42, 42), messages[3]) |
960 | + self.assertEqual(("stats.timers.glork.upper_50", 15, 42), messages[4]) |
961 | + self.assertEqual(("statsd.numStats", 1, 42), messages[5]) |
962 | self.assertEqual([], self.processor.timer_metrics["glork"]) |
963 | |
964 | def test_flush_gauge_metric(self): |
965 | @@ -233,11 +228,10 @@ |
966 | |
967 | messages = self.processor.flush() |
968 | self.assertEqual(2, len(messages)) |
969 | - gauge_metric = messages[0].splitlines() |
970 | - self.assertEqual( |
971 | - "stats.gauge.gorets.value 9.6 42", gauge_metric[0]) |
972 | - self.assertEqual( |
973 | - "statsd.numStats 1 42", messages[1].splitlines()[0]) |
974 | + self.assertEqual( |
975 | + ("stats.gauge.gorets.value", 9.6, 42), messages[0]) |
976 | + self.assertEqual( |
977 | + ("statsd.numStats", 1, 42), messages[1]) |
978 | self.assertEqual(0, len(self.processor.gauge_metrics)) |
979 | |
980 | def test_flush_distinct_metric(self): |
981 | @@ -249,12 +243,11 @@ |
982 | self.processor.process("gorets:item|pd") |
983 | |
984 | messages = self.processor.flush() |
985 | - self.assertEqual(2, len(messages)) |
986 | - metrics = messages[0] |
987 | - self.assertTrue("stats.pdistinct.gorets.count " in metrics) |
988 | - self.assertTrue("stats.pdistinct.gorets.count_1hour" in metrics) |
989 | - self.assertTrue("stats.pdistinct.gorets.count_1min" in metrics) |
990 | - self.assertTrue("stats.pdistinct.gorets.count_1day" in metrics) |
991 | + self.assertEqual(5, len(messages)) |
992 | + self.assertEqual(("stats.pdistinct.gorets.count", 1, 42), messages[0]) |
993 | + self.assertEqual(("stats.pdistinct.gorets.count_1day", 5552568545, 42), messages[1]) |
994 | + self.assertEqual(("stats.pdistinct.gorets.count_1hour", 5552568545, 42), messages[2]) |
995 | + self.assertEqual(("stats.pdistinct.gorets.count_1min", 5552568545, 42), messages[3]) |
996 | |
997 | def test_flush_plugin_arguments(self): |
998 | """Test the passing of arguments for flush.""" |
999 | @@ -262,6 +255,7 @@ |
1000 | class FakeMetric(object): |
1001 | def flush(self, interval, timestamp): |
1002 | self.data = interval, timestamp |
1003 | + return [] |
1004 | |
1005 | self.processor.plugin_metrics["somemetric"] = FakeMetric() |
1006 | self.processor.flush(41000) |
1007 | @@ -291,26 +285,25 @@ |
1008 | |
1009 | self.time_now += 1 |
1010 | messages = self.processor.flush() |
1011 | - self.assertEqual(2, len(messages)) |
1012 | - meter_metric = messages[0].splitlines() |
1013 | - self.assertEqual( |
1014 | - "stats.meter.gorets.count 3.0 %s" % self.time_now, |
1015 | - meter_metric[0]) |
1016 | - self.assertEqual( |
1017 | - "stats.meter.gorets.mean_rate 3.0 %s" % self.time_now, |
1018 | - meter_metric[1]) |
1019 | - self.assertEqual( |
1020 | - "stats.meter.gorets.1min_rate 0.0 %s" % self.time_now, |
1021 | - meter_metric[2]) |
1022 | - self.assertEqual( |
1023 | - "stats.meter.gorets.5min_rate 0.0 %s" % self.time_now, |
1024 | - meter_metric[3]) |
1025 | - self.assertEqual( |
1026 | - "stats.meter.gorets.15min_rate 0.0 %s" % self.time_now, |
1027 | - meter_metric[4]) |
1028 | - self.assertEqual( |
1029 | - "statsd.numStats 1 %s" % self.time_now, |
1030 | - messages[1].splitlines()[0]) |
1031 | + self.assertEqual(6, len(messages)) |
1032 | + self.assertEqual( |
1033 | + ("stats.meter.gorets.15min_rate", 0.0, self.time_now), |
1034 | + messages[0]) |
1035 | + self.assertEqual( |
1036 | + ("stats.meter.gorets.1min_rate", 0.0, self.time_now), |
1037 | + messages[1]) |
1038 | + self.assertEqual( |
1039 | + ("stats.meter.gorets.5min_rate", 0.0, self.time_now), |
1040 | + messages[2]) |
1041 | + self.assertEqual( |
1042 | + ("stats.meter.gorets.count", 3.0, self.time_now), |
1043 | + messages[3]) |
1044 | + self.assertEqual( |
1045 | + ("stats.meter.gorets.mean_rate", 3.0, self.time_now), |
1046 | + messages[4]) |
1047 | + self.assertEqual( |
1048 | + ("statsd.numStats", 1, self.time_now), |
1049 | + messages[5]) |
1050 | |
1051 | # As we are employing the expected results from test_ewma.py |
1052 | # we perform the initial tick(), before advancing the clock 60sec. |
1053 | @@ -319,22 +312,21 @@ |
1054 | self.mark_minutes(1) |
1055 | self.time_now += 60 |
1056 | messages = self.processor.flush() |
1057 | - self.assertEqual(2, len(messages)) |
1058 | - meter_metric = messages[0].splitlines() |
1059 | - self.assertEqual( |
1060 | - "stats.meter.gorets.count 3.0 %s" % self.time_now, |
1061 | - meter_metric[0]) |
1062 | - self.assertTrue( |
1063 | - meter_metric[1].startswith( |
1064 | - "stats.meter.gorets.mean_rate 0.04918032")) |
1065 | - self.assertTrue( |
1066 | - meter_metric[2].startswith( |
1067 | - "stats.meter.gorets.1min_rate 0.22072766")) |
1068 | - self.assertTrue( |
1069 | - meter_metric[3].startswith( |
1070 | - "stats.meter.gorets.5min_rate 0.49123845")) |
1071 | - self.assertTrue( |
1072 | - meter_metric[4].startswith( |
1073 | - "stats.meter.gorets.15min_rate 0.5613041")) |
1074 | - self.assertEqual( |
1075 | - "statsd.numStats 1 %s" % self.time_now, messages[1].splitlines()[0]) |
1076 | + self.assertEqual(6, len(messages)) |
1077 | + self.assertEqual( |
1078 | + ("stats.meter.gorets.15min_rate", 0.561304, self.time_now), |
1079 | + messages[0]) |
1080 | + self.assertEqual( |
1081 | + ("stats.meter.gorets.1min_rate", 0.220728, self.time_now), |
1082 | + messages[1]) |
1083 | + self.assertEqual( |
1084 | + ("stats.meter.gorets.5min_rate", 0.491238, self.time_now), |
1085 | + messages[2]) |
1086 | + self.assertEqual( |
1087 | + ("stats.meter.gorets.count", 3.0, self.time_now), |
1088 | + messages[3]) |
1089 | + self.assertEqual( |
1090 | + ("stats.meter.gorets.mean_rate", 0.049180, self.time_now), |
1091 | + messages[4]) |
1092 | + self.assertEqual( |
1093 | + ("statsd.numStats", 1, self.time_now), messages[5]) |
1094 | |
1095 | === modified file 'txstatsd/tests/test_protocol.py' |
1096 | --- txstatsd/tests/test_protocol.py 2011-10-19 17:59:44 +0000 |
1097 | +++ txstatsd/tests/test_protocol.py 2011-12-02 17:13:07 +0000 |
1098 | @@ -13,9 +13,9 @@ |
1099 | self.sequence = 0 |
1100 | |
1101 | def flush(self, interval): |
1102 | - """Always produce a sequence number followed by 9 lines of output""" |
1103 | + """Always produce a sequence number""" |
1104 | self.sequence += 1 |
1105 | - return [str(self.sequence)] |
1106 | + return [("foo.bar", str(self.sequence), 42)] |
1107 | |
1108 | |
1109 | class FakeTransport(object): |
1110 | @@ -68,7 +68,7 @@ |
1111 | self.clock.advance(1) |
1112 | self.assertEqual(2, len(self.transport.messages)) |
1113 | # Last message is the message graphite metric. |
1114 | - self.assertEqual("3", self.transport.messages[-2]) |
1115 | + self.assertEqual("foo.bar 3 42\n", self.transport.messages[-2]) |
1116 | |
1117 | def test_stopped_producer_discards_everything(self): |
1118 | """ |
you are the god of refactoring