25
25
unit. 'c' is simply used to signal that this is a counter message.
27
27
self.processor.process("gorets:1|c")
28
self.assertEqual(1, len(self.processor.counters))
29
self.assertEqual(1.0, self.processor.counters["gorets"])
28
self.assertEqual(1, len(self.processor.counter_metrics))
29
self.assertEqual(1.0, self.processor.counter_metrics["gorets"])
31
31
def test_receive_counter_rate(self):
39
39
self.processor.process("gorets:1|c|@0.1")
40
self.assertEqual(1, len(self.processor.counters))
41
self.assertEqual(10.0, self.processor.counters["gorets"])
40
self.assertEqual(1, len(self.processor.counter_metrics))
41
self.assertEqual(10.0, self.processor.counter_metrics["gorets"])
43
43
def test_receive_timer(self):
46
46
identifier and '320' is the time in milliseconds.
48
48
self.processor.process("glork:320|ms")
49
self.assertEqual(1, len(self.processor.timers))
50
self.assertEqual([320], self.processor.timers["glork"])
49
self.assertEqual(1, len(self.processor.timer_metrics))
50
self.assertEqual([320], self.processor.timer_metrics["glork"])
52
def test_receive_gauge_metric(self):
54
A gauge metric message takes the form:
56
'g' indicates this is a gauge metric message.
58
self.processor.process("gorets:9.6|g")
59
self.assertEqual(1, len(self.processor.gauge_metrics))
62
self.processor.gauge_metrics.pop())
52
64
def test_receive_message_no_fields(self):
54
66
If a timer message has no fields, it is logged and discarded.
56
68
self.processor.process("glork")
57
self.assertEqual(0, len(self.processor.timers))
58
self.assertEqual(0, len(self.processor.counters))
69
self.assertEqual(0, len(self.processor.timer_metrics))
70
self.assertEqual(0, len(self.processor.counter_metrics))
59
71
self.assertEqual(["glork"], self.processor.failures)
61
73
def test_receive_counter_no_value(self):
63
75
If a counter message has no value, it is logged and discarded.
65
77
self.processor.process("gorets:|c")
66
self.assertEqual(0, len(self.processor.counters))
78
self.assertEqual(0, len(self.processor.counter_metrics))
67
79
self.assertEqual(["gorets:|c"], self.processor.failures)
69
81
def test_receive_timer_no_value(self):
71
83
If a timer message has no value, it is logged and discarded.
73
85
self.processor.process("glork:|ms")
74
self.assertEqual(0, len(self.processor.timers))
86
self.assertEqual(0, len(self.processor.timer_metrics))
75
87
self.assertEqual(["glork:|ms"], self.processor.failures)
77
89
def test_receive_not_enough_fields(self):
79
91
If a timer message has not enough fields, it is logged and discarded.
81
93
self.processor.process("glork:1")
82
self.assertEqual(0, len(self.processor.timers))
83
self.assertEqual(0, len(self.processor.counters))
94
self.assertEqual(0, len(self.processor.timer_metrics))
95
self.assertEqual(0, len(self.processor.counter_metrics))
84
96
self.assertEqual(["glork:1"], self.processor.failures)
86
98
def test_receive_too_many_fields(self):
88
100
If a timer message has too many fields, it is logged and discarded.
90
102
self.processor.process("gorets:1|c|@0.1|yay")
91
self.assertEqual(0, len(self.processor.timers))
92
self.assertEqual(0, len(self.processor.counters))
103
self.assertEqual(0, len(self.processor.timer_metrics))
104
self.assertEqual(0, len(self.processor.counter_metrics))
93
105
self.assertEqual(["gorets:1|c|@0.1|yay"], self.processor.failures)
110
122
If a counter is present, flushing it will generate a counter message
111
123
normalized to the default interval.
113
self.processor.counters["gorets"] = 42
125
self.processor.counter_metrics["gorets"] = 42
114
126
messages = self.processor.flush()
115
127
self.assertEqual(2, len(messages))
116
128
counters = messages[0].splitlines()
117
129
self.assertEqual("stats.gorets 4 42", counters[0])
118
130
self.assertEqual("stats_counts.gorets 42 42", counters[1])
119
131
self.assertEqual("statsd.numStats 1 42", messages[1])
120
self.assertEqual(0, self.processor.counters["gorets"])
132
self.assertEqual(0, self.processor.counter_metrics["gorets"])
122
134
def test_flush_counter_one_second_interval(self):
124
136
It is possible to flush counters with a one-second interval, in which
125
137
case the counter value will be unchanged.
127
self.processor.counters["gorets"] = 42
139
self.processor.counter_metrics["gorets"] = 42
128
140
messages = self.processor.flush(interval=1000)
129
141
self.assertEqual(2, len(messages))
130
142
counters = messages[0].splitlines()
131
143
self.assertEqual("stats.gorets 42 42", counters[0])
132
144
self.assertEqual("stats_counts.gorets 42 42", counters[1])
133
145
self.assertEqual("statsd.numStats 1 42", messages[1])
134
self.assertEqual(0, self.processor.counters["gorets"])
146
self.assertEqual(0, self.processor.counter_metrics["gorets"])
136
148
def test_flush_single_timer_single_time(self):
139
151
threshold_upper, lower, mean will be set to the same value. Timer is
140
152
reset after flush is called.
142
self.processor.timers["glork"] = [24]
154
self.processor.timer_metrics["glork"] = [24]
143
155
messages = self.processor.flush()
144
156
self.assertEqual(2, len(messages))
145
157
timers = messages[0].splitlines()
149
161
self.assertEqual("stats.timers.glork.lower 24 42", timers[3])
150
162
self.assertEqual("stats.timers.glork.count 1 42", timers[4])
151
163
self.assertEqual("statsd.numStats 1 42", messages[1])
152
self.assertEqual([], self.processor.timers["glork"])
164
self.assertEqual([], self.processor.timer_metrics["glork"])
154
166
def test_flush_single_timer_multiple_times(self):
160
172
- count will be the count of data points
161
173
- mean will be the mean value within the 90th percentile
163
self.processor.timers["glork"] = [4, 8, 15, 16, 23, 42]
175
self.processor.timer_metrics["glork"] = [4, 8, 15, 16, 23, 42]
164
176
messages = self.processor.flush()
165
177
self.assertEqual(2, len(messages))
166
178
timers = messages[0].splitlines()
170
182
self.assertEqual("stats.timers.glork.lower 4 42", timers[3])
171
183
self.assertEqual("stats.timers.glork.count 6 42", timers[4])
172
184
self.assertEqual("statsd.numStats 1 42", messages[1])
173
self.assertEqual([], self.processor.timers["glork"])
185
self.assertEqual([], self.processor.timer_metrics["glork"])
175
187
def test_flush_single_timer_50th_percentile(self):
184
196
- count will be the count of data points
185
197
- mean will be the mean value within the 50th percentile
187
self.processor.timers["glork"] = [4, 8, 15, 16, 23, 42]
199
self.processor.timer_metrics["glork"] = [4, 8, 15, 16, 23, 42]
188
200
messages = self.processor.flush(percent=50)
189
201
self.assertEqual(2, len(messages))
190
202
timers = messages[0].splitlines()
194
206
self.assertEqual("stats.timers.glork.lower 4 42", timers[3])
195
207
self.assertEqual("stats.timers.glork.count 6 42", timers[4])
196
208
self.assertEqual("statsd.numStats 1 42", messages[1])
197
self.assertEqual([], self.processor.timers["glork"])
209
self.assertEqual([], self.processor.timer_metrics["glork"])
211
def test_flush_gauge_metric(self):
213
Test the correct rendering of the Graphite report for
217
self.processor.process("gorets:9.6|g")
219
messages = self.processor.flush()
220
self.assertEqual(2, len(messages))
221
gauge_metric = messages[0].splitlines()
223
"stats.gauge.gorets.value 9.6 42", gauge_metric[0])
225
"statsd.numStats 1 42", messages[1])
226
self.assertEqual(0, len(self.processor.gauge_metrics))