tsdb_time_series 4.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,48 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+ require 'time_series'
5
+
6
+ describe Opower::TimeSeries::Metric do
7
+ subject(:config) { { name: 'test1.test2', timestamp: 12_132_342, value: 1, tags: { 'x' => 1, 'y' => 2 } } }
8
+
9
+ context 'with valid input' do
10
+ describe 'Metric#new' do
11
+ subject { Opower::TimeSeries::Metric.new(config) }
12
+
13
+ describe '#name' do
14
+ subject { super().name }
15
+ it { is_expected.to eq('test1.test2') }
16
+ end
17
+
18
+ describe '#timestamp' do
19
+ subject { super().timestamp }
20
+ it { is_expected.to eq(12_132_342) }
21
+ end
22
+
23
+ describe '#value' do
24
+ subject { super().value }
25
+ it { is_expected.to eq(1) }
26
+ end
27
+
28
+ describe '#tags' do
29
+ subject { super().tags }
30
+ it { is_expected.to eq('x' => 1, 'y' => 2) }
31
+ end
32
+ end
33
+ end
34
+
35
+ context 'with invalid input' do
36
+ it 'errors if no data is specified' do
37
+ expect { Opower::TimeSeries::Metric.new }.to raise_error(ArgumentError)
38
+ end
39
+
40
+ it 'errors if no metric name is specified' do
41
+ expect { Opower::TimeSeries::Metric.new(value: 1) }.to raise_error(ArgumentError)
42
+ end
43
+
44
+ it 'errors if no metric value is specified' do
45
+ expect { Opower::TimeSeries::Metric.new(name: '123') }.to raise_error(ArgumentError)
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,49 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'time_series'
4
+ require 'spec_helper'
5
+
6
+ describe Opower::TimeSeries::Query do
7
+ @aggregator_msg = 'Metric label must be present for query to run'
8
+
9
+ context 'with invalid input' do
10
+ it 'errors without a start parameter' do
11
+ m = [{ aggregator: 'sum', metric: 'mtest' }]
12
+ config = { format: :ascii, end: 134_567, m: m }
13
+ expect { Opower::TimeSeries::Query.new(config) }.to raise_error(ArgumentError, 'start is a required parameter.')
14
+ end
15
+
16
+ it 'errors without a m parameter' do
17
+ config = { format: :ascii, start: 123_456, end: 134_567 }
18
+ expect { Opower::TimeSeries::Query.new(config) }.to raise_error(ArgumentError, 'm is a required parameter.')
19
+ end
20
+
21
+ it 'errors when passing a non-array m parameter' do
22
+ config = { format: :ascii, start: 123_456, end: 134_567, m: '123' }
23
+ expect { Opower::TimeSeries::Query.new(config) }.to raise_error(ArgumentError, 'm parameter must be an array.')
24
+ end
25
+
26
+ it 'errors when passing an empty array m parameter' do
27
+ config = { format: :ascii, start: 123_456, end: 134_567, m: [] }
28
+ expect { Opower::TimeSeries::Query.new(config) }.to raise_error(ArgumentError, 'm parameter must not be empty.')
29
+ end
30
+
31
+ it 'errors when missing aggregator and metric label' do
32
+ config = { format: :ascii, start: 123_456, end: 134_567, m: [{}] }
33
+ expect { Opower::TimeSeries::Query.new(config) }.to raise_error(ArgumentError, @aggregator_msg)
34
+ end
35
+
36
+ it 'errors when missing metric label' do
37
+ config = { format: :ascii, start: 123_456, end: 134_567, m: [{ aggregator: 'sum' }] }
38
+ expect { Opower::TimeSeries::Query.new(config) }.to raise_error(ArgumentError, @aggregator_msg)
39
+ end
40
+ end
41
+
42
+ context 'with valid input' do
43
+ it 'creates a query object' do
44
+ m = [{ aggregator: 'sum', metric: 'mtest', rate: true, downsample: { period: '24h-ago', function: 'sum' } }]
45
+ config = { format: :json, start: 123_456, end: 134_567, m: m }
46
+ Opower::TimeSeries::Query.new(config)
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,39 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'time_series'
4
+ require 'spec_helper'
5
+
6
+ describe Opower::TimeSeries::SyntheticResult do
7
+ context 'with valid input' do
8
+ it 'calculates results for aligned time-series' do
9
+ formula = 'x + y'
10
+ data = { x: { '123' => 1, '124' => 2 }, y: { '123' => 1, '124' => 2, '125' => 3 } }
11
+
12
+ synthetic_results = Opower::TimeSeries::SyntheticResult.new('test', formula, data)
13
+ calculated_dps = synthetic_results.results
14
+ expect(calculated_dps['123']).to eq(2)
15
+ expect(calculated_dps['124']).to eq(4)
16
+ expect(calculated_dps['125']).to be_nil
17
+ end
18
+
19
+ it 'supports using Ruby math functions' do
20
+ formula = 'cos((x + y))'
21
+ data = { x: { '123' => 1, '124' => 2 }, y: { '123' => 1, '124' => 2, '125' => 3 } }
22
+
23
+ synthetic_results = Opower::TimeSeries::SyntheticResult.new('test', formula, data)
24
+ calculated_dps = synthetic_results.results
25
+ expect(calculated_dps['123']).to eq(-0.4161468365471424)
26
+ expect(calculated_dps['124']).to eq(-0.6536436208636119)
27
+ expect(calculated_dps['125']).to be_nil
28
+ end
29
+ end
30
+
31
+ context 'with invalid input' do
32
+ it 'errors when dividing by zero' do
33
+ formula = 'x / y'
34
+ data = { x: { '123' => 10, '124' => 20, '125' => 30 }, y: { '123' => 1, '124' => 0, '125' => 3 } }
35
+
36
+ expect { Opower::TimeSeries::SyntheticResult.new('test', formula, data) }.to raise_error(ZeroDivisionError)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,70 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'spec_helper'
4
+ require 'time_series'
5
+
6
+ describe Opower::TimeSeries::TSClient do
7
+ describe '#new' do
8
+ context 'with defaults' do
9
+ subject { Opower::TimeSeries::TSClient.new }
10
+
11
+ describe '#host' do
12
+ subject { super().host }
13
+ it { is_expected.to eq '127.0.0.1' }
14
+ end
15
+
16
+ describe '#port' do
17
+ subject { super().port }
18
+ it { is_expected.to eq 4242 }
19
+ end
20
+ end
21
+
22
+ context 'with user options' do
23
+ subject { Opower::TimeSeries::TSClient.new('opentsdb.foo.com', 4343) }
24
+
25
+ describe '#host' do
26
+ subject { super().host }
27
+ it { is_expected.to eq 'opentsdb.foo.com' }
28
+ end
29
+
30
+ describe '#port' do
31
+ subject { super().port }
32
+ it { is_expected.to eq 4343 }
33
+ end
34
+ end
35
+ end
36
+
37
+ describe '#configure' do
38
+ context 'with defaults' do
39
+ subject { Opower::TimeSeries::TSClient.new.config }
40
+
41
+ describe(:dry_run) do
42
+ subject { super()[:dry_run] }
43
+ it { is_expected.to eq(false) }
44
+ end
45
+
46
+ describe(:version) do
47
+ subject { super()[:version] }
48
+ it { is_expected.to eq('2.0') }
49
+ end
50
+ end
51
+
52
+ context 'with user input' do
53
+ subject do
54
+ client = Opower::TimeSeries::TSClient.new
55
+ client.configure(dry_run: true, validation: true, version: '2.1')
56
+ client.config
57
+ end
58
+
59
+ describe(:dry_run) do
60
+ subject { super()[:dry_run] }
61
+ it { is_expected.to eq(true) }
62
+ end
63
+
64
+ describe(:version) do
65
+ subject { super()[:version] }
66
+ it { is_expected.to eq('2.1') }
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,38 @@
1
+ # -*- encoding: utf-8 -*-
2
+ # vim: ft=ruby
3
+
4
+ require File.expand_path('../lib/time_series/version', __FILE__)
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.authors = ['Uday Jarajapu', 'Jan Mangs', 'Ravikumar Gudipati']
8
+ gem.email = %w(uday.jarajapu@opower.com jmangs@gmail.com ravikumar.gudipati@opower.com)
9
+ gem.description = 'Provides a set of tools for working with time series data in OpenTSDB data store'
10
+ gem.summary = 'OpenTSDB Gem'
11
+
12
+ gem.files = `git ls-files`.split($ORS)
13
+ gem.executables = gem.files.grep(/^bin\//).map { |f| File.basename(f) }
14
+ gem.test_files = gem.files.grep(/^(test|spec|features)\//)
15
+ gem.name = 'tsdb_time_series'
16
+ gem.require_paths = %w(lib)
17
+ gem.version = Opower::TimeSeries::VERSION
18
+
19
+ # dependencies.
20
+ gem.add_dependency('excon')
21
+ gem.add_dependency('dentaku', '~> 1.2.0')
22
+
23
+ # development dependencies.
24
+ gem.add_development_dependency('rspec', '~> 3.0')
25
+ gem.add_development_dependency('simplecov', '~> 0.7.0')
26
+ gem.add_development_dependency('guard', '~> 2.0')
27
+ gem.add_development_dependency('guard-rspec', '~> 4.0')
28
+ gem.add_development_dependency('rubocop', '~> 0.28.0')
29
+ gem.add_development_dependency('rainbow', '~> 2.0')
30
+ gem.add_development_dependency('guard-rubocop', '~> 1.0')
31
+ gem.add_development_dependency('metric_fu', '~> 4.2.0')
32
+ gem.add_development_dependency('guard-reek', '~> 0.0.4')
33
+ gem.add_development_dependency('rake', '~> 10.0.1')
34
+ gem.add_development_dependency('yard', '~> 0.8.7')
35
+ gem.add_development_dependency('redcarpet', '~> 2.3.0')
36
+ gem.add_development_dependency('webmock', '~> 1.20.0')
37
+ gem.add_development_dependency('docker-api', '~> 1.17.0')
38
+ end
File without changes
metadata ADDED
@@ -0,0 +1,323 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tsdb_time_series
3
+ version: !ruby/object:Gem::Version
4
+ version: 4.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Uday Jarajapu
8
+ - Jan Mangs
9
+ - Ravikumar Gudipati
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2016-04-06 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: excon
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ! '>='
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: dentaku
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ~>
34
+ - !ruby/object:Gem::Version
35
+ version: 1.2.0
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ version: 1.2.0
43
+ - !ruby/object:Gem::Dependency
44
+ name: rspec
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ~>
48
+ - !ruby/object:Gem::Version
49
+ version: '3.0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ version: '3.0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: simplecov
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ version: 0.7.0
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: 0.7.0
71
+ - !ruby/object:Gem::Dependency
72
+ name: guard
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ~>
76
+ - !ruby/object:Gem::Version
77
+ version: '2.0'
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ~>
83
+ - !ruby/object:Gem::Version
84
+ version: '2.0'
85
+ - !ruby/object:Gem::Dependency
86
+ name: guard-rspec
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ~>
90
+ - !ruby/object:Gem::Version
91
+ version: '4.0'
92
+ type: :development
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ~>
97
+ - !ruby/object:Gem::Version
98
+ version: '4.0'
99
+ - !ruby/object:Gem::Dependency
100
+ name: rubocop
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ~>
104
+ - !ruby/object:Gem::Version
105
+ version: 0.28.0
106
+ type: :development
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - ~>
111
+ - !ruby/object:Gem::Version
112
+ version: 0.28.0
113
+ - !ruby/object:Gem::Dependency
114
+ name: rainbow
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ~>
118
+ - !ruby/object:Gem::Version
119
+ version: '2.0'
120
+ type: :development
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ~>
125
+ - !ruby/object:Gem::Version
126
+ version: '2.0'
127
+ - !ruby/object:Gem::Dependency
128
+ name: guard-rubocop
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ~>
132
+ - !ruby/object:Gem::Version
133
+ version: '1.0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ~>
139
+ - !ruby/object:Gem::Version
140
+ version: '1.0'
141
+ - !ruby/object:Gem::Dependency
142
+ name: metric_fu
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ~>
146
+ - !ruby/object:Gem::Version
147
+ version: 4.2.0
148
+ type: :development
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ~>
153
+ - !ruby/object:Gem::Version
154
+ version: 4.2.0
155
+ - !ruby/object:Gem::Dependency
156
+ name: guard-reek
157
+ requirement: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ~>
160
+ - !ruby/object:Gem::Version
161
+ version: 0.0.4
162
+ type: :development
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - ~>
167
+ - !ruby/object:Gem::Version
168
+ version: 0.0.4
169
+ - !ruby/object:Gem::Dependency
170
+ name: rake
171
+ requirement: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ~>
174
+ - !ruby/object:Gem::Version
175
+ version: 10.0.1
176
+ type: :development
177
+ prerelease: false
178
+ version_requirements: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ~>
181
+ - !ruby/object:Gem::Version
182
+ version: 10.0.1
183
+ - !ruby/object:Gem::Dependency
184
+ name: yard
185
+ requirement: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ~>
188
+ - !ruby/object:Gem::Version
189
+ version: 0.8.7
190
+ type: :development
191
+ prerelease: false
192
+ version_requirements: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - ~>
195
+ - !ruby/object:Gem::Version
196
+ version: 0.8.7
197
+ - !ruby/object:Gem::Dependency
198
+ name: redcarpet
199
+ requirement: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ~>
202
+ - !ruby/object:Gem::Version
203
+ version: 2.3.0
204
+ type: :development
205
+ prerelease: false
206
+ version_requirements: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ~>
209
+ - !ruby/object:Gem::Version
210
+ version: 2.3.0
211
+ - !ruby/object:Gem::Dependency
212
+ name: webmock
213
+ requirement: !ruby/object:Gem::Requirement
214
+ requirements:
215
+ - - ~>
216
+ - !ruby/object:Gem::Version
217
+ version: 1.20.0
218
+ type: :development
219
+ prerelease: false
220
+ version_requirements: !ruby/object:Gem::Requirement
221
+ requirements:
222
+ - - ~>
223
+ - !ruby/object:Gem::Version
224
+ version: 1.20.0
225
+ - !ruby/object:Gem::Dependency
226
+ name: docker-api
227
+ requirement: !ruby/object:Gem::Requirement
228
+ requirements:
229
+ - - ~>
230
+ - !ruby/object:Gem::Version
231
+ version: 1.17.0
232
+ type: :development
233
+ prerelease: false
234
+ version_requirements: !ruby/object:Gem::Requirement
235
+ requirements:
236
+ - - ~>
237
+ - !ruby/object:Gem::Version
238
+ version: 1.17.0
239
+ description: Provides a set of tools for working with time series data in OpenTSDB
240
+ data store
241
+ email:
242
+ - uday.jarajapu@opower.com
243
+ - jmangs@gmail.com
244
+ - ravikumar.gudipati@opower.com
245
+ executables: []
246
+ extensions: []
247
+ extra_rdoc_files: []
248
+ files:
249
+ - .gitignore
250
+ - .rubocop.yml
251
+ - .rvmrc
252
+ - CHANGELOG.md
253
+ - CONTRIBUTING.md
254
+ - Gemfile
255
+ - Guardfile
256
+ - README.md
257
+ - Rakefile
258
+ - lib/time_series.rb
259
+ - lib/time_series/metric.rb
260
+ - lib/time_series/query.rb
261
+ - lib/time_series/results/result.rb
262
+ - lib/time_series/results/synthetic_result.rb
263
+ - lib/time_series/ts_client.rb
264
+ - lib/time_series/version.rb
265
+ - spec/acceptance/lib/time_series/metric_spec.rb
266
+ - spec/acceptance/lib/time_series/synthetic_result_spec.rb
267
+ - spec/acceptance/lib/time_series/ts_client_spec.rb
268
+ - spec/fixtures.rb
269
+ - spec/fixtures/errors/no_metric.json
270
+ - spec/fixtures/errors/no_tag_key.json
271
+ - spec/fixtures/query/sys.numa.allocation.json
272
+ - spec/fixtures/query/sys.numa.allocation.rate.json
273
+ - spec/fixtures/query/sys.numa.zoneallocs.json
274
+ - spec/fixtures/suggest/sys.json
275
+ - spec/integration/lib/time_series/integration_spec.rb
276
+ - spec/spec_helper.rb
277
+ - spec/unit/lib/time_series/metric_spec.rb
278
+ - spec/unit/lib/time_series/query_spec.rb
279
+ - spec/unit/lib/time_series/synthetic_result_spec.rb
280
+ - spec/unit/lib/time_series/ts_client_spec.rb
281
+ - tsdb_time_series.gemspec
282
+ - tsdb_time_series.reek
283
+ homepage:
284
+ licenses: []
285
+ metadata: {}
286
+ post_install_message:
287
+ rdoc_options: []
288
+ require_paths:
289
+ - lib
290
+ required_ruby_version: !ruby/object:Gem::Requirement
291
+ requirements:
292
+ - - ! '>='
293
+ - !ruby/object:Gem::Version
294
+ version: '0'
295
+ required_rubygems_version: !ruby/object:Gem::Requirement
296
+ requirements:
297
+ - - ! '>='
298
+ - !ruby/object:Gem::Version
299
+ version: '0'
300
+ requirements: []
301
+ rubyforge_project:
302
+ rubygems_version: 2.5.1
303
+ signing_key:
304
+ specification_version: 4
305
+ summary: OpenTSDB Gem
306
+ test_files:
307
+ - spec/acceptance/lib/time_series/metric_spec.rb
308
+ - spec/acceptance/lib/time_series/synthetic_result_spec.rb
309
+ - spec/acceptance/lib/time_series/ts_client_spec.rb
310
+ - spec/fixtures.rb
311
+ - spec/fixtures/errors/no_metric.json
312
+ - spec/fixtures/errors/no_tag_key.json
313
+ - spec/fixtures/query/sys.numa.allocation.json
314
+ - spec/fixtures/query/sys.numa.allocation.rate.json
315
+ - spec/fixtures/query/sys.numa.zoneallocs.json
316
+ - spec/fixtures/suggest/sys.json
317
+ - spec/integration/lib/time_series/integration_spec.rb
318
+ - spec/spec_helper.rb
319
+ - spec/unit/lib/time_series/metric_spec.rb
320
+ - spec/unit/lib/time_series/query_spec.rb
321
+ - spec/unit/lib/time_series/synthetic_result_spec.rb
322
+ - spec/unit/lib/time_series/ts_client_spec.rb
323
+ has_rdoc: