pulse-meter 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. data/.travis.yml +4 -0
  2. data/examples/basic.ru +23 -5
  3. data/examples/basic_sensor_data.rb +15 -2
  4. data/examples/full/server.ru +2 -3
  5. data/examples/minimal/server.ru +3 -2
  6. data/lib/pulse-meter/sensor.rb +2 -1
  7. data/lib/pulse-meter/sensor/configuration.rb +3 -1
  8. data/lib/pulse-meter/sensor/hashed_indicator.rb +22 -0
  9. data/lib/pulse-meter/sensor/timeline.rb +13 -1
  10. data/lib/pulse-meter/version.rb +1 -1
  11. data/lib/pulse-meter/visualize/app.rb +6 -2
  12. data/lib/pulse-meter/visualize/base.rb +15 -0
  13. data/lib/pulse-meter/visualize/dsl/base.rb +131 -0
  14. data/lib/pulse-meter/visualize/dsl/errors.rb +0 -6
  15. data/lib/pulse-meter/visualize/dsl/layout.rb +12 -41
  16. data/lib/pulse-meter/visualize/dsl/page.rb +15 -41
  17. data/lib/pulse-meter/visualize/dsl/sensor.rb +9 -10
  18. data/lib/pulse-meter/visualize/dsl/widget.rb +18 -65
  19. data/lib/pulse-meter/visualize/dsl/widget_old.rb +95 -0
  20. data/lib/pulse-meter/visualize/dsl/widgets/area.rb +20 -0
  21. data/lib/pulse-meter/visualize/dsl/widgets/gauge.rb +12 -0
  22. data/lib/pulse-meter/visualize/dsl/widgets/line.rb +21 -0
  23. data/lib/pulse-meter/visualize/dsl/widgets/pie.rb +16 -0
  24. data/lib/pulse-meter/visualize/dsl/widgets/table.rb +19 -0
  25. data/lib/pulse-meter/visualize/layout.rb +7 -16
  26. data/lib/pulse-meter/visualize/page.rb +5 -10
  27. data/lib/pulse-meter/visualize/public/favicon.ico +0 -0
  28. data/lib/pulse-meter/visualize/public/js/application.coffee +156 -107
  29. data/lib/pulse-meter/visualize/public/js/application.js +283 -122
  30. data/lib/pulse-meter/visualize/sensor.rb +7 -13
  31. data/lib/pulse-meter/visualize/views/main.haml +8 -52
  32. data/lib/pulse-meter/visualize/views/widgets/area.haml +31 -0
  33. data/lib/pulse-meter/visualize/views/widgets/extend_options.haml +11 -0
  34. data/lib/pulse-meter/visualize/views/widgets/gauge.haml +13 -0
  35. data/lib/pulse-meter/visualize/views/widgets/line.haml +31 -0
  36. data/lib/pulse-meter/visualize/views/widgets/pie.haml +13 -0
  37. data/lib/pulse-meter/visualize/views/widgets/table.haml +23 -0
  38. data/lib/pulse-meter/visualize/widget.rb +17 -87
  39. data/lib/pulse-meter/visualize/widgets/gauge.rb +47 -0
  40. data/lib/pulse-meter/visualize/widgets/pie.rb +36 -0
  41. data/lib/pulse-meter/visualize/widgets/timeline.rb +90 -0
  42. data/lib/pulse-meter/visualizer.rb +18 -8
  43. data/perl/PulseMeter/Sensor/Base.pm +42 -0
  44. data/perl/PulseMeter/Sensor/Counter.pm +19 -0
  45. data/perl/PulseMeter/Sensor/HashedIndicator.pm +12 -0
  46. data/perl/PulseMeter/Sensor/Indicator.pm +17 -0
  47. data/perl/PulseMeter/Sensor/Timeline.pm +51 -0
  48. data/perl/PulseMeter/Sensor/Timelined/Average.pm +13 -0
  49. data/perl/PulseMeter/Sensor/Timelined/Counter.pm +12 -0
  50. data/perl/PulseMeter/Sensor/Timelined/HashedCounter.pm +12 -0
  51. data/perl/PulseMeter/Sensor/Timelined/Max.pm +18 -0
  52. data/perl/PulseMeter/Sensor/Timelined/Median.pm +8 -0
  53. data/perl/PulseMeter/Sensor/Timelined/Min.pm +18 -0
  54. data/perl/PulseMeter/Sensor/Timelined/Percentile.pm +17 -0
  55. data/perl/PulseMeter/Sensor/Timelined/UniqCounter.pm +13 -0
  56. data/perl/PulseMeter/Sensor/UniqCounter.pm +12 -0
  57. data/pulse-meter.gemspec +1 -0
  58. data/spec/pulse_meter/sensor/configuration_spec.rb +10 -2
  59. data/spec/pulse_meter/sensor/hashed_indicator_spec.rb +39 -0
  60. data/spec/pulse_meter/visualize/dsl/layout_spec.rb +8 -8
  61. data/spec/pulse_meter/visualize/dsl/page_spec.rb +29 -42
  62. data/spec/pulse_meter/visualize/dsl/sensor_spec.rb +5 -5
  63. data/spec/pulse_meter/visualize/dsl/widget_spec.rb +1 -122
  64. data/spec/pulse_meter/visualize/dsl/widgets/area_spec.rb +44 -0
  65. data/spec/pulse_meter/visualize/dsl/widgets/gauge_spec.rb +22 -0
  66. data/spec/pulse_meter/visualize/dsl/widgets/line_spec.rb +44 -0
  67. data/spec/pulse_meter/visualize/dsl/widgets/pie_spec.rb +35 -0
  68. data/spec/pulse_meter/visualize/dsl/widgets/table_spec.rb +36 -0
  69. data/spec/pulse_meter/visualize/layout_spec.rb +3 -3
  70. data/spec/pulse_meter/visualize/page_spec.rb +2 -2
  71. data/spec/pulse_meter/visualize/sensor_spec.rb +4 -4
  72. data/spec/pulse_meter/visualize/series_extractor_spec.rb +3 -3
  73. data/spec/pulse_meter/visualize/widgets/area_spec.rb +78 -0
  74. data/spec/pulse_meter/visualize/widgets/gauge_spec.rb +63 -0
  75. data/spec/pulse_meter/visualize/widgets/line_spec.rb +77 -0
  76. data/spec/pulse_meter/visualize/widgets/pie_spec.rb +73 -0
  77. data/spec/pulse_meter/visualize/widgets/table_spec.rb +78 -0
  78. data/spec/shared_examples/dsl_widget.rb +106 -0
  79. data/spec/shared_examples/timeline_sensor.rb +32 -2
  80. metadata +75 -6
  81. data/lib/pulse-meter/visualize/dsl.rb +0 -0
  82. data/spec/pulse_meter/visualize/widget_spec.rb +0 -122
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe PulseMeter::Visualize::DSL::Widgets::Pie do
4
+ it_should_behave_like "dsl widget"
5
+
6
+ let(:interval){ 100 }
7
+ let(:name) { "some_sensor" }
8
+ let!(:sensor){ PulseMeter::Sensor::Timelined::Max.new(name, :ttl => 1000, :interval => interval) }
9
+
10
+ let(:widget_name){ "some_widget" }
11
+ let(:w){ described_class.new(widget_name) }
12
+
13
+ describe "#to_data" do
14
+ it "should produce PulseMeter::Visualize::Widgets::Pie class" do
15
+ w.to_data.should be_kind_of(PulseMeter::Visualize::Widgets::Pie)
16
+ end
17
+ end
18
+
19
+ describe "#values_label" do
20
+ it "should set values_label" do
21
+ w.values_label "some y-axis legend"
22
+ w.to_data.values_label.should == "some y-axis legend"
23
+ end
24
+ end
25
+
26
+ describe "#show_last_point" do
27
+ it "should set show_last_point" do
28
+ w.show_last_point true
29
+ w.to_data.show_last_point.should be_true
30
+ end
31
+ end
32
+
33
+ end
34
+
35
+
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+
3
+ describe PulseMeter::Visualize::DSL::Widgets::Table do
4
+ it_should_behave_like "dsl widget"
5
+
6
+ let(:interval){ 100 }
7
+ let(:name) { "some_sensor" }
8
+ let!(:sensor){ PulseMeter::Sensor::Timelined::Max.new(name, :ttl => 1000, :interval => interval) }
9
+
10
+ let(:widget_name){ "some_widget" }
11
+ let(:w){ described_class.new(widget_name) }
12
+
13
+ describe "#to_data" do
14
+ it "should produce PulseMeter::Visualize::Widgets::Area class" do
15
+ w.to_data.should be_kind_of(PulseMeter::Visualize::Widgets::Table)
16
+ end
17
+ end
18
+
19
+ describe "#show_last_point" do
20
+ it "should set show_last_point" do
21
+ w.show_last_point true
22
+ w.to_data.show_last_point.should be_true
23
+ end
24
+ end
25
+
26
+ describe "#timespan" do
27
+ it "should set timespan" do
28
+ w.timespan 5
29
+ w.to_data.timespan.should == 5
30
+ end
31
+ it "should raise exception if timespan is negative" do
32
+ expect{ w.timespan(-1) }.to raise_exception(PulseMeter::Visualize::DSL::BadWidgetTimeSpan)
33
+ end
34
+ end
35
+ end
36
+
@@ -12,7 +12,7 @@ describe PulseMeter::Visualize::Layout do
12
12
  p.line "w3"
13
13
  p.line "w4"
14
14
  end
15
- l.to_layout
15
+ l.to_data
16
16
  end
17
17
 
18
18
  describe "#page_infos" do
@@ -29,7 +29,7 @@ describe PulseMeter::Visualize::Layout do
29
29
  ldsl = PulseMeter::Visualize::DSL::Layout.new
30
30
  ldsl.use_utc true
31
31
  ldsl.gchart_options({a: 1})
32
- l = ldsl.to_layout
32
+ l = ldsl.to_data
33
33
  l.options.should == {use_utc: true, gchart_options: {a: 1}}
34
34
  end
35
35
  end
@@ -51,4 +51,4 @@ describe PulseMeter::Visualize::Layout do
51
51
  end
52
52
  end
53
53
 
54
- end
54
+ end
@@ -42,7 +42,7 @@ describe PulseMeter::Visualize::Page do
42
42
  w.sensor :a_sensor, color: a_color
43
43
  w.sensor :b_sensor, color: b_color
44
44
  end
45
- p.to_page
45
+ p.to_data
46
46
  end
47
47
 
48
48
  before(:each) do
@@ -150,4 +150,4 @@ describe PulseMeter::Visualize::Page do
150
150
 
151
151
  end
152
152
  end
153
- end
153
+ end
@@ -5,12 +5,12 @@ describe PulseMeter::Visualize::Sensor do
5
5
  let(:name) { "some_sensor" }
6
6
  let(:annotation) { 'sensor descr' }
7
7
  let!(:real_sensor){ PulseMeter::Sensor::Timelined::Counter.new(name, ttl: 1000, interval: interval, annotation: annotation) }
8
- let(:sensor) { described_class.new(sensor: name) }
8
+ let(:sensor) { described_class.new(name: name) }
9
9
 
10
10
  let(:color){ '#ABCDEF' }
11
- let(:sensor_with_color) { described_class.new(sensor: name, color: color) }
11
+ let(:sensor_with_color) { described_class.new(name: name, color: color) }
12
12
 
13
- let(:bad_sensor) { described_class.new(sensor: "bad_sensor_name") }
13
+ let(:bad_sensor) { described_class.new(name: "bad_sensor_name") }
14
14
  let(:interval_start){ Time.at((Time.now.to_i / interval) * interval) }
15
15
 
16
16
  describe '#last_value' do
@@ -117,4 +117,4 @@ describe PulseMeter::Visualize::Sensor do
117
117
  end
118
118
  end
119
119
 
120
- end
120
+ end
@@ -13,8 +13,8 @@ describe PulseMeter::Visualize::SeriesExtractor do
13
13
  annotation: 'hashed sensor'
14
14
  ) }
15
15
 
16
- let!(:simple_sensor){PulseMeter::Visualize::Sensor.new(sensor: :simple_sensor)}
17
- let!(:hashed_sensor){PulseMeter::Visualize::Sensor.new(sensor: :hashed_sensor)}
16
+ let!(:simple_sensor){PulseMeter::Visualize::Sensor.new(name: :simple_sensor)}
17
+ let!(:hashed_sensor){PulseMeter::Visualize::Sensor.new(name: :hashed_sensor)}
18
18
 
19
19
  describe "simple extractor" do
20
20
 
@@ -77,4 +77,4 @@ describe PulseMeter::Visualize::SeriesExtractor do
77
77
  end
78
78
  end
79
79
 
80
- end
80
+ end
@@ -0,0 +1,78 @@
1
+ require "spec_helper"
2
+
3
+ describe PulseMeter::Visualize::Widgets::Area 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(:timespan){interval * 2}
14
+ let(:a_color){'#FF0000'}
15
+ let(:b_color){'#FFFF00'}
16
+
17
+ let(:interval_start){ Time.at((Time.now.to_i / interval) * interval) }
18
+
19
+ let(:widget) do
20
+ w = PulseMeter::Visualize::DSL::Widgets::Area.new(widget_name)
21
+ w.redraw_interval redraw_interval
22
+ w.width width
23
+ w.sensor :a_sensor, color: a_color
24
+ w.sensor :b_sensor, color: b_color
25
+ w.gchart_options a: 1
26
+ w.timespan timespan
27
+ w.to_data
28
+ end
29
+
30
+ describe "#data" do
31
+ it "should contain type, title, redraw_interval, width, gchart_options, timespan attriutes" do
32
+ wdata = widget.data
33
+ wdata[:type].should == 'area'
34
+ wdata[:title].should == widget_name
35
+ wdata[:redraw_interval].should == redraw_interval
36
+ wdata[:width].should == width
37
+ wdata[:gchart_options].should == {a: 1}
38
+ wdata[:timespan].should == timespan
39
+ end
40
+
41
+ describe "series attribute" do
42
+ before(:each) do
43
+ Timecop.freeze(interval_start + 1) do
44
+ a_sensor.event(12)
45
+ b_sensor.event(33)
46
+ end
47
+ Timecop.freeze(interval_start + interval + 1) do
48
+ a_sensor.event(111)
49
+ end
50
+ @current_time = interval_start + 2 * interval - 1
51
+ end
52
+
53
+ it "should contain valid series" do
54
+ Timecop.freeze(@current_time) do
55
+ widget.data[:series].should ==
56
+ {
57
+ titles: [a_sensor.annotation, b_sensor.annotation],
58
+ rows: [[interval_start.to_i * 1000, 12, 33]],
59
+ options: [
60
+ {color: a_color},
61
+ {color: b_color}
62
+ ]
63
+ }
64
+ end
65
+ end
66
+
67
+ it "should accept custom timespan" do
68
+ Timecop.freeze(@current_time + interval) do
69
+ widget.data(timespan: timespan)[:series][:rows].size.should == 1
70
+ widget.data(timespan: timespan + interval)[:series][:rows].size.should == 2
71
+ end
72
+ end
73
+
74
+ end
75
+ end
76
+ end
77
+
78
+
@@ -0,0 +1,63 @@
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
+
@@ -0,0 +1,77 @@
1
+ require "spec_helper"
2
+
3
+ describe PulseMeter::Visualize::Widgets::Line 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(:timespan){interval * 2}
14
+ let(:a_color){'#FF0000'}
15
+ let(:b_color){'#FFFF00'}
16
+
17
+ let(:interval_start){ Time.at((Time.now.to_i / interval) * interval) }
18
+
19
+ let(:widget) do
20
+ w = PulseMeter::Visualize::DSL::Widgets::Line.new(widget_name)
21
+ w.redraw_interval redraw_interval
22
+ w.width width
23
+ w.sensor :a_sensor, color: a_color
24
+ w.sensor :b_sensor, color: b_color
25
+ w.gchart_options a: 1
26
+ w.timespan timespan
27
+ w.to_data
28
+ end
29
+
30
+ describe "#data" do
31
+ it "should contain type, title, redraw_interval, width, gchart_options, timespan attriutes" do
32
+ wdata = widget.data
33
+ wdata[:type].should == 'line'
34
+ wdata[:title].should == widget_name
35
+ wdata[:redraw_interval].should == redraw_interval
36
+ wdata[:width].should == width
37
+ wdata[:gchart_options].should == {a: 1}
38
+ wdata[:timespan].should == timespan
39
+ end
40
+
41
+ describe "series attribute" do
42
+ before(:each) do
43
+ Timecop.freeze(interval_start + 1) do
44
+ a_sensor.event(12)
45
+ b_sensor.event(33)
46
+ end
47
+ Timecop.freeze(interval_start + interval + 1) do
48
+ a_sensor.event(111)
49
+ end
50
+ @current_time = interval_start + 2 * interval - 1
51
+ end
52
+
53
+ it "should contain valid series" do
54
+ Timecop.freeze(@current_time) do
55
+ widget.data[:series].should ==
56
+ {
57
+ titles: [a_sensor.annotation, b_sensor.annotation],
58
+ rows: [[interval_start.to_i * 1000, 12, 33]],
59
+ options: [
60
+ {color: a_color},
61
+ {color: b_color}
62
+ ]
63
+ }
64
+ end
65
+ end
66
+
67
+ it "should accept custom timespan" do
68
+ Timecop.freeze(@current_time + interval) do
69
+ widget.data(timespan: timespan)[:series][:rows].size.should == 1
70
+ widget.data(timespan: timespan + interval)[:series][:rows].size.should == 2
71
+ end
72
+ end
73
+
74
+ end
75
+ end
76
+ end
77
+
@@ -0,0 +1,73 @@
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
+