pulse_meter_core 0.5.3 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -13
- data/.rbenv-version +1 -1
- data/.travis.yml +2 -0
- data/pulse_meter_core.gemspec +1 -1
- data/spec/pulse_meter/command_aggregator/async_spec.rb +14 -14
- data/spec/pulse_meter/command_aggregator/sync_spec.rb +5 -5
- data/spec/pulse_meter/command_aggregator/udp_spec.rb +8 -8
- data/spec/pulse_meter/mixins/dumper_spec.rb +27 -27
- data/spec/pulse_meter/mixins/utils_spec.rb +64 -64
- data/spec/pulse_meter/observer/extended_spec.rb +20 -20
- data/spec/pulse_meter/observer_spec.rb +26 -26
- data/spec/pulse_meter/sensor/base_spec.rb +25 -25
- data/spec/pulse_meter/sensor/configuration_spec.rb +21 -21
- data/spec/pulse_meter/sensor/counter_spec.rb +12 -12
- data/spec/pulse_meter/sensor/hashed_counter_spec.rb +9 -9
- data/spec/pulse_meter/sensor/hashed_indicator_spec.rb +10 -10
- data/spec/pulse_meter/sensor/indicator_spec.rb +9 -9
- data/spec/pulse_meter/sensor/multi_spec.rb +13 -13
- data/spec/pulse_meter/sensor/timeline_spec.rb +12 -12
- data/spec/pulse_meter/sensor/timelined/multi_percentile_spec.rb +2 -2
- data/spec/pulse_meter/sensor/timelined/percentile_spec.rb +1 -1
- data/spec/pulse_meter/sensor/uniq_counter_spec.rb +5 -5
- data/spec/pulse_meter/udp_server_spec.rb +9 -9
- data/spec/pulse_meter_spec.rb +21 -21
- data/spec/shared_examples/timeline_sensor.rb +88 -88
- data/spec/shared_examples/timelined_subclass.rb +2 -2
- data/spec/spec_helper.rb +2 -0
- data/spec/support/matchers.rb +2 -2
- metadata +34 -34
@@ -19,11 +19,11 @@ describe PulseMeter::Observer::Extended do
|
|
19
19
|
|
20
20
|
dummy.incr(40)
|
21
21
|
|
22
|
-
parameters[:self].
|
23
|
-
parameters[:delta].
|
24
|
-
parameters[:result].
|
25
|
-
parameters[:exception].
|
26
|
-
parameters[:args].
|
22
|
+
expect(parameters[:self]).to eq(dummy)
|
23
|
+
expect(parameters[:delta]).to be >= 1000
|
24
|
+
expect(parameters[:result]).to eq(40)
|
25
|
+
expect(parameters[:exception]).to be_nil
|
26
|
+
expect(parameters[:args]).to eq([40])
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -35,12 +35,12 @@ describe PulseMeter::Observer::Extended do
|
|
35
35
|
parameters = params
|
36
36
|
end
|
37
37
|
|
38
|
-
|
38
|
+
expect { dummy.error }.to raise_error(RuntimeError)
|
39
39
|
|
40
|
-
parameters[:self].
|
41
|
-
parameters[:result].
|
42
|
-
parameters[:exception].class.
|
43
|
-
parameters[:args].
|
40
|
+
expect(parameters[:self]).to eq(dummy)
|
41
|
+
expect(parameters[:result]).to eq(nil)
|
42
|
+
expect(parameters[:exception].class).to eq(RuntimeError)
|
43
|
+
expect(parameters[:args]).to eq([])
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
@@ -63,11 +63,11 @@ describe PulseMeter::Observer::Extended do
|
|
63
63
|
|
64
64
|
ObservedDummy.incr(40)
|
65
65
|
|
66
|
-
parameters[:self].
|
67
|
-
parameters[:delta].
|
68
|
-
parameters[:result].
|
69
|
-
parameters[:exception].
|
70
|
-
parameters[:args].
|
66
|
+
expect(parameters[:self]).to eq(ObservedDummy)
|
67
|
+
expect(parameters[:delta]).to be >= 1000
|
68
|
+
expect(parameters[:result]).to eq(40)
|
69
|
+
expect(parameters[:exception]).to be_nil
|
70
|
+
expect(parameters[:args]).to eq([40])
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
@@ -79,12 +79,12 @@ describe PulseMeter::Observer::Extended do
|
|
79
79
|
parameters = params
|
80
80
|
end
|
81
81
|
|
82
|
-
|
82
|
+
expect { ObservedDummy.error }.to raise_error(RuntimeError)
|
83
83
|
|
84
|
-
parameters[:self].
|
85
|
-
parameters[:result].
|
86
|
-
parameters[:exception].class.
|
87
|
-
parameters[:args].
|
84
|
+
expect(parameters[:self]).to eq(ObservedDummy)
|
85
|
+
expect(parameters[:result]).to eq(nil)
|
86
|
+
expect(parameters[:exception].class).to eq(RuntimeError)
|
87
|
+
expect(parameters[:args]).to eq([])
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
@@ -23,13 +23,13 @@ describe PulseMeter::Observer do
|
|
23
23
|
it "executes block in context of sensor each time specified method of given class called" do
|
24
24
|
create_observer
|
25
25
|
5.times {dummy.incr}
|
26
|
-
sensor.value.
|
26
|
+
expect(sensor.value).to eq(5)
|
27
27
|
end
|
28
28
|
|
29
29
|
it "passes arguments to observed method" do
|
30
30
|
create_observer
|
31
31
|
5.times {dummy.incr(10)}
|
32
|
-
dummy.count.
|
32
|
+
expect(dummy.count).to eq(50)
|
33
33
|
end
|
34
34
|
|
35
35
|
it "passes methods' params to block" do
|
@@ -38,7 +38,7 @@ describe PulseMeter::Observer do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
5.times {dummy.incr(10)}
|
41
|
-
sensor.value.
|
41
|
+
expect(sensor.value).to eq(50)
|
42
42
|
end
|
43
43
|
|
44
44
|
it "passes execution time in milliseconds to block" do
|
@@ -48,7 +48,7 @@ describe PulseMeter::Observer do
|
|
48
48
|
end
|
49
49
|
|
50
50
|
dummy.incr
|
51
|
-
sensor.value.
|
51
|
+
expect(sensor.value).to be >= 1000
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
@@ -57,26 +57,26 @@ describe PulseMeter::Observer do
|
|
57
57
|
raise RuntimeError
|
58
58
|
end
|
59
59
|
|
60
|
-
|
61
|
-
dummy.count.
|
60
|
+
expect {dummy.incr}.not_to raise_error
|
61
|
+
expect(dummy.count).to eq(1)
|
62
62
|
end
|
63
63
|
|
64
64
|
it "uses first observer in case of double observation" do
|
65
65
|
create_observer(:incr, 1)
|
66
66
|
create_observer(:incr, 2)
|
67
67
|
5.times {dummy.incr}
|
68
|
-
sensor.value.
|
68
|
+
expect(sensor.value).to eq(5)
|
69
69
|
end
|
70
70
|
|
71
71
|
it "keeps observed methods' errors" do
|
72
72
|
create_observer(:error)
|
73
|
-
|
74
|
-
sensor.value.
|
73
|
+
expect {dummy.error}.to raise_error
|
74
|
+
expect(sensor.value).to eq(1)
|
75
75
|
end
|
76
76
|
|
77
77
|
it "makes observed method return its value" do
|
78
78
|
create_observer
|
79
|
-
dummy.incr.
|
79
|
+
expect(dummy.incr).to eq(1)
|
80
80
|
end
|
81
81
|
|
82
82
|
it "allows to pass blocks to observed method" do
|
@@ -84,13 +84,13 @@ describe PulseMeter::Observer do
|
|
84
84
|
dummy.incr do
|
85
85
|
2
|
86
86
|
end
|
87
|
-
dummy.count.
|
87
|
+
expect(dummy.count).to eq(3)
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
91
|
describe ".unobserve_method" do
|
92
92
|
it "does nothing unless method is observed" do
|
93
|
-
|
93
|
+
expect {remove_observer}.not_to raise_error
|
94
94
|
end
|
95
95
|
|
96
96
|
it "removes observation from observed method" do
|
@@ -98,7 +98,7 @@ describe PulseMeter::Observer do
|
|
98
98
|
dummy.incr
|
99
99
|
remove_observer
|
100
100
|
dummy.incr
|
101
|
-
sensor.value.
|
101
|
+
expect(sensor.value).to eq(1)
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|
@@ -125,13 +125,13 @@ describe PulseMeter::Observer do
|
|
125
125
|
it "executes block in context of sensor each time specified method of given class called" do
|
126
126
|
create_observer
|
127
127
|
5.times {dummy.incr}
|
128
|
-
sensor.value.
|
128
|
+
expect(sensor.value).to eq(5)
|
129
129
|
end
|
130
130
|
|
131
131
|
it "passes arguments to observed method" do
|
132
132
|
create_observer
|
133
133
|
5.times {dummy.incr(10)}
|
134
|
-
dummy.count.
|
134
|
+
expect(dummy.count).to eq(50)
|
135
135
|
end
|
136
136
|
|
137
137
|
it "passes methods' params to block" do
|
@@ -140,7 +140,7 @@ describe PulseMeter::Observer do
|
|
140
140
|
end
|
141
141
|
|
142
142
|
5.times {dummy.incr(10)}
|
143
|
-
sensor.value.
|
143
|
+
expect(sensor.value).to eq(50)
|
144
144
|
end
|
145
145
|
|
146
146
|
it "passes execution time in milliseconds to block" do
|
@@ -150,7 +150,7 @@ describe PulseMeter::Observer do
|
|
150
150
|
end
|
151
151
|
|
152
152
|
dummy.incr
|
153
|
-
sensor.value.
|
153
|
+
expect(sensor.value).to eq(1000)
|
154
154
|
end
|
155
155
|
end
|
156
156
|
|
@@ -159,26 +159,26 @@ describe PulseMeter::Observer do
|
|
159
159
|
raise RuntimeError
|
160
160
|
end
|
161
161
|
|
162
|
-
|
163
|
-
dummy.count.
|
162
|
+
expect {dummy.incr}.not_to raise_error
|
163
|
+
expect(dummy.count).to eq(1)
|
164
164
|
end
|
165
165
|
|
166
166
|
it "uses first observer in case of double observation" do
|
167
167
|
create_observer(:incr, 1)
|
168
168
|
create_observer(:incr, 2)
|
169
169
|
5.times {dummy.incr}
|
170
|
-
sensor.value.
|
170
|
+
expect(sensor.value).to eq(5)
|
171
171
|
end
|
172
172
|
|
173
173
|
it "keeps observed methods' errors" do
|
174
174
|
create_observer(:error)
|
175
|
-
|
176
|
-
sensor.value.
|
175
|
+
expect {dummy.error}.to raise_error
|
176
|
+
expect(sensor.value).to eq(1)
|
177
177
|
end
|
178
178
|
|
179
179
|
it "makes observed method return its value" do
|
180
180
|
create_observer
|
181
|
-
dummy.incr.
|
181
|
+
expect(dummy.incr).to eq(1)
|
182
182
|
end
|
183
183
|
|
184
184
|
it "allows to pass blocks to observed method" do
|
@@ -186,13 +186,13 @@ describe PulseMeter::Observer do
|
|
186
186
|
dummy.incr do
|
187
187
|
2
|
188
188
|
end
|
189
|
-
dummy.count.
|
189
|
+
expect(dummy.count).to eq(3)
|
190
190
|
end
|
191
191
|
end
|
192
192
|
|
193
193
|
describe ".unobserve_class_method" do
|
194
194
|
it "does nothing unless method is observed" do
|
195
|
-
|
195
|
+
expect {remove_observer}.not_to raise_error
|
196
196
|
end
|
197
197
|
|
198
198
|
it "removes observation from observed method" do
|
@@ -200,7 +200,7 @@ describe PulseMeter::Observer do
|
|
200
200
|
dummy.incr
|
201
201
|
remove_observer
|
202
202
|
dummy.incr
|
203
|
-
sensor.value.
|
203
|
+
expect(sensor.value).to eq(1)
|
204
204
|
end
|
205
205
|
end
|
206
206
|
end
|
@@ -8,7 +8,7 @@ describe PulseMeter::Sensor::Base do
|
|
8
8
|
|
9
9
|
describe '#initialize' do
|
10
10
|
context 'when PulseMeter.redis is not initialized' do
|
11
|
-
it "
|
11
|
+
it "raises RedisNotInitialized exception" do
|
12
12
|
PulseMeter.redis = nil
|
13
13
|
expect{ described_class.new(:foo) }.to raise_exception(PulseMeter::RedisNotInitialized)
|
14
14
|
end
|
@@ -17,7 +17,7 @@ describe PulseMeter::Sensor::Base do
|
|
17
17
|
context 'when PulseMeter.redis is initialized' do
|
18
18
|
|
19
19
|
context 'when passed sensor name is bad' do
|
20
|
-
it "
|
20
|
+
it "raises BadSensorName exception" do
|
21
21
|
['name with whitespace', 'name|with|bad|characters'].each do |bad_name|
|
22
22
|
expect{ described_class.new(bad_name) }.to raise_exception(PulseMeter::BadSensorName)
|
23
23
|
end
|
@@ -25,24 +25,24 @@ describe PulseMeter::Sensor::Base do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
context 'when passed sensor name is valid' do
|
28
|
-
it "
|
29
|
-
described_class.new("foo_@").
|
28
|
+
it "successfully creates object" do
|
29
|
+
expect(described_class.new("foo_@")).not_to be_nil
|
30
30
|
end
|
31
31
|
|
32
|
-
it "
|
32
|
+
it "initializes attributes #redis and #name" do
|
33
33
|
sensor = described_class.new(:foo)
|
34
|
-
sensor.name.
|
35
|
-
sensor.redis.
|
34
|
+
expect(sensor.name).to eq('foo')
|
35
|
+
expect(sensor.redis).to eq(PulseMeter.redis)
|
36
36
|
end
|
37
37
|
|
38
|
-
it "
|
39
|
-
described_class.restore(name).
|
38
|
+
it "saves dump to redis automatically to let the object be restored by name" do
|
39
|
+
expect(described_class.restore(name)).to be_instance_of(described_class)
|
40
40
|
end
|
41
41
|
|
42
|
-
it "
|
42
|
+
it "annotates object if annotation given" do
|
43
43
|
described_class.new(:foo, :annotation => "annotation")
|
44
44
|
sensor = described_class.restore(:foo)
|
45
|
-
sensor.annotation.
|
45
|
+
expect(sensor.annotation).to eq("annotation")
|
46
46
|
end
|
47
47
|
end
|
48
48
|
end
|
@@ -50,7 +50,7 @@ describe PulseMeter::Sensor::Base do
|
|
50
50
|
|
51
51
|
describe '#annotate' do
|
52
52
|
|
53
|
-
it "
|
53
|
+
it "stores sensor annotation in redis" do
|
54
54
|
expect {sensor.annotate(description)}.to change{redis.keys('*').count}.by(1)
|
55
55
|
end
|
56
56
|
|
@@ -58,47 +58,47 @@ describe PulseMeter::Sensor::Base do
|
|
58
58
|
|
59
59
|
describe '#annotation' do
|
60
60
|
context "when sensor was annotated" do
|
61
|
-
it "
|
61
|
+
it "returns stored annotation" do
|
62
62
|
sensor.annotate(description)
|
63
|
-
sensor.annotation.
|
63
|
+
expect(sensor.annotation).to eq(description)
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
67
|
context "when sensor was not annotated" do
|
68
|
-
it "
|
69
|
-
sensor.annotation.
|
68
|
+
it "returns nil" do
|
69
|
+
expect(sensor.annotation).to be_nil
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
73
|
context "after sensor data was cleaned" do
|
74
|
-
it "
|
74
|
+
it "returns nil" do
|
75
75
|
sensor.annotate(description)
|
76
76
|
sensor.cleanup
|
77
|
-
sensor.annotation.
|
77
|
+
expect(sensor.annotation).to be_nil
|
78
78
|
end
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
82
82
|
describe "#cleanup" do
|
83
|
-
it "
|
83
|
+
it "removes from redis all sensor data" do
|
84
84
|
sensor.event(123)
|
85
85
|
sensor.annotate(description)
|
86
86
|
sensor.cleanup
|
87
|
-
redis.keys('*').
|
87
|
+
expect(redis.keys('*')).to be_empty
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
91
|
describe "#event" do
|
92
92
|
context "when everything is ok" do
|
93
|
-
it "
|
94
|
-
sensor.event(nil).
|
93
|
+
it "does nothing and return true" do
|
94
|
+
expect(sensor.event(nil)).to be
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
98
|
context "when an error occures while processing event" do
|
99
|
-
it "
|
100
|
-
sensor.
|
101
|
-
sensor.event(nil).
|
99
|
+
it "catches StandardErrors and return false" do
|
100
|
+
allow(sensor).to receive(:process_event) {raise StandardError}
|
101
|
+
expect(sensor.event(nil)).not_to be
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end
|
@@ -15,43 +15,43 @@ describe PulseMeter::Sensor::Configuration do
|
|
15
15
|
describe "#add_sensor" do
|
16
16
|
let(:cfg) {described_class.new}
|
17
17
|
|
18
|
-
it "
|
19
|
-
cfg.has_sensor?(:foo).
|
18
|
+
it "creates sensor available under passed name" do
|
19
|
+
expect(cfg.has_sensor?(:foo)).not_to be
|
20
20
|
cfg.add_sensor(:foo, sensor_type: 'counter')
|
21
|
-
cfg.has_sensor?(:foo).
|
21
|
+
expect(cfg.has_sensor?(:foo)).not_to be
|
22
22
|
end
|
23
23
|
|
24
|
-
it "
|
24
|
+
it "has event shortcut for the sensor" do
|
25
25
|
cfg.add_sensor(:foo, sensor_type: 'counter')
|
26
26
|
puts cfg.to_yaml
|
27
|
-
cfg.sensor(:foo){|s| s.
|
27
|
+
cfg.sensor(:foo){|s| expect(s).to receive(:event).with(321)}
|
28
28
|
cfg.foo(321)
|
29
29
|
end
|
30
|
-
|
31
|
-
it "
|
30
|
+
|
31
|
+
it "has event_at shortcut for the sensor" do
|
32
32
|
cfg.add_sensor(:foo, sensor_type: 'counter')
|
33
33
|
now = Time.now
|
34
34
|
cfg.sensor(:foo) do |sensor|
|
35
|
-
sensor.
|
35
|
+
expect(sensor).to receive(:event_at).with(now, 321)
|
36
36
|
end
|
37
37
|
cfg.foo_at(now, 321)
|
38
38
|
end
|
39
39
|
|
40
|
-
it "
|
40
|
+
it "creates sensor with correct type" do
|
41
41
|
cfg.add_sensor(:foo, sensor_type: 'counter')
|
42
|
-
cfg.sensor(:foo){|s| s.
|
42
|
+
cfg.sensor(:foo){|s| expect(s).to be_kind_of(PulseMeter::Sensor::Counter)}
|
43
43
|
end
|
44
44
|
|
45
|
-
it "
|
45
|
+
it "does not raise exception if sensor type is bad" do
|
46
46
|
expect{ cfg.add_sensor(:foo, sensor_type: 'baaaar') }.not_to raise_exception
|
47
47
|
end
|
48
48
|
|
49
|
-
it "
|
49
|
+
it "passes args to created sensor" do
|
50
50
|
cfg.add_sensor(:foo, sensor_type: 'counter', args: {annotation: "My Foo Counter"} )
|
51
|
-
cfg.sensor(:foo){|s| s.annotation.
|
51
|
+
cfg.sensor(:foo){|s| expect(s.annotation).to eq("My Foo Counter") }
|
52
52
|
end
|
53
53
|
|
54
|
-
it "
|
54
|
+
it "accepts hashie-objects" do
|
55
55
|
class Dummy
|
56
56
|
def sensor_type
|
57
57
|
'counter'
|
@@ -62,12 +62,12 @@ describe PulseMeter::Sensor::Configuration do
|
|
62
62
|
end
|
63
63
|
|
64
64
|
cfg.add_sensor(:foo, Dummy.new)
|
65
|
-
cfg.sensor(:foo){|s| s.annotation.
|
65
|
+
cfg.sensor(:foo){|s| expect(s.annotation).to eq("My Foo Counter")}
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
69
|
describe ".new" do
|
70
|
-
it "
|
70
|
+
it "adds passed sensor setting hash using keys as names" do
|
71
71
|
opts = {
|
72
72
|
cnt: {
|
73
73
|
sensor_type: 'counter'
|
@@ -79,15 +79,15 @@ describe PulseMeter::Sensor::Configuration do
|
|
79
79
|
cfg1 = described_class.new(opts)
|
80
80
|
cfg2 = described_class.new
|
81
81
|
opts.each{|k,v| cfg2.add_sensor(k, v)}
|
82
|
-
cfg1.sensors.to_yaml.
|
82
|
+
expect(cfg1.sensors.to_yaml).to eq(cfg2.sensors.to_yaml)
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
86
|
describe "#sensor" do
|
87
|
-
it "
|
87
|
+
it "gives access to added sensors via block" do
|
88
88
|
cfg = described_class.new(counter_config)
|
89
|
-
cfg.sensor(:cnt){ |s| s.annotation.
|
90
|
-
cfg.sensor("cnt"){ |s| s.annotation.
|
89
|
+
cfg.sensor(:cnt){ |s| expect(s.annotation).to eq("MySensor") }
|
90
|
+
cfg.sensor("cnt"){ |s| expect(s.annotation).to eq("MySensor") }
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
@@ -97,7 +97,7 @@ describe PulseMeter::Sensor::Configuration do
|
|
97
97
|
sensors = {}
|
98
98
|
cfg.each {|s| sensors[s.name.to_sym] = s}
|
99
99
|
sensor = cfg.sensor(:cnt){|s| s}
|
100
|
-
sensors.
|
100
|
+
expect(sensors).to eq({:cnt => sensor})
|
101
101
|
end
|
102
102
|
end
|
103
103
|
end
|