rhcf-timeseries 0.0.5 → 0.0.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a70fa3c86609812b9cc3d5b441d0dad9300b7276
4
- data.tar.gz: 4272404e49b127c630dc06f5abb68f5c33877333
3
+ metadata.gz: 9cef009b581b2e4025db5234bc0ba24cb970503d
4
+ data.tar.gz: 5168fbcf5b232d4bc3e2687be9b57e4efd6a1cca
5
5
  SHA512:
6
- metadata.gz: e7f0b61fb3335635e038ff7d7382520eefddd80f2c53a780ae055ff44df6d434775f3f467dd26c73ec447caa7c8967fe2fa310d870d1a3f3d46f873526b0b4cf
7
- data.tar.gz: 457437977599b1546fdcb943d4a4a0706a000cad62b8f3580fdda9bdacb6aea86acce30ea1611a6e2afc6ab12e323fa225e896a80143f9a2039e4d213574b162
6
+ metadata.gz: 2954a59ea1374b1308483c17480463ce3c3e9fc8c34881d9da4aae2728101f50ae44a666b41c0fe424c9475169fb872cf318cad1a771b2c72698fede5943141d
7
+ data.tar.gz: 6efdacb63cbc3f5f75a9b6568af314ba86f71b0555037daa36f673032de7480b023d3de7a50a1208911c43c9e510e63944d60ee2a281858fe8cd6f939bd7e91a
@@ -105,10 +105,14 @@ module Rhcf
105
105
  end
106
106
 
107
107
  def better_resolution
108
- span = @to - @from
108
+ span = @to.to_time - @from.to_time
109
+
109
110
  resolutions = @series.resolutions.sort_by{|h| h[:span]}.reverse
110
- better = resolutions.find{|r| r[:span] < span / 5} || resolutions.last
111
- return better
111
+ 5.downto(1) do |div|
112
+ res = resolutions.find{|r| r[:span] < span / div }
113
+ return res if res
114
+ end
115
+ return nil
112
116
  end
113
117
  end
114
118
 
@@ -152,12 +156,12 @@ module Rhcf
152
156
  @connection_to_use || fail("No redis connection given")
153
157
  end
154
158
 
155
- def store(subject, event_point_hash, moment = Time.now)
159
+ def store(subject, event_point_hash, moment = Time.now, descend_subject = true, descend_event = true)
156
160
  resolutions = resolutions_of(moment)
157
161
 
158
- descend(subject) do |subject_path|
162
+ descend(subject, descend_subject) do |subject_path|
159
163
  event_point_hash.each do |event, point_value|
160
- descend(event) do |event_path|
164
+ descend(event, descend_event) do |event_path|
161
165
  resolutions.each do |res|
162
166
  resolution_name, resolution_value = *res
163
167
  store_point_value(subject_path, event_path, resolution_name, resolution_value, point_value)
@@ -167,8 +171,6 @@ module Rhcf
167
171
  end
168
172
  end
169
173
 
170
-
171
-
172
174
  def resolutions_of(moment)
173
175
  @resolution_ids.collect do |res_id|
174
176
  [res_id, resolution_value_at(moment, res_id)]
@@ -192,10 +194,10 @@ module Rhcf
192
194
  end
193
195
  end
194
196
 
195
- def descend(path, &block)
197
+ def descend(path, do_descend = true , &block)
196
198
  return if path.empty? or path == "."
197
199
  block.call(path)
198
- descend(File.dirname(path), &block)
200
+ descend(File.dirname(path), do_descend, &block) if do_descend
199
201
  end
200
202
 
201
203
  def store_point_event( resolution_name, resolution_value, subject_path, event_path)
@@ -252,13 +254,11 @@ module Rhcf
252
254
  fail ArgumentError, "Invalid resolution name #{id} for this time series" if res.nil?
253
255
  res.merge(:id => id)
254
256
  end
257
+
255
258
  def resolutions
256
- @resolution_ids.collect do |id|
257
- resolution(id)
258
- end
259
+ @_resolutions ||= @resolution_ids.map { |id| resolution(id) }
259
260
  end
260
261
 
261
-
262
262
  def events_for_subject_on(subject, point, resolution_id)
263
263
  key = [@prefix, 'event_set', resolution_id, point, subject].join(NAMESPACE_SEPARATOR)
264
264
  logger.debug("EVENTSET SMEMBERS #{key}")
@@ -1,5 +1,5 @@
1
1
  module Rhcf
2
2
  module Timeseries
3
- VERSION = "0.0.5"
3
+ VERSION = "0.0.6"
4
4
  end
5
5
  end
@@ -14,36 +14,52 @@ describe Rhcf::Timeseries::Redis do
14
14
  subject.flush!
15
15
  end
16
16
 
17
- it "should be fast to store and read" do
18
- subject.flush!
19
- total = 0
20
- start_time = Time.now
21
-
22
- bench = Benchmark.measure {
23
- profile = StackProf.run(mode: :cpu, out: '/tmp/stackprof-cpu-store.dump') do
24
- 10000.times do
25
- total +=1
26
- subject.store("a", {"b" => 1} ) #, time)
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
27
28
  end
28
- end
29
- }
29
+ }
30
30
 
31
31
 
32
- #pp subject.find("a", start_time - 11100, Time.now + 11100).points(:second)
33
- qbench = Benchmark.measure {
34
- subject.find("a", start_time - 11100, Time.now + 11100).total['b'].to_i.should == total
35
- }
32
+ Benchmark.measure {
33
+ expect(subject.find("a", start_time - 11100, Time.now + 11100).total['e'].to_i).to eq(total)
34
+ }
36
35
 
37
- qbench_year = Benchmark.measure {
38
- subject.find("a", start_time - 100000, Time.now + 100000).total(:year)['b'].to_i.should == total
39
- }
36
+ Benchmark.measure {
37
+ expect(subject.find("a", start_time - 100000, Time.now + 100000).total(:year)['e/f'].to_i).to eq(total)
38
+ }
40
39
 
41
- puts "Write speed %d points/seg | points:%d, duration:%0.3fs | query_time %0.3fs" % [speed = (1.0 * total / (bench.total + 0.00000001)), total, bench.total, qbench.total]
42
- speed.should > 400
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
43
  end
44
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
45
61
 
46
- it "should be similar to redistat" do
62
+ it "is similar to redistat" do
47
63
  start_time = Time.parse("2000-01-01 00:00:00")
48
64
  Timecop.travel(start_time)
49
65
  subject.store("views/product/15", {"web/firefox/3" => 1})
@@ -68,7 +84,7 @@ describe Rhcf::Timeseries::Redis do
68
84
  Timecop.travel(15.minutes) #00:00:30
69
85
  subject.store("views/product/11", {"web/chrome/11"=> 2})
70
86
 
71
- subject.find("views/product", start_time, start_time + 55.minutes).total(:ever).should == {
87
+ expect(subject.find("views/product", start_time, start_time + 55.minutes).total(:ever)).to eq({
72
88
  "web" => 16.0,
73
89
  "web/chrome" => 6.0,
74
90
  "web/chrome/11" => 6.0,
@@ -77,9 +93,9 @@ describe Rhcf::Timeseries::Redis do
77
93
  "web/ie" => 7.0,
78
94
  "web/ie/5" => 2.0,
79
95
  "web/ie/6" => 5.0
80
- }
96
+ })
81
97
 
82
- subject.find("views/product", start_time, start_time + 55.minutes).total(:year).should == {
98
+ expect(subject.find("views/product", start_time, start_time + 55.minutes).total(:year)).to eq({
83
99
  "web" => 16.0,
84
100
  "web/chrome" => 6.0,
85
101
  "web/chrome/11" => 6.0,
@@ -88,59 +104,60 @@ describe Rhcf::Timeseries::Redis do
88
104
  "web/ie" => 7.0,
89
105
  "web/ie/5" => 2.0,
90
106
  "web/ie/6" => 5.0
91
- }
107
+ })
92
108
 
93
- subject.find("views/product", start_time, start_time + 55.minutes).total.should == {
109
+ expect( subject.find("views/product", start_time, start_time + 55.minutes).total ).to eq({
94
110
  'web' => 8,
95
111
  'web/firefox' => 3,
96
112
  'web/firefox/3' => 3,
97
113
  'web/ie' => 5,
98
114
  'web/ie/6' => 5,
99
- }
115
+ })
100
116
 
101
- subject.find("views/product/15", start_time, start_time + 55.minutes).points(:minute).should == [
117
+ expect(subject.find("views/product/15", start_time, start_time + 55.minutes).points(:minute)).to eq([
102
118
  {:moment=>"2000-01-01T00:00", :values=>{"web/firefox"=>1, "web/firefox/3"=>1, "web"=>1}},
103
119
  {:moment=>"2000-01-01T00:30", :values=>{"web"=>3, "web/ie/6"=>3, "web/ie"=>3}},
104
120
  {:moment=>"2000-01-01T00:45", :values=>{"web"=>2, "web/ie/6"=>2, "web/ie"=>2}}
105
- ]
121
+ ])
106
122
 
107
- subject.find("views/product/13", start_time, start_time + 55.minutes).points(:minute).should == [
123
+ expect(subject.find("views/product/13", start_time, start_time + 55.minutes).points(:minute)).to eq([
108
124
  {:moment=>"2000-01-01T00:15", :values=>{"web/firefox"=>2, "web/firefox/3"=>2, "web"=>2}},
109
- ]
110
-
125
+ ])
111
126
 
112
-
113
-
114
- subject.find("views/product", start_time, start_time + 55.minutes).points(:minute).should == [
127
+ expect(subject.find("views/product", start_time, start_time + 55.minutes).points(:minute)).to eq([
115
128
  {:moment=>"2000-01-01T00:00", :values=>{"web/firefox"=>1, "web/firefox/3"=>1, "web"=>1}},
116
129
  {:moment=>"2000-01-01T00:15", :values=>{"web/firefox"=>2, "web/firefox/3"=>2, "web"=>2}},
117
130
  {:moment=>"2000-01-01T00:30", :values=>{"web"=>3, "web/ie/6"=>3, "web/ie"=>3}},
118
131
  {:moment=>"2000-01-01T00:45", :values=>{"web"=>2, "web/ie/6"=>2, "web/ie"=>2}}
119
- ]
132
+ ])
120
133
 
121
- subject.find("views", start_time, start_time + 55.minutes).points(:minute).should == [
134
+ expect(subject.find("views", start_time, start_time + 55.minutes).points(:minute)).to eq([
122
135
  {:moment=>"2000-01-01T00:00", :values=>{"web/firefox"=>1, "web/firefox/3"=>1, "web"=>1}},
123
136
  {:moment=>"2000-01-01T00:15", :values=>{"web/firefox"=>2, "web/firefox/3"=>2, "web"=>2}},
124
137
  {:moment=>"2000-01-01T00:30", :values=>{"web"=>3, "web/ie/6"=>3, "web/ie"=>3}},
125
138
  {:moment=>"2000-01-01T00:45", :values=>{"web"=>2, "web/ie/6"=>2, "web/ie"=>2}}
126
- ]
127
-
128
- subject.find("views", start_time).points(:hour).should == [{:moment=>"2000-01-01T00",
129
- :values=>
130
- {"web/ie"=>5.0,
131
- "web"=>8.0,
132
- "web/firefox"=>3.0,
133
- "web/ie/6"=>5.0,
134
- "web/firefox/3"=>3.0}},
135
- {:moment=>"2000-01-01T01",
136
- :values=>
137
- {"web/ie"=>2.0,
138
- "web/chrome"=>6.0,
139
- "web/chrome/11"=>6.0,
140
- "web"=>8.0,
141
- "web/ie/5"=>2.0}}]
142
-
143
-
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
+ ])
144
161
  end
145
162
 
146
163
  it "causes no stack overflow" do
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+ require 'rhcf/timeseries/redis'
3
+
4
+
5
+ describe "Query" do
6
+ describe "#better_resolution" do
7
+
8
+ let(:redis_connection){nil}
9
+ describe "When having a smaller then 1/5 " do
10
+ let(:series) { Rhcf::Timeseries::Redis.new(nil, redis_connection, resolutions: [:hour, :"15minutes", :minute]) }
11
+ it { expect(series.find('bla', Time.now - 3600, Time.now).better_resolution[:id]).to eq :minute }
12
+ end
13
+
14
+ describe "When having a smaller but greather then 1/5" do
15
+ let(:series) { Rhcf::Timeseries::Redis.new(nil, redis_connection, resolutions: [:hour, :"15minutes"]) }
16
+ it { expect(series.find('bla', Time.now - 3600, Time.now).better_resolution[:id]).to eq :"15minutes" }
17
+ end
18
+
19
+ describe "When having no smaller, only its size" do
20
+ let(:series) { Rhcf::Timeseries::Redis.new(nil, redis_connection, resolutions: [:hour]) }
21
+ it { expect(series.find('bla', DateTime.parse('2015-01-01 01:50:00'), DateTime.parse('2015-01-01 03:10:00')).better_resolution[:id]).to eq :hour }
22
+ end
23
+
24
+ describe "When having only bigger" do
25
+ let(:series) { Rhcf::Timeseries::Redis.new(nil, redis_connection, resolutions: [:month]) }
26
+ it { expect(series.find('bla', DateTime.parse('2015-01-01 01:50:00'), DateTime.parse('2015-01-01 03:10:00')).better_resolution).to be_nil}
27
+ end
28
+
29
+ end
30
+ end
data/spec/spec_helper.rb CHANGED
@@ -8,7 +8,6 @@
8
8
  #SimpleCov.start_with?
9
9
  require 'timecop'
10
10
  RSpec.configure do |config|
11
- config.treat_symbols_as_metadata_keys_with_true_values = true
12
11
  config.run_all_when_everything_filtered = true
13
12
  config.filter_run :focus
14
13
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rhcf-timeseries
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Romeu Fonseca
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-08 00:00:00.000000000 Z
11
+ date: 2015-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -116,6 +116,7 @@ files:
116
116
  - rhcf-timeseries.gemspec
117
117
  - spec/lib/rhcf/timeseries/TODO
118
118
  - spec/lib/rhcf/timeseries/redis_spec.rb
119
+ - spec/lib/rhcf/timeseries/result_spec.rb
119
120
  - spec/spec_helper.rb
120
121
  homepage: ''
121
122
  licenses:
@@ -144,4 +145,5 @@ summary: Redistat inspired redis time series.
144
145
  test_files:
145
146
  - spec/lib/rhcf/timeseries/TODO
146
147
  - spec/lib/rhcf/timeseries/redis_spec.rb
148
+ - spec/lib/rhcf/timeseries/result_spec.rb
147
149
  - spec/spec_helper.rb