nightfury 0.7.1 → 0.7.2
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/lib/nightfury/metric/avg_time_series.rb +11 -1
- data/lib/nightfury/metric/count_time_series.rb +11 -0
- data/lib/nightfury/metric/time_series.rb +36 -17
- data/lib/nightfury/version.rb +1 -1
- data/spec/nightfury/metric/avg_time_series_spec.rb +13 -0
- data/spec/nightfury/metric/count_time_series_spec.rb +13 -0
- data/spec/nightfury/metric/time_series_spec.rb +17 -1
- metadata +1 -1
@@ -1,11 +1,21 @@
|
|
1
1
|
module Nightfury
|
2
2
|
module Metric
|
3
3
|
class AvgTimeSeries < TimeSeries
|
4
|
+
def get_padded_range(start_time, end_time)
|
5
|
+
data_points = get_range(start_time, end_time)
|
6
|
+
each_timestamp(start_time, end_time) do |current_step_time, last_step_time|
|
7
|
+
current_step_time = current_step_time.to_s
|
8
|
+
last_step_time = last_step_time.to_s
|
9
|
+
next if data_points[current_step_time]
|
10
|
+
data_points[current_step_time] = '0.0'
|
11
|
+
end
|
12
|
+
data_points
|
13
|
+
end
|
4
14
|
|
5
15
|
protected
|
6
16
|
|
7
17
|
def before_set(value, time)
|
8
|
-
step_time = get_step_time(time)
|
18
|
+
step_time = get_step_time(time)
|
9
19
|
data_point, meta_value = get_exact(step_time, true)
|
10
20
|
current_count = current_total = 0.0
|
11
21
|
unless data_point.nil?
|
@@ -1,6 +1,17 @@
|
|
1
1
|
module Nightfury
|
2
2
|
module Metric
|
3
3
|
class CountTimeSeries < TimeSeries
|
4
|
+
def get_padded_range(start_time, end_time)
|
5
|
+
data_points = get_range(start_time, end_time)
|
6
|
+
each_timestamp(start_time, end_time) do |current_step_time, last_step_time|
|
7
|
+
current_step_time = current_step_time.to_s
|
8
|
+
last_step_time = last_step_time.to_s
|
9
|
+
next if data_points[current_step_time]
|
10
|
+
data_points[current_step_time] = data_points[last_step_time]
|
11
|
+
end
|
12
|
+
data_points
|
13
|
+
end
|
14
|
+
|
4
15
|
def incr(step=1, timestamp = Time.now)
|
5
16
|
last_data_point = get
|
6
17
|
if last_data_point
|
@@ -5,6 +5,16 @@ module Nightfury
|
|
5
5
|
def self.floor_time(time, seconds=60)
|
6
6
|
Time.at((time.to_f / seconds).floor * seconds)
|
7
7
|
end
|
8
|
+
|
9
|
+
def self.seconds_in_step(step_name, time)
|
10
|
+
{
|
11
|
+
minute: 60,
|
12
|
+
hour: 1.hour,
|
13
|
+
day: 1.day,
|
14
|
+
week: 1.week,
|
15
|
+
month: Time.days_in_month(time.month, time.year)
|
16
|
+
}[step_name]
|
17
|
+
end
|
8
18
|
|
9
19
|
def initialize(name, options={})
|
10
20
|
super(name, options)
|
@@ -51,9 +61,9 @@ module Nightfury
|
|
51
61
|
|
52
62
|
def get_range(start_time, end_time)
|
53
63
|
return nil unless redis.exists(redis_key)
|
54
|
-
start_time = get_step_time(start_time)
|
55
|
-
end_time = get_step_time(end_time)
|
56
|
-
data_points = redis.zrangebyscore(redis_key, start_time, end_time, withscores: true)
|
64
|
+
start_time = get_step_time(start_time)
|
65
|
+
end_time = get_step_time(end_time)
|
66
|
+
data_points = redis.zrangebyscore(redis_key, start_time.to_i, end_time.to_i, withscores: true)
|
57
67
|
decode_many_data_points(data_points)
|
58
68
|
end
|
59
69
|
|
@@ -80,14 +90,8 @@ module Nightfury
|
|
80
90
|
{}
|
81
91
|
end
|
82
92
|
|
83
|
-
|
84
|
-
|
85
|
-
def before_set(value, time)
|
86
|
-
[value, time]
|
87
|
-
end
|
88
|
-
|
89
|
-
def decode_data_point(data_point)
|
90
|
-
[data_point[1], data_point[0], {}]
|
93
|
+
def seconds_in_step(time)
|
94
|
+
self.class.seconds_in_step(step, time)
|
91
95
|
end
|
92
96
|
|
93
97
|
def floor_time(time, seconds=60)
|
@@ -95,15 +99,30 @@ module Nightfury
|
|
95
99
|
end
|
96
100
|
|
97
101
|
def get_step_time(time)
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
102
|
+
floor_time(time, seconds_in_step(time))
|
103
|
+
end
|
104
|
+
|
105
|
+
def each_timestamp(start_time, end_time, &block)
|
106
|
+
start_time = get_step_time(start_time).to_i
|
107
|
+
end_time = get_step_time(end_time).to_i
|
108
|
+
current_step_time, last_step_time = start_time, nil
|
109
|
+
start_time.step(end_time, seconds_in_step(Time.at(current_step_time))) do
|
110
|
+
yield(current_step_time, last_step_time)
|
111
|
+
last_step_time = current_step_time
|
112
|
+
current_step_time += seconds_in_step(Time.at(current_step_time))
|
104
113
|
end
|
105
114
|
end
|
106
115
|
|
116
|
+
protected
|
117
|
+
|
118
|
+
def before_set(value, time)
|
119
|
+
[value, time]
|
120
|
+
end
|
121
|
+
|
122
|
+
def decode_data_point(data_point)
|
123
|
+
[data_point[1], data_point[0], {}]
|
124
|
+
end
|
125
|
+
|
107
126
|
private
|
108
127
|
|
109
128
|
def add_value_to_timeline(value, time)
|
data/lib/nightfury/version.rb
CHANGED
@@ -1,6 +1,19 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Nightfury::Metric::AvgTimeSeries do
|
4
|
+
describe "#get_padded_range" do
|
5
|
+
it "should fill the missing data points" do
|
6
|
+
count_series = Nightfury::Metric::AvgTimeSeries.new(:count)
|
7
|
+
start_time = Time.new(2013,1,1,0,0,0)
|
8
|
+
end_time = start_time + 120
|
9
|
+
missing_time = start_time + 60
|
10
|
+
|
11
|
+
count_series.set(1, start_time)
|
12
|
+
count_series.set(2, end_time)
|
13
|
+
count_series.get_padded_range(start_time, end_time)[missing_time.to_i.to_s].should == "0.0"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
4
17
|
it "should calculate avg in buckets defined by step" do
|
5
18
|
avg_metric = Nightfury::Metric::AvgTimeSeries.new(:avg)
|
6
19
|
first_bucket_time = Time.now
|
@@ -1,6 +1,19 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Nightfury::Metric::CountTimeSeries do
|
4
|
+
describe "#get_padded_range" do
|
5
|
+
it "should fill the missing data points" do
|
6
|
+
count_series = Nightfury::Metric::CountTimeSeries.new(:count)
|
7
|
+
start_time = Time.new(2013,1,1,0,0,0)
|
8
|
+
end_time = start_time + 120
|
9
|
+
missing_time = start_time + 60
|
10
|
+
|
11
|
+
count_series.set(1, start_time)
|
12
|
+
count_series.set(2, end_time)
|
13
|
+
count_series.get_padded_range(start_time, end_time)[missing_time.to_i.to_s].should == "1"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
4
17
|
describe "Incr" do
|
5
18
|
context "Has data points" do
|
6
19
|
it "should be able to increment value by 1 at the current timestamp by default" do
|
@@ -18,6 +18,22 @@ describe Nightfury::Metric::TimeSeries do
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
describe "#each_timestamp" do
|
22
|
+
it "should iterate through each timestamp between a start and a end time" do
|
23
|
+
ts_metric = Nightfury::Metric::TimeSeries.new(:avg_time)
|
24
|
+
|
25
|
+
start_time = Time.new(2013,1,1,0,0,0)
|
26
|
+
mid_time = start_time + 60
|
27
|
+
end_time = mid_time + 60
|
28
|
+
|
29
|
+
expected = [[start_time.to_i, nil], [mid_time.to_i, start_time.to_i], [end_time.to_i, mid_time.to_i]]
|
30
|
+
|
31
|
+
expect { |b|
|
32
|
+
ts_metric.each_timestamp(start_time, end_time, &b)
|
33
|
+
}.to yield_successive_args(*expected)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
21
37
|
describe "Getter" do
|
22
38
|
describe "#get" do
|
23
39
|
it "should retrun nil if metric key on redis is empty" do
|
@@ -179,7 +195,7 @@ describe Nightfury::Metric::TimeSeries do
|
|
179
195
|
it "should call before_set, before adding the value to the timeline" do
|
180
196
|
ts_metric = Nightfury::Metric::TimeSeries.new(:avg_time)
|
181
197
|
time = Time.now
|
182
|
-
flexmock(ts_metric).should_receive(:before_set).with(1, time).once
|
198
|
+
flexmock(ts_metric).should_receive(:before_set).with(1, time).and_return([1,time]).once
|
183
199
|
ts_metric.set(1, time)
|
184
200
|
end
|
185
201
|
|