pulse-meter 0.4.8 → 0.4.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -100,8 +100,9 @@ while true
100
100
  sensors.shortest_minute_request(request_time)
101
101
  sensors.perc90_minute_request(request_time)
102
102
 
103
- agent_counter = sensors.sensor(agent_names.shuffle.first)
104
- agent_counter.event(1)
103
+ sensors.sensor(agent_names.shuffle.first) do |s|
104
+ s.event(1)
105
+ end
105
106
 
106
107
  sensors.cpu(Random.rand(100))
107
108
 
@@ -5,6 +5,7 @@ require "pulse-meter/mixins/dumper"
5
5
  require "pulse-meter/mixins/utils"
6
6
  require "pulse-meter/mixins/cmd"
7
7
  require "pulse-meter/observer"
8
+ require "pulse-meter/observer/extended"
8
9
  require "pulse-meter/sensor"
9
10
  require "pulse-meter/sensor/configuration"
10
11
 
@@ -16,6 +16,7 @@ module PulseMeter
16
16
  @buffer = []
17
17
  @in_multi = false
18
18
  @consumer_thread = run_consumer
19
+ at_exit{ wait_for_pending_events }
19
20
  end
20
21
 
21
22
  def multi
@@ -88,6 +88,19 @@ module PulseMeter
88
88
  (first_letter_upper ? first.capitalize : first.downcase) + terms.map(&:capitalize).join
89
89
  end
90
90
 
91
+ # Converts string from CamelCase to snake_case
92
+ # @param str [String] string to be underscore
93
+ # @return [String]
94
+ # @raise [ArgumentError] unless passed value responds to to_s
95
+ def underscore(str)
96
+ raise ArgumentError unless str.respond_to?(:to_s)
97
+ str.to_s.gsub(/::/, '/').
98
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
99
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
100
+ tr("-", "_").
101
+ downcase
102
+ end
103
+
91
104
  # Converts string of the form YYYYmmddHHMMSS (considered as UTC) to Time
92
105
  # @param str [String] string to be converted
93
106
  # @return [Time]
@@ -2,6 +2,8 @@ require 'pulse-meter'
2
2
 
3
3
  module PulseMeter
4
4
  class Observer
5
+ extend PulseMeter::Mixins::Utils
6
+
5
7
  class << self
6
8
  # Removes observation from instance method
7
9
  # @param klass [Class] class
@@ -53,19 +55,8 @@ module PulseMeter
53
55
  end
54
56
  end
55
57
 
56
- private
58
+ protected
57
59
 
58
- def unchain_block(method)
59
- with_observer = method_with_observer(method)
60
- without_observer = method_without_observer(method)
61
-
62
- Proc.new do
63
- alias_method(method, without_observer)
64
- remove_method(with_observer)
65
- remove_method(without_observer)
66
- end
67
- end
68
-
69
60
  def define_instrumented_method(method_owner, method, receiver, &handler)
70
61
  with_observer = method_with_observer(method)
71
62
  without_observer = method_without_observer(method)
@@ -83,6 +74,19 @@ module PulseMeter
83
74
  end
84
75
  end
85
76
 
77
+ private
78
+
79
+ def unchain_block(method)
80
+ with_observer = method_with_observer(method)
81
+ without_observer = method_without_observer(method)
82
+
83
+ Proc.new do
84
+ alias_method(method, without_observer)
85
+ remove_method(with_observer)
86
+ remove_method(without_observer)
87
+ end
88
+ end
89
+
86
90
  def chain_block(method, receiver, &handler)
87
91
  with_observer = method_with_observer(method)
88
92
  without_observer = method_without_observer(method)
@@ -105,11 +109,11 @@ module PulseMeter
105
109
  end
106
110
 
107
111
  def method_with_observer(method)
108
- "#{method}_with_observer"
112
+ "#{method}_with_#{underscore(self).tr('/', '_')}"
109
113
  end
110
114
 
111
115
  def method_without_observer(method)
112
- "#{method}_without_observer"
116
+ "#{method}_without_#{underscore(self).tr('/', '_')}"
113
117
  end
114
118
  end
115
119
  end
@@ -0,0 +1,34 @@
1
+ require 'pulse-meter'
2
+
3
+ module PulseMeter
4
+ class Observer::Extended < ::PulseMeter::Observer
5
+ class << self
6
+ protected
7
+
8
+ def define_instrumented_method(method_owner, method, receiver, &handler)
9
+ with_observer = method_with_observer(method)
10
+ without_observer = method_without_observer(method)
11
+ method_owner.send(:define_method, with_observer) do |*args, &block|
12
+ start_time = Time.now
13
+ begin
14
+ result = self.send(without_observer, *args, &block)
15
+ ensure
16
+ begin
17
+ delta = ((Time.now - start_time) * 1000).to_i
18
+ observe_parameters = {
19
+ self: self,
20
+ delta: delta,
21
+ result: result,
22
+ args: args,
23
+ exception: $!
24
+ }
25
+ receiver.instance_exec(observe_parameters, &handler)
26
+ rescue StandardError
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,3 @@
1
1
  module PulseMeter
2
- VERSION = "0.4.8"
2
+ VERSION = "0.4.9"
3
3
  end
@@ -1,5 +1,5 @@
1
1
  #main {
2
- margin-top: 30px;
2
+ margin-top: 50px;
3
3
  }
4
4
 
5
5
  #plotarea{
@@ -49,3 +49,8 @@
49
49
  margin-top: 0px;
50
50
  margin-bottom: 4px;
51
51
  }
52
+
53
+ select#extend-timespan-val {
54
+ display: inline;
55
+ }
56
+
@@ -20,14 +20,11 @@
20
20
  = partial "widgets/#{wtype}"
21
21
  = partial "sensors"
22
22
 
23
- .container#main
24
- .row
25
- .span10.offset1
26
- .navbar
27
- .navbar-inner
28
- .container
29
- %a{href: '#/custom'}
30
- %span.brand= @title
31
- %ul.nav#page-titles
32
- #widgets.row
23
+ .navbar.navbar-fixed-top
24
+ .navbar-inner
25
+ .container-fluid
26
+ %a.brand{href: '#/custom'}= @title
27
+ %ul.nav#page-titles
33
28
 
29
+ .container-fluid#main
30
+ .row-fluid#widgets
@@ -33,7 +33,7 @@
33
33
  Refresh chart
34
34
  .form-inline
35
35
  Timespan:
36
- %select#extend-timespan-val.btn-mini.span1
36
+ %select#extend-timespan-val.btn-mini.span3
37
37
  = partial "widgets/extend_options"
38
38
  %button#extend-timespan.btn.btn-mini
39
39
  %i.icon-arrow-left
@@ -56,10 +56,7 @@
56
56
 
57
57
 
58
58
  %script#dynamic-widget{type: 'text/template'}
59
- .span10
60
- #dynamic-plotarea
61
- #errors
62
- .span10
59
+ .span6
63
60
  #sensor-controls.form-horizontal
64
61
  %p.form-inline
65
62
  Chart type
@@ -74,6 +71,6 @@
74
71
  %i.icon-refresh
75
72
  Refresh sensor list
76
73
  #sensor-list-area
77
-
78
-
79
-
74
+ .span6
75
+ #dynamic-plotarea
76
+ #errors
@@ -30,7 +30,7 @@
30
30
  %p
31
31
  %label
32
32
  Timespan:
33
- %select#extend-timespan-val.btn-mini.span1
33
+ %select#extend-timespan-val.btn-mini.span3
34
34
  = partial "widgets/extend_options"
35
35
  %button#extend-timespan.btn.btn-mini
36
36
  %i.icon-arrow-left
@@ -30,7 +30,7 @@
30
30
  %p
31
31
  %label
32
32
  Timespan:
33
- %select#extend-timespan-val.btn-mini.span1
33
+ %select#extend-timespan-val.btn-mini.span3
34
34
  = partial "widgets/extend_options"
35
35
  %button#extend-timespan.btn.btn-mini
36
36
  %i.icon-arrow-left
@@ -21,7 +21,7 @@
21
21
  %p
22
22
  %label
23
23
  Timespan:
24
- %select#extend-timespan-val.btn-mini.span1
24
+ %select#extend-timespan-val.btn-mini.span3
25
25
  = partial "widgets/extend_options"
26
26
  %button#extend-timespan.btn.btn-mini
27
27
  %i.icon-arrow-left
@@ -156,6 +156,14 @@ describe PulseMeter::Mixins::Utils do
156
156
  end
157
157
  end
158
158
 
159
+ describe "#underscore" do
160
+ it "should underscore string" do
161
+ dummy.underscore("aaBbCc").should == "aa_bb_cc"
162
+ dummy.underscore("AaBbCc").should == "aa_bb_cc"
163
+ dummy.underscore("aaBb::Cc").should == "aa_bb/cc"
164
+ end
165
+ end
166
+
159
167
  describe "#camelize_keys" do
160
168
  it "should deeply camelize keys in hashes" do
161
169
  dummy.camelize_keys({ :aa_bb_cc => [ { :dd_ee => 123 }, 456 ] }).should =={ 'aaBbCc' => [ { 'ddEe' => 123 }, 456 ] }
@@ -0,0 +1,92 @@
1
+ require 'spec_helper'
2
+
3
+ describe PulseMeter::Observer::Extended do
4
+ context "instance methods observation" do
5
+ let!(:dummy) {ObservedDummy.new}
6
+ let!(:sensor) {PulseMeter::Sensor::Counter.new(:foo)}
7
+ before do
8
+ [:incr, :error].each {|m| described_class.unobserve_method(ObservedDummy, m)}
9
+ end
10
+
11
+ describe ".observe_method" do
12
+ it "passes exended parameters to block in normal execution" do
13
+ Timecop.freeze do
14
+ parameters = {}
15
+
16
+ described_class.observe_method(ObservedDummy, :incr, sensor) do |params|
17
+ parameters = params
18
+ end
19
+
20
+ dummy.incr(40)
21
+
22
+ parameters[:self].should == dummy
23
+ parameters[:delta].should >= 1000
24
+ parameters[:result].should == 40
25
+ parameters[:exception].should be_nil
26
+ parameters[:args].should == [40]
27
+ end
28
+ end
29
+
30
+ it "passes exended parameters to block with exception" do
31
+ Timecop.freeze do
32
+ parameters = {}
33
+
34
+ described_class.observe_method(ObservedDummy, :error, sensor) do |params|
35
+ parameters = params
36
+ end
37
+
38
+ lambda { dummy.error }.should raise_error(RuntimeError)
39
+
40
+ parameters[:self].should == dummy
41
+ parameters[:result].should == nil
42
+ parameters[:exception].class.should == RuntimeError
43
+ parameters[:args].should == []
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ context "class methods observation" do
50
+ let!(:sensor) {PulseMeter::Sensor::Counter.new(:foo)}
51
+ before do
52
+ [:incr, :error].each {|m| described_class.unobserve_class_method(ObservedDummy, m)}
53
+ end
54
+
55
+ describe ".observe_class_method" do
56
+ it "passes exended parameters to block in normal execution" do
57
+ Timecop.freeze do
58
+ parameters = {}
59
+
60
+ described_class.observe_class_method(ObservedDummy, :incr, sensor) do |params|
61
+ parameters = params
62
+ end
63
+
64
+ ObservedDummy.incr(40)
65
+
66
+ parameters[:self].should == ObservedDummy
67
+ parameters[:delta].should >= 1000
68
+ parameters[:result].should == 40
69
+ parameters[:exception].should be_nil
70
+ parameters[:args].should == [40]
71
+ end
72
+ end
73
+
74
+ it "passes exended parameters to block with exception" do
75
+ Timecop.freeze do
76
+ parameters = {}
77
+
78
+ described_class.observe_class_method(ObservedDummy, :error, sensor) do |params|
79
+ parameters = params
80
+ end
81
+
82
+ lambda { ObservedDummy.error }.should raise_error(RuntimeError)
83
+
84
+ parameters[:self].should == ObservedDummy
85
+ parameters[:result].should == nil
86
+ parameters[:exception].class.should == RuntimeError
87
+ parameters[:args].should == []
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -3,26 +3,6 @@ require 'spec_helper'
3
3
  describe PulseMeter::Observer do
4
4
 
5
5
  context "instance methods observation" do
6
-
7
- class ObservedDummy
8
- attr_reader :count
9
-
10
- def initialize
11
- @count = 0
12
- end
13
-
14
- def incr(value = 1, &proc)
15
- Timecop.travel(Time.now + 1)
16
- @count += value
17
- @count += proc.call if proc
18
- @count
19
- end
20
-
21
- def error
22
- raise RuntimeError
23
- end
24
- end
25
-
26
6
  let!(:dummy) {ObservedDummy.new}
27
7
  let!(:sensor) {PulseMeter::Sensor::Counter.new(:foo)}
28
8
  before do
@@ -124,31 +104,6 @@ describe PulseMeter::Observer do
124
104
  end
125
105
 
126
106
  context "class methods observation" do
127
-
128
- class ObservedDummy
129
- @@count = 0
130
- class << self
131
- def count
132
- @@count
133
- end
134
-
135
- def reset
136
- @@count = 0
137
- end
138
-
139
- def incr(value = 1, &proc)
140
- Timecop.travel(Time.now + 1)
141
- @@count += value
142
- @@count += proc.call if proc
143
- @@count
144
- end
145
-
146
- def error
147
- raise RuntimeError
148
- end
149
- end
150
- end
151
-
152
107
  let!(:dummy) {ObservedDummy}
153
108
  let!(:sensor) {PulseMeter::Sensor::Counter.new(:foo)}
154
109
  before do
@@ -0,0 +1,40 @@
1
+ class ObservedDummy
2
+ attr_reader :count
3
+ @@count = 0
4
+
5
+ def initialize
6
+ @count = 0
7
+ end
8
+
9
+ def incr(value = 1, &proc)
10
+ Timecop.travel(Time.now + 1)
11
+ @count += value
12
+ @count += proc.call if proc
13
+ @count
14
+ end
15
+
16
+ def error
17
+ raise RuntimeError
18
+ end
19
+
20
+ class << self
21
+ def count
22
+ @@count
23
+ end
24
+
25
+ def reset
26
+ @@count = 0
27
+ end
28
+
29
+ def incr(value = 1, &proc)
30
+ Timecop.travel(Time.now + 1)
31
+ @@count += value
32
+ @@count += proc.call if proc
33
+ @@count
34
+ end
35
+
36
+ def error
37
+ raise RuntimeError
38
+ end
39
+ end
40
+ end