Merge lp:~sidnei/txstatsd/no-strings-attached into lp:txstatsd

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
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.
Revision history for this message
Lucio Torre (lucio.torre) wrote :

you are the god of refactoring

review: Approve

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 """

Subscribers

People subscribed via source and target branches