tsdb_time_series 4.1.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.
@@ -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: