rhcf-timeseries 0.0.6 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rhcf/extensions/fixnum.rb +34 -0
- data/lib/rhcf/timeseries/constants.rb +25 -0
- data/lib/rhcf/timeseries/manager.rb +119 -0
- data/lib/rhcf/timeseries/query.rb +69 -0
- data/lib/rhcf/timeseries/redis_strategies.rb +175 -0
- data/lib/rhcf/timeseries/version.rb +1 -1
- data/rhcf-timeseries.gemspec +2 -2
- data/spec/lib/rhcf/timeseries/manager_spec.rb +193 -0
- data/spec/lib/rhcf/timeseries/{result_spec.rb → query_spec.rb} +6 -6
- data/spec/lib/rhcf/timeseries/redis_get_strategy_spec.rb +7 -0
- data/spec/lib/rhcf/timeseries/redis_hgetall_strategy_spec.rb +7 -0
- data/spec/lib/rhcf/timeseries/redis_mget_lua_strategy_spec.rb +7 -0
- data/spec/lib/rhcf/timeseries/redis_mget_strategy_spec.rb +7 -0
- data/spec/spec_helper.rb +1 -2
- data/spec/support/database_cleaner.rb +14 -0
- data/spec/support/simplecov.rb +2 -0
- data/spec/support/valid_strategy_spec.rb +119 -0
- metadata +53 -7
- data/lib/rhcf/timeseries/redis.rb +0 -269
- data/spec/lib/rhcf/timeseries/redis_spec.rb +0 -182
@@ -1,182 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'timecop'
|
3
|
-
require 'redis'
|
4
|
-
require 'rhcf/timeseries/redis'
|
5
|
-
require 'benchmark'
|
6
|
-
require 'stackprof'
|
7
|
-
|
8
|
-
describe Rhcf::Timeseries::Redis do
|
9
|
-
let(:redis_connection){Redis.new}
|
10
|
-
subject{Rhcf::Timeseries::Redis.new(nil, redis_connection)}
|
11
|
-
|
12
|
-
before(:each) do
|
13
|
-
Timecop.return
|
14
|
-
subject.flush!
|
15
|
-
end
|
16
|
-
|
17
|
-
describe 'descending' do
|
18
|
-
it "is be fast to store and read" do
|
19
|
-
total = 0
|
20
|
-
start_time = Time.now
|
21
|
-
|
22
|
-
bench = Benchmark.measure {
|
23
|
-
StackProf.run(mode: :cpu, out: p('/tmp/stackprof-cpu-store-descend.dump')) do
|
24
|
-
1000.times do
|
25
|
-
total +=1
|
26
|
-
subject.store("a/b", {"e/f" => 1} ) #, time)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
}
|
30
|
-
|
31
|
-
|
32
|
-
Benchmark.measure {
|
33
|
-
expect(subject.find("a", start_time - 11100, Time.now + 11100).total['e'].to_i).to eq(total)
|
34
|
-
}
|
35
|
-
|
36
|
-
Benchmark.measure {
|
37
|
-
expect(subject.find("a", start_time - 100000, Time.now + 100000).total(:year)['e/f'].to_i).to eq(total)
|
38
|
-
}
|
39
|
-
|
40
|
-
puts "Descend write speed %d points/seg | points:%d, duration:%0.3fs" % [speed = (1.0 * total / (bench.total + 0.00000001)), total, bench.total]
|
41
|
-
expect(speed).to be > 100
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe 'not descending' do
|
46
|
-
it "is be fast to store and read" do
|
47
|
-
total = 0
|
48
|
-
bench = Benchmark.measure {
|
49
|
-
StackProf.run(mode: :cpu, out: p('/tmp/stackprof-cpu-store-nodescend.dump')) do
|
50
|
-
10000.times do
|
51
|
-
total +=1
|
52
|
-
subject.store("a/b/c/d", {"e/f/g/h" => 1} , Time.now, false, false)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
}
|
56
|
-
|
57
|
-
puts "No descend write speed %d points/seg | points:%d, duration:%0.3fs" % [new_speed = (1.0 * total / (bench.total + 0.00000001)), total, bench.total]
|
58
|
-
expect(new_speed).to be > 300
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
it "is similar to redistat" do
|
63
|
-
start_time = Time.parse("2000-01-01 00:00:00")
|
64
|
-
Timecop.travel(start_time)
|
65
|
-
subject.store("views/product/15", {"web/firefox/3" => 1})
|
66
|
-
|
67
|
-
Timecop.travel(15.minutes) #00:00:15
|
68
|
-
subject.store("views/product/13", {"web/firefox/3" => 1}, Time.now)
|
69
|
-
subject.store("views/product/13", {"web/firefox/3" => 1}, Time.now)
|
70
|
-
subject.store("views/product/13", {"web/firefox/3" => 0}, Time.now)
|
71
|
-
|
72
|
-
Timecop.travel(15.minutes) #00:00:30
|
73
|
-
subject.store("views/product/15", {"web/ie/6" => 3})
|
74
|
-
|
75
|
-
Timecop.travel(15.minutes) #00:00:45
|
76
|
-
subject.store("views/product/15", {"web/ie/6" => 2})
|
77
|
-
|
78
|
-
Timecop.travel(15.minutes) #00:00:00
|
79
|
-
subject.store("views/product/11", {"web/ie/5" => 2})
|
80
|
-
|
81
|
-
Timecop.travel(15.minutes) #00:00:15
|
82
|
-
subject.store("views/product/11", {"web/chrome/11"=> 4})
|
83
|
-
|
84
|
-
Timecop.travel(15.minutes) #00:00:30
|
85
|
-
subject.store("views/product/11", {"web/chrome/11"=> 2})
|
86
|
-
|
87
|
-
expect(subject.find("views/product", start_time, start_time + 55.minutes).total(:ever)).to eq({
|
88
|
-
"web" => 16.0,
|
89
|
-
"web/chrome" => 6.0,
|
90
|
-
"web/chrome/11" => 6.0,
|
91
|
-
"web/firefox" => 3.0,
|
92
|
-
"web/firefox/3" => 3.0,
|
93
|
-
"web/ie" => 7.0,
|
94
|
-
"web/ie/5" => 2.0,
|
95
|
-
"web/ie/6" => 5.0
|
96
|
-
})
|
97
|
-
|
98
|
-
expect(subject.find("views/product", start_time, start_time + 55.minutes).total(:year)).to eq({
|
99
|
-
"web" => 16.0,
|
100
|
-
"web/chrome" => 6.0,
|
101
|
-
"web/chrome/11" => 6.0,
|
102
|
-
"web/firefox" => 3.0,
|
103
|
-
"web/firefox/3" => 3.0,
|
104
|
-
"web/ie" => 7.0,
|
105
|
-
"web/ie/5" => 2.0,
|
106
|
-
"web/ie/6" => 5.0
|
107
|
-
})
|
108
|
-
|
109
|
-
expect( subject.find("views/product", start_time, start_time + 55.minutes).total ).to eq({
|
110
|
-
'web' => 8,
|
111
|
-
'web/firefox' => 3,
|
112
|
-
'web/firefox/3' => 3,
|
113
|
-
'web/ie' => 5,
|
114
|
-
'web/ie/6' => 5,
|
115
|
-
})
|
116
|
-
|
117
|
-
expect(subject.find("views/product/15", start_time, start_time + 55.minutes).points(:minute)).to eq([
|
118
|
-
{:moment=>"2000-01-01T00:00", :values=>{"web/firefox"=>1, "web/firefox/3"=>1, "web"=>1}},
|
119
|
-
{:moment=>"2000-01-01T00:30", :values=>{"web"=>3, "web/ie/6"=>3, "web/ie"=>3}},
|
120
|
-
{:moment=>"2000-01-01T00:45", :values=>{"web"=>2, "web/ie/6"=>2, "web/ie"=>2}}
|
121
|
-
])
|
122
|
-
|
123
|
-
expect(subject.find("views/product/13", start_time, start_time + 55.minutes).points(:minute)).to eq([
|
124
|
-
{:moment=>"2000-01-01T00:15", :values=>{"web/firefox"=>2, "web/firefox/3"=>2, "web"=>2}},
|
125
|
-
])
|
126
|
-
|
127
|
-
expect(subject.find("views/product", start_time, start_time + 55.minutes).points(:minute)).to eq([
|
128
|
-
{:moment=>"2000-01-01T00:00", :values=>{"web/firefox"=>1, "web/firefox/3"=>1, "web"=>1}},
|
129
|
-
{:moment=>"2000-01-01T00:15", :values=>{"web/firefox"=>2, "web/firefox/3"=>2, "web"=>2}},
|
130
|
-
{:moment=>"2000-01-01T00:30", :values=>{"web"=>3, "web/ie/6"=>3, "web/ie"=>3}},
|
131
|
-
{:moment=>"2000-01-01T00:45", :values=>{"web"=>2, "web/ie/6"=>2, "web/ie"=>2}}
|
132
|
-
])
|
133
|
-
|
134
|
-
expect(subject.find("views", start_time, start_time + 55.minutes).points(:minute)).to eq([
|
135
|
-
{:moment=>"2000-01-01T00:00", :values=>{"web/firefox"=>1, "web/firefox/3"=>1, "web"=>1}},
|
136
|
-
{:moment=>"2000-01-01T00:15", :values=>{"web/firefox"=>2, "web/firefox/3"=>2, "web"=>2}},
|
137
|
-
{:moment=>"2000-01-01T00:30", :values=>{"web"=>3, "web/ie/6"=>3, "web/ie"=>3}},
|
138
|
-
{:moment=>"2000-01-01T00:45", :values=>{"web"=>2, "web/ie/6"=>2, "web/ie"=>2}}
|
139
|
-
])
|
140
|
-
|
141
|
-
expect(subject.find("views", start_time).points(:hour)).to eq([
|
142
|
-
{
|
143
|
-
:moment=>"2000-01-01T00",
|
144
|
-
:values=> {
|
145
|
-
"web/ie"=>5.0,
|
146
|
-
"web"=>8.0,
|
147
|
-
"web/firefox"=>3.0,
|
148
|
-
"web/ie/6"=>5.0,
|
149
|
-
"web/firefox/3"=>3.0}
|
150
|
-
},{
|
151
|
-
:moment=>"2000-01-01T01",
|
152
|
-
:values=>{
|
153
|
-
"web/ie"=>2.0,
|
154
|
-
"web/chrome"=>6.0,
|
155
|
-
"web/chrome/11"=>6.0,
|
156
|
-
"web"=>8.0,
|
157
|
-
"web/ie/5"=>2.0
|
158
|
-
}
|
159
|
-
}
|
160
|
-
])
|
161
|
-
end
|
162
|
-
|
163
|
-
it "causes no stack overflow" do
|
164
|
-
params_hash = {
|
165
|
-
sender_domain: 'example.com',
|
166
|
-
realm: 'realm',
|
167
|
-
destination_domain: 'lvh.me',
|
168
|
-
mail_server: 'aserver',
|
169
|
-
bind_interface: '11.1.1.11'
|
170
|
-
}
|
171
|
-
|
172
|
-
{
|
173
|
-
'sender_domain' => '%{sender_domain}',
|
174
|
-
'realm_and_sender_domain' => '%{realm}/%{sender_domain}',
|
175
|
-
'mail_server_and_interface' => '%{mail_server}/%{bind_interface}',
|
176
|
-
'realm_and_destination_domain' => '%{realm}/%{destination_domain}',
|
177
|
-
'destination_domain' => '%{destination_domain}'
|
178
|
-
}.each do |known, unknown|
|
179
|
-
subject.store(known % params_hash, {[(unknown % params_hash),'sent'].join('/') => 1})
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|