pulse-meter 0.4.9 → 0.4.11

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.
Files changed (192) hide show
  1. data/Rakefile +1 -48
  2. data/lib/pulse-meter.rb +1 -68
  3. data/lib/pulse-meter/visualizer.rb +1 -40
  4. data/pulse-meter.gemspec +4 -26
  5. metadata +10 -558
  6. data/Procfile +0 -3
  7. data/bin/pulse +0 -6
  8. data/examples/basic.ru +0 -145
  9. data/examples/basic_sensor_data.rb +0 -96
  10. data/examples/udp_benchmark.rb +0 -29
  11. data/lib/cmd.rb +0 -171
  12. data/lib/pulse-meter/command_aggregator/async.rb +0 -83
  13. data/lib/pulse-meter/command_aggregator/sync.rb +0 -18
  14. data/lib/pulse-meter/command_aggregator/udp.rb +0 -48
  15. data/lib/pulse-meter/extensions/enumerable.rb +0 -24
  16. data/lib/pulse-meter/mixins/cmd.rb +0 -46
  17. data/lib/pulse-meter/mixins/dumper.rb +0 -87
  18. data/lib/pulse-meter/mixins/utils.rb +0 -155
  19. data/lib/pulse-meter/observer.rb +0 -120
  20. data/lib/pulse-meter/observer/extended.rb +0 -34
  21. data/lib/pulse-meter/sensor.rb +0 -61
  22. data/lib/pulse-meter/sensor/base.rb +0 -88
  23. data/lib/pulse-meter/sensor/configuration.rb +0 -106
  24. data/lib/pulse-meter/sensor/counter.rb +0 -39
  25. data/lib/pulse-meter/sensor/hashed_counter.rb +0 -36
  26. data/lib/pulse-meter/sensor/hashed_indicator.rb +0 -24
  27. data/lib/pulse-meter/sensor/indicator.rb +0 -35
  28. data/lib/pulse-meter/sensor/multi.rb +0 -97
  29. data/lib/pulse-meter/sensor/timeline.rb +0 -236
  30. data/lib/pulse-meter/sensor/timeline_reduce.rb +0 -68
  31. data/lib/pulse-meter/sensor/timelined/average.rb +0 -32
  32. data/lib/pulse-meter/sensor/timelined/counter.rb +0 -23
  33. data/lib/pulse-meter/sensor/timelined/hashed_counter.rb +0 -31
  34. data/lib/pulse-meter/sensor/timelined/hashed_indicator.rb +0 -30
  35. data/lib/pulse-meter/sensor/timelined/indicator.rb +0 -23
  36. data/lib/pulse-meter/sensor/timelined/max.rb +0 -19
  37. data/lib/pulse-meter/sensor/timelined/median.rb +0 -14
  38. data/lib/pulse-meter/sensor/timelined/min.rb +0 -19
  39. data/lib/pulse-meter/sensor/timelined/multi_percentile.rb +0 -34
  40. data/lib/pulse-meter/sensor/timelined/percentile.rb +0 -22
  41. data/lib/pulse-meter/sensor/timelined/uniq_counter.rb +0 -22
  42. data/lib/pulse-meter/sensor/timelined/zset_based.rb +0 -38
  43. data/lib/pulse-meter/sensor/uniq_counter.rb +0 -24
  44. data/lib/pulse-meter/server.rb +0 -0
  45. data/lib/pulse-meter/server/command_line_options.rb +0 -0
  46. data/lib/pulse-meter/server/config_options.rb +0 -0
  47. data/lib/pulse-meter/server/sensors.rb +0 -0
  48. data/lib/pulse-meter/udp_server.rb +0 -45
  49. data/lib/pulse-meter/version.rb +0 -3
  50. data/lib/pulse-meter/visualize/app.rb +0 -78
  51. data/lib/pulse-meter/visualize/base.rb +0 -15
  52. data/lib/pulse-meter/visualize/coffee/application.coffee +0 -40
  53. data/lib/pulse-meter/visualize/coffee/collections/page_info_list.coffee +0 -17
  54. data/lib/pulse-meter/visualize/coffee/collections/sensor_info_list.coffee +0 -4
  55. data/lib/pulse-meter/visualize/coffee/collections/widget_list.coffee +0 -14
  56. data/lib/pulse-meter/visualize/coffee/extensions.coffee +0 -26
  57. data/lib/pulse-meter/visualize/coffee/models/dinamic_widget.coffee +0 -34
  58. data/lib/pulse-meter/visualize/coffee/models/page_info.coffee +0 -2
  59. data/lib/pulse-meter/visualize/coffee/models/sensor_info.coffee +0 -2
  60. data/lib/pulse-meter/visualize/coffee/models/widget.coffee +0 -54
  61. data/lib/pulse-meter/visualize/coffee/presenters/area.coffee +0 -2
  62. data/lib/pulse-meter/visualize/coffee/presenters/gauge.coffee +0 -11
  63. data/lib/pulse-meter/visualize/coffee/presenters/line.coffee +0 -2
  64. data/lib/pulse-meter/visualize/coffee/presenters/pie.coffee +0 -20
  65. data/lib/pulse-meter/visualize/coffee/presenters/series.coffee +0 -44
  66. data/lib/pulse-meter/visualize/coffee/presenters/table.coffee +0 -10
  67. data/lib/pulse-meter/visualize/coffee/presenters/timeline.coffee +0 -13
  68. data/lib/pulse-meter/visualize/coffee/presenters/widget.coffee +0 -65
  69. data/lib/pulse-meter/visualize/coffee/router.coffee +0 -21
  70. data/lib/pulse-meter/visualize/coffee/views/dynamic_chart.coffee +0 -91
  71. data/lib/pulse-meter/visualize/coffee/views/dynamic_widget.coffee +0 -58
  72. data/lib/pulse-meter/visualize/coffee/views/page_title.coffee +0 -17
  73. data/lib/pulse-meter/visualize/coffee/views/page_titles.coffee +0 -15
  74. data/lib/pulse-meter/visualize/coffee/views/sensor_info_list.coffee +0 -19
  75. data/lib/pulse-meter/visualize/coffee/views/widget.coffee +0 -99
  76. data/lib/pulse-meter/visualize/coffee/views/widget_chart.coffee +0 -13
  77. data/lib/pulse-meter/visualize/coffee/views/widget_list.coffee +0 -15
  78. data/lib/pulse-meter/visualize/dsl/base.rb +0 -131
  79. data/lib/pulse-meter/visualize/dsl/errors.rb +0 -40
  80. data/lib/pulse-meter/visualize/dsl/layout.rb +0 -27
  81. data/lib/pulse-meter/visualize/dsl/page.rb +0 -33
  82. data/lib/pulse-meter/visualize/dsl/sensor.rb +0 -20
  83. data/lib/pulse-meter/visualize/dsl/widget.rb +0 -37
  84. data/lib/pulse-meter/visualize/dsl/widgets/area.rb +0 -20
  85. data/lib/pulse-meter/visualize/dsl/widgets/gauge.rb +0 -12
  86. data/lib/pulse-meter/visualize/dsl/widgets/line.rb +0 -21
  87. data/lib/pulse-meter/visualize/dsl/widgets/pie.rb +0 -16
  88. data/lib/pulse-meter/visualize/dsl/widgets/table.rb +0 -19
  89. data/lib/pulse-meter/visualize/layout.rb +0 -79
  90. data/lib/pulse-meter/visualize/page.rb +0 -25
  91. data/lib/pulse-meter/visualize/public/css/application.css +0 -56
  92. data/lib/pulse-meter/visualize/public/css/bootstrap.css +0 -4883
  93. data/lib/pulse-meter/visualize/public/css/bootstrap.min.css +0 -729
  94. data/lib/pulse-meter/visualize/public/css/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  95. data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  96. data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  97. data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  98. data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  99. data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_75_ffffff_1x400.png +0 -0
  100. data/lib/pulse-meter/visualize/public/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  101. data/lib/pulse-meter/visualize/public/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png +0 -0
  102. data/lib/pulse-meter/visualize/public/css/images/ui-icons_222222_256x240.png +0 -0
  103. data/lib/pulse-meter/visualize/public/css/images/ui-icons_2e83ff_256x240.png +0 -0
  104. data/lib/pulse-meter/visualize/public/css/images/ui-icons_454545_256x240.png +0 -0
  105. data/lib/pulse-meter/visualize/public/css/images/ui-icons_888888_256x240.png +0 -0
  106. data/lib/pulse-meter/visualize/public/css/images/ui-icons_cd0a0a_256x240.png +0 -0
  107. data/lib/pulse-meter/visualize/public/css/images/ui-icons_f6cf3b_256x240.png +0 -0
  108. data/lib/pulse-meter/visualize/public/css/jquery-ui-1.8.16.bootstrap.css +0 -1320
  109. data/lib/pulse-meter/visualize/public/favicon.ico +0 -208
  110. data/lib/pulse-meter/visualize/public/img/glyphicons-halflings-white.png +0 -0
  111. data/lib/pulse-meter/visualize/public/img/glyphicons-halflings.png +0 -0
  112. data/lib/pulse-meter/visualize/public/js/application.js +0 -973
  113. data/lib/pulse-meter/visualize/public/js/backbone-min.js +0 -38
  114. data/lib/pulse-meter/visualize/public/js/bootstrap.js +0 -1835
  115. data/lib/pulse-meter/visualize/public/js/jquery-1.7.2.min.js +0 -4
  116. data/lib/pulse-meter/visualize/public/js/jquery-ui-1.8.16.bootstrap.min.js +0 -791
  117. data/lib/pulse-meter/visualize/public/js/jquery-ui-1.8.23.custom.min.js +0 -21
  118. data/lib/pulse-meter/visualize/public/js/jquery-ui-timepicker-addon.js +0 -1687
  119. data/lib/pulse-meter/visualize/public/js/json2.js +0 -487
  120. data/lib/pulse-meter/visualize/public/js/underscore-min.js +0 -32
  121. data/lib/pulse-meter/visualize/sensor.rb +0 -63
  122. data/lib/pulse-meter/visualize/series_extractor.rb +0 -107
  123. data/lib/pulse-meter/visualize/views/main.haml +0 -30
  124. data/lib/pulse-meter/visualize/views/sensors.haml +0 -76
  125. data/lib/pulse-meter/visualize/views/widgets/area.haml +0 -53
  126. data/lib/pulse-meter/visualize/views/widgets/extend_options.haml +0 -11
  127. data/lib/pulse-meter/visualize/views/widgets/gauge.haml +0 -13
  128. data/lib/pulse-meter/visualize/views/widgets/line.haml +0 -54
  129. data/lib/pulse-meter/visualize/views/widgets/pie.haml +0 -13
  130. data/lib/pulse-meter/visualize/views/widgets/table.haml +0 -45
  131. data/lib/pulse-meter/visualize/widget.rb +0 -38
  132. data/lib/pulse-meter/visualize/widgets/gauge.rb +0 -47
  133. data/lib/pulse-meter/visualize/widgets/pie.rb +0 -36
  134. data/lib/pulse-meter/visualize/widgets/timeline.rb +0 -114
  135. data/spec/pulse_meter/command_aggregator/async_spec.rb +0 -53
  136. data/spec/pulse_meter/command_aggregator/sync_spec.rb +0 -25
  137. data/spec/pulse_meter/command_aggregator/udp_spec.rb +0 -45
  138. data/spec/pulse_meter/extensions/enumerable_spec.rb +0 -58
  139. data/spec/pulse_meter/mixins/cmd_spec.rb +0 -117
  140. data/spec/pulse_meter/mixins/dumper_spec.rb +0 -162
  141. data/spec/pulse_meter/mixins/utils_spec.rb +0 -212
  142. data/spec/pulse_meter/observer/extended_spec.rb +0 -92
  143. data/spec/pulse_meter/observer_spec.rb +0 -207
  144. data/spec/pulse_meter/sensor/base_spec.rb +0 -106
  145. data/spec/pulse_meter/sensor/configuration_spec.rb +0 -103
  146. data/spec/pulse_meter/sensor/counter_spec.rb +0 -54
  147. data/spec/pulse_meter/sensor/hashed_counter_spec.rb +0 -43
  148. data/spec/pulse_meter/sensor/hashed_indicator_spec.rb +0 -39
  149. data/spec/pulse_meter/sensor/indicator_spec.rb +0 -43
  150. data/spec/pulse_meter/sensor/multi_spec.rb +0 -137
  151. data/spec/pulse_meter/sensor/timeline_spec.rb +0 -88
  152. data/spec/pulse_meter/sensor/timelined/average_spec.rb +0 -6
  153. data/spec/pulse_meter/sensor/timelined/counter_spec.rb +0 -6
  154. data/spec/pulse_meter/sensor/timelined/hashed_counter_spec.rb +0 -8
  155. data/spec/pulse_meter/sensor/timelined/hashed_indicator_spec.rb +0 -8
  156. data/spec/pulse_meter/sensor/timelined/indicator_spec.rb +0 -6
  157. data/spec/pulse_meter/sensor/timelined/max_spec.rb +0 -7
  158. data/spec/pulse_meter/sensor/timelined/median_spec.rb +0 -7
  159. data/spec/pulse_meter/sensor/timelined/min_spec.rb +0 -7
  160. data/spec/pulse_meter/sensor/timelined/multi_percentile_spec.rb +0 -21
  161. data/spec/pulse_meter/sensor/timelined/percentile_spec.rb +0 -17
  162. data/spec/pulse_meter/sensor/timelined/uniq_counter_spec.rb +0 -9
  163. data/spec/pulse_meter/sensor/uniq_counter_spec.rb +0 -28
  164. data/spec/pulse_meter/udp_server_spec.rb +0 -36
  165. data/spec/pulse_meter/visualize/app_spec.rb +0 -27
  166. data/spec/pulse_meter/visualize/dsl/layout_spec.rb +0 -64
  167. data/spec/pulse_meter/visualize/dsl/page_spec.rb +0 -62
  168. data/spec/pulse_meter/visualize/dsl/sensor_spec.rb +0 -30
  169. data/spec/pulse_meter/visualize/dsl/widget_spec.rb +0 -6
  170. data/spec/pulse_meter/visualize/dsl/widgets/area_spec.rb +0 -44
  171. data/spec/pulse_meter/visualize/dsl/widgets/gauge_spec.rb +0 -22
  172. data/spec/pulse_meter/visualize/dsl/widgets/line_spec.rb +0 -44
  173. data/spec/pulse_meter/visualize/dsl/widgets/pie_spec.rb +0 -35
  174. data/spec/pulse_meter/visualize/dsl/widgets/table_spec.rb +0 -36
  175. data/spec/pulse_meter/visualize/layout_spec.rb +0 -54
  176. data/spec/pulse_meter/visualize/page_spec.rb +0 -153
  177. data/spec/pulse_meter/visualize/sensor_spec.rb +0 -120
  178. data/spec/pulse_meter/visualize/series_extractor_spec.rb +0 -80
  179. data/spec/pulse_meter/visualize/widgets/area_spec.rb +0 -6
  180. data/spec/pulse_meter/visualize/widgets/gauge_spec.rb +0 -63
  181. data/spec/pulse_meter/visualize/widgets/line_spec.rb +0 -6
  182. data/spec/pulse_meter/visualize/widgets/pie_spec.rb +0 -73
  183. data/spec/pulse_meter/visualize/widgets/table_spec.rb +0 -6
  184. data/spec/pulse_meter/visualizer_spec.rb +0 -42
  185. data/spec/pulse_meter_spec.rb +0 -73
  186. data/spec/shared_examples/dsl_widget.rb +0 -106
  187. data/spec/shared_examples/timeline_sensor.rb +0 -439
  188. data/spec/shared_examples/timelined_subclass.rb +0 -23
  189. data/spec/shared_examples/widget.rb +0 -97
  190. data/spec/spec_helper.rb +0 -40
  191. data/spec/support/matchers.rb +0 -34
  192. data/spec/support/observered.rb +0 -40
@@ -1,6 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe PulseMeter::Visualize::Widgets::Area do
4
- it_should_behave_like "widget"
5
- end
6
-
@@ -1,63 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe PulseMeter::Visualize::Widgets::Gauge do
4
- let(:interval){ 100 }
5
- let!(:a_sensor){PulseMeter::Sensor::Indicator.new(:a_sensor, annotation: 'A')}
6
- let!(:b_sensor){PulseMeter::Sensor::Indicator.new(:b_sensor, annotation: 'B')}
7
- let!(:c_sensor){PulseMeter::Sensor::HashedIndicator.new(:c_sensor, annotation: 'C')}
8
-
9
-
10
- let(:widget_name){ "some_widget" }
11
-
12
- let(:redraw_interval){5}
13
- let(:width){6}
14
-
15
- let(:interval_start){ Time.at((Time.now.to_i / interval) * interval) }
16
-
17
- let(:widget) do
18
- w = PulseMeter::Visualize::DSL::Widgets::Gauge.new(widget_name)
19
- w.redraw_interval redraw_interval
20
- w.width width
21
- w.sensor :a_sensor
22
- w.sensor :b_sensor
23
- w.sensor :c_sensor
24
- w.gchart_options a: 1
25
- w.to_data
26
- end
27
-
28
- describe "#data" do
29
- it "should contain type, title, redraw_interval, width, gchart_options attriutes" do
30
- wdata = widget.data
31
- wdata[:type].should == 'gauge'
32
- wdata[:title].should == widget_name
33
- wdata[:redraw_interval].should == redraw_interval
34
- wdata[:width].should == width
35
- wdata[:gchart_options].should == {a: 1}
36
- end
37
-
38
- describe "series attribute" do
39
- before(:each) do
40
- a_sensor.event(12)
41
- b_sensor.event(33)
42
- c_sensor.event(:a => 44)
43
- c_sensor.event(:b => 55)
44
- end
45
-
46
- it "should contain valid gauge slices" do
47
-
48
- widget.data[:series].sort.should == [
49
- ['A', 12],
50
- ['B', 33],
51
- ["C: a", 44],
52
- ["C: b", 55]
53
- ].sort
54
-
55
- end
56
-
57
- end
58
- end
59
- end
60
-
61
-
62
-
63
-
@@ -1,6 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe PulseMeter::Visualize::Widgets::Line do
4
- it_should_behave_like "widget"
5
- end
6
-
@@ -1,73 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe PulseMeter::Visualize::Widgets::Pie do
4
- let(:interval){ 100 }
5
- let!(:a_sensor){ PulseMeter::Sensor::Timelined::Counter.new(:a_sensor, :ttl => 1000, :interval => interval, annotation: 'A') }
6
- let!(:b_sensor){ PulseMeter::Sensor::Timelined::Counter.new(:b_sensor, :ttl => 1000, :interval => interval, annotation: 'B') }
7
-
8
- let(:widget_name){ "some_widget" }
9
-
10
- let(:redraw_interval){5}
11
- let(:values_label){'xxxx'}
12
- let(:width){6}
13
- let(:a_color){'#FF0000'}
14
- let(:b_color){'#FFFF00'}
15
-
16
- let(:interval_start){ Time.at((Time.now.to_i / interval) * interval) }
17
-
18
- let(:widget) do
19
- w = PulseMeter::Visualize::DSL::Widgets::Pie.new(widget_name)
20
- w.redraw_interval redraw_interval
21
- w.width width
22
- w.sensor :a_sensor, color: a_color
23
- w.sensor :b_sensor, color: b_color
24
- w.gchart_options a: 1
25
- w.to_data
26
- end
27
-
28
- describe "#data" do
29
- it "should contain type, title, redraw_interval, width, gchart_options attriutes" do
30
- wdata = widget.data
31
- wdata[:type].should == 'pie'
32
- wdata[:title].should == widget_name
33
- wdata[:redraw_interval].should == redraw_interval
34
- wdata[:width].should == width
35
- wdata[:gchart_options].should == {a: 1}
36
- end
37
-
38
- describe "series attribute" do
39
- before(:each) do
40
- Timecop.freeze(interval_start + 1) do
41
- a_sensor.event(12)
42
- b_sensor.event(33)
43
- end
44
- Timecop.freeze(interval_start + interval + 1) do
45
- a_sensor.event(111)
46
- end
47
- @current_time = interval_start + 2 * interval - 1
48
- end
49
-
50
- it "should contain valid pie slices" do
51
-
52
- Timecop.freeze(@current_time) do
53
- widget.data[:series].should ==
54
- {
55
- data: [
56
- [a_sensor.annotation, 12],
57
- [b_sensor.annotation, 33]
58
- ],
59
- options: [
60
- {color: a_color},
61
- {color: b_color}
62
- ]
63
- }
64
- end
65
-
66
- end
67
-
68
- end
69
- end
70
- end
71
-
72
-
73
-
@@ -1,6 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe PulseMeter::Visualize::Widgets::Table do
4
- it_should_behave_like "widget"
5
- end
6
-
@@ -1,42 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe PulseMeter::Visualizer do
4
- describe "::draw" do
5
- it "should generate correct layout with passed block" do
6
- layout = described_class.draw do |l|
7
-
8
- l.title "My Gauges"
9
-
10
- l.page "Dashboard" do |p|
11
- p.line :convertion do |c|
12
- c.sensor :adv_clicks, color: :green
13
- c.sensor :adv_shows, color: :red
14
- end
15
-
16
- p.pie :agents, title: 'User Agents' do |c|
17
- c.sensor :agent_ie
18
- c.sensor :agent_chrome
19
- c.sensor :agent_ff
20
- c.sensor :agent_other
21
- end
22
-
23
- end
24
-
25
- l.page "Request stats" do |p|
26
- p.line :rph_total, sensor: :rph_total
27
- p.line :rph_main_page, sensor: :rph_main_page
28
- p.line :request_time_p95_hour
29
-
30
- p.pie :success_vs_fail_total_hourly do |w|
31
- w.sensor :success_total_hourly
32
- w.sensor :fail_total_hourly
33
- end
34
-
35
- end
36
-
37
- end
38
- layout.should be_kind_of(PulseMeter::Visualize::Layout)
39
- end
40
- end
41
- end
42
-
@@ -1,73 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe PulseMeter do
4
- describe "::redis=" do
5
- it "should store redis" do
6
- PulseMeter.redis = 'redis'
7
- PulseMeter.redis.should == 'redis'
8
- end
9
- end
10
- describe "::redis" do
11
- it "should retrieve redis" do
12
- PulseMeter.redis = 'redis'
13
- PulseMeter.redis.should == 'redis'
14
- end
15
- end
16
- describe "::command_aggregator=" do
17
- context "when :async passed" do
18
- it "should set async command_aggregator to be used" do
19
- PulseMeter.command_aggregator = :async
20
- PulseMeter.command_aggregator.should be_kind_of(PulseMeter::CommandAggregator::Async)
21
- end
22
- end
23
- context "when :sync passed" do
24
- it "should set sync command_aggregator to be used" do
25
- PulseMeter.command_aggregator = :sync
26
- PulseMeter.command_aggregator.should be_kind_of(PulseMeter::CommandAggregator::Sync)
27
- end
28
- end
29
- context "otherwise" do
30
- it "should set command_aggregator to the passed value" do
31
- PulseMeter.command_aggregator = :xxx
32
- PulseMeter.command_aggregator.should == :xxx
33
- end
34
- end
35
- end
36
-
37
- describe "::command_aggregator" do
38
- it "should return current command_aggregator" do
39
- PulseMeter.command_aggregator = :async
40
- PulseMeter.command_aggregator.should be_kind_of(PulseMeter::CommandAggregator::Async)
41
- PulseMeter.command_aggregator = :sync
42
- PulseMeter.command_aggregator.should be_kind_of(PulseMeter::CommandAggregator::Sync)
43
- end
44
-
45
- it "should always return the same command_aggregator for each type" do
46
- PulseMeter.command_aggregator = :async
47
- ca1 = PulseMeter.command_aggregator
48
- PulseMeter.command_aggregator = :sync
49
- PulseMeter.command_aggregator = :async
50
- ca2 = PulseMeter.command_aggregator
51
- ca1.should == ca2
52
- end
53
- end
54
-
55
- describe "::logger" do
56
- it "should return PulseMeter logger" do
57
- PulseMeter.logger = 123
58
- PulseMeter.logger.should == 123
59
- end
60
-
61
- it "should return default logger" do
62
- PulseMeter.logger = nil
63
- PulseMeter.logger.should be_kind_of(Logger)
64
- end
65
- end
66
-
67
- describe "::error" do
68
- it "should delegate error message to logger" do
69
- PulseMeter.logger.should_receive(:error)
70
- PulseMeter.error("foo")
71
- end
72
- end
73
- end
@@ -1,106 +0,0 @@
1
- shared_examples_for "dsl widget" do
2
-
3
- let(:interval){ 100 }
4
- let(:name) { "some_sensor" }
5
- let!(:sensor){ PulseMeter::Sensor::Timelined::Max.new(name, :ttl => 1000, :interval => interval) }
6
-
7
- let(:widget_name){ "some_widget" }
8
- let(:w){ described_class.new(widget_name) }
9
-
10
- describe '.new' do
11
- it "should set default value for width papram" do
12
- wid = w.to_data
13
- wid.width.should == PulseMeter::Visualize::DSL::Widget::MAX_WIDTH
14
- end
15
-
16
- it "should set title param from .new argument" do
17
- wid = w.to_data
18
- wid.title.should == widget_name
19
- end
20
- end
21
-
22
- describe "#process_args" do
23
- it "should set sensor by :sensor param" do
24
- w.process_args :sensor => :sss
25
- sensors = w.to_data.sensors
26
- sensors.size.should == 1
27
- sensors.first.name.to_s.should == 'sss'
28
- end
29
-
30
- it "should set title by :title param" do
31
- w.process_args :title => 'Title XXX'
32
- w.to_data.title.should == 'Title XXX'
33
- end
34
-
35
- it "should set width by :width param" do
36
- w.process_args :width => 5
37
- w.to_data.width.should == 5
38
- end
39
-
40
- end
41
-
42
- describe "#sensor" do
43
- it "should add sensor" do
44
- w.sensor :s1
45
- w.sensor :s2
46
- sensors = w.to_data.sensors
47
- sensors.size.should == 2
48
- sensors.first.name.to_s.should == 's1'
49
- sensors.last.name.to_s.should == 's2'
50
- end
51
- end
52
-
53
- describe "#title" do
54
- it "should set title" do
55
- w.title 'Title XXX'
56
- w.to_data.title.should == 'Title XXX'
57
- w.title 'Title YYY'
58
- w.to_data.title.should == 'Title YYY'
59
- end
60
- end
61
-
62
- describe "#width" do
63
- it "should set width" do
64
- w.width 6
65
- w.to_data.width.should == 6
66
- end
67
-
68
- it "should raise exception if width is invalid" do
69
- expect { w.width -1 }.to raise_exception(PulseMeter::Visualize::DSL::BadWidgetWidth)
70
- expect { w.width 11 }.to raise_exception(PulseMeter::Visualize::DSL::BadWidgetWidth)
71
- end
72
- end
73
-
74
- describe "#redraw_interval" do
75
- it "should set redraw_interval" do
76
- w.redraw_interval 5
77
- w.to_data.redraw_interval.should == 5
78
- end
79
- it "should raise exception if redraw_interval is negative" do
80
- expect{ w.redraw_interval(-1) }.to raise_exception(PulseMeter::Visualize::DSL::BadWidgetRedrawInterval)
81
- end
82
-
83
- end
84
-
85
- describe "#to_data" do
86
- it "should convert dsl data to widget" do
87
- w.to_data.should be_kind_of(PulseMeter::Visualize::Widget)
88
- end
89
- end
90
-
91
- describe "#gchart_options" do
92
- it "should add options to gchart_options hash" do
93
- w.gchart_options a: 1
94
- w.gchart_options b: 2
95
- w.to_data.gchart_options.should == {a: 1, b: 2}
96
- end
97
- end
98
-
99
- describe "any anknown method" do
100
- it "should add options to gchart_options hash" do
101
- w.foobar 123
102
- w.to_data.gchart_options.should == {foobar: 123}
103
- end
104
- end
105
- end
106
-
@@ -1,439 +0,0 @@
1
- shared_examples_for "timeline sensor" do |extra_init_values, default_event|
2
- class Dummy
3
- include PulseMeter::Mixins::Dumper
4
- def name; :dummy end
5
- def redis; PulseMeter.redis; end
6
- end
7
-
8
- let(:name){ :some_value_with_history }
9
- let(:ttl){ 10000 }
10
- let(:raw_data_ttl){ 3000 }
11
- let(:interval){ 5 }
12
- let(:reduce_delay){ 3 }
13
- let(:good_init_values){ {:ttl => ttl, :raw_data_ttl => raw_data_ttl, :interval => interval, :reduce_delay => reduce_delay}.merge(extra_init_values || {}) }
14
- let!(:sensor){ described_class.new(name, good_init_values) }
15
- let(:dummy) {Dummy.new}
16
- let(:base_class){ PulseMeter::Sensor::Base }
17
- let(:redis){ PulseMeter.redis }
18
- let(:sample_event) {default_event || 123}
19
-
20
- before(:each) do
21
- @interval_id = (Time.now.to_i / interval) * interval
22
- @prev_interval_id = (Time.now.to_i / interval) * interval - interval
23
-
24
- @raw_data_key = sensor.raw_data_key(@interval_id)
25
- @prev_raw_data_key = sensor.raw_data_key(@prev_interval_id)
26
-
27
- @next_raw_data_key = sensor.raw_data_key(@interval_id + interval)
28
-
29
- @start_of_interval = Time.at(@interval_id)
30
- @start_of_prev_interval = Time.at(@prev_interval_id)
31
- end
32
-
33
- describe "#dump" do
34
- it "should be dumped succesfully" do
35
- expect {sensor.dump!}.not_to raise_exception
36
- end
37
- end
38
-
39
- describe ".restore" do
40
- before do
41
- # no need to call sensor.dump! explicitly for it
42
- # will be called automatically after creation
43
- @restored = base_class.restore(sensor.name)
44
- end
45
-
46
- it "should restore #{described_class} instance" do
47
- @restored.should be_instance_of(described_class)
48
- end
49
-
50
- it "should restore object with the same data" do
51
- def inner_data(obj)
52
- obj.instance_variables.sort.map {|v| obj.instance_variable_get(v)}
53
- end
54
-
55
- inner_data(sensor).should == inner_data(@restored)
56
- end
57
- end
58
-
59
- describe "#event" do
60
- it "should write events to redis" do
61
- expect{
62
- sensor.event(sample_event)
63
- }.to change{ redis.keys('*').count }.by(1)
64
- end
65
-
66
- it "should write data so that it totally expires after :raw_data_ttl" do
67
- key_count = redis.keys('*').count
68
- sensor.event(sample_event)
69
- Timecop.freeze(Time.now + raw_data_ttl + 1) do
70
- redis.keys('*').count.should == key_count
71
- end
72
- end
73
-
74
- it "should write data to bucket indicated by truncated timestamp" do
75
- expect{
76
- Timecop.freeze(@start_of_interval) do
77
- sensor.event(sample_event)
78
- end
79
- }.to change{ redis.ttl(@raw_data_key) }
80
- end
81
-
82
- it "returns true if event processed correctly" do
83
- sensor.event(sample_event).should be_true
84
- end
85
-
86
- it "catches StandardErrors and returns false" do
87
- sensor.stub(:aggregate_event) {raise StandardError}
88
- sensor.event(sample_event).should be_false
89
- end
90
- end
91
-
92
- describe "#event_at" do
93
- let(:now) {Time.now}
94
- it "should write events to redis" do
95
- expect{
96
- sensor.event_at(now, sample_event)
97
- }.to change{ redis.keys('*').count }.by(1)
98
- end
99
-
100
- it "should write data so that it totally expires after :raw_data_ttl" do
101
- key_count = redis.keys('*').count
102
- sensor.event_at(now, sample_event)
103
- Timecop.freeze(now + raw_data_ttl + 1) do
104
- redis.keys('*').count.should == key_count
105
- end
106
- end
107
-
108
- it "should write data to bucket indicated by passed time" do
109
- expect{
110
- Timecop.freeze(@start_of_interval) do
111
- sensor.event_at(@start_of_prev_interval, sample_event)
112
- end
113
- }.to change{ redis.ttl(@prev_raw_data_key) }
114
- end
115
- end
116
-
117
- describe "#summarize" do
118
- it "should convert data stored by raw_data_key to a value defined only by stored data" do
119
- Timecop.freeze(@start_of_interval) do
120
- sensor.event(sample_event)
121
- end
122
- Timecop.freeze(@start_of_interval + interval) do
123
- sensor.event(sample_event)
124
- end
125
- sensor.summarize(@raw_data_key).should == sensor.summarize(@next_raw_data_key)
126
- sensor.summarize(@raw_data_key).should_not be_nil
127
- end
128
- end
129
-
130
- describe "#reduce" do
131
- it "should store summarized value into data_key" do
132
- Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
133
- val = sensor.summarize(@raw_data_key)
134
- val.should_not be_nil
135
- sensor.reduce(@interval_id)
136
- redis.get(sensor.data_key(@interval_id)).should == val.to_s
137
- end
138
-
139
- it "should remove original raw_data_key" do
140
- Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
141
- expect{
142
- sensor.reduce(@interval_id)
143
- }.to change{ redis.keys(sensor.raw_data_key(@interval_id)).count }.from(1).to(0)
144
- end
145
-
146
- it "should expire stored summarized data" do
147
- Timecop.freeze(@start_of_interval) do
148
- sensor.event(sample_event)
149
- sensor.reduce(@interval_id)
150
- redis.keys(sensor.data_key(@interval_id)).count.should == 1
151
- end
152
- Timecop.freeze(@start_of_interval + ttl + 1) do
153
- redis.keys(sensor.data_key(@interval_id)).count.should == 0
154
- end
155
- end
156
-
157
- it "should not store data if there is no corresponding raw data" do
158
- Timecop.freeze(@start_of_interval) do
159
- sensor.reduce(@interval_id)
160
- redis.keys(sensor.data_key(@interval_id)).count.should == 0
161
- end
162
- end
163
-
164
- it "should not store summarized data if it already exists" do
165
- data_key = sensor.data_key(@interval_id)
166
- redis.set(data_key, :dummy)
167
- Timecop.freeze(@start_of_interval) do
168
- sensor.event(sample_event)
169
- sensor.reduce(@interval_id)
170
- redis.get(data_key).should == "dummy"
171
- end
172
- end
173
- end
174
-
175
- describe "#reduce_all_raw" do
176
- it "should reduce all data older than reduce_delay" do
177
- Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
178
- val0 = sensor.summarize(@raw_data_key)
179
- Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
180
- val1 = sensor.summarize(@next_raw_data_key)
181
- expect{
182
- Timecop.freeze(@start_of_interval + interval + interval + reduce_delay + 1) do
183
- sensor.reduce_all_raw
184
- end
185
- }.to change{ redis.keys(sensor.raw_data_key('*')).count }.from(2).to(0)
186
-
187
- redis.get(sensor.data_key(@interval_id)).should == val0.to_s
188
- redis.get(sensor.data_key(@interval_id + interval)).should == val1.to_s
189
- end
190
-
191
- it "creates up to MAX_INTERVALS compresed data pieces from previously uncompressed data" do
192
- max_count = described_class::MAX_INTERVALS
193
- start = @start_of_interval - reduce_delay - max_count * interval
194
- (max_count + 100).times do |i|
195
- Timecop.freeze(start + i * interval) {sensor.event(sample_event)}
196
- end
197
-
198
- Timecop.freeze(@start_of_interval) do
199
- expect {
200
- sensor.reduce_all_raw
201
- }.to change {redis.keys(sensor.data_key('*')).count}.from(0).to(max_count)
202
- end
203
- end
204
-
205
- it "should not reduce fresh data" do
206
- Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
207
-
208
- expect{
209
- Timecop.freeze(@start_of_interval + interval + reduce_delay - 1) { sensor.reduce_all_raw }
210
- }.not_to change{ redis.keys(sensor.raw_data_key('*')).count }
211
-
212
- expect{
213
- Timecop.freeze(@start_of_interval + interval + reduce_delay - 1) { sensor.reduce_all_raw }
214
- }.not_to change{ redis.keys(sensor.data_key('*')).count }
215
- end
216
- end
217
-
218
- describe ".reduce_all_raw" do
219
- it "should silently skip objects without reduce logic" do
220
- dummy.dump!
221
- expect {described_class.reduce_all_raw}.not_to raise_exception
222
- end
223
-
224
- it "should send reduce_all_raw to all dumped objects" do
225
- described_class.any_instance.should_receive(:reduce_all_raw)
226
- described_class.reduce_all_raw
227
- end
228
- end
229
-
230
- describe "#timeline_within" do
231
- it "should raise exception unless both arguments are Time objects" do
232
- [:q, nil, -1].each do |bad_value|
233
- expect{ sensor.timeline_within(Time.now, bad_value) }.to raise_exception(ArgumentError)
234
- expect{ sensor.timeline_within(bad_value, Time.now) }.to raise_exception(ArgumentError)
235
- end
236
- end
237
-
238
- it "should return an array of SensorData objects corresponding to stored data for passed interval" do
239
- sensor.event(sample_event)
240
- now = Time.now
241
- timeline = sensor.timeline_within(now - 1, now)
242
- timeline.should be_kind_of(Array)
243
- timeline.each{|i| i.should be_kind_of(SensorData) }
244
- end
245
-
246
- it "should return array of results containing as many results as there are sensor interval beginnings in the passed interval" do
247
- Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
248
- Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
249
-
250
- future = @start_of_interval + 3600
251
- Timecop.freeze(future) do
252
- sensor.timeline_within(
253
- Time.at(@start_of_interval + interval - 1),
254
- Time.at(@start_of_interval + interval + 1)
255
- ).size.should == 1
256
-
257
- sensor.timeline_within(
258
- Time.at(@start_of_interval - 1),
259
- Time.at(@start_of_interval + interval + 1)
260
- ).size.should == 2
261
- end
262
-
263
- Timecop.freeze(@start_of_interval + interval + 2) do
264
- sensor.timeline_within(
265
- Time.at(@start_of_interval + interval + 1),
266
- Time.at(@start_of_interval + interval + 2)
267
- ).size.should == 0
268
- end
269
- end
270
-
271
- context "to avoid getting to much data" do
272
- let(:max) {PulseMeter::Sensor::Timeline::MAX_TIMESPAN_POINTS}
273
-
274
- it "should skip some points not to exceed MAX_TIMESPAN_POINTS" do
275
- count = max * 2
276
- sensor.timeline_within(
277
- Time.at(@start_of_interval - 1),
278
- Time.at(@start_of_interval + count * interval)
279
- ).size.should < max
280
- end
281
-
282
- it "should not skip any points when timeline orginal size is less then MAX_TIMESPAN_POINTS" do
283
- count = max - 1
284
- sensor.timeline_within(
285
- Time.at(@start_of_interval - 1),
286
- Time.at(@start_of_interval + count * interval)
287
- ).size.should == count
288
- end
289
-
290
- it "should give full data in case skip_optimization parameter set to true" do
291
- count = max * 2
292
- sensor.timeline_within(
293
- Time.at(@start_of_interval - 1),
294
- Time.at(@start_of_interval + count * interval),
295
- true
296
- ).size.should == count
297
- end
298
- end
299
- end
300
-
301
- describe "#timeline" do
302
- it "should raise exception if passed interval is not a positive integer" do
303
- [:q, nil, -1].each do |bad_interval|
304
- expect{ sensor.timeline(bad_interval) }.to raise_exception(ArgumentError)
305
- end
306
- end
307
-
308
- it "should request timeline within interval from given number of seconds ago till now" do
309
- Timecop.freeze do
310
- now = Time.now
311
- ago = interval * 100
312
- sensor.timeline(ago).should == sensor.timeline_within(now - ago, now)
313
- end
314
- end
315
-
316
- it "should return array of results containing as many results as there are sensor interval beginnings in the passed interval" do
317
- Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
318
- Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
319
-
320
- Timecop.freeze(@start_of_interval + interval + 1) do
321
- sensor.timeline(2).size.should == 1
322
- end
323
- Timecop.freeze(@start_of_interval + interval + 2) do
324
- sensor.timeline(1).size.should == 0
325
- end
326
- Timecop.freeze(@start_of_interval + interval + 1) do
327
- sensor.timeline(2 + interval).size.should == 2
328
- end
329
- end
330
- end
331
-
332
- describe "#drop_within" do
333
- it "should raise exception unless both arguments are Time objects" do
334
- [:q, nil, -1].each do |bad_value|
335
- expect{ sensor.drop_within(Time.now, bad_value) }.to raise_exception(ArgumentError)
336
- expect{ sensor.drop_within(bad_value, Time.now) }.to raise_exception(ArgumentError)
337
- end
338
- end
339
-
340
- it "should drop as many raw results as there are sensor interval beginnings in the passed interval" do
341
- Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
342
- Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
343
-
344
- future = @start_of_interval + interval * 3
345
- Timecop.freeze(future) do
346
- sensor.drop_within(
347
- Time.at(@start_of_interval + interval - 1),
348
- Time.at(@start_of_interval + interval + 1)
349
- ).should == 1
350
-
351
- data = sensor.timeline_within(
352
- Time.at(@start_of_interval + interval - 1),
353
- Time.at(@start_of_interval + interval + 1)
354
- )
355
- data.size.should == 1
356
- data.first.value.should be_nil # since data is dropped
357
-
358
- end
359
-
360
- Timecop.freeze(@start_of_interval + interval + 2) do
361
- sensor.drop_within(
362
- Time.at(@start_of_interval + interval + 1),
363
- Time.at(@start_of_interval + interval + 2)
364
- ).should == 0
365
- end
366
- end
367
-
368
- it "should drop as many reduced results as there are sensor interval beginnings in the passed interval" do
369
- Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
370
- Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
371
-
372
- future = @start_of_interval
373
- Timecop.freeze(future) do
374
- sensor.reduce_all_raw
375
- sensor.drop_within(
376
- Time.at(@start_of_interval + interval - 1),
377
- Time.at(@start_of_interval + interval + 1)
378
- ).should == 1
379
-
380
- data = sensor.timeline_within(
381
- Time.at(@start_of_interval + interval - 1),
382
- Time.at(@start_of_interval + interval + 1)
383
- )
384
- data.size.should == 1
385
- data.first.value.should be_nil # since data is dropped
386
-
387
- end
388
-
389
- Timecop.freeze(@start_of_interval + interval + 2) do
390
- sensor.drop_within(
391
- Time.at(@start_of_interval + interval + 1),
392
- Time.at(@start_of_interval + interval + 2)
393
- ).should == 0
394
- end
395
- end
396
- end
397
-
398
- describe "SensorData value for an interval" do
399
- def check_sensor_data(sensor, value)
400
- data = sensor.timeline(2).first
401
- data.value.should be_generally_equal(sensor.deflate_safe(value))
402
- data.start_time.to_i.should == @interval_id
403
- end
404
-
405
- it "should contain summarized value stored by data_key for reduced intervals" do
406
- Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
407
- sensor.reduce(@interval_id)
408
- Timecop.freeze(@start_of_interval + 1){
409
- check_sensor_data(sensor, redis.get(sensor.data_key(@interval_id)))
410
- }
411
- end
412
-
413
- it "should contain summarized value based on raw data for intervals not yet reduced" do
414
- Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
415
- Timecop.freeze(@start_of_interval + 1){
416
- check_sensor_data(sensor, sensor.summarize(@raw_data_key))
417
- }
418
- end
419
-
420
- it "should contain nil for intervals without any data" do
421
- Timecop.freeze(@start_of_interval + 1) {
422
- check_sensor_data(sensor, nil)
423
- }
424
- end
425
- end
426
-
427
- describe "#cleanup" do
428
- it "should remove all sensor data (raw data, reduced data, annotations) from redis" do
429
- Timecop.freeze(@start_of_interval){ sensor.event(sample_event) }
430
- sensor.reduce(@interval_id)
431
- Timecop.freeze(@start_of_interval + interval){ sensor.event(sample_event) }
432
- sensor.annotate("Fooo sensor")
433
-
434
- sensor.cleanup
435
- redis.keys('*').should be_empty
436
- end
437
- end
438
-
439
- end