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.
- data/Rakefile +1 -48
- data/lib/pulse-meter.rb +1 -68
- data/lib/pulse-meter/visualizer.rb +1 -40
- data/pulse-meter.gemspec +4 -26
- metadata +10 -558
- data/Procfile +0 -3
- data/bin/pulse +0 -6
- data/examples/basic.ru +0 -145
- data/examples/basic_sensor_data.rb +0 -96
- data/examples/udp_benchmark.rb +0 -29
- data/lib/cmd.rb +0 -171
- data/lib/pulse-meter/command_aggregator/async.rb +0 -83
- data/lib/pulse-meter/command_aggregator/sync.rb +0 -18
- data/lib/pulse-meter/command_aggregator/udp.rb +0 -48
- data/lib/pulse-meter/extensions/enumerable.rb +0 -24
- data/lib/pulse-meter/mixins/cmd.rb +0 -46
- data/lib/pulse-meter/mixins/dumper.rb +0 -87
- data/lib/pulse-meter/mixins/utils.rb +0 -155
- data/lib/pulse-meter/observer.rb +0 -120
- data/lib/pulse-meter/observer/extended.rb +0 -34
- data/lib/pulse-meter/sensor.rb +0 -61
- data/lib/pulse-meter/sensor/base.rb +0 -88
- data/lib/pulse-meter/sensor/configuration.rb +0 -106
- data/lib/pulse-meter/sensor/counter.rb +0 -39
- data/lib/pulse-meter/sensor/hashed_counter.rb +0 -36
- data/lib/pulse-meter/sensor/hashed_indicator.rb +0 -24
- data/lib/pulse-meter/sensor/indicator.rb +0 -35
- data/lib/pulse-meter/sensor/multi.rb +0 -97
- data/lib/pulse-meter/sensor/timeline.rb +0 -236
- data/lib/pulse-meter/sensor/timeline_reduce.rb +0 -68
- data/lib/pulse-meter/sensor/timelined/average.rb +0 -32
- data/lib/pulse-meter/sensor/timelined/counter.rb +0 -23
- data/lib/pulse-meter/sensor/timelined/hashed_counter.rb +0 -31
- data/lib/pulse-meter/sensor/timelined/hashed_indicator.rb +0 -30
- data/lib/pulse-meter/sensor/timelined/indicator.rb +0 -23
- data/lib/pulse-meter/sensor/timelined/max.rb +0 -19
- data/lib/pulse-meter/sensor/timelined/median.rb +0 -14
- data/lib/pulse-meter/sensor/timelined/min.rb +0 -19
- data/lib/pulse-meter/sensor/timelined/multi_percentile.rb +0 -34
- data/lib/pulse-meter/sensor/timelined/percentile.rb +0 -22
- data/lib/pulse-meter/sensor/timelined/uniq_counter.rb +0 -22
- data/lib/pulse-meter/sensor/timelined/zset_based.rb +0 -38
- data/lib/pulse-meter/sensor/uniq_counter.rb +0 -24
- data/lib/pulse-meter/server.rb +0 -0
- data/lib/pulse-meter/server/command_line_options.rb +0 -0
- data/lib/pulse-meter/server/config_options.rb +0 -0
- data/lib/pulse-meter/server/sensors.rb +0 -0
- data/lib/pulse-meter/udp_server.rb +0 -45
- data/lib/pulse-meter/version.rb +0 -3
- data/lib/pulse-meter/visualize/app.rb +0 -78
- data/lib/pulse-meter/visualize/base.rb +0 -15
- data/lib/pulse-meter/visualize/coffee/application.coffee +0 -40
- data/lib/pulse-meter/visualize/coffee/collections/page_info_list.coffee +0 -17
- data/lib/pulse-meter/visualize/coffee/collections/sensor_info_list.coffee +0 -4
- data/lib/pulse-meter/visualize/coffee/collections/widget_list.coffee +0 -14
- data/lib/pulse-meter/visualize/coffee/extensions.coffee +0 -26
- data/lib/pulse-meter/visualize/coffee/models/dinamic_widget.coffee +0 -34
- data/lib/pulse-meter/visualize/coffee/models/page_info.coffee +0 -2
- data/lib/pulse-meter/visualize/coffee/models/sensor_info.coffee +0 -2
- data/lib/pulse-meter/visualize/coffee/models/widget.coffee +0 -54
- data/lib/pulse-meter/visualize/coffee/presenters/area.coffee +0 -2
- data/lib/pulse-meter/visualize/coffee/presenters/gauge.coffee +0 -11
- data/lib/pulse-meter/visualize/coffee/presenters/line.coffee +0 -2
- data/lib/pulse-meter/visualize/coffee/presenters/pie.coffee +0 -20
- data/lib/pulse-meter/visualize/coffee/presenters/series.coffee +0 -44
- data/lib/pulse-meter/visualize/coffee/presenters/table.coffee +0 -10
- data/lib/pulse-meter/visualize/coffee/presenters/timeline.coffee +0 -13
- data/lib/pulse-meter/visualize/coffee/presenters/widget.coffee +0 -65
- data/lib/pulse-meter/visualize/coffee/router.coffee +0 -21
- data/lib/pulse-meter/visualize/coffee/views/dynamic_chart.coffee +0 -91
- data/lib/pulse-meter/visualize/coffee/views/dynamic_widget.coffee +0 -58
- data/lib/pulse-meter/visualize/coffee/views/page_title.coffee +0 -17
- data/lib/pulse-meter/visualize/coffee/views/page_titles.coffee +0 -15
- data/lib/pulse-meter/visualize/coffee/views/sensor_info_list.coffee +0 -19
- data/lib/pulse-meter/visualize/coffee/views/widget.coffee +0 -99
- data/lib/pulse-meter/visualize/coffee/views/widget_chart.coffee +0 -13
- data/lib/pulse-meter/visualize/coffee/views/widget_list.coffee +0 -15
- data/lib/pulse-meter/visualize/dsl/base.rb +0 -131
- data/lib/pulse-meter/visualize/dsl/errors.rb +0 -40
- data/lib/pulse-meter/visualize/dsl/layout.rb +0 -27
- data/lib/pulse-meter/visualize/dsl/page.rb +0 -33
- data/lib/pulse-meter/visualize/dsl/sensor.rb +0 -20
- data/lib/pulse-meter/visualize/dsl/widget.rb +0 -37
- data/lib/pulse-meter/visualize/dsl/widgets/area.rb +0 -20
- data/lib/pulse-meter/visualize/dsl/widgets/gauge.rb +0 -12
- data/lib/pulse-meter/visualize/dsl/widgets/line.rb +0 -21
- data/lib/pulse-meter/visualize/dsl/widgets/pie.rb +0 -16
- data/lib/pulse-meter/visualize/dsl/widgets/table.rb +0 -19
- data/lib/pulse-meter/visualize/layout.rb +0 -79
- data/lib/pulse-meter/visualize/page.rb +0 -25
- data/lib/pulse-meter/visualize/public/css/application.css +0 -56
- data/lib/pulse-meter/visualize/public/css/bootstrap.css +0 -4883
- data/lib/pulse-meter/visualize/public/css/bootstrap.min.css +0 -729
- data/lib/pulse-meter/visualize/public/css/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/lib/pulse-meter/visualize/public/css/images/ui-bg_glass_75_ffffff_1x400.png +0 -0
- data/lib/pulse-meter/visualize/public/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/lib/pulse-meter/visualize/public/css/images/ui-bg_inset-soft_95_fef1ec_1x100.png +0 -0
- data/lib/pulse-meter/visualize/public/css/images/ui-icons_222222_256x240.png +0 -0
- data/lib/pulse-meter/visualize/public/css/images/ui-icons_2e83ff_256x240.png +0 -0
- data/lib/pulse-meter/visualize/public/css/images/ui-icons_454545_256x240.png +0 -0
- data/lib/pulse-meter/visualize/public/css/images/ui-icons_888888_256x240.png +0 -0
- data/lib/pulse-meter/visualize/public/css/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/lib/pulse-meter/visualize/public/css/images/ui-icons_f6cf3b_256x240.png +0 -0
- data/lib/pulse-meter/visualize/public/css/jquery-ui-1.8.16.bootstrap.css +0 -1320
- data/lib/pulse-meter/visualize/public/favicon.ico +0 -208
- data/lib/pulse-meter/visualize/public/img/glyphicons-halflings-white.png +0 -0
- data/lib/pulse-meter/visualize/public/img/glyphicons-halflings.png +0 -0
- data/lib/pulse-meter/visualize/public/js/application.js +0 -973
- data/lib/pulse-meter/visualize/public/js/backbone-min.js +0 -38
- data/lib/pulse-meter/visualize/public/js/bootstrap.js +0 -1835
- data/lib/pulse-meter/visualize/public/js/jquery-1.7.2.min.js +0 -4
- data/lib/pulse-meter/visualize/public/js/jquery-ui-1.8.16.bootstrap.min.js +0 -791
- data/lib/pulse-meter/visualize/public/js/jquery-ui-1.8.23.custom.min.js +0 -21
- data/lib/pulse-meter/visualize/public/js/jquery-ui-timepicker-addon.js +0 -1687
- data/lib/pulse-meter/visualize/public/js/json2.js +0 -487
- data/lib/pulse-meter/visualize/public/js/underscore-min.js +0 -32
- data/lib/pulse-meter/visualize/sensor.rb +0 -63
- data/lib/pulse-meter/visualize/series_extractor.rb +0 -107
- data/lib/pulse-meter/visualize/views/main.haml +0 -30
- data/lib/pulse-meter/visualize/views/sensors.haml +0 -76
- data/lib/pulse-meter/visualize/views/widgets/area.haml +0 -53
- data/lib/pulse-meter/visualize/views/widgets/extend_options.haml +0 -11
- data/lib/pulse-meter/visualize/views/widgets/gauge.haml +0 -13
- data/lib/pulse-meter/visualize/views/widgets/line.haml +0 -54
- data/lib/pulse-meter/visualize/views/widgets/pie.haml +0 -13
- data/lib/pulse-meter/visualize/views/widgets/table.haml +0 -45
- data/lib/pulse-meter/visualize/widget.rb +0 -38
- data/lib/pulse-meter/visualize/widgets/gauge.rb +0 -47
- data/lib/pulse-meter/visualize/widgets/pie.rb +0 -36
- data/lib/pulse-meter/visualize/widgets/timeline.rb +0 -114
- data/spec/pulse_meter/command_aggregator/async_spec.rb +0 -53
- data/spec/pulse_meter/command_aggregator/sync_spec.rb +0 -25
- data/spec/pulse_meter/command_aggregator/udp_spec.rb +0 -45
- data/spec/pulse_meter/extensions/enumerable_spec.rb +0 -58
- data/spec/pulse_meter/mixins/cmd_spec.rb +0 -117
- data/spec/pulse_meter/mixins/dumper_spec.rb +0 -162
- data/spec/pulse_meter/mixins/utils_spec.rb +0 -212
- data/spec/pulse_meter/observer/extended_spec.rb +0 -92
- data/spec/pulse_meter/observer_spec.rb +0 -207
- data/spec/pulse_meter/sensor/base_spec.rb +0 -106
- data/spec/pulse_meter/sensor/configuration_spec.rb +0 -103
- data/spec/pulse_meter/sensor/counter_spec.rb +0 -54
- data/spec/pulse_meter/sensor/hashed_counter_spec.rb +0 -43
- data/spec/pulse_meter/sensor/hashed_indicator_spec.rb +0 -39
- data/spec/pulse_meter/sensor/indicator_spec.rb +0 -43
- data/spec/pulse_meter/sensor/multi_spec.rb +0 -137
- data/spec/pulse_meter/sensor/timeline_spec.rb +0 -88
- data/spec/pulse_meter/sensor/timelined/average_spec.rb +0 -6
- data/spec/pulse_meter/sensor/timelined/counter_spec.rb +0 -6
- data/spec/pulse_meter/sensor/timelined/hashed_counter_spec.rb +0 -8
- data/spec/pulse_meter/sensor/timelined/hashed_indicator_spec.rb +0 -8
- data/spec/pulse_meter/sensor/timelined/indicator_spec.rb +0 -6
- data/spec/pulse_meter/sensor/timelined/max_spec.rb +0 -7
- data/spec/pulse_meter/sensor/timelined/median_spec.rb +0 -7
- data/spec/pulse_meter/sensor/timelined/min_spec.rb +0 -7
- data/spec/pulse_meter/sensor/timelined/multi_percentile_spec.rb +0 -21
- data/spec/pulse_meter/sensor/timelined/percentile_spec.rb +0 -17
- data/spec/pulse_meter/sensor/timelined/uniq_counter_spec.rb +0 -9
- data/spec/pulse_meter/sensor/uniq_counter_spec.rb +0 -28
- data/spec/pulse_meter/udp_server_spec.rb +0 -36
- data/spec/pulse_meter/visualize/app_spec.rb +0 -27
- data/spec/pulse_meter/visualize/dsl/layout_spec.rb +0 -64
- data/spec/pulse_meter/visualize/dsl/page_spec.rb +0 -62
- data/spec/pulse_meter/visualize/dsl/sensor_spec.rb +0 -30
- data/spec/pulse_meter/visualize/dsl/widget_spec.rb +0 -6
- data/spec/pulse_meter/visualize/dsl/widgets/area_spec.rb +0 -44
- data/spec/pulse_meter/visualize/dsl/widgets/gauge_spec.rb +0 -22
- data/spec/pulse_meter/visualize/dsl/widgets/line_spec.rb +0 -44
- data/spec/pulse_meter/visualize/dsl/widgets/pie_spec.rb +0 -35
- data/spec/pulse_meter/visualize/dsl/widgets/table_spec.rb +0 -36
- data/spec/pulse_meter/visualize/layout_spec.rb +0 -54
- data/spec/pulse_meter/visualize/page_spec.rb +0 -153
- data/spec/pulse_meter/visualize/sensor_spec.rb +0 -120
- data/spec/pulse_meter/visualize/series_extractor_spec.rb +0 -80
- data/spec/pulse_meter/visualize/widgets/area_spec.rb +0 -6
- data/spec/pulse_meter/visualize/widgets/gauge_spec.rb +0 -63
- data/spec/pulse_meter/visualize/widgets/line_spec.rb +0 -6
- data/spec/pulse_meter/visualize/widgets/pie_spec.rb +0 -73
- data/spec/pulse_meter/visualize/widgets/table_spec.rb +0 -6
- data/spec/pulse_meter/visualizer_spec.rb +0 -42
- data/spec/pulse_meter_spec.rb +0 -73
- data/spec/shared_examples/dsl_widget.rb +0 -106
- data/spec/shared_examples/timeline_sensor.rb +0 -439
- data/spec/shared_examples/timelined_subclass.rb +0 -23
- data/spec/shared_examples/widget.rb +0 -97
- data/spec/spec_helper.rb +0 -40
- data/spec/support/matchers.rb +0 -34
- data/spec/support/observered.rb +0 -40
data/lib/pulse-meter/observer.rb
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
require 'pulse-meter'
|
2
|
-
|
3
|
-
module PulseMeter
|
4
|
-
class Observer
|
5
|
-
extend PulseMeter::Mixins::Utils
|
6
|
-
|
7
|
-
class << self
|
8
|
-
# Removes observation from instance method
|
9
|
-
# @param klass [Class] class
|
10
|
-
# @param method [Symbol] instance method name
|
11
|
-
def unobserve_method(klass, method)
|
12
|
-
with_observer = method_with_observer(method)
|
13
|
-
if klass.method_defined?(with_observer)
|
14
|
-
block = unchain_block(method)
|
15
|
-
klass.class_eval &block
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# Removes observation from class method
|
20
|
-
# @param klass [Class] class
|
21
|
-
# @param method [Symbol] class method name
|
22
|
-
def unobserve_class_method(klass, method)
|
23
|
-
with_observer = method_with_observer(method)
|
24
|
-
if klass.respond_to?(with_observer)
|
25
|
-
method_owner = metaclass(klass)
|
26
|
-
block = unchain_block(method)
|
27
|
-
method_owner.instance_eval &block
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Registeres an observer for instance method
|
32
|
-
# @param klass [Class] class
|
33
|
-
# @param method [Symbol] instance method
|
34
|
-
# @param sensor [Object] notifications receiver
|
35
|
-
# @param proc [Proc] proc to be called in context of receiver each time observed method called
|
36
|
-
def observe_method(klass, method, sensor, &proc)
|
37
|
-
with_observer = method_with_observer(method)
|
38
|
-
unless klass.method_defined?(with_observer)
|
39
|
-
block = chain_block(method, sensor, &proc)
|
40
|
-
klass.class_eval &block
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Registeres an observer for class method
|
45
|
-
# @param klass [Class] class
|
46
|
-
# @param method [Symbol] class method
|
47
|
-
# @param sensor [Object] notifications receiver
|
48
|
-
# @param proc [Proc] proc to be called in context of receiver each time observed method called
|
49
|
-
def observe_class_method(klass, method, sensor, &proc)
|
50
|
-
with_observer = method_with_observer(method)
|
51
|
-
unless klass.respond_to?(with_observer)
|
52
|
-
method_owner = metaclass(klass)
|
53
|
-
block = chain_block(method, sensor, &proc)
|
54
|
-
method_owner.instance_eval &block
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
protected
|
59
|
-
|
60
|
-
def define_instrumented_method(method_owner, method, receiver, &handler)
|
61
|
-
with_observer = method_with_observer(method)
|
62
|
-
without_observer = method_without_observer(method)
|
63
|
-
method_owner.send(:define_method, with_observer) do |*args, &block|
|
64
|
-
start_time = Time.now
|
65
|
-
begin
|
66
|
-
self.send(without_observer, *args, &block)
|
67
|
-
ensure
|
68
|
-
begin
|
69
|
-
delta = ((Time.now - start_time) * 1000).to_i
|
70
|
-
receiver.instance_exec(delta, *args, &handler)
|
71
|
-
rescue StandardError
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
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
|
-
|
90
|
-
def chain_block(method, receiver, &handler)
|
91
|
-
with_observer = method_with_observer(method)
|
92
|
-
without_observer = method_without_observer(method)
|
93
|
-
me = self
|
94
|
-
|
95
|
-
Proc.new do
|
96
|
-
alias_method(without_observer, method)
|
97
|
-
method_owner = self
|
98
|
-
me.send(:define_instrumented_method, method_owner, method, receiver, &handler)
|
99
|
-
alias_method(method, with_observer)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def metaclass(klass)
|
104
|
-
klass.class_eval do
|
105
|
-
class << self
|
106
|
-
self
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def method_with_observer(method)
|
112
|
-
"#{method}_with_#{underscore(self).tr('/', '_')}"
|
113
|
-
end
|
114
|
-
|
115
|
-
def method_without_observer(method)
|
116
|
-
"#{method}_without_#{underscore(self).tr('/', '_')}"
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
@@ -1,34 +0,0 @@
|
|
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
|
data/lib/pulse-meter/sensor.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
require 'pulse-meter/sensor/base'
|
2
|
-
require 'pulse-meter/sensor/configuration'
|
3
|
-
require 'pulse-meter/sensor/counter'
|
4
|
-
require 'pulse-meter/sensor/indicator'
|
5
|
-
require 'pulse-meter/sensor/hashed_counter'
|
6
|
-
require 'pulse-meter/sensor/hashed_indicator'
|
7
|
-
require 'pulse-meter/sensor/multi'
|
8
|
-
require 'pulse-meter/sensor/uniq_counter'
|
9
|
-
require 'pulse-meter/sensor/timeline_reduce'
|
10
|
-
require 'pulse-meter/sensor/timeline'
|
11
|
-
require 'pulse-meter/sensor/timelined/average'
|
12
|
-
require 'pulse-meter/sensor/timelined/counter'
|
13
|
-
require 'pulse-meter/sensor/timelined/indicator'
|
14
|
-
require 'pulse-meter/sensor/timelined/hashed_counter'
|
15
|
-
require 'pulse-meter/sensor/timelined/hashed_indicator'
|
16
|
-
require 'pulse-meter/sensor/timelined/zset_based'
|
17
|
-
require 'pulse-meter/sensor/timelined/min'
|
18
|
-
require 'pulse-meter/sensor/timelined/max'
|
19
|
-
require 'pulse-meter/sensor/timelined/percentile'
|
20
|
-
require 'pulse-meter/sensor/timelined/multi_percentile'
|
21
|
-
require 'pulse-meter/sensor/timelined/median'
|
22
|
-
require 'pulse-meter/sensor/timelined/uniq_counter'
|
23
|
-
|
24
|
-
# Top level sensor module
|
25
|
-
module PulseMeter
|
26
|
-
|
27
|
-
# Atomic sensor data
|
28
|
-
SensorData = Struct.new(:start_time, :value)
|
29
|
-
|
30
|
-
# General sensor exception
|
31
|
-
class SensorError < StandardError; end
|
32
|
-
|
33
|
-
# Exception to be raised when sensor name is malformed
|
34
|
-
class BadSensorName < SensorError
|
35
|
-
def initialize(name, options = {})
|
36
|
-
super("Bad sensor name: `#{name}', only a-z letters and _ are allowed")
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# Exception to be raised when Redis is not initialized
|
41
|
-
class RedisNotInitialized < SensorError
|
42
|
-
def initialize
|
43
|
-
super("PulseMeter.redis is not set")
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
# Exception to be raised when sensor cannot be dumped
|
48
|
-
class DumpError < SensorError; end
|
49
|
-
|
50
|
-
# Exception to be raised on attempts of using the same key for different sensors
|
51
|
-
class DumpConflictError < DumpError; end
|
52
|
-
|
53
|
-
# Exception to be raised when sensor cannot be restored
|
54
|
-
class RestoreError < SensorError; end
|
55
|
-
|
56
|
-
module Remote
|
57
|
-
class MessageTooLarge < PulseMeter::SensorError; end
|
58
|
-
class ConnectionError < PulseMeter::SensorError; end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
@@ -1,88 +0,0 @@
|
|
1
|
-
module PulseMeter
|
2
|
-
module Sensor
|
3
|
-
# @abstract Subclass and override {#event} to implement sensor
|
4
|
-
class Base
|
5
|
-
include PulseMeter::Mixins::Dumper
|
6
|
-
|
7
|
-
# @!attribute [rw] redis
|
8
|
-
# @return [Redis]
|
9
|
-
attr_accessor :redis
|
10
|
-
# @!attribute [r] name
|
11
|
-
# @return [String] sensor name
|
12
|
-
attr_reader :name
|
13
|
-
|
14
|
-
# Initializes sensor and dumps it to redis
|
15
|
-
# @param name [String] sensor name
|
16
|
-
# @option options [String] :annotation Sensor annotation
|
17
|
-
# @raise [BadSensorName] if sensor name is malformed
|
18
|
-
# @raise [RedisNotInitialized] unless Redis is initialized
|
19
|
-
def initialize(name, options={})
|
20
|
-
@name = name.to_s
|
21
|
-
if options[:annotation]
|
22
|
-
annotate(options[:annotation])
|
23
|
-
end
|
24
|
-
raise BadSensorName, @name unless @name =~ /\A\w+\z/
|
25
|
-
raise RedisNotInitialized unless PulseMeter.redis
|
26
|
-
dump!
|
27
|
-
end
|
28
|
-
|
29
|
-
# Returns Redis instance
|
30
|
-
def redis
|
31
|
-
PulseMeter.redis
|
32
|
-
end
|
33
|
-
|
34
|
-
def command_aggregator
|
35
|
-
PulseMeter.command_aggregator
|
36
|
-
end
|
37
|
-
|
38
|
-
# Saves annotation to Redis
|
39
|
-
# @param description [String] Sensor annotation
|
40
|
-
def annotate(description)
|
41
|
-
redis.set(desc_key, description)
|
42
|
-
end
|
43
|
-
|
44
|
-
# Retrieves annotation from Redis
|
45
|
-
# @return [String] Sensor annotation
|
46
|
-
def annotation
|
47
|
-
redis.get(desc_key)
|
48
|
-
end
|
49
|
-
|
50
|
-
# Cleans up all sensor metadata in Redis
|
51
|
-
def cleanup
|
52
|
-
redis.del(desc_key)
|
53
|
-
cleanup_dump
|
54
|
-
end
|
55
|
-
|
56
|
-
# Processes event
|
57
|
-
# @param value [Object] value produced by some kind of event
|
58
|
-
def event(value)
|
59
|
-
process_event(value)
|
60
|
-
true
|
61
|
-
rescue StandardError => e
|
62
|
-
false
|
63
|
-
end
|
64
|
-
|
65
|
-
protected
|
66
|
-
|
67
|
-
# Forms Redis key to store annotation
|
68
|
-
def desc_key
|
69
|
-
"pulse_meter:desc:#{name}"
|
70
|
-
end
|
71
|
-
|
72
|
-
# For a block
|
73
|
-
# @yield Executes it within Redis multi
|
74
|
-
def multi
|
75
|
-
redis.multi do
|
76
|
-
yield
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
private
|
81
|
-
|
82
|
-
def process_event(value)
|
83
|
-
# do nothing here
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
@@ -1,106 +0,0 @@
|
|
1
|
-
module PulseMeter
|
2
|
-
module Sensor
|
3
|
-
# Constructs multiple sensors from configuration passed
|
4
|
-
class Configuration
|
5
|
-
include PulseMeter::Mixins::Utils
|
6
|
-
include Enumerable
|
7
|
-
|
8
|
-
# Initializes sensors
|
9
|
-
# @param opts [Hash] sensors' configuration
|
10
|
-
def initialize(opts = {})
|
11
|
-
@opts = opts
|
12
|
-
end
|
13
|
-
|
14
|
-
# Returns previously initialized sensor by name
|
15
|
-
# @param name [Symbol] sensor name
|
16
|
-
# @yield [sensor] Gives sensor(if it is found) to the block
|
17
|
-
def sensor(name)
|
18
|
-
raise ArgumentError, "need a block" unless block_given?
|
19
|
-
with_resque do
|
20
|
-
s = sensors[name.to_s]
|
21
|
-
yield(s) if s
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# Returns true value if sensor with specified name exists in configuration, false otherwise
|
26
|
-
# @param name [Symbol] sensor name
|
27
|
-
def has_sensor?(name)
|
28
|
-
has_sensor = false
|
29
|
-
with_resque do
|
30
|
-
has_sensor = sensors.has_key?(name)
|
31
|
-
end
|
32
|
-
has_sensor
|
33
|
-
end
|
34
|
-
|
35
|
-
# Adds sensor
|
36
|
-
# @param name [Symbol] sensor name
|
37
|
-
# @param opts [Hash] sensor options
|
38
|
-
def add_sensor(name, opts)
|
39
|
-
with_resque do
|
40
|
-
sensors[name.to_s] = create_sensor(name, opts)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Iterates over each sensor
|
45
|
-
def each
|
46
|
-
with_resque do
|
47
|
-
sensors.each_value do |s|
|
48
|
-
yield(s)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# Invokes event(_at) for any sensor
|
54
|
-
# @raise [ArgumentError] unless sensor exists
|
55
|
-
def method_missing(name, *args)
|
56
|
-
with_resque do
|
57
|
-
name = name.to_s
|
58
|
-
if sensors.has_key?(name)
|
59
|
-
sensors[name].event(*args)
|
60
|
-
elsif name =~ /\A(.*)_at\z/
|
61
|
-
sensor_name = $1
|
62
|
-
sensors[sensor_name].event_at(*args) if sensors.has_key?(sensor_name)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
private
|
68
|
-
|
69
|
-
def with_resque
|
70
|
-
yield
|
71
|
-
rescue StandardError => e
|
72
|
-
PulseMeter.error "Configuration error: #{e}, #{e.backtrace.join("\n")}"
|
73
|
-
nil
|
74
|
-
end
|
75
|
-
|
76
|
-
|
77
|
-
# Tries to create a specific sensor
|
78
|
-
# @param name [Symbol] sensor name
|
79
|
-
# @param opts [Hash] sensor options
|
80
|
-
def create_sensor(name, opts)
|
81
|
-
sensor_type = opts.respond_to?(:sensor_type) ? opts.sensor_type : opts[:sensor_type]
|
82
|
-
klass_s = sensor_class(sensor_type)
|
83
|
-
klass = constantize(klass_s)
|
84
|
-
raise ArgumentError, "#{klass_s} is not a valid class for a sensor" unless klass
|
85
|
-
args = (opts.respond_to?(:args) ? opts.args : opts[:args]) || {}
|
86
|
-
klass.new(name, symbolize_keys(args.to_hash))
|
87
|
-
end
|
88
|
-
|
89
|
-
def sensor_class(sensor_type)
|
90
|
-
entries = sensor_type.to_s.split('/').map do |entry|
|
91
|
-
entry.split('_').map(&:capitalize).join
|
92
|
-
end
|
93
|
-
entries.unshift('PulseMeter::Sensor').join('::')
|
94
|
-
end
|
95
|
-
|
96
|
-
# Lazy collection of sensors, specified by opts
|
97
|
-
# @raise [ArgumentError] unless one of the sensors exists
|
98
|
-
def sensors
|
99
|
-
@sensors ||= @opts.each_with_object({}){ |(name, opts), sensor_acc|
|
100
|
-
sensor_acc[name.to_s] = create_sensor(name, opts)
|
101
|
-
}
|
102
|
-
end
|
103
|
-
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
@@ -1,39 +0,0 @@
|
|
1
|
-
# Static counter
|
2
|
-
module PulseMeter
|
3
|
-
module Sensor
|
4
|
-
class Counter < Base
|
5
|
-
|
6
|
-
# Cleans up all sensor metadata in Redis
|
7
|
-
def cleanup
|
8
|
-
redis.del(value_key)
|
9
|
-
super
|
10
|
-
end
|
11
|
-
|
12
|
-
# Increments counter value by 1
|
13
|
-
def incr
|
14
|
-
event(1)
|
15
|
-
end
|
16
|
-
|
17
|
-
# Gets counter value
|
18
|
-
# @return [Fixnum]
|
19
|
-
def value
|
20
|
-
redis.get(value_key).to_i
|
21
|
-
end
|
22
|
-
|
23
|
-
# Gets redis key by which counter value is stored
|
24
|
-
# @return [String]
|
25
|
-
def value_key
|
26
|
-
@value_key ||= "pulse_meter:value:#{name}"
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
# Processes event by incremnting counter by given value
|
32
|
-
# @param value [Fixnum] increment
|
33
|
-
def process_event(value)
|
34
|
-
command_aggregator.incrby(value_key, value.to_i)
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|