influxdb 0.2.6 → 0.3.0
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 +4 -4
- data/.rubocop.yml +2 -2
- data/.travis.yml +20 -5
- data/CHANGELOG.md +58 -0
- data/README.md +23 -1
- data/Rakefile +3 -0
- data/influxdb.gemspec +5 -7
- data/lib/influxdb/client/http.rb +1 -1
- data/lib/influxdb/config.rb +62 -37
- data/lib/influxdb/version.rb +1 -1
- data/lib/influxdb/writer/async.rb +22 -10
- data/spec/influxdb/cases/async_client_spec.rb +27 -6
- data/spec/influxdb/cases/query_core.rb +23 -21
- data/spec/influxdb/cases/query_user_spec.rb +3 -3
- data/spec/influxdb/cases/querying_spec.rb +51 -104
- data/spec/influxdb/cases/retry_requests_spec.rb +9 -7
- data/spec/influxdb/cases/write_points_spec.rb +37 -56
- data/spec/influxdb/client_spec.rb +4 -4
- data/spec/influxdb/logging_spec.rb +5 -2
- data/spec/influxdb/point_value_spec.rb +3 -3
- data/spec/spec_helper.rb +3 -2
- metadata +13 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a21a286129826d9f88c4ca4e8dc87676b6f017a2
|
4
|
+
data.tar.gz: e42cd53060f55865f25b480fd2894a5a375d9961
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 405f425003836d44d9d7123d6bfd7b24be8f2955737e2922b40743e86cd5434bc7443f7b4f23c4ad6346ed17d27b41836b9eaba92ff0b70d301469617e033b28
|
7
|
+
data.tar.gz: 2fe79f2e54e16890cf5cfc6f50cbe45d282cf2f3a241305b6b925542b4f5e2603a60c8e0559d4402647ed586e972a46fd30ebae14368c7bd14f264bb83ea1a52
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -1,16 +1,31 @@
|
|
1
|
+
sudo: required
|
2
|
+
dist: trusty
|
1
3
|
language: ruby
|
2
4
|
before_install:
|
3
5
|
- gem update bundler
|
4
6
|
rvm:
|
5
7
|
- 2.0.0
|
6
|
-
- 2.1.
|
7
|
-
- 2.2.
|
8
|
+
- 2.1.10
|
9
|
+
- 2.2.4
|
8
10
|
- 2.3.0
|
9
11
|
- ruby-head
|
10
|
-
|
11
|
-
-
|
12
|
-
- jruby-head
|
12
|
+
env:
|
13
|
+
- TEST_TASK=spec
|
13
14
|
matrix:
|
14
15
|
allow_failures:
|
15
16
|
- rvm: jruby-head
|
16
17
|
- rvm: ruby-head
|
18
|
+
- rvm: jruby-9.0.5.0
|
19
|
+
include:
|
20
|
+
- rvm: 2.3.0
|
21
|
+
env: TEST_TASK=rubocop
|
22
|
+
- rvm: jruby-9.0.5.0
|
23
|
+
env: JRUBY_OPTS='-J-Xmx256M'
|
24
|
+
- rvm: jruby-head
|
25
|
+
env: JRUBY_OPTS='-J-Xmx256M'
|
26
|
+
fail_fast: true
|
27
|
+
addons:
|
28
|
+
apt:
|
29
|
+
packages:
|
30
|
+
- libgmp-dev
|
31
|
+
script: bundle exec rake $TEST_TASK
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
For the full commit log, [see here](https://github.com/influxdata/influxdb-ruby/commits/master).
|
4
|
+
|
5
|
+
## v0.3.0, released 2016-04-24
|
6
|
+
|
7
|
+
- Write queries are now checked against 204 No Content responses, in accordance with the official documentation (#128).
|
8
|
+
- Async options are now configurabe (#107).
|
9
|
+
|
10
|
+
## v0.2.6, released 2016-04-14
|
11
|
+
|
12
|
+
- Empty tag keys/values are now omitted (#124).
|
13
|
+
|
14
|
+
## v0.2.5, released 2016-04-14
|
15
|
+
|
16
|
+
- Async writer now behaves when stopping the client (#73).
|
17
|
+
- Update development dependencies and started enforcing Rubocop styles.
|
18
|
+
|
19
|
+
## v0.2.4, released 2016-04-12
|
20
|
+
|
21
|
+
- Added `InfluxDB::Client#version`, returning the server version (#117).
|
22
|
+
- Fixed escaping issues (#119, #121, #135).
|
23
|
+
- Interger values are now written as Integer, not as Float value (#131).
|
24
|
+
- Return all result series when querying multiple selects (#134).
|
25
|
+
- Made host cycling thread safe (#136).
|
26
|
+
|
27
|
+
## v0.2.3, released 2015-10-27
|
28
|
+
|
29
|
+
- Added `epoch` option to client constructor and write methods (#104).
|
30
|
+
- Added `#list_user_grants` (#111), `#grant_user_admin_privileges` (#112) and `#alter_retention_policy` (#114) methods.
|
31
|
+
|
32
|
+
## v0.2.2, released 2015-07-29
|
33
|
+
|
34
|
+
- Fixed issues with Async client (#101)
|
35
|
+
- Avoid usage of `gsub!` (#102)
|
36
|
+
|
37
|
+
## v0.2.1, released 2015-07-25
|
38
|
+
|
39
|
+
- Fix double quote tags escaping (#98)
|
40
|
+
|
41
|
+
## v0.2.0, released 2015-07-20
|
42
|
+
|
43
|
+
- Large library refactoring (#88, #90)
|
44
|
+
- Extract config from client
|
45
|
+
- Extract HTTP functionality to separate module
|
46
|
+
- Extract InfluxDB management functions to separate modules
|
47
|
+
- Add writer concept
|
48
|
+
- Refactor specs (add cases)
|
49
|
+
- Add 'denormalize' option to config
|
50
|
+
- Recognize SeriesNotFound error
|
51
|
+
- Update README
|
52
|
+
- Add Rubocop config
|
53
|
+
- Break support for Ruby < 2
|
54
|
+
- Added support for InfluxDB 0.9+ (#92)
|
55
|
+
|
56
|
+
## v0.1.9, released 2015-07-04
|
57
|
+
|
58
|
+
- last version to support InfluxDB 0.8.x
|
data/README.md
CHANGED
@@ -345,7 +345,7 @@ name = 'foobar'
|
|
345
345
|
influxdb = InfluxDB::Client.new database,
|
346
346
|
username: username,
|
347
347
|
password: password,
|
348
|
-
async:
|
348
|
+
async: true
|
349
349
|
|
350
350
|
data = {
|
351
351
|
values: { value: 0 },
|
@@ -356,6 +356,28 @@ data = {
|
|
356
356
|
influxdb.write_point(name, data)
|
357
357
|
```
|
358
358
|
|
359
|
+
Using `async: true` is a shortcut for the following:
|
360
|
+
|
361
|
+
``` ruby
|
362
|
+
async_options = {
|
363
|
+
# number of points to write to the server at once
|
364
|
+
max_post_points: 1000,
|
365
|
+
# queue capacity
|
366
|
+
max_queue_size: 10_000,
|
367
|
+
# number of threads
|
368
|
+
num_worker_threads: 3,
|
369
|
+
# max. time (in seconds) a thread sleeps before
|
370
|
+
# checking if there are new jobs in the queue
|
371
|
+
sleep_interval: 5
|
372
|
+
}
|
373
|
+
|
374
|
+
influxdb = InfluxDB::Client.new database,
|
375
|
+
username: username,
|
376
|
+
password: password,
|
377
|
+
async: async_options
|
378
|
+
```
|
379
|
+
|
380
|
+
|
359
381
|
Write data via UDP (note that a retention policy cannot be specified for UDP writes):
|
360
382
|
|
361
383
|
``` ruby
|
data/Rakefile
CHANGED
data/influxdb.gemspec
CHANGED
@@ -3,13 +3,14 @@ lib = File.expand_path('../lib', __FILE__)
|
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
4
|
require 'influxdb/version'
|
5
5
|
|
6
|
+
# rubocop:disable Style/SpecialGlobalVars
|
6
7
|
Gem::Specification.new do |spec|
|
7
8
|
spec.name = "influxdb"
|
8
9
|
spec.version = InfluxDB::VERSION
|
9
10
|
spec.authors = ["Todd Persen"]
|
10
11
|
spec.email = ["influxdb@googlegroups.com"]
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
12
|
+
spec.description = "This is the official Ruby library for InfluxDB."
|
13
|
+
spec.summary = "Ruby library for InfluxDB."
|
13
14
|
spec.homepage = "http://influxdb.org"
|
14
15
|
spec.license = "MIT"
|
15
16
|
|
@@ -19,13 +20,10 @@ Gem::Specification.new do |spec|
|
|
19
20
|
spec.require_paths = ["lib"]
|
20
21
|
|
21
22
|
spec.add_runtime_dependency "json"
|
23
|
+
spec.add_runtime_dependency "cause" if RUBY_VERSION < '2.1'
|
22
24
|
|
23
|
-
if RUBY_VERSION < '2.1'
|
24
|
-
spec.add_runtime_dependency "cause"
|
25
|
-
end
|
26
|
-
|
27
|
-
spec.add_development_dependency "bundler", "~> 1.3"
|
28
25
|
spec.add_development_dependency "rake"
|
26
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
29
27
|
spec.add_development_dependency "rspec", "~> 3.4.0"
|
30
28
|
spec.add_development_dependency "webmock", "~> 1.24.2"
|
31
29
|
spec.add_development_dependency "rubocop", "~> 0.39.0"
|
data/lib/influxdb/client/http.rb
CHANGED
@@ -27,7 +27,7 @@ module InfluxDB
|
|
27
27
|
response = do_request http, Net::HTTP::Post.new(url, headers), data
|
28
28
|
|
29
29
|
case response
|
30
|
-
when Net::
|
30
|
+
when Net::HTTPNoContent
|
31
31
|
return response
|
32
32
|
when Net::HTTPUnauthorized
|
33
33
|
raise InfluxDB::AuthenticationError, response.body
|
data/lib/influxdb/config.rb
CHANGED
@@ -25,51 +25,22 @@ module InfluxDB
|
|
25
25
|
|
26
26
|
attr_reader :async, :udp
|
27
27
|
|
28
|
-
# rubocop:disable all
|
29
28
|
def initialize(opts = {})
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
@password = opts.fetch(:password, "root".freeze)
|
35
|
-
@auth_method = AUTH_METHODS.include?(opts[:auth_method]) ? opts[:auth_method] : "params".freeze
|
36
|
-
@use_ssl = opts.fetch(:use_ssl, false)
|
37
|
-
@verify_ssl = opts.fetch(:verify_ssl, true)
|
38
|
-
@ssl_ca_cert = opts.fetch(:ssl_ca_cert, false)
|
39
|
-
@time_precision = opts.fetch(:time_precision, "s".freeze)
|
40
|
-
@initial_delay = opts.fetch(:initial_delay, 0.01)
|
41
|
-
@max_delay = opts.fetch(:max_delay, 30)
|
42
|
-
@open_timeout = opts.fetch(:write_timeout, 5)
|
43
|
-
@read_timeout = opts.fetch(:read_timeout, 300)
|
44
|
-
@async = opts.fetch(:async, false)
|
45
|
-
@udp = opts.fetch(:udp, false)
|
46
|
-
@retry = opts.fetch(:retry, nil)
|
47
|
-
@denormalize = opts.fetch(:denormalize, true)
|
48
|
-
@epoch = opts.fetch(:epoch, false)
|
49
|
-
|
50
|
-
# load the hosts into a Queue for thread safety
|
51
|
-
@hosts_queue = Queue.new
|
52
|
-
Array(opts[:hosts] || opts[:host] || ["localhost"]).each do |host|
|
53
|
-
@hosts_queue.push(host)
|
54
|
-
end
|
29
|
+
extract_http_options!(opts)
|
30
|
+
extract_ssl_options!(opts)
|
31
|
+
extract_database_options!(opts)
|
32
|
+
extract_writer_options!(opts)
|
55
33
|
|
56
|
-
|
57
|
-
|
58
|
-
when Integer
|
59
|
-
# ok
|
60
|
-
when true, nil
|
61
|
-
@retry = -1
|
62
|
-
when false
|
63
|
-
@retry = 0
|
64
|
-
end
|
34
|
+
configure_retry! opts.fetch(:retry, nil)
|
35
|
+
configure_hosts! opts[:hosts] || opts[:host] || "localhost".freeze
|
65
36
|
end
|
66
37
|
|
67
38
|
def udp?
|
68
|
-
|
39
|
+
udp != false
|
69
40
|
end
|
70
41
|
|
71
42
|
def async?
|
72
|
-
|
43
|
+
async != false
|
73
44
|
end
|
74
45
|
|
75
46
|
def next_host
|
@@ -85,5 +56,59 @@ module InfluxDB
|
|
85
56
|
host
|
86
57
|
end
|
87
58
|
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
# rubocop:disable Metrics/AbcSize
|
63
|
+
def extract_http_options!(opts)
|
64
|
+
@port = opts.fetch :port, 8086
|
65
|
+
@prefix = opts.fetch :prefix, "".freeze
|
66
|
+
@username = opts.fetch :username, "root".freeze
|
67
|
+
@password = opts.fetch :password, "root".freeze
|
68
|
+
@open_timeout = opts.fetch :write_timeout, 5
|
69
|
+
@read_timeout = opts.fetch :read_timeout, 300
|
70
|
+
@max_delay = opts.fetch :max_delay, 30
|
71
|
+
@initial_delay = opts.fetch :initial_delay, 0.01
|
72
|
+
auth = opts[:auth_method]
|
73
|
+
@auth_method = AUTH_METHODS.include?(auth) ? auth : "params".freeze
|
74
|
+
end
|
75
|
+
|
76
|
+
def extract_ssl_options!(opts)
|
77
|
+
@use_ssl = opts.fetch :use_ssl, false
|
78
|
+
@verify_ssl = opts.fetch :verify_ssl, true
|
79
|
+
@ssl_ca_cert = opts.fetch :ssl_ca_cert, false
|
80
|
+
end
|
81
|
+
|
82
|
+
# normalize retry option
|
83
|
+
def configure_retry!(value)
|
84
|
+
case value
|
85
|
+
when Integer
|
86
|
+
@retry = value
|
87
|
+
when true, nil
|
88
|
+
@retry = -1
|
89
|
+
when false
|
90
|
+
@retry = 0
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# load the hosts into a Queue for thread safety
|
95
|
+
def configure_hosts!(hosts)
|
96
|
+
@hosts_queue = Queue.new
|
97
|
+
Array(hosts).each do |host|
|
98
|
+
@hosts_queue.push(host)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def extract_database_options!(opts)
|
103
|
+
@database = opts[:database]
|
104
|
+
@time_precision = opts.fetch :time_precision, "s".freeze
|
105
|
+
@denormalize = opts.fetch :denormalize, true
|
106
|
+
@epoch = opts.fetch :epoch, false
|
107
|
+
end
|
108
|
+
|
109
|
+
def extract_writer_options!(opts)
|
110
|
+
@async = opts.fetch :async, false
|
111
|
+
@udp = opts.fetch :udp, false
|
112
|
+
end
|
88
113
|
end
|
89
114
|
end
|
data/lib/influxdb/version.rb
CHANGED
@@ -29,19 +29,31 @@ module InfluxDB
|
|
29
29
|
end
|
30
30
|
|
31
31
|
class Worker
|
32
|
-
attr_reader :client,
|
32
|
+
attr_reader :client,
|
33
|
+
:queue,
|
34
|
+
:threads,
|
35
|
+
:max_post_points,
|
36
|
+
:max_queue_size,
|
37
|
+
:num_worker_threads,
|
38
|
+
:sleep_interval
|
33
39
|
|
34
40
|
include InfluxDB::Logging
|
35
41
|
|
36
|
-
MAX_POST_POINTS
|
37
|
-
MAX_QUEUE_SIZE
|
38
|
-
NUM_WORKER_THREADS
|
39
|
-
SLEEP_INTERVAL
|
42
|
+
MAX_POST_POINTS = 1000
|
43
|
+
MAX_QUEUE_SIZE = 10_000
|
44
|
+
NUM_WORKER_THREADS = 3
|
45
|
+
SLEEP_INTERVAL = 5
|
40
46
|
|
41
47
|
def initialize(client, config)
|
42
48
|
@client = client
|
43
49
|
config = config.is_a?(Hash) ? config : {}
|
44
|
-
|
50
|
+
|
51
|
+
@max_post_points = config.fetch(:max_post_points, MAX_POST_POINTS)
|
52
|
+
@max_queue_size = config.fetch(:max_queue_size, MAX_QUEUE_SIZE)
|
53
|
+
@num_worker_threads = config.fetch(:num_worker_threads, NUM_WORKER_THREADS)
|
54
|
+
@sleep_interval = config.fetch(:sleep_interval, SLEEP_INTERVAL)
|
55
|
+
|
56
|
+
@queue = InfluxDB::MaxQueue.new max_queue_size
|
45
57
|
|
46
58
|
spawn_threads!
|
47
59
|
end
|
@@ -64,7 +76,7 @@ module InfluxDB
|
|
64
76
|
|
65
77
|
def spawn_threads!
|
66
78
|
@threads = []
|
67
|
-
|
79
|
+
num_worker_threads.times do |thread_num|
|
68
80
|
log :debug, "Spawning background worker thread #{thread_num}."
|
69
81
|
|
70
82
|
@threads << Thread.new do
|
@@ -72,7 +84,7 @@ module InfluxDB
|
|
72
84
|
|
73
85
|
until client.stopped?
|
74
86
|
check_background_queue(thread_num)
|
75
|
-
sleep rand(
|
87
|
+
sleep rand(sleep_interval)
|
76
88
|
end
|
77
89
|
|
78
90
|
log :debug, "Exit background worker thread #{thread_num}."
|
@@ -87,7 +99,7 @@ module InfluxDB
|
|
87
99
|
loop do
|
88
100
|
data = []
|
89
101
|
|
90
|
-
while data.size <
|
102
|
+
while data.size < max_post_points && !queue.empty?
|
91
103
|
p = queue.pop(true) rescue next
|
92
104
|
data.push p
|
93
105
|
end
|
@@ -101,7 +113,7 @@ module InfluxDB
|
|
101
113
|
puts "Cannot write data: #{e.inspect}"
|
102
114
|
end
|
103
115
|
|
104
|
-
break if queue.length >
|
116
|
+
break if queue.length > max_post_points
|
105
117
|
end
|
106
118
|
end
|
107
119
|
|
@@ -2,17 +2,19 @@ require "spec_helper"
|
|
2
2
|
require "timeout"
|
3
3
|
|
4
4
|
describe InfluxDB::Client do
|
5
|
-
let(:
|
5
|
+
let(:async_options) { true }
|
6
|
+
let(:client) { described_class.new(async: async_options) }
|
7
|
+
let(:subject) { client }
|
6
8
|
let(:stub_url) { "http://localhost:8086/write?db=&p=root&precision=s&u=root" }
|
7
|
-
let(:
|
9
|
+
let(:worker) { client.writer.worker }
|
8
10
|
|
9
11
|
specify { expect(subject.writer).to be_a(InfluxDB::Writer::Async) }
|
10
12
|
|
11
13
|
describe "#write_point" do
|
12
14
|
it "sends writes to client" do
|
13
|
-
post_request = stub_request(:post, stub_url)
|
15
|
+
post_request = stub_request(:post, stub_url).to_return(status: 204)
|
14
16
|
|
15
|
-
(
|
17
|
+
(worker.max_post_points + 100).times do
|
16
18
|
subject.write_point('a', {})
|
17
19
|
end
|
18
20
|
|
@@ -21,11 +23,11 @@ describe InfluxDB::Client do
|
|
21
23
|
# responsive and needs a bit more time.
|
22
24
|
timeout_stretch = ENV["TRAVIS"] == "true" ? 10 : 3
|
23
25
|
|
24
|
-
Timeout.timeout(timeout_stretch *
|
26
|
+
Timeout.timeout(timeout_stretch * worker.sleep_interval) do
|
25
27
|
subject.stop!
|
26
28
|
end
|
27
29
|
|
28
|
-
|
30
|
+
worker.threads.each do |t|
|
29
31
|
expect(t.stop?).to be true
|
30
32
|
end
|
31
33
|
|
@@ -34,4 +36,23 @@ describe InfluxDB::Client do
|
|
34
36
|
expect(post_request).to have_been_requested.at_least_times(2)
|
35
37
|
end
|
36
38
|
end
|
39
|
+
|
40
|
+
describe "async options" do
|
41
|
+
let(:async_options) do
|
42
|
+
{
|
43
|
+
max_post_points: 10,
|
44
|
+
max_queue_size: 100,
|
45
|
+
num_worker_threads: 1,
|
46
|
+
sleep_interval: 0.5
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
subject { worker }
|
51
|
+
before { worker.stop! }
|
52
|
+
|
53
|
+
specify { expect(subject.max_post_points).to be 10 }
|
54
|
+
specify { expect(subject.max_queue_size).to be 100 }
|
55
|
+
specify { expect(subject.num_worker_threads).to be 1 }
|
56
|
+
specify { expect(subject.sleep_interval).to be_within(0.0001).of(0.5) }
|
57
|
+
end
|
37
58
|
end
|
@@ -1,33 +1,35 @@
|
|
1
|
-
require
|
2
|
-
require 'json'
|
1
|
+
require "spec_helper"
|
3
2
|
|
4
3
|
describe InfluxDB::Client do
|
5
4
|
let(:subject) do
|
6
|
-
described_class.new
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
time_precision: 's'
|
14
|
-
}.merge(args)
|
15
|
-
)
|
5
|
+
described_class.new "database", {
|
6
|
+
host: "influxdb.test",
|
7
|
+
port: 9999,
|
8
|
+
username: "username",
|
9
|
+
password: "password",
|
10
|
+
time_precision: "s"
|
11
|
+
}.merge(args)
|
16
12
|
end
|
17
13
|
|
18
14
|
let(:args) { {} }
|
19
15
|
|
20
|
-
describe
|
16
|
+
describe "#query" do
|
17
|
+
let(:query) { "SELECT value FROM requests_per_minute WHERE time > 1437019900" }
|
18
|
+
let(:response) do
|
19
|
+
{ "results" => [{ "series" => [{ "name" => "requests_per_minute",
|
20
|
+
"columns" => %w( time value ) }] }] }
|
21
|
+
end
|
22
|
+
|
23
|
+
before do
|
24
|
+
stub_request(:get, "http://influxdb.test:9999/query")
|
25
|
+
.with(query: { db: "database", precision: "s", u: "username", p: "password", q: query })
|
26
|
+
.to_return(body: JSON.generate(response), status: 200)
|
27
|
+
end
|
21
28
|
|
22
|
-
it
|
29
|
+
it "should handle responses with no values" do
|
23
30
|
# Some requests (such as trying to retrieve values from the future)
|
24
|
-
# return a result with no
|
25
|
-
|
26
|
-
response = {'results'=>[{'series'=>[{'name'=>'requests_per_minute' ,'columns' => ['time','value']}]}]}
|
27
|
-
stub_request(:get, 'http://influxdb.test:9999/query').with(
|
28
|
-
query: { db: 'database', precision: 's', u: 'username', p: 'password', q: query }
|
29
|
-
).to_return(body: JSON.generate(response), status: 200)
|
30
|
-
expected_result = [{'name'=>'requests_per_minute', 'tags'=>nil, 'values'=>[]}]
|
31
|
+
# return a result with no "values" key set.
|
32
|
+
expected_result = [{ "name" => "requests_per_minute", "tags" => nil, "values" => [] }]
|
31
33
|
expect(subject.query(query)).to eq(expected_result)
|
32
34
|
end
|
33
35
|
end
|
@@ -145,9 +145,9 @@ describe InfluxDB::Client do
|
|
145
145
|
let(:list_query) { "SHOW GRANTS FOR #{user}" }
|
146
146
|
|
147
147
|
before do
|
148
|
-
stub_request(:get, "http://influxdb.test:9999/query")
|
149
|
-
query: { u: "username", p: "password", q: list_query}
|
150
|
-
|
148
|
+
stub_request(:get, "http://influxdb.test:9999/query")
|
149
|
+
.with(query: { u: "username", p: "password", q: list_query })
|
150
|
+
.to_return(status: 200, body: "", headers: {})
|
151
151
|
end
|
152
152
|
|
153
153
|
it "should GET for a user" do
|
@@ -3,20 +3,25 @@ require "json"
|
|
3
3
|
|
4
4
|
describe InfluxDB::Client do
|
5
5
|
let(:subject) do
|
6
|
-
described_class.new
|
7
|
-
"
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
time_precision: "s"
|
14
|
-
}.merge(args)
|
15
|
-
)
|
6
|
+
described_class.new "database", {
|
7
|
+
host: "influxdb.test",
|
8
|
+
port: 9999,
|
9
|
+
username: "username",
|
10
|
+
password: "password",
|
11
|
+
time_precision: "s"
|
12
|
+
}.merge(args)
|
16
13
|
end
|
17
14
|
|
18
|
-
let(:args)
|
19
|
-
let(:database)
|
15
|
+
let(:args) { {} }
|
16
|
+
let(:database) { subject.config.database }
|
17
|
+
let(:extra_params) { {} }
|
18
|
+
let(:response) {}
|
19
|
+
|
20
|
+
before do
|
21
|
+
stub_request(:get, "http://influxdb.test:9999/query")
|
22
|
+
.with(query: { q: query, u: "username", p: "password", precision: 's', db: database }.merge(extra_params))
|
23
|
+
.to_return(body: JSON.generate(response))
|
24
|
+
end
|
20
25
|
|
21
26
|
describe "#query" do
|
22
27
|
context "with single series with multiple points" do
|
@@ -32,12 +37,6 @@ describe InfluxDB::Client do
|
|
32
37
|
end
|
33
38
|
let(:query) { 'SELECT * FROM cpu' }
|
34
39
|
|
35
|
-
before do
|
36
|
-
stub_request(:get, "http://influxdb.test:9999/query").with(
|
37
|
-
query: { q: query, u: "username", p: "password", precision: 's', db: database }
|
38
|
-
).to_return(body: JSON.generate(response))
|
39
|
-
end
|
40
|
-
|
41
40
|
it "should return array with single hash containing multiple values" do
|
42
41
|
expect(subject.query(query)).to eq(expected_result)
|
43
42
|
end
|
@@ -45,8 +44,8 @@ describe InfluxDB::Client do
|
|
45
44
|
|
46
45
|
context "with series with different tags" do
|
47
46
|
let(:response) do
|
48
|
-
{ "results" =>
|
49
|
-
|
47
|
+
{ "results" => [{ "series" => [{ "name" => "cpu", "tags" => { "region" => "pl" }, "columns" => %w(time temp value), "values" => [["2015-07-07T15:13:04Z", 34, 0.343443]] },
|
48
|
+
{ "name" => "cpu", "tags" => { "region" => "us" }, "columns" => %w(time temp value), "values" => [["2015-07-07T14:58:37Z", 92, 0.3445], ["2015-07-07T14:59:09Z", 68, 0.8787]] }] }] }
|
50
49
|
end
|
51
50
|
let(:expected_result) do
|
52
51
|
[{ "name" => "cpu", "tags" => { "region" => "pl" },
|
@@ -57,12 +56,6 @@ describe InfluxDB::Client do
|
|
57
56
|
end
|
58
57
|
let(:query) { 'SELECT * FROM cpu' }
|
59
58
|
|
60
|
-
before do
|
61
|
-
stub_request(:get, "http://influxdb.test:9999/query").with(
|
62
|
-
query: { q: query, u: "username", p: "password", precision: 's', db: database }
|
63
|
-
).to_return(body: JSON.generate(response))
|
64
|
-
end
|
65
|
-
|
66
59
|
it "should return array with 2 elements grouped by tags" do
|
67
60
|
expect(subject.query(query)).to eq(expected_result)
|
68
61
|
end
|
@@ -70,10 +63,10 @@ describe InfluxDB::Client do
|
|
70
63
|
|
71
64
|
context "with multiple series with different tags" do
|
72
65
|
let(:response) do
|
73
|
-
{ "results" =>
|
74
|
-
|
75
|
-
|
76
|
-
|
66
|
+
{ "results" => [{ "series" => [{ "name" => "access_times.service_1", "tags" => { "code" => "200", "result" => "failure", "status" => "OK" }, "columns" => %w(time value), "values" => [["2015-07-08T07:15:22Z", 327]] },
|
67
|
+
{ "name" => "access_times.service_1", "tags" => { "code" => "500", "result" => "failure", "status" => "Internal Server Error" }, "columns" => %w(time value), "values" => [["2015-07-08T06:15:22Z", 873]] },
|
68
|
+
{ "name" => "access_times.service_2", "tags" => { "code" => "200", "result" => "failure", "status" => "OK" }, "columns" => %w(time value), "values" => [["2015-07-08T07:15:22Z", 943]] },
|
69
|
+
{ "name" => "access_times.service_2", "tags" => { "code" => "500", "result" => "failure", "status" => "Internal Server Error" }, "columns" => %w(time value), "values" => [["2015-07-08T06:15:22Z", 606]] }] }] }
|
77
70
|
end
|
78
71
|
let(:expected_result) do
|
79
72
|
[{ "name" => "access_times.service_1", "tags" => { "code" => "200", "result" => "failure", "status" => "OK" }, "values" => [{ "time" => "2015-07-08T07:15:22Z", "value" => 327 }] },
|
@@ -83,12 +76,6 @@ describe InfluxDB::Client do
|
|
83
76
|
end
|
84
77
|
let(:query) { "SELECT * FROM /access_times.*/" }
|
85
78
|
|
86
|
-
before do
|
87
|
-
stub_request(:get, "http://influxdb.test:9999/query").with(
|
88
|
-
query: { q: query, u: "username", p: "password", precision: 's', db: database }
|
89
|
-
).to_return(body: JSON.generate(response))
|
90
|
-
end
|
91
|
-
|
92
79
|
it "should return array with 4 elements grouped by name and tags" do
|
93
80
|
expect(subject.query(query)).to eq(expected_result)
|
94
81
|
end
|
@@ -96,8 +83,8 @@ describe InfluxDB::Client do
|
|
96
83
|
|
97
84
|
context "with multiple series for explicit value only" do
|
98
85
|
let(:response) do
|
99
|
-
{ "results" =>
|
100
|
-
|
86
|
+
{ "results" => [{ "series" => [{ "name" => "access_times.service_1", "columns" => %w(time value), "values" => [["2015-07-08T06:15:22Z", 873], ["2015-07-08T07:15:22Z", 327]] },
|
87
|
+
{ "name" => "access_times.service_2", "columns" => %w(time value), "values" => [["2015-07-08T06:15:22Z", 606], ["2015-07-08T07:15:22Z", 943]] }] }] }
|
101
88
|
end
|
102
89
|
let(:expected_result) do
|
103
90
|
[{ "name" => "access_times.service_1", "tags" => nil, "values" => [{ "time" => "2015-07-08T06:15:22Z", "value" => 873 }, { "time" => "2015-07-08T07:15:22Z", "value" => 327 }] },
|
@@ -105,12 +92,6 @@ describe InfluxDB::Client do
|
|
105
92
|
end
|
106
93
|
let(:query) { "SELECT value FROM /access_times.*/" }
|
107
94
|
|
108
|
-
before do
|
109
|
-
stub_request(:get, "http://influxdb.test:9999/query").with(
|
110
|
-
query: { q: query, u: "username", p: "password", precision: 's', db: database }
|
111
|
-
).to_return(body: JSON.generate(response))
|
112
|
-
end
|
113
|
-
|
114
95
|
it "should return array with 2 elements grouped by name only and no tags" do
|
115
96
|
expect(subject.query(query)).to eq(expected_result)
|
116
97
|
end
|
@@ -118,8 +99,8 @@ describe InfluxDB::Client do
|
|
118
99
|
|
119
100
|
context "with a block" do
|
120
101
|
let(:response) do
|
121
|
-
{ "results" =>
|
122
|
-
|
102
|
+
{ "results" => [{ "series" => [{ "name" => "cpu", "tags" => { "region" => "pl" }, "columns" => %w(time temp value), "values" => [["2015-07-07T15:13:04Z", 34, 0.343443]] },
|
103
|
+
{ "name" => "cpu", "tags" => { "region" => "us" }, "columns" => %w(time temp value), "values" => [["2015-07-07T14:58:37Z", 92, 0.3445], ["2015-07-07T14:59:09Z", 68, 0.8787]] }] }] }
|
123
104
|
end
|
124
105
|
|
125
106
|
let(:expected_result) do
|
@@ -131,12 +112,6 @@ describe InfluxDB::Client do
|
|
131
112
|
end
|
132
113
|
let(:query) { 'SELECT * FROM cpu' }
|
133
114
|
|
134
|
-
before do
|
135
|
-
stub_request(:get, "http://influxdb.test:9999/query").with(
|
136
|
-
query: { q: query, u: "username", p: "password", precision: 's', db: database }
|
137
|
-
).to_return(body: JSON.generate(response))
|
138
|
-
end
|
139
|
-
|
140
115
|
it "should accept a block and yield name, tags and points" do
|
141
116
|
results = []
|
142
117
|
subject.query(query) do |name, tags, points|
|
@@ -147,33 +122,23 @@ describe InfluxDB::Client do
|
|
147
122
|
end
|
148
123
|
|
149
124
|
context "with epoch set to seconds" do
|
150
|
-
let(:args) { {epoch: 's'} }
|
125
|
+
let(:args) { { epoch: 's' } }
|
126
|
+
let(:extra_params) { { epoch: 's' } }
|
151
127
|
|
152
128
|
let(:response) do
|
153
|
-
{ "results" =>
|
154
|
-
|
155
|
-
[{ "name" => "cpu", "tags" => { "region" => "pl" }, "columns" => %w(time temp value), "values" => [[1438580576, 34, 0.343443]] },
|
156
|
-
{ "name" => "cpu", "tags" => { "region" => "us" }, "columns" => %w(time temp value), "values" => [[1438612976, 92, 0.3445], [1438612989, 68, 0.8787]] }
|
157
|
-
]
|
158
|
-
}]
|
159
|
-
}
|
129
|
+
{ "results" => [{ "series" => [{ "name" => "cpu", "tags" => { "region" => "pl" }, "columns" => %w(time temp value), "values" => [[1_438_580_576, 34, 0.343443]] },
|
130
|
+
{ "name" => "cpu", "tags" => { "region" => "us" }, "columns" => %w(time temp value), "values" => [[1_438_612_976, 92, 0.3445], [1_438_612_989, 68, 0.8787]] }] }] }
|
160
131
|
end
|
161
132
|
let(:expected_result) do
|
162
133
|
[{ "name" => "cpu", "tags" => { "region" => "pl" },
|
163
|
-
"values" => [{ "time" =>
|
134
|
+
"values" => [{ "time" => 1_438_580_576, "temp" => 34, "value" => 0.343443 }] },
|
164
135
|
{ "name" => "cpu", "tags" => { "region" => "us" },
|
165
|
-
"values" => [{ "time" =>
|
166
|
-
{ "time" =>
|
136
|
+
"values" => [{ "time" => 1_438_612_976, "temp" => 92, "value" => 0.3445 },
|
137
|
+
{ "time" => 1_438_612_989, "temp" => 68, "value" => 0.8787 }]
|
167
138
|
}]
|
168
139
|
end
|
169
140
|
let(:query) { 'SELECT * FROM cpu' }
|
170
141
|
|
171
|
-
before do
|
172
|
-
stub_request(:get, "http://influxdb.test:9999/query").with(
|
173
|
-
query: { q: query, u: "username", p: "password", precision: 's', db: database, epoch: 's' }
|
174
|
-
).to_return(body: JSON.generate(response))
|
175
|
-
end
|
176
|
-
|
177
142
|
it "should return results with integer timestamp" do
|
178
143
|
expect(subject.query(query)).to eq(expected_result)
|
179
144
|
end
|
@@ -188,24 +153,18 @@ describe InfluxDB::Client do
|
|
188
153
|
"values" => [["2015-07-07T14:58:37Z", 92, 0.3445], ["2015-07-07T14:59:09Z", 68, 0.8787]] }] },
|
189
154
|
{ "series" => [{ "name" => "memory", "tags" => { "region" => "us" },
|
190
155
|
"columns" => %w(time free total),
|
191
|
-
"values" => [["2015-07-07T14:58:37Z",
|
156
|
+
"values" => [["2015-07-07T14:58:37Z", 96_468_992, 134_217_728], ["2015-07-07T14:59:09Z", 71_303_168, 134_217_728]] }] }] }
|
192
157
|
end
|
193
158
|
let(:expected_result) do
|
194
159
|
[{ "name" => "cpu", "tags" => { "region" => "us" },
|
195
160
|
"values" => [{ "time" => "2015-07-07T14:58:37Z", "temp" => 92, "value" => 0.3445 },
|
196
161
|
{ "time" => "2015-07-07T14:59:09Z", "temp" => 68, "value" => 0.8787 }] },
|
197
162
|
{ "name" => "memory", "tags" => { "region" => "us" },
|
198
|
-
"values" => [{ "time" => "2015-07-07T14:58:37Z", "free" => 92*2**20, "total" => 128*2**20 },
|
199
|
-
{ "time" => "2015-07-07T14:59:09Z", "free" => 68*2**20, "total" => 128*2**20 }] }]
|
163
|
+
"values" => [{ "time" => "2015-07-07T14:58:37Z", "free" => 92 * 2**20, "total" => 128 * 2**20 },
|
164
|
+
{ "time" => "2015-07-07T14:59:09Z", "free" => 68 * 2**20, "total" => 128 * 2**20 }] }]
|
200
165
|
end
|
201
166
|
let(:query) { 'SELECT * FROM cpu; SELECT * FROM memory' }
|
202
167
|
|
203
|
-
before do
|
204
|
-
stub_request(:get, "http://influxdb.test:9999/query").with(
|
205
|
-
query: { q: query, u: "username", p: "password", precision: 's', db: database }
|
206
|
-
).to_return(body: JSON.generate(response))
|
207
|
-
end
|
208
|
-
|
209
168
|
it "should return array with single hash containing multiple values" do
|
210
169
|
expect(subject.query(query)).to eq(expected_result)
|
211
170
|
end
|
@@ -213,10 +172,10 @@ describe InfluxDB::Client do
|
|
213
172
|
|
214
173
|
context "with series with different tags" do
|
215
174
|
let(:response) do
|
216
|
-
{ "results" =>
|
217
|
-
|
218
|
-
|
219
|
-
|
175
|
+
{ "results" => [{ "series" => [{ "name" => "cpu", "tags" => { "region" => "pl" }, "columns" => %w(time temp value), "values" => [["2015-07-07T15:13:04Z", 34, 0.343443]] },
|
176
|
+
{ "name" => "cpu", "tags" => { "region" => "us" }, "columns" => %w(time temp value), "values" => [["2015-07-07T14:58:37Z", 92, 0.3445], ["2015-07-07T14:59:09Z", 68, 0.8787]] }] },
|
177
|
+
{ "series" => [{ "name" => "memory", "tags" => { "region" => "pl" }, "columns" => %w(time free total), "values" => [["2015-07-07T15:13:04Z", 35_651_584, 134_217_728]] },
|
178
|
+
{ "name" => "memory", "tags" => { "region" => "us" }, "columns" => %w(time free total), "values" => [["2015-07-07T14:58:37Z", 96_468_992, 134_217_728], ["2015-07-07T14:59:09Z", 71_303_168, 134_217_728]] }] }] }
|
220
179
|
end
|
221
180
|
let(:expected_result) do
|
222
181
|
[{ "name" => "cpu", "tags" => { "region" => "pl" },
|
@@ -225,19 +184,13 @@ describe InfluxDB::Client do
|
|
225
184
|
"values" => [{ "time" => "2015-07-07T14:58:37Z", "temp" => 92, "value" => 0.3445 },
|
226
185
|
{ "time" => "2015-07-07T14:59:09Z", "temp" => 68, "value" => 0.8787 }] },
|
227
186
|
{ "name" => "memory", "tags" => { "region" => "pl" },
|
228
|
-
"values" => [{ "time" => "2015-07-07T15:13:04Z", "free" => 34*2**20, "total" => 128*2**20 }] },
|
187
|
+
"values" => [{ "time" => "2015-07-07T15:13:04Z", "free" => 34 * 2**20, "total" => 128 * 2**20 }] },
|
229
188
|
{ "name" => "memory", "tags" => { "region" => "us" },
|
230
|
-
"values" => [{ "time" => "2015-07-07T14:58:37Z", "free" => 92*2**20, "total" => 128*2**20 },
|
231
|
-
{ "time" => "2015-07-07T14:59:09Z", "free" => 68*2**20, "total" => 128*2**20 }] }]
|
189
|
+
"values" => [{ "time" => "2015-07-07T14:58:37Z", "free" => 92 * 2**20, "total" => 128 * 2**20 },
|
190
|
+
{ "time" => "2015-07-07T14:59:09Z", "free" => 68 * 2**20, "total" => 128 * 2**20 }] }]
|
232
191
|
end
|
233
192
|
let(:query) { 'SELECT * FROM cpu; SELECT * FROM memory' }
|
234
193
|
|
235
|
-
before do
|
236
|
-
stub_request(:get, "http://influxdb.test:9999/query").with(
|
237
|
-
query: { q: query, u: "username", p: "password", precision: 's', db: database }
|
238
|
-
).to_return(body: JSON.generate(response))
|
239
|
-
end
|
240
|
-
|
241
194
|
it "should return array with 2 elements grouped by tags" do
|
242
195
|
expect(subject.query(query)).to eq(expected_result)
|
243
196
|
end
|
@@ -245,10 +198,10 @@ describe InfluxDB::Client do
|
|
245
198
|
|
246
199
|
context "with a block" do
|
247
200
|
let(:response) do
|
248
|
-
{ "results" =>
|
249
|
-
|
250
|
-
|
251
|
-
|
201
|
+
{ "results" => [{ "series" => [{ "name" => "cpu", "tags" => { "region" => "pl" }, "columns" => %w(time temp value), "values" => [["2015-07-07T15:13:04Z", 34, 0.343443]] },
|
202
|
+
{ "name" => "cpu", "tags" => { "region" => "us" }, "columns" => %w(time temp value), "values" => [["2015-07-07T14:58:37Z", 92, 0.3445], ["2015-07-07T14:59:09Z", 68, 0.8787]] }] },
|
203
|
+
{ "series" => [{ "name" => "memory", "tags" => { "region" => "pl" }, "columns" => %w(time free total), "values" => [["2015-07-07T15:13:04Z", 35_651_584, 134_217_728]] },
|
204
|
+
{ "name" => "memory", "tags" => { "region" => "us" }, "columns" => %w(time free total), "values" => [["2015-07-07T14:58:37Z", 96_468_992, 134_217_728], ["2015-07-07T14:59:09Z", 71_303_168, 134_217_728]] }] }] }
|
252
205
|
end
|
253
206
|
|
254
207
|
let(:expected_result) do
|
@@ -258,19 +211,13 @@ describe InfluxDB::Client do
|
|
258
211
|
"values" => [{ "time" => "2015-07-07T14:58:37Z", "temp" => 92, "value" => 0.3445 },
|
259
212
|
{ "time" => "2015-07-07T14:59:09Z", "temp" => 68, "value" => 0.8787 }] },
|
260
213
|
{ "name" => "memory", "tags" => { "region" => "pl" },
|
261
|
-
"values" => [{ "time" => "2015-07-07T15:13:04Z", "free" => 34*2**20, "total" => 128*2**20 }] },
|
214
|
+
"values" => [{ "time" => "2015-07-07T15:13:04Z", "free" => 34 * 2**20, "total" => 128 * 2**20 }] },
|
262
215
|
{ "name" => "memory", "tags" => { "region" => "us" },
|
263
|
-
"values" => [{ "time" => "2015-07-07T14:58:37Z", "free" => 92*2**20, "total" => 128*2**20 },
|
264
|
-
{ "time" => "2015-07-07T14:59:09Z", "free" => 68*2**20, "total" => 128*2**20 }] }]
|
216
|
+
"values" => [{ "time" => "2015-07-07T14:58:37Z", "free" => 92 * 2**20, "total" => 128 * 2**20 },
|
217
|
+
{ "time" => "2015-07-07T14:59:09Z", "free" => 68 * 2**20, "total" => 128 * 2**20 }] }]
|
265
218
|
end
|
266
219
|
let(:query) { 'SELECT * FROM cpu; SELECT * FROM memory' }
|
267
220
|
|
268
|
-
before do
|
269
|
-
stub_request(:get, "http://influxdb.test:9999/query").with(
|
270
|
-
query: { q: query, u: "username", p: "password", precision: 's', db: database }
|
271
|
-
).to_return(body: JSON.generate(response))
|
272
|
-
end
|
273
|
-
|
274
221
|
it "should accept a block and yield name, tags and points" do
|
275
222
|
results = []
|
276
223
|
subject.query(query) do |name, tags, points|
|
@@ -23,7 +23,7 @@ describe InfluxDB::Client do
|
|
23
23
|
let(:series) { "cpu" }
|
24
24
|
let(:data) do
|
25
25
|
{ tags: { region: 'us', host: 'server_1' },
|
26
|
-
values: { temp: 88,
|
26
|
+
values: { temp: 88, value: 54 } }
|
27
27
|
end
|
28
28
|
let(:body) do
|
29
29
|
InfluxDB::PointValue.new(data.merge(series: series)).dump
|
@@ -72,15 +72,17 @@ describe InfluxDB::Client do
|
|
72
72
|
context "when retry is -1" do
|
73
73
|
let(:args) { { retry: -1 } }
|
74
74
|
before do
|
75
|
-
stub_request(:post, "http://influxdb.test:9999/write")
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
75
|
+
stub_request(:post, "http://influxdb.test:9999/write")
|
76
|
+
.with(
|
77
|
+
query: { u: "username", p: "password", precision: 's', db: database },
|
78
|
+
headers: { "Content-Type" => "application/octet-stream" },
|
79
|
+
body: body
|
80
|
+
)
|
80
81
|
.to_raise(Timeout::Error).then
|
81
82
|
.to_raise(Timeout::Error).then
|
82
83
|
.to_raise(Timeout::Error).then
|
83
|
-
.
|
84
|
+
.to_raise(Timeout::Error).then
|
85
|
+
.to_return(status: 204)
|
84
86
|
end
|
85
87
|
|
86
88
|
it "keep trying until get the connection" do
|
@@ -3,16 +3,13 @@ require "json"
|
|
3
3
|
|
4
4
|
describe InfluxDB::Client do
|
5
5
|
let(:subject) do
|
6
|
-
described_class.new
|
7
|
-
"
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
time_precision: "s"
|
14
|
-
}.merge(args)
|
15
|
-
)
|
6
|
+
described_class.new "database", {
|
7
|
+
host: "influxdb.test",
|
8
|
+
port: 9999,
|
9
|
+
username: "username",
|
10
|
+
password: "password",
|
11
|
+
time_precision: "s"
|
12
|
+
}.merge(args)
|
16
13
|
end
|
17
14
|
|
18
15
|
let(:args) { {} }
|
@@ -23,7 +20,7 @@ describe InfluxDB::Client do
|
|
23
20
|
let(:series) { "cpu" }
|
24
21
|
let(:data) do
|
25
22
|
{ tags: { region: 'us', host: 'server_1' },
|
26
|
-
values: { temp: 88,
|
23
|
+
values: { temp: 88, value: 54 } }
|
27
24
|
end
|
28
25
|
let(:body) do
|
29
26
|
InfluxDB::PointValue.new(data.merge(series: series)).dump
|
@@ -34,11 +31,11 @@ describe InfluxDB::Client do
|
|
34
31
|
query: { u: "username", p: "password", precision: 's', db: database },
|
35
32
|
headers: { "Content-Type" => "application/octet-stream" },
|
36
33
|
body: body
|
37
|
-
)
|
34
|
+
).to_return(status: 204)
|
38
35
|
end
|
39
36
|
|
40
37
|
it "should POST to add single point" do
|
41
|
-
expect(subject.write_point(series, data)).to be_a(Net::
|
38
|
+
expect(subject.write_point(series, data)).to be_a(Net::HTTPNoContent)
|
42
39
|
end
|
43
40
|
|
44
41
|
it "should not mutate data object" do
|
@@ -52,16 +49,12 @@ describe InfluxDB::Client do
|
|
52
49
|
describe "#write_points" do
|
53
50
|
context "with multiple series" do
|
54
51
|
let(:data) do
|
55
|
-
[{
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
series: 'gpu',
|
62
|
-
tags: { region: 'uk', host: 'server_5' },
|
63
|
-
values: { value: 0.5435345 }
|
64
|
-
}]
|
52
|
+
[{ series: 'cpu',
|
53
|
+
tags: { region: 'us', host: 'server_1' },
|
54
|
+
values: { temp: 88, value: 54 } },
|
55
|
+
{ series: 'gpu',
|
56
|
+
tags: { region: 'uk', host: 'server_5' },
|
57
|
+
values: { value: 0.5435345 } }]
|
65
58
|
end
|
66
59
|
let(:body) do
|
67
60
|
data.map do |point|
|
@@ -74,24 +67,20 @@ describe InfluxDB::Client do
|
|
74
67
|
query: { u: "username", p: "password", precision: 's', db: database },
|
75
68
|
headers: { "Content-Type" => "application/octet-stream" },
|
76
69
|
body: body
|
77
|
-
)
|
70
|
+
).to_return(status: 204)
|
78
71
|
end
|
79
72
|
|
80
73
|
it "should POST multiple points" do
|
81
|
-
expect(subject.write_points(data)).to be_a(Net::
|
74
|
+
expect(subject.write_points(data)).to be_a(Net::HTTPNoContent)
|
82
75
|
end
|
83
76
|
end
|
84
77
|
|
85
78
|
context "with no tags" do
|
86
79
|
let(:data) do
|
87
|
-
[{
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
{
|
92
|
-
series: 'gpu',
|
93
|
-
values: { value: 0.5435345 }
|
94
|
-
}]
|
80
|
+
[{ series: 'cpu',
|
81
|
+
values: { temp: 88, value: 54 } },
|
82
|
+
{ series: 'gpu',
|
83
|
+
values: { value: 0.5435345 } }]
|
95
84
|
end
|
96
85
|
let(:body) do
|
97
86
|
data.map do |point|
|
@@ -104,26 +93,22 @@ describe InfluxDB::Client do
|
|
104
93
|
query: { u: "username", p: "password", precision: 's', db: database },
|
105
94
|
headers: { "Content-Type" => "application/octet-stream" },
|
106
95
|
body: body
|
107
|
-
)
|
96
|
+
).to_return(status: 204)
|
108
97
|
end
|
109
98
|
|
110
99
|
it "should POST multiple points" do
|
111
|
-
expect(subject.write_points(data)).to be_a(Net::
|
100
|
+
expect(subject.write_points(data)).to be_a(Net::HTTPNoContent)
|
112
101
|
end
|
113
102
|
end
|
114
103
|
|
115
104
|
context "with time precision set to milisceconds" do
|
116
105
|
let(:data) do
|
117
|
-
[{
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
},
|
122
|
-
{
|
123
|
-
series: 'gpu',
|
106
|
+
[{ series: 'cpu',
|
107
|
+
values: { temp: 88, value: 54 },
|
108
|
+
timestamp: (Time.now.to_f * 1000).to_i },
|
109
|
+
{ series: 'gpu',
|
124
110
|
values: { value: 0.5435345 },
|
125
|
-
timestamp: (Time.now.to_f * 1000).to_i
|
126
|
-
}]
|
111
|
+
timestamp: (Time.now.to_f * 1000).to_i }]
|
127
112
|
end
|
128
113
|
|
129
114
|
let(:body) do
|
@@ -137,23 +122,19 @@ describe InfluxDB::Client do
|
|
137
122
|
query: { u: "username", p: "password", precision: 'm', db: database },
|
138
123
|
headers: { "Content-Type" => "application/octet-stream" },
|
139
124
|
body: body
|
140
|
-
)
|
125
|
+
).to_return(status: 204)
|
141
126
|
end
|
142
127
|
it "should POST multiple points" do
|
143
|
-
expect(subject.write_points(data, 'm')).to be_a(Net::
|
128
|
+
expect(subject.write_points(data, 'm')).to be_a(Net::HTTPNoContent)
|
144
129
|
end
|
145
130
|
end
|
146
131
|
|
147
132
|
context "with retention policy" do
|
148
133
|
let(:data) do
|
149
|
-
[{
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
{
|
154
|
-
series: 'gpu',
|
155
|
-
values: { value: 0.5435345 }
|
156
|
-
}]
|
134
|
+
[{ series: 'cpu',
|
135
|
+
values: { temp: 88, value: 54 } },
|
136
|
+
{ series: 'gpu',
|
137
|
+
values: { value: 0.5435345 } }]
|
157
138
|
end
|
158
139
|
|
159
140
|
let(:body) do
|
@@ -167,10 +148,10 @@ describe InfluxDB::Client do
|
|
167
148
|
query: { u: "username", p: "password", precision: 's', db: database, rp: 'rp_1_hour' },
|
168
149
|
headers: { "Content-Type" => "application/octet-stream" },
|
169
150
|
body: body
|
170
|
-
)
|
151
|
+
).to_return(status: 204)
|
171
152
|
end
|
172
153
|
it "should POST multiple points" do
|
173
|
-
expect(subject.write_points(data, nil, 'rp_1_hour')).to be_a(Net::
|
154
|
+
expect(subject.write_points(data, nil, 'rp_1_hour')).to be_a(Net::HTTPNoContent)
|
174
155
|
end
|
175
156
|
end
|
176
157
|
end
|
@@ -31,8 +31,8 @@ describe InfluxDB::Client do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
it "POST" do
|
34
|
-
stub_request(:post, stub_url)
|
35
|
-
expect(subject.post(url, {})).to be_a(Net::
|
34
|
+
stub_request(:post, stub_url).to_return(status: 204)
|
35
|
+
expect(subject.post(url, {})).to be_a(Net::HTTPNoContent)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -66,8 +66,8 @@ describe InfluxDB::Client do
|
|
66
66
|
|
67
67
|
describe "GET #version" do
|
68
68
|
it "returns 1.1.1" do
|
69
|
-
stub_request(:get, "http://influxdb.test:9999/ping")
|
70
|
-
|
69
|
+
stub_request(:get, "http://influxdb.test:9999/ping")
|
70
|
+
.to_return(status: 204, headers: { 'x-influxdb-version' => '1.1.1' })
|
71
71
|
|
72
72
|
expect(subject.version).to eq('1.1.1')
|
73
73
|
end
|
@@ -10,8 +10,11 @@ describe InfluxDB::Logging do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
around do |example|
|
14
|
+
old_logger = InfluxDB::Logging.logger
|
15
|
+
example.call
|
16
|
+
InfluxDB::Logging.logger = old_logger
|
17
|
+
end
|
15
18
|
|
16
19
|
it "has a default logger" do
|
17
20
|
expect(InfluxDB::Logging.logger).to be_a(Logger)
|
@@ -5,14 +5,14 @@ describe InfluxDB::PointValue do
|
|
5
5
|
let(:data) do
|
6
6
|
{
|
7
7
|
series: '1= ,"\\1',
|
8
|
-
tags: {'2= ,"\\2' => '3= ,"\\3'},
|
9
|
-
values: {'4= ,"\\4' => '5= ,"\\5'}
|
8
|
+
tags: { '2= ,"\\2' => '3= ,"\\3' },
|
9
|
+
values: { '4= ,"\\4' => '5= ,"\\5' }
|
10
10
|
}
|
11
11
|
end
|
12
12
|
|
13
13
|
it 'should escape correctly' do
|
14
14
|
point = InfluxDB::PointValue.new(data)
|
15
|
-
expected = %(1=\\ \\,"\\1,2\\=\\ \\,"\\2=3\\=\\ \\,"\\3 )+
|
15
|
+
expected = %(1=\\ \\,"\\1,2\\=\\ \\,"\\2=3\\=\\ \\,"\\3 ) +
|
16
16
|
%(4\\=\\ \\,\\"\\4="5= ,\\"\\5")
|
17
17
|
expect(point.dump).to eq(expected)
|
18
18
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -8,6 +8,7 @@ end
|
|
8
8
|
RSpec.configure do |config|
|
9
9
|
config.color = ENV["TRAVIS"] != "true"
|
10
10
|
|
11
|
+
# rubocop:disable Style/ConditionalAssignment
|
11
12
|
if config.files_to_run.one? || ENV["TRAVIS"] == "true"
|
12
13
|
config.formatter = :documentation
|
13
14
|
else
|
@@ -19,8 +20,8 @@ RSpec.configure do |config|
|
|
19
20
|
logfile = File.open("tmp/spec.log", File::WRONLY | File::TRUNC | File::CREAT)
|
20
21
|
|
21
22
|
InfluxDB::Logging.logger = Logger.new(logfile).tap do |logger|
|
22
|
-
logger.formatter =
|
23
|
-
"%-5s - %s: %s\n"
|
23
|
+
logger.formatter = proc {|severity, _datetime, progname, message|
|
24
|
+
"%-5s - %s: %s\n".format severity, progname, message
|
24
25
|
}
|
25
26
|
end
|
26
27
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: influxdb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Todd Persen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-04-
|
11
|
+
date: 2016-04-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -25,33 +25,33 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
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: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '1.3'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '1.3'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -104,6 +104,7 @@ files:
|
|
104
104
|
- ".gitignore"
|
105
105
|
- ".rubocop.yml"
|
106
106
|
- ".travis.yml"
|
107
|
+
- CHANGELOG.md
|
107
108
|
- Gemfile
|
108
109
|
- LICENSE.txt
|
109
110
|
- README.md
|