influxer 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog.md +4 -0
- data/influxer.gemspec +1 -1
- data/lib/influxer/client.rb +2 -3
- data/lib/influxer/config.rb +1 -0
- data/lib/influxer/metrics/metrics.rb +19 -4
- data/lib/influxer/metrics/relation.rb +11 -2
- data/lib/influxer/version.rb +1 -1
- data/spec/cases/points_spec.rb +1 -1
- data/spec/metrics/metrics_spec.rb +30 -2
- data/spec/metrics/relation_spec.rb +46 -0
- data/spec/support/metrics/dummy_metrics.rb +1 -1
- data/spec/support/shared_contexts/shared_query.rb +1 -3
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c7fc8c72105e35542e5c818fa97fc55b49c6c068
|
4
|
+
data.tar.gz: eb461ecfc644cdf6a34789d940398ceda66c418e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d470618c9e5f329ba66ba8f1c9da6ba330075c6ee5be825f527c0feab3c3995827b44a5a92fd3f133456896df4b25417b42f2abc2197702117930572d36d8c64
|
7
|
+
data.tar.gz: 425b73368fafb1ff3e82dc6bab1ab005ab14ce9a2e1aac623359feb8eac763660aa13697a7dd3e8e9c018bfb6565b10109c66f7272fd34069ea4e38fdc35a830
|
data/Changelog.md
CHANGED
data/influxer.gemspec
CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.require_paths = ["lib"]
|
17
17
|
|
18
18
|
s.add_dependency "activemodel", '>= 4.0'
|
19
|
-
s.add_dependency "influxdb", "~> 0.2.
|
19
|
+
s.add_dependency "influxdb", "~> 0.2.3"
|
20
20
|
s.add_dependency "anyway_config", "~>0.3.0"
|
21
21
|
|
22
22
|
s.add_development_dependency "timecop"
|
data/lib/influxer/client.rb
CHANGED
data/lib/influxer/config.rb
CHANGED
@@ -9,6 +9,7 @@ module Influxer
|
|
9
9
|
# Base class for InfluxDB querying and writing
|
10
10
|
# rubocop:disable Metrics/ClassLength
|
11
11
|
class Metrics
|
12
|
+
TIME_FACTOR = 1_000_000_000
|
12
13
|
include ActiveModel::Model
|
13
14
|
include ActiveModel::Validations
|
14
15
|
extend ActiveModel::Callbacks
|
@@ -24,7 +25,7 @@ module Influxer
|
|
24
25
|
[
|
25
26
|
:write, :write!, :select, :where,
|
26
27
|
:group, :time, :past, :since,
|
27
|
-
:limit, :offset, :fill, :delete_all
|
28
|
+
:limit, :offset, :fill, :delete_all, :epoch
|
28
29
|
] + Influxer::Calculations::CALCULATION_METHODS
|
29
30
|
),
|
30
31
|
to: :all
|
@@ -108,6 +109,7 @@ module Influxer
|
|
108
109
|
end
|
109
110
|
|
110
111
|
delegate :tag_names, to: :class
|
112
|
+
attr_accessor :timestamp
|
111
113
|
|
112
114
|
def initialize(attributes = {})
|
113
115
|
@attributes = {}
|
@@ -132,7 +134,7 @@ module Influxer
|
|
132
134
|
end
|
133
135
|
|
134
136
|
def write_point
|
135
|
-
client.write_point unquote(series), values: values, tags: tags
|
137
|
+
client.write_point unquote(series), values: values, tags: tags, timestamp: parsed_timestamp
|
136
138
|
@persisted = true
|
137
139
|
end
|
138
140
|
|
@@ -162,10 +164,23 @@ module Influxer
|
|
162
164
|
@attributes.select { |k, _| tag_names.include?(k.to_s) }
|
163
165
|
end
|
164
166
|
|
165
|
-
attributes :timestamp
|
166
|
-
|
167
167
|
private
|
168
168
|
|
169
|
+
def parsed_timestamp
|
170
|
+
return @timestamp unless client.time_precision == 'ns'
|
171
|
+
|
172
|
+
case @timestamp
|
173
|
+
when Numeric
|
174
|
+
@timestamp.to_i.to_s.ljust(19, '0').to_i
|
175
|
+
when String
|
176
|
+
(Time.parse(@timestamp).to_r * TIME_FACTOR).to_i
|
177
|
+
when Date
|
178
|
+
(@timestamp.to_time.to_r * TIME_FACTOR).to_i
|
179
|
+
when Time
|
180
|
+
(@timestamp.to_r * TIME_FACTOR).to_i
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
169
184
|
def unquote(name)
|
170
185
|
name.gsub(/(\A['"]|['"]\z)/, '')
|
171
186
|
end
|
@@ -12,6 +12,8 @@ module Influxer
|
|
12
12
|
|
13
13
|
attr_reader :values
|
14
14
|
|
15
|
+
SUPPORTED_EPOCH_FORMAT = [:h, :m, :s, :ms, :u, :ns]
|
16
|
+
|
15
17
|
MULTI_VALUE_METHODS = [:select, :where, :group, :order]
|
16
18
|
|
17
19
|
MULTI_KEY_METHODS = [:fanout]
|
@@ -109,6 +111,13 @@ module Influxer
|
|
109
111
|
@values[:normalized] == true
|
110
112
|
end
|
111
113
|
|
114
|
+
def epoch(val)
|
115
|
+
return self unless SUPPORTED_EPOCH_FORMAT.include? val
|
116
|
+
|
117
|
+
@values[:epoch] = val
|
118
|
+
self
|
119
|
+
end
|
120
|
+
|
112
121
|
def order(val)
|
113
122
|
case val
|
114
123
|
when Hash
|
@@ -180,7 +189,7 @@ module Influxer
|
|
180
189
|
end
|
181
190
|
|
182
191
|
def load
|
183
|
-
@records = get_points(@instance.client.query(to_sql, denormalize: !normalized
|
192
|
+
@records = get_points(@instance.client.query(to_sql, denormalize: !normalized?, epoch: @values[:epoch]))
|
184
193
|
@loaded = true
|
185
194
|
@records
|
186
195
|
end
|
@@ -194,7 +203,7 @@ module Influxer
|
|
194
203
|
|
195
204
|
sql = sql.join " "
|
196
205
|
|
197
|
-
@instance.client.
|
206
|
+
@instance.client.query sql
|
198
207
|
end
|
199
208
|
|
200
209
|
def scoping
|
data/lib/influxer/version.rb
CHANGED
data/spec/cases/points_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe DummyMetrics do
|
|
4
4
|
before do
|
5
5
|
stub_request(:get, "http://localhost:8086/query")
|
6
6
|
.with(
|
7
|
-
query: { q: 'select * from "dummy"', u: "root", p: "root", precision: '
|
7
|
+
query: { q: 'select * from "dummy"', u: "root", p: "root", precision: 'ns', db: 'db' }
|
8
8
|
)
|
9
9
|
.to_return(body: fixture_file)
|
10
10
|
end
|
@@ -61,7 +61,7 @@ describe Influxer::Metrics, :query do
|
|
61
61
|
it "sets current time" do
|
62
62
|
Timecop.freeze(Time.local(2015))
|
63
63
|
dummy_metrics.write!
|
64
|
-
expect(dummy_metrics.timestamp).to eq Time.local(2015)
|
64
|
+
expect(dummy_metrics.timestamp).to eq Time.local(2015)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
@@ -181,7 +181,7 @@ describe Influxer::Metrics, :query do
|
|
181
181
|
|
182
182
|
it "write data and return point" do
|
183
183
|
expect(client)
|
184
|
-
.to receive(:write_point).with("dummies", tags: { dummy_id: 2, host: 'test' }, values: { user_id: 1 })
|
184
|
+
.to receive(:write_point).with("dummies", tags: { dummy_id: 2, host: 'test' }, values: { user_id: 1 }, timestamp: nil)
|
185
185
|
|
186
186
|
point = dummy_metrics.write(user_id: 1, dummy_id: 2, host: 'test')
|
187
187
|
expect(point.persisted?).to be_truthy
|
@@ -189,6 +189,34 @@ describe Influxer::Metrics, :query do
|
|
189
189
|
expect(point.dummy_id).to eq 2
|
190
190
|
end
|
191
191
|
|
192
|
+
it "test write data with time and return point" do
|
193
|
+
timestamp_test = Time.now
|
194
|
+
expected_time = (timestamp_test.to_r * 1_000_000_000).to_i
|
195
|
+
|
196
|
+
expect(client).
|
197
|
+
to receive(:write_point).with("dummies", tags: { dummy_id: 2, host: 'test' }, values: { user_id: 1 }, timestamp: expected_time)
|
198
|
+
|
199
|
+
point = dummy_metrics.write(user_id: 1, dummy_id: 2, host: 'test', timestamp: timestamp_test)
|
200
|
+
expect(point.persisted?).to be_truthy
|
201
|
+
expect(point.user_id).to eq 1
|
202
|
+
expect(point.dummy_id).to eq 2
|
203
|
+
expect(point.timestamp).to eq timestamp_test
|
204
|
+
end
|
205
|
+
|
206
|
+
it "test write data with string time" do
|
207
|
+
base_time = Time.now
|
208
|
+
timestamp_test = "#{base_time.to_s}"
|
209
|
+
|
210
|
+
expect(client).
|
211
|
+
to receive(:write_point).with("dummies", tags: { dummy_id: 2, host: 'test' }, values: { user_id: 1 }, timestamp: (base_time.to_i * 1_000_000_000).to_i)
|
212
|
+
|
213
|
+
point = dummy_metrics.write(user_id: 1, dummy_id: 2, host: 'test', timestamp: timestamp_test)
|
214
|
+
expect(point.persisted?).to be_truthy
|
215
|
+
expect(point.user_id).to eq 1
|
216
|
+
expect(point.dummy_id).to eq 2
|
217
|
+
expect(point.timestamp).to eq(timestamp_test)
|
218
|
+
end
|
219
|
+
|
192
220
|
it "doesn't write data and return false if invalid" do
|
193
221
|
expect(client).not_to receive(:write_point)
|
194
222
|
expect(DummyMetrics.write(dummy_id: 2)).to be false
|
@@ -294,6 +294,15 @@ describe Influxer::Relation, :query do
|
|
294
294
|
end
|
295
295
|
|
296
296
|
describe "#delete_all" do
|
297
|
+
it "client expects to execute query method" do
|
298
|
+
expected_query = "drop series from \"dummy\""
|
299
|
+
|
300
|
+
expect(client)
|
301
|
+
.to receive(:query).with(expected_query)
|
302
|
+
|
303
|
+
rel.delete_all
|
304
|
+
end
|
305
|
+
|
297
306
|
it "without tags" do
|
298
307
|
expect(rel.delete_all)
|
299
308
|
.to eq "drop series from \"dummy\""
|
@@ -321,4 +330,41 @@ describe Influxer::Relation, :query do
|
|
321
330
|
expect(rel.inspect).to eq "#<Influxer::Relation [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...]>"
|
322
331
|
end
|
323
332
|
end
|
333
|
+
|
334
|
+
describe "#epoch" do
|
335
|
+
it "format :h" do
|
336
|
+
expect(client).to receive(:query).with('select * from "dummy"', denormalize: true, epoch: :h).and_return []
|
337
|
+
DummyMetrics.epoch(:h).all.to_a
|
338
|
+
end
|
339
|
+
|
340
|
+
it "format :m" do
|
341
|
+
expect(client).to receive(:query).with('select * from "dummy"', denormalize: true, epoch: :m).and_return []
|
342
|
+
DummyMetrics.epoch(:m).all.to_a
|
343
|
+
end
|
344
|
+
|
345
|
+
it "format :s" do
|
346
|
+
expect(client).to receive(:query).with('select * from "dummy"', denormalize: true, epoch: :s).and_return []
|
347
|
+
DummyMetrics.epoch(:s).all.to_a
|
348
|
+
end
|
349
|
+
|
350
|
+
it "format :ms" do
|
351
|
+
expect(client).to receive(:query).with('select * from "dummy"', denormalize: true, epoch: :ms).and_return []
|
352
|
+
DummyMetrics.epoch(:ms).all.to_a
|
353
|
+
end
|
354
|
+
|
355
|
+
it "format :u" do
|
356
|
+
expect(client).to receive(:query).with('select * from "dummy"', denormalize: true, epoch: :u).and_return []
|
357
|
+
DummyMetrics.epoch(:u).all.to_a
|
358
|
+
end
|
359
|
+
|
360
|
+
it "format :ns" do
|
361
|
+
expect(client).to receive(:query).with('select * from "dummy"', denormalize: true, epoch: :ns).and_return []
|
362
|
+
DummyMetrics.epoch(:ns).all.to_a
|
363
|
+
end
|
364
|
+
|
365
|
+
it "invalid epoch format" do
|
366
|
+
expect(client).to receive(:query).with('select * from "dummy"', denormalize: true, epoch: nil).and_return []
|
367
|
+
DummyMetrics.epoch(:invalid).all.to_a
|
368
|
+
end
|
369
|
+
end
|
324
370
|
end
|
@@ -7,9 +7,7 @@ shared_context "stub_query", :query do
|
|
7
7
|
sql
|
8
8
|
end
|
9
9
|
|
10
|
-
allow_any_instance_of(
|
11
|
-
sql
|
12
|
-
end
|
10
|
+
allow_any_instance_of(InfluxDB::Client).to receive(:time_precision)
|
13
11
|
|
14
12
|
allow_any_instance_of(InfluxDB::Client).to receive(:post)
|
15
13
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: influxer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vlad Dem
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.2.
|
33
|
+
version: 0.2.3
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.2.
|
40
|
+
version: 0.2.3
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: anyway_config
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -238,3 +238,4 @@ signing_key:
|
|
238
238
|
specification_version: 4
|
239
239
|
summary: InfluxDB for Rails
|
240
240
|
test_files: []
|
241
|
+
has_rdoc:
|