influxdb 0.2.4 → 0.2.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +5 -3
- data/.travis.yml +5 -0
- data/README.md +1 -1
- data/Rakefile +0 -5
- data/influxdb.gemspec +4 -3
- data/lib/influxdb/client.rb +15 -12
- data/lib/influxdb/client/http.rb +20 -16
- data/lib/influxdb/config.rb +30 -30
- data/lib/influxdb/errors.rb +3 -4
- data/lib/influxdb/logging.rb +3 -2
- data/lib/influxdb/max_queue.rb +1 -1
- data/lib/influxdb/point_value.rb +33 -25
- data/lib/influxdb/query/continuous_query.rb +2 -1
- data/lib/influxdb/query/core.rb +18 -15
- data/lib/influxdb/query/database.rb +3 -2
- data/lib/influxdb/query/retention_policy.rb +2 -2
- data/lib/influxdb/query/user.rb +4 -3
- data/lib/influxdb/version.rb +1 -1
- data/lib/influxdb/writer/async.rb +5 -5
- data/lib/influxdb/writer/udp.rb +1 -1
- data/spec/influxdb/cases/async_client_spec.rb +9 -7
- data/spec/spec_helper.rb +29 -1
- metadata +21 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 09287aa2a00c9ec031281fbdbd081c4f599573d2
|
4
|
+
data.tar.gz: 9b454a640b3c2ff8c59b721a3bb5501910344ae5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8df6f43cd2e34213ca3c7fb0e240cd6c7e331f738193ca975a398ca6c9980477a643245c6042741889eda133158b32bdcaf63886741c6218971e579fc2aa162b
|
7
|
+
data.tar.gz: 35f5c3d665848354082570e7dec081838084f5ce3db3b0fff2900ed38fb6bab392281dbde969632e8a70e4605ab32edf7e63395cceb65accdd73c103bdf36056
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -6,15 +6,17 @@ AllCops:
|
|
6
6
|
- 'spec/**/*.rb'
|
7
7
|
Exclude:
|
8
8
|
- 'bin/**/*'
|
9
|
-
RunRailsCops: false
|
10
9
|
DisplayCopNames: true
|
11
10
|
StyleGuideCopsOnly: false
|
12
11
|
|
12
|
+
Rails:
|
13
|
+
Enabled: false
|
14
|
+
|
13
15
|
Style/Documentation:
|
14
16
|
Exclude:
|
15
17
|
- 'spec/**/*.rb'
|
16
18
|
|
17
|
-
Style/StringLiterals:
|
19
|
+
Style/StringLiterals:
|
18
20
|
Enabled: false
|
19
21
|
|
20
22
|
Style/BlockDelimiters:
|
@@ -38,4 +40,4 @@ Metrics/LineLength:
|
|
38
40
|
|
39
41
|
Metrics/MethodLength:
|
40
42
|
Exclude:
|
41
|
-
- 'spec/**/*.rb'
|
43
|
+
- 'spec/**/*.rb'
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -3,7 +3,7 @@ influxdb-ruby
|
|
3
3
|
|
4
4
|
[![Build Status](https://travis-ci.org/influxdata/influxdb-ruby.svg?branch=master)](https://travis-ci.org/influxdata/influxdb-ruby)
|
5
5
|
|
6
|
-
The official ruby client library for [InfluxDB](https://influxdata.com/time-series-platform/influxdb/). Maintained by [@toddboom](https://github.com/toddboom).
|
6
|
+
The official ruby client library for [InfluxDB](https://influxdata.com/time-series-platform/influxdb/). Maintained by [@toddboom](https://github.com/toddboom) and [@dmke](https://github.com/dmke).
|
7
7
|
|
8
8
|
> **Support for InfluxDB v0.8.x is now deprecated**. The final version of this library that will support the older InfluxDB interface is `v0.1.9`, which is available as a gem and tagged on this repository. If you're reading this message, then you should only expect support for InfluxDB v0.9.1 and higher.
|
9
9
|
|
data/Rakefile
CHANGED
data/influxdb.gemspec
CHANGED
@@ -24,8 +24,9 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_runtime_dependency "cause"
|
25
25
|
end
|
26
26
|
|
27
|
-
spec.add_development_dependency "bundler",
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
28
28
|
spec.add_development_dependency "rake"
|
29
|
-
spec.add_development_dependency "rspec",
|
30
|
-
spec.add_development_dependency "webmock",
|
29
|
+
spec.add_development_dependency "rspec", "~> 3.4.0"
|
30
|
+
spec.add_development_dependency "webmock", "~> 1.24.2"
|
31
|
+
spec.add_development_dependency "rubocop", "~> 0.39.0"
|
31
32
|
end
|
data/lib/influxdb/client.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
require 'json'
|
2
|
-
require 'cause'
|
2
|
+
require 'cause' unless Exception.instance_methods.include?(:cause)
|
3
3
|
require 'thread'
|
4
4
|
|
5
5
|
module InfluxDB
|
6
|
-
# rubocop:disable Metrics/MethodLength
|
7
|
-
# rubocop:disable Metrics/AbcSize
|
8
|
-
|
9
6
|
# InfluxDB client class
|
10
7
|
class Client
|
11
8
|
attr_reader :config, :writer
|
@@ -56,24 +53,30 @@ module InfluxDB
|
|
56
53
|
opts[:database] = args.first if args.first.is_a? String
|
57
54
|
@config = InfluxDB::Config.new(opts)
|
58
55
|
@stopped = false
|
59
|
-
|
60
|
-
@writer = self
|
61
|
-
|
62
|
-
if config.async?
|
63
|
-
@writer = InfluxDB::Writer::Async.new(self, config.async)
|
64
|
-
elsif config.udp?
|
65
|
-
@writer = InfluxDB::Writer::UDP.new(self, config.udp)
|
66
|
-
end
|
56
|
+
@writer = find_writer
|
67
57
|
|
68
58
|
at_exit { stop! } if config.retry > 0
|
69
59
|
end
|
70
60
|
|
71
61
|
def stop!
|
62
|
+
writer.worker.stop! if config.async?
|
72
63
|
@stopped = true
|
73
64
|
end
|
74
65
|
|
75
66
|
def stopped?
|
76
67
|
@stopped
|
77
68
|
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def find_writer
|
73
|
+
if config.async?
|
74
|
+
InfluxDB::Writer::Async.new(self, config.async)
|
75
|
+
elsif config.udp?
|
76
|
+
InfluxDB::Writer::UDP.new(self, config.udp)
|
77
|
+
else
|
78
|
+
self
|
79
|
+
end
|
80
|
+
end
|
78
81
|
end
|
79
82
|
end
|
data/lib/influxdb/client/http.rb
CHANGED
@@ -10,10 +10,11 @@ module InfluxDB
|
|
10
10
|
def get(url, options = {})
|
11
11
|
connect_with_retry do |http|
|
12
12
|
response = do_request http, Net::HTTP::Get.new(url)
|
13
|
-
|
13
|
+
case response
|
14
|
+
when Net::HTTPSuccess
|
14
15
|
handle_successful_response(response, options)
|
15
|
-
|
16
|
-
|
16
|
+
when Net::HTTPUnauthorized
|
17
|
+
raise InfluxDB::AuthenticationError, response.body
|
17
18
|
else
|
18
19
|
resolve_error(response.body)
|
19
20
|
end
|
@@ -24,10 +25,12 @@ module InfluxDB
|
|
24
25
|
headers = { "Content-Type" => "application/octet-stream" }
|
25
26
|
connect_with_retry do |http|
|
26
27
|
response = do_request http, Net::HTTP::Post.new(url, headers), data
|
27
|
-
|
28
|
+
|
29
|
+
case response
|
30
|
+
when Net::HTTPSuccess
|
28
31
|
return response
|
29
|
-
|
30
|
-
|
32
|
+
when Net::HTTPUnauthorized
|
33
|
+
raise InfluxDB::AuthenticationError, response.body
|
31
34
|
else
|
32
35
|
resolve_error(response.body)
|
33
36
|
end
|
@@ -36,7 +39,7 @@ module InfluxDB
|
|
36
39
|
|
37
40
|
private
|
38
41
|
|
39
|
-
def connect_with_retry
|
42
|
+
def connect_with_retry
|
40
43
|
host = config.next_host
|
41
44
|
delay = config.initial_delay
|
42
45
|
retry_count = 0
|
@@ -47,8 +50,7 @@ module InfluxDB
|
|
47
50
|
http.read_timeout = config.read_timeout
|
48
51
|
|
49
52
|
http = setup_ssl(http)
|
50
|
-
|
51
|
-
block.call(http)
|
53
|
+
yield http
|
52
54
|
|
53
55
|
rescue Timeout::Error, *InfluxDB::NET_HTTP_EXCEPTIONS => e
|
54
56
|
retry_count += 1
|
@@ -77,21 +79,23 @@ module InfluxDB
|
|
77
79
|
|
78
80
|
def resolve_error(response)
|
79
81
|
if response =~ /Couldn\'t find series/
|
80
|
-
|
81
|
-
else
|
82
|
-
fail InfluxDB::Error, response
|
82
|
+
raise InfluxDB::SeriesNotFound, response
|
83
83
|
end
|
84
|
+
raise InfluxDB::Error, response
|
84
85
|
end
|
85
86
|
|
86
87
|
def handle_successful_response(response, options)
|
87
|
-
parsed_response = JSON.parse(response.body)
|
88
|
-
errors = errors_from_response(parsed_response)
|
89
|
-
|
88
|
+
parsed_response = JSON.parse(response.body) if response.body
|
89
|
+
errors = errors_from_response(parsed_response)
|
90
|
+
|
91
|
+
raise InfluxDB::QueryError, errors if errors
|
90
92
|
options.fetch(:parse, false) ? parsed_response : response
|
91
93
|
end
|
92
94
|
|
93
95
|
def errors_from_response(parsed_resp)
|
94
|
-
parsed_resp.is_a?(Hash)
|
96
|
+
return unless parsed_resp.is_a?(Hash)
|
97
|
+
parsed_resp
|
98
|
+
.fetch('results', [])
|
95
99
|
.fetch(0, {})
|
96
100
|
.fetch('error', nil)
|
97
101
|
end
|
data/lib/influxdb/config.rb
CHANGED
@@ -3,7 +3,7 @@ require 'thread'
|
|
3
3
|
module InfluxDB
|
4
4
|
# InfluxDB client configuration
|
5
5
|
class Config
|
6
|
-
AUTH_METHODS =
|
6
|
+
AUTH_METHODS = ["params".freeze, "basic_auth".freeze].freeze
|
7
7
|
|
8
8
|
attr_accessor :port,
|
9
9
|
:username,
|
@@ -27,41 +27,41 @@ module InfluxDB
|
|
27
27
|
|
28
28
|
# rubocop:disable all
|
29
29
|
def initialize(opts = {})
|
30
|
-
@database
|
31
|
-
@
|
30
|
+
@database = opts[:database]
|
31
|
+
@port = opts.fetch(:port, 8086)
|
32
|
+
@prefix = opts.fetch(:prefix, "".freeze)
|
33
|
+
@username = opts.fetch(:username, "root".freeze)
|
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)
|
32
49
|
|
33
50
|
# load the hosts into a Queue for thread safety
|
51
|
+
@hosts_queue = Queue.new
|
34
52
|
Array(opts[:hosts] || opts[:host] || ["localhost"]).each do |host|
|
35
53
|
@hosts_queue.push(host)
|
36
54
|
end
|
37
55
|
|
38
|
-
|
39
|
-
@
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
@initial_delay = opts.fetch(:initial_delay, 0.01)
|
48
|
-
@max_delay = opts.fetch(:max_delay, 30)
|
49
|
-
@open_timeout = opts.fetch(:write_timeout, 5)
|
50
|
-
@read_timeout = opts.fetch(:read_timeout, 300)
|
51
|
-
@async = opts.fetch(:async, false)
|
52
|
-
@udp = opts.fetch(:udp, false)
|
53
|
-
@retry = opts.fetch(:retry, nil)
|
54
|
-
@denormalize = opts.fetch(:denormalize, true)
|
55
|
-
@epoch = opts.fetch(:epoch, false)
|
56
|
-
@retry =
|
57
|
-
case @retry
|
58
|
-
when Integer
|
59
|
-
@retry
|
60
|
-
when true, nil
|
61
|
-
-1
|
62
|
-
when false
|
63
|
-
0
|
64
|
-
end
|
56
|
+
# normalize retry option
|
57
|
+
case @retry
|
58
|
+
when Integer
|
59
|
+
# ok
|
60
|
+
when true, nil
|
61
|
+
@retry = -1
|
62
|
+
when false
|
63
|
+
@retry = 0
|
64
|
+
end
|
65
65
|
end
|
66
66
|
|
67
67
|
def udp?
|
data/lib/influxdb/errors.rb
CHANGED
@@ -33,8 +33,7 @@ module InfluxDB # :nodoc:
|
|
33
33
|
Net::HTTPHeaderSyntaxError,
|
34
34
|
Net::ProtocolError,
|
35
35
|
SocketError,
|
36
|
-
Zlib::GzipFile::Error
|
37
|
-
|
38
|
-
|
39
|
-
NET_HTTP_EXCEPTIONS << OpenSSL::SSL::SSLError if defined?(OpenSSL)
|
36
|
+
Zlib::GzipFile::Error,
|
37
|
+
(OpenSSL::SSL::SSLError if defined?(OpenSSL))
|
38
|
+
].compact.freeze
|
40
39
|
end
|
data/lib/influxdb/logging.rb
CHANGED
@@ -2,7 +2,7 @@ require 'logger'
|
|
2
2
|
|
3
3
|
module InfluxDB
|
4
4
|
module Logging # :nodoc:
|
5
|
-
PREFIX = "
|
5
|
+
PREFIX = "InfluxDB".freeze
|
6
6
|
|
7
7
|
class << self
|
8
8
|
attr_writer :logger
|
@@ -16,7 +16,8 @@ module InfluxDB
|
|
16
16
|
private
|
17
17
|
|
18
18
|
def log(level, message)
|
19
|
-
|
19
|
+
return unless InfluxDB::Logging.logger
|
20
|
+
InfluxDB::Logging.logger.send(level.to_sym, PREFIX) { message }
|
20
21
|
end
|
21
22
|
end
|
22
23
|
end
|
data/lib/influxdb/max_queue.rb
CHANGED
data/lib/influxdb/point_value.rb
CHANGED
@@ -4,29 +4,15 @@ module InfluxDB
|
|
4
4
|
attr_reader :series, :values, :tags, :timestamp
|
5
5
|
|
6
6
|
def initialize(data)
|
7
|
-
@series = escape
|
8
|
-
|
9
|
-
@
|
10
|
-
key = escape(k.to_s, :field_key)
|
11
|
-
val = if v.is_a?(String)
|
12
|
-
'"' + escape(v, :field_value) + '"'
|
13
|
-
else
|
14
|
-
v.to_s
|
15
|
-
end
|
16
|
-
"#{key}=#{val}"
|
17
|
-
}.join(',') if data[:values]
|
18
|
-
|
19
|
-
@tags = data[:tags].map{|k, v|
|
20
|
-
key = escape(k.to_s, :tag_key)
|
21
|
-
val = escape(v.to_s, :tag_value)
|
22
|
-
"#{key}=#{val}"
|
23
|
-
}.join(',') if data[:tags]
|
7
|
+
@series = escape data[:series], :measurement
|
8
|
+
@values = escape_values data[:values]
|
9
|
+
@tags = escape_tags data[:tags]
|
24
10
|
|
25
11
|
@timestamp = data[:timestamp]
|
26
12
|
end
|
27
13
|
|
28
14
|
def dump
|
29
|
-
dump =
|
15
|
+
dump = @series.dup
|
30
16
|
dump << ",#{@tags}" if @tags
|
31
17
|
dump << " #{@values}"
|
32
18
|
dump << " #{@timestamp}" if @timestamp
|
@@ -36,16 +22,16 @@ module InfluxDB
|
|
36
22
|
private
|
37
23
|
|
38
24
|
ESCAPES = {
|
39
|
-
measurement:
|
40
|
-
tag_key:
|
41
|
-
tag_value:
|
42
|
-
field_key:
|
43
|
-
field_value:
|
44
|
-
}
|
25
|
+
measurement: [' '.freeze, ','.freeze],
|
26
|
+
tag_key: ['='.freeze, ' '.freeze, ','.freeze],
|
27
|
+
tag_value: ['='.freeze, ' '.freeze, ','.freeze],
|
28
|
+
field_key: ['='.freeze, ' '.freeze, ','.freeze, '"'.freeze],
|
29
|
+
field_value: ['"'.freeze]
|
30
|
+
}.freeze
|
45
31
|
|
46
32
|
def escape(s, type)
|
47
33
|
ESCAPES[type].each do |ch|
|
48
|
-
s = s.gsub(ch){ "\\#{ch}" }
|
34
|
+
s = s.gsub(ch) { "\\#{ch}" }
|
49
35
|
end
|
50
36
|
s
|
51
37
|
end
|
@@ -58,5 +44,27 @@ module InfluxDB
|
|
58
44
|
"#{key}=#{val}"
|
59
45
|
end
|
60
46
|
end
|
47
|
+
|
48
|
+
def escape_values(values)
|
49
|
+
return if values.nil?
|
50
|
+
values.map do |k, v|
|
51
|
+
key = escape(k.to_s, :field_key)
|
52
|
+
val = if v.is_a?(String)
|
53
|
+
'"' + escape(v, :field_value) + '"'
|
54
|
+
else
|
55
|
+
v.to_s
|
56
|
+
end
|
57
|
+
"#{key}=#{val}"
|
58
|
+
end.join(",")
|
59
|
+
end
|
60
|
+
|
61
|
+
def escape_tags(tags)
|
62
|
+
return if tags.nil?
|
63
|
+
tags.map do |k, v|
|
64
|
+
key = escape(k.to_s, :tag_key)
|
65
|
+
val = escape(v.to_s, :tag_value)
|
66
|
+
"#{key}=#{val}"
|
67
|
+
end.join(",")
|
68
|
+
end
|
61
69
|
end
|
62
70
|
end
|
@@ -3,7 +3,8 @@ module InfluxDB
|
|
3
3
|
module ContinuousQuery # :nodoc:
|
4
4
|
def list_continuous_queries(database)
|
5
5
|
resp = execute("SHOW CONTINUOUS QUERIES", parse: true)
|
6
|
-
fetch_series(resp)
|
6
|
+
fetch_series(resp)
|
7
|
+
.select { |v| v['name'] == database }
|
7
8
|
.fetch(0, {})
|
8
9
|
.fetch('values', [])
|
9
10
|
.map { |v| { 'name' => v.first, 'query' => v.last } }
|
data/lib/influxdb/query/core.rb
CHANGED
@@ -3,11 +3,11 @@ module InfluxDB
|
|
3
3
|
# rubocop:disable Metrics/AbcSize
|
4
4
|
module Core
|
5
5
|
def ping
|
6
|
-
get "/ping"
|
6
|
+
get "/ping".freeze
|
7
7
|
end
|
8
8
|
|
9
9
|
def version
|
10
|
-
resp = get "/ping"
|
10
|
+
resp = get "/ping".freeze
|
11
11
|
resp.header['x-influxdb-version']
|
12
12
|
end
|
13
13
|
|
@@ -15,12 +15,13 @@ module InfluxDB
|
|
15
15
|
def query(query, opts = {})
|
16
16
|
denormalize = opts.fetch(:denormalize, config.denormalize)
|
17
17
|
params = query_params(query, opts)
|
18
|
-
url = full_url("/query", params)
|
18
|
+
url = full_url("/query".freeze, params)
|
19
19
|
series = fetch_series(get(url, parse: true))
|
20
20
|
|
21
21
|
if block_given?
|
22
22
|
series.each do |s|
|
23
|
-
|
23
|
+
values = denormalize ? denormalize_series(s) : raw_values(s)
|
24
|
+
yield s['name'.freeze], s['tags'.freeze], values
|
24
25
|
end
|
25
26
|
else
|
26
27
|
denormalize ? denormalized_series_list(series) : series
|
@@ -68,30 +69,30 @@ module InfluxDB
|
|
68
69
|
epoch = opts.fetch(:epoch, config.epoch)
|
69
70
|
|
70
71
|
params = { q: query, db: config.database, precision: precision }
|
71
|
-
params
|
72
|
+
params[:epoch] = epoch if epoch
|
72
73
|
params
|
73
74
|
end
|
74
75
|
|
75
76
|
def denormalized_series_list(series)
|
76
77
|
series.map do |s|
|
77
78
|
{
|
78
|
-
|
79
|
-
|
80
|
-
|
79
|
+
"name" => s["name".freeze],
|
80
|
+
"tags" => s["tags".freeze],
|
81
|
+
"values" => denormalize_series(s)
|
81
82
|
}
|
82
83
|
end
|
83
84
|
end
|
84
85
|
|
85
86
|
def fetch_series(response)
|
86
|
-
response.fetch('results', []).flat_map
|
87
|
-
result.fetch('series', [])
|
88
|
-
|
87
|
+
response.fetch('results'.freeze, []).flat_map do |result|
|
88
|
+
result.fetch('series'.freeze, [])
|
89
|
+
end
|
89
90
|
end
|
90
91
|
|
91
92
|
def generate_payload(data)
|
92
93
|
data.map do |point|
|
93
94
|
InfluxDB::PointValue.new(point).dump
|
94
|
-
end.join("\n")
|
95
|
+
end.join("\n".freeze)
|
95
96
|
end
|
96
97
|
|
97
98
|
def execute(query, options = {})
|
@@ -100,8 +101,8 @@ module InfluxDB
|
|
100
101
|
end
|
101
102
|
|
102
103
|
def denormalize_series(series)
|
103
|
-
Array(series["values"]).map do |values|
|
104
|
-
Hash[series["columns"].zip(values)]
|
104
|
+
Array(series["values".freeze]).map do |values|
|
105
|
+
Hash[series["columns".freeze].zip(values)]
|
105
106
|
end
|
106
107
|
end
|
107
108
|
|
@@ -115,7 +116,9 @@ module InfluxDB
|
|
115
116
|
params[:p] = config.password
|
116
117
|
end
|
117
118
|
|
118
|
-
query = params.map
|
119
|
+
query = params.map do |k, v|
|
120
|
+
[CGI.escape(k.to_s), "=".freeze, CGI.escape(v.to_s)].join
|
121
|
+
end.join("&".freeze)
|
119
122
|
|
120
123
|
URI::Generic.build(path: File.join(config.prefix, path), query: query).to_s
|
121
124
|
end
|
@@ -10,8 +10,9 @@ module InfluxDB
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def list_databases
|
13
|
-
resp = execute("SHOW DATABASES", parse: true)
|
14
|
-
fetch_series(resp)
|
13
|
+
resp = execute("SHOW DATABASES".freeze, parse: true)
|
14
|
+
fetch_series(resp)
|
15
|
+
.fetch(0, {})
|
15
16
|
.fetch('values', [])
|
16
17
|
.flatten
|
17
18
|
.map { |v| { 'name' => v } }
|
@@ -11,9 +11,9 @@ module InfluxDB
|
|
11
11
|
resp = execute("SHOW RETENTION POLICIES ON \"#{database}\"", parse: true)
|
12
12
|
data = fetch_series(resp).fetch(0)
|
13
13
|
|
14
|
-
data['values'].map do |policy|
|
14
|
+
data['values'.freeze].map do |policy|
|
15
15
|
policy.each.with_index.inject({}) do |hash, (value, index)|
|
16
|
-
hash.tap { |h| h[data['columns'][index]] = value }
|
16
|
+
hash.tap { |h| h[data['columns'.freeze][index]] = value }
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
data/lib/influxdb/query/user.rb
CHANGED
@@ -40,9 +40,10 @@ module InfluxDB
|
|
40
40
|
|
41
41
|
# => [{"username"=>"usr", "admin"=>true}, {"username"=>"justauser", "admin"=>false}]
|
42
42
|
def list_users
|
43
|
-
resp = execute("SHOW USERS", parse: true)
|
44
|
-
fetch_series(resp)
|
45
|
-
.fetch(
|
43
|
+
resp = execute("SHOW USERS".freeze, parse: true)
|
44
|
+
fetch_series(resp)
|
45
|
+
.fetch(0, {})
|
46
|
+
.fetch('values'.freeze, [])
|
46
47
|
.map { |v| { 'username' => v.first, 'admin' => v.last } }
|
47
48
|
end
|
48
49
|
end
|
data/lib/influxdb/version.rb
CHANGED
@@ -44,11 +44,6 @@ module InfluxDB
|
|
44
44
|
@queue = InfluxDB::MaxQueue.new config.fetch(:max_queue, MAX_QUEUE_SIZE)
|
45
45
|
|
46
46
|
spawn_threads!
|
47
|
-
|
48
|
-
at_exit do
|
49
|
-
log :debug, "Thread exiting, flushing queue."
|
50
|
-
check_background_queue until queue.empty?
|
51
|
-
end
|
52
47
|
end
|
53
48
|
|
54
49
|
def push(payload)
|
@@ -109,6 +104,11 @@ module InfluxDB
|
|
109
104
|
break if queue.length > MAX_POST_POINTS
|
110
105
|
end
|
111
106
|
end
|
107
|
+
|
108
|
+
def stop!
|
109
|
+
log :debug, "Thread exiting, flushing queue."
|
110
|
+
check_background_queue until queue.empty?
|
111
|
+
end
|
112
112
|
end
|
113
113
|
end
|
114
114
|
end
|
data/lib/influxdb/writer/udp.rb
CHANGED
@@ -7,7 +7,7 @@ module InfluxDB
|
|
7
7
|
def initialize(client, config)
|
8
8
|
@client = client
|
9
9
|
config = config.is_a?(Hash) ? config : {}
|
10
|
-
@host = config.fetch(:host,
|
10
|
+
@host = config.fetch(:host, "localhost".freeze)
|
11
11
|
@port = config.fetch(:port, 4444)
|
12
12
|
self.socket = UDPSocket.new
|
13
13
|
socket.connect(host, port)
|
@@ -9,8 +9,6 @@ describe InfluxDB::Client do
|
|
9
9
|
specify { expect(subject.writer).to be_a(InfluxDB::Writer::Async) }
|
10
10
|
|
11
11
|
describe "#write_point" do
|
12
|
-
let(:payload) { "responses,region=eu value=5" }
|
13
|
-
|
14
12
|
it "sends writes to client" do
|
15
13
|
post_request = stub_request(:post, stub_url)
|
16
14
|
|
@@ -18,13 +16,17 @@ describe InfluxDB::Client do
|
|
18
16
|
subject.write_point('a', {})
|
19
17
|
end
|
20
18
|
|
21
|
-
|
19
|
+
# The timout code is fragile, and heavily dependent on system load
|
20
|
+
# (and scheduler decisions). On the CI, the system is less
|
21
|
+
# responsive and needs a bit more time.
|
22
|
+
timeout_stretch = ENV["TRAVIS"] == "true" ? 10 : 3
|
23
|
+
|
24
|
+
Timeout.timeout(timeout_stretch * worker_klass::SLEEP_INTERVAL) do
|
22
25
|
subject.stop!
|
23
|
-
|
24
|
-
subject.writer.worker.threads.each(&:join)
|
26
|
+
end
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
+
subject.writer.worker.threads.each do |t|
|
29
|
+
expect(t.stop?).to be true
|
28
30
|
end
|
29
31
|
|
30
32
|
# exact times can be 2 or 3 (because we have 3 worker threads),
|
data/spec/spec_helper.rb
CHANGED
@@ -5,4 +5,32 @@ begin
|
|
5
5
|
rescue LoadError
|
6
6
|
end
|
7
7
|
|
8
|
-
|
8
|
+
RSpec.configure do |config|
|
9
|
+
config.color = ENV["TRAVIS"] != "true"
|
10
|
+
|
11
|
+
if config.files_to_run.one? || ENV["TRAVIS"] == "true"
|
12
|
+
config.formatter = :documentation
|
13
|
+
else
|
14
|
+
config.formatter = :progress
|
15
|
+
end
|
16
|
+
|
17
|
+
if ENV["LOG"]
|
18
|
+
Dir.mkdir("tmp") unless Dir.exist?("tmp")
|
19
|
+
logfile = File.open("tmp/spec.log", File::WRONLY | File::TRUNC | File::CREAT)
|
20
|
+
|
21
|
+
InfluxDB::Logging.logger = Logger.new(logfile).tap do |logger|
|
22
|
+
logger.formatter = ->(severity, _datetime, progname, message) {
|
23
|
+
"%-5s - %s: %s\n" % [ severity, progname, message ]
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
config.before(:each) do
|
28
|
+
InfluxDB::Logging.logger.info("RSpec") { self.class }
|
29
|
+
InfluxDB::Logging.logger.info("RSpec") { @__inspect_output }
|
30
|
+
end
|
31
|
+
|
32
|
+
config.after(:each) do
|
33
|
+
logfile.write "\n"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
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.2.
|
4
|
+
version: 0.2.5
|
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-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -58,28 +58,42 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 3.
|
61
|
+
version: 3.4.0
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 3.
|
68
|
+
version: 3.4.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: webmock
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.
|
75
|
+
version: 1.24.2
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.
|
82
|
+
version: 1.24.2
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rubocop
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 0.39.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.39.0
|
83
97
|
description: This is the official Ruby library for InfluxDB.
|
84
98
|
email:
|
85
99
|
- influxdb@googlegroups.com
|
@@ -153,7 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
167
|
version: '0'
|
154
168
|
requirements: []
|
155
169
|
rubyforge_project:
|
156
|
-
rubygems_version: 2.
|
170
|
+
rubygems_version: 2.5.1
|
157
171
|
signing_key:
|
158
172
|
specification_version: 4
|
159
173
|
summary: Ruby library for InfluxDB.
|