Module: PulseMeter::Sensor::TimelineReduce
- Included in:
- Timeline
- Defined in:
- lib/pulse-meter/sensor/timeline_reduce.rb
Overview
Methods for reducing raw data to single values
Defined Under Namespace
Modules: ClassMethods
Constant Summary collapse
- MAX_INTERVALS =
100
Class Method Summary collapse
Instance Method Summary collapse
- #collect_ids_to_reduce(time, time_from, time_to) ⇒ Object
- #reduce(interval_id) ⇒ Object
-
#reduce_all_raw ⇒ Object
Reduces data in all raw intervals.
Class Method Details
.included(base) ⇒ Object
6 7 8 |
# File 'lib/pulse-meter/sensor/timeline_reduce.rb', line 6 def self.included(base) base.extend(ClassMethods) end |
Instance Method Details
#collect_ids_to_reduce(time, time_from, time_to) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# File 'lib/pulse-meter/sensor/timeline_reduce.rb', line 40 def collect_ids_to_reduce(time, time_from, time_to) ids = [] while (time > time_from) # go backwards time -= interval interval_id = get_interval_id(time) next if Time.at(interval_id) > time_to reduced_key = data_key(interval_id) raw_key = raw_data_key(interval_id) break if redis.exists(reduced_key) ids << interval_id end ids end |
#reduce(interval_id) ⇒ Object
Note:
Interval id is just unixtime of its lower bound. Ruduction is a process of ‘compressing’ all interval’s raw data to a single value. When reduction is done summarized data is saved to Redis separately with expiration time taken from sensor configuration.
18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/pulse-meter/sensor/timeline_reduce.rb', line 18 def reduce(interval_id) interval_raw_data_key = raw_data_key(interval_id) return unless redis.exists(interval_raw_data_key) value = summarize(interval_raw_data_key) interval_data_key = data_key(interval_id) multi do redis.del(interval_raw_data_key) if redis.setnx(interval_data_key, value) redis.expire(interval_data_key, ttl) end end end |
#reduce_all_raw ⇒ Object
Reduces data in all raw intervals
32 33 34 35 36 37 38 |
# File 'lib/pulse-meter/sensor/timeline_reduce.rb', line 32 def reduce_all_raw time = Time.now min_time = time - reduce_delay - interval max_depth = time - reduce_delay - interval * MAX_INTERVALS ids = collect_ids_to_reduce(time, max_depth, min_time) ids.reverse.each {|id| reduce(id)} end |