influxdb 0.1.8 → 0.1.9
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/.gitignore +2 -0
- data/.travis.yml +2 -2
- data/README.md +31 -0
- data/influxdb.gemspec +2 -1
- data/lib/influxdb.rb +1 -0
- data/lib/influxdb/client.rb +190 -23
- data/lib/influxdb/logger.rb +3 -2
- data/lib/influxdb/udp_client.rb +16 -0
- data/lib/influxdb/version.rb +1 -1
- data/lib/influxdb/worker.rb +10 -6
- data/spec/influxdb/client_spec.rb +293 -11
- data/spec/influxdb/logger_spec.rb +16 -0
- data/spec/influxdb/udp_client_spec.rb +33 -0
- data/spec/spec_helper.rb +11 -2
- metadata +24 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79714dbe624e4485dfefc69e334b3234daf4c5c6
|
4
|
+
data.tar.gz: 8a36045de479f5406d65b332c191edb3cfe327bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f29ae07c03cd04314bfc82af8510334c7a6e829a33ef1eaa1a7d8a5be802bf53883bab852075d64b3fd142b319e7ea9ecfb5a4f447671bd5629af0be4087dda3
|
7
|
+
data.tar.gz: 478b0d0002b481bed502b6682f795bad4a61f69eaa4c459dacc9f8050023ba1ed78d15bd27187914d0c6b6d2ea0b6e6989945f5b399f97c0ffefb0596e2d9514
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
influxdb-ruby
|
2
2
|
=============
|
3
3
|
|
4
|
+
# This library is not updated for InfluxDB 0.9.0. There are breaking changes to the API, use at your own risk.
|
5
|
+
|
6
|
+
We encourage you to submit a pull request if you have a contribution.
|
7
|
+
|
8
|
+
----------
|
9
|
+
|
10
|
+
|
11
|
+
|
4
12
|
[](https://travis-ci.org/influxdb/influxdb-ruby)
|
5
13
|
|
6
14
|
Ruby client library for [InfluxDB](http://influxdb.org/).
|
@@ -23,6 +31,8 @@ Connecting to a single host:
|
|
23
31
|
require 'influxdb'
|
24
32
|
|
25
33
|
influxdb = InfluxDB::Client.new host: "influxdb.domain.com"
|
34
|
+
# or
|
35
|
+
influxdb = InfluxDB::Client.new # no host given defaults connecting to localhost
|
26
36
|
```
|
27
37
|
|
28
38
|
Connecting to multiple hosts (with built-in load balancing and failover):
|
@@ -40,6 +50,8 @@ require 'influxdb'
|
|
40
50
|
|
41
51
|
influxdb = InfluxDB::Client.new
|
42
52
|
|
53
|
+
database = 'site_development'
|
54
|
+
|
43
55
|
influxdb.create_database(database)
|
44
56
|
```
|
45
57
|
|
@@ -137,6 +149,25 @@ data = {
|
|
137
149
|
influxdb.write_point(name, data, false, time_precision)
|
138
150
|
```
|
139
151
|
|
152
|
+
Write data via UDP:
|
153
|
+
|
154
|
+
``` ruby
|
155
|
+
require 'influxdb'
|
156
|
+
host = '127.0.0.1'
|
157
|
+
port = 4444
|
158
|
+
|
159
|
+
influxdb = InfluxDB::Client.new :udp => { :host => host, :port => port }
|
160
|
+
|
161
|
+
name = 'hitchhiker'
|
162
|
+
|
163
|
+
data = {
|
164
|
+
:answer => 42,
|
165
|
+
:question => "life the universe and everything?"
|
166
|
+
}
|
167
|
+
|
168
|
+
influxdb.write_point(name, data)
|
169
|
+
```
|
170
|
+
|
140
171
|
|
141
172
|
List cluster admins:
|
142
173
|
|
data/influxdb.gemspec
CHANGED
@@ -19,9 +19,10 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_runtime_dependency "json"
|
22
|
+
spec.add_runtime_dependency "cause"
|
22
23
|
|
23
24
|
spec.add_development_dependency "bundler", "~> 1.3"
|
24
25
|
spec.add_development_dependency "rake"
|
25
|
-
spec.add_development_dependency "rspec"
|
26
|
+
spec.add_development_dependency "rspec", "~> 3.0.0"
|
26
27
|
spec.add_development_dependency "webmock"
|
27
28
|
end
|
data/lib/influxdb.rb
CHANGED
data/lib/influxdb/client.rb
CHANGED
@@ -3,6 +3,7 @@ require 'cgi'
|
|
3
3
|
require 'net/http'
|
4
4
|
require 'net/https'
|
5
5
|
require 'json'
|
6
|
+
require 'cause'
|
6
7
|
|
7
8
|
module InfluxDB
|
8
9
|
class Client
|
@@ -12,10 +13,13 @@ module InfluxDB
|
|
12
13
|
:password,
|
13
14
|
:database,
|
14
15
|
:time_precision,
|
16
|
+
:auth_method,
|
15
17
|
:use_ssl,
|
18
|
+
:verify_ssl,
|
19
|
+
:ssl_ca_cert,
|
16
20
|
:stopped
|
17
21
|
|
18
|
-
attr_accessor :queue, :worker
|
22
|
+
attr_accessor :queue, :worker, :udp_client
|
19
23
|
|
20
24
|
include InfluxDB::Logging
|
21
25
|
|
@@ -33,21 +37,30 @@ module InfluxDB
|
|
33
37
|
#
|
34
38
|
# Influxdb::Client.new 'db', :username => 'username' # override username, use 'db' as the db name
|
35
39
|
#
|
40
|
+
# Influxdb::Client.new 'db', :path => '/prefix' # use the specified path prefix when building the
|
41
|
+
# # url e.g.: /prefix/db/dbname...
|
42
|
+
#
|
36
43
|
# === Valid options in hash
|
37
44
|
#
|
38
45
|
# +:host+:: the hostname to connect to
|
39
46
|
# +:port+:: the port to connect to
|
40
47
|
# +:username+:: the username to use when executing commands
|
41
48
|
# +:password+:: the password associated with the username
|
42
|
-
# +:use_ssl+:: use ssl to connect
|
49
|
+
# +:use_ssl+:: use ssl to connect?
|
50
|
+
# +:verify_ssl+:: verify ssl server certificate?
|
51
|
+
# +:ssl_ca_cert+:: ssl CA certificate, chainfile or CA path. The system CA path is automatically included.
|
43
52
|
def initialize *args
|
44
53
|
@database = args.first if args.first.is_a? String
|
45
54
|
opts = args.last.is_a?(Hash) ? args.last : {}
|
46
55
|
@hosts = Array(opts[:hosts] || opts[:host] || ["localhost"])
|
47
56
|
@port = opts[:port] || 8086
|
57
|
+
@path = opts[:path] || ""
|
48
58
|
@username = opts[:username] || "root"
|
49
59
|
@password = opts[:password] || "root"
|
60
|
+
@auth_method = %w{params basic_auth}.include?(opts[:auth_method]) ? opts[:auth_method] : "params"
|
50
61
|
@use_ssl = opts[:use_ssl] || false
|
62
|
+
@verify_ssl = opts.fetch(:verify_ssl, true)
|
63
|
+
@ssl_ca_cert = opts[:ssl_ca_cert] || false
|
51
64
|
@time_precision = opts[:time_precision] || "s"
|
52
65
|
@initial_delay = opts[:initial_delay] || 0.01
|
53
66
|
@max_delay = opts[:max_delay] || 30
|
@@ -65,14 +78,18 @@ module InfluxDB
|
|
65
78
|
end
|
66
79
|
|
67
80
|
@worker = InfluxDB::Worker.new(self) if @async
|
81
|
+
self.udp_client = opts[:udp] ? InfluxDB::UDPClient.new(opts[:udp][:host], opts[:udp][:port]) : nil
|
82
|
+
|
83
|
+
at_exit { stop! } if @retry > 0
|
84
|
+
end
|
68
85
|
|
69
|
-
|
86
|
+
def ping
|
87
|
+
get "/ping"
|
70
88
|
end
|
71
89
|
|
72
90
|
## allow options, e.g. influxdb.create_database('foo', replicationFactor: 3)
|
73
91
|
def create_database(name, options = {})
|
74
|
-
url = full_url("/
|
75
|
-
options[:name] = name
|
92
|
+
url = full_url("/cluster/database_configs/#{name}")
|
76
93
|
data = JSON.generate(options)
|
77
94
|
post(url, data)
|
78
95
|
end
|
@@ -85,6 +102,10 @@ module InfluxDB
|
|
85
102
|
get full_url("/db")
|
86
103
|
end
|
87
104
|
|
105
|
+
def authenticate_cluster_admin
|
106
|
+
get(full_url('/cluster_admins/authenticate'), true)
|
107
|
+
end
|
108
|
+
|
88
109
|
def create_cluster_admin(username, password)
|
89
110
|
url = full_url("/cluster_admins")
|
90
111
|
data = JSON.generate({:name => username, :password => password})
|
@@ -105,9 +126,13 @@ module InfluxDB
|
|
105
126
|
get full_url("/cluster_admins")
|
106
127
|
end
|
107
128
|
|
108
|
-
def
|
129
|
+
def authenticate_database_user(database)
|
130
|
+
get(full_url("/db/#{database}/authenticate"), true)
|
131
|
+
end
|
132
|
+
|
133
|
+
def create_database_user(database, username, password, options={})
|
109
134
|
url = full_url("/db/#{database}/users")
|
110
|
-
data = JSON.generate({:name => username, :password => password})
|
135
|
+
data = JSON.generate({:name => username, :password => password}.merge(options))
|
111
136
|
post(url, data)
|
112
137
|
end
|
113
138
|
|
@@ -133,6 +158,7 @@ module InfluxDB
|
|
133
158
|
update_database_user(database, username, :admin => admin)
|
134
159
|
end
|
135
160
|
|
161
|
+
# NOTE: Only cluster admin can call this
|
136
162
|
def continuous_queries(database)
|
137
163
|
get full_url("/db/#{database}/continuous_queries")
|
138
164
|
end
|
@@ -141,12 +167,126 @@ module InfluxDB
|
|
141
167
|
get full_url("/cluster/shards")
|
142
168
|
end
|
143
169
|
|
144
|
-
def delete_shard(shard_id, server_ids
|
170
|
+
def delete_shard(shard_id, server_ids)
|
145
171
|
data = JSON.generate({"serverIds" => server_ids})
|
146
|
-
delete full_url("/cluster/shards/#{shard_id}"
|
172
|
+
delete full_url("/cluster/shards/#{shard_id}"), data
|
173
|
+
end
|
174
|
+
|
175
|
+
# EXAMPLE:
|
176
|
+
#
|
177
|
+
# db.create_continuous_query(
|
178
|
+
# "select mean(sys) as sys, mean(usr) as usr from cpu group by time(15m)",
|
179
|
+
# "cpu.15m",
|
180
|
+
# )
|
181
|
+
#
|
182
|
+
# NOTE: Only cluster admin can call this
|
183
|
+
def create_continuous_query(query, name)
|
184
|
+
query("#{query} into #{name}")
|
185
|
+
end
|
186
|
+
|
187
|
+
# NOTE: Only cluster admin can call this
|
188
|
+
def get_continuous_query_list
|
189
|
+
query("list continuous queries")
|
190
|
+
end
|
191
|
+
|
192
|
+
# NOTE: Only cluster admin can call this
|
193
|
+
def delete_continuous_query(id)
|
194
|
+
query("drop continuous query #{id}")
|
195
|
+
end
|
196
|
+
|
197
|
+
def get_shard_space_list
|
198
|
+
get full_url("/cluster/shard_spaces")
|
199
|
+
end
|
200
|
+
|
201
|
+
def get_shard_space(database_name, shard_space_name)
|
202
|
+
get_shard_space_list.find do |shard_space|
|
203
|
+
shard_space["database"] == database_name &&
|
204
|
+
shard_space["name"] == shard_space_name
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
def create_shard_space(database_name, options = {})
|
209
|
+
url = full_url("/cluster/shard_spaces/#{database_name}")
|
210
|
+
data = JSON.generate(default_shard_space_options.merge(options))
|
211
|
+
|
212
|
+
post(url, data)
|
213
|
+
end
|
214
|
+
|
215
|
+
def delete_shard_space(database_name, shard_space_name)
|
216
|
+
delete full_url("/cluster/shard_spaces/#{database_name}/#{shard_space_name}")
|
217
|
+
end
|
218
|
+
|
219
|
+
## Get the shard space first, so the user doesn't have to specify the existing options
|
220
|
+
def update_shard_space(database_name, shard_space_name, options)
|
221
|
+
shard_space_options = get_shard_space(database_name, shard_space_name)
|
222
|
+
shard_space_options.delete("database")
|
223
|
+
|
224
|
+
url = full_url("/cluster/shard_spaces/#{database_name}/#{shard_space_name}")
|
225
|
+
data = JSON.generate(shard_space_options.merge(options))
|
226
|
+
|
227
|
+
post(url, data)
|
228
|
+
end
|
229
|
+
|
230
|
+
def default_shard_space_options
|
231
|
+
{
|
232
|
+
"name" => "default",
|
233
|
+
"regEx" => "/.*/",
|
234
|
+
"retentionPolicy" => "inf",
|
235
|
+
"shardDuration" => "7d",
|
236
|
+
"replicationFactor" => 1,
|
237
|
+
"split" => 1
|
238
|
+
}
|
239
|
+
end
|
240
|
+
|
241
|
+
def configure_database(database_name, options = {})
|
242
|
+
url = full_url("/cluster/database_configs/#{database_name}")
|
243
|
+
data = JSON.generate(default_database_configuration.merge(options))
|
244
|
+
|
245
|
+
post(url, data)
|
246
|
+
end
|
247
|
+
|
248
|
+
def default_database_configuration
|
249
|
+
{:spaces => [default_shard_space_options]}
|
147
250
|
end
|
148
251
|
|
149
252
|
def write_point(name, data, async=@async, time_precision=@time_precision)
|
253
|
+
write_points([{:name => name, :data => data}], async, time_precision)
|
254
|
+
end
|
255
|
+
|
256
|
+
# Example:
|
257
|
+
# db.write_points(
|
258
|
+
# [
|
259
|
+
# {
|
260
|
+
# name: 'first_name',
|
261
|
+
# data: {
|
262
|
+
# value: 'val1'
|
263
|
+
# }
|
264
|
+
# },
|
265
|
+
# {
|
266
|
+
# name: 'first_name',
|
267
|
+
# data: {
|
268
|
+
# value: 'val1'
|
269
|
+
# }
|
270
|
+
# }
|
271
|
+
# ]
|
272
|
+
# )
|
273
|
+
def write_points(name_data_hashes_array, async=@async, time_precision=@time_precision)
|
274
|
+
|
275
|
+
payloads = []
|
276
|
+
name_data_hashes_array.each do |attrs|
|
277
|
+
payloads << generate_payload(attrs[:name], attrs[:data])
|
278
|
+
end
|
279
|
+
|
280
|
+
if async
|
281
|
+
worker.push(payloads)
|
282
|
+
elsif udp_client
|
283
|
+
udp_client.send(payloads)
|
284
|
+
else
|
285
|
+
_write(payloads, time_precision)
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def generate_payload(name, data)
|
150
290
|
data = data.is_a?(Array) ? data : [data]
|
151
291
|
columns = data.reduce(:merge).keys.sort {|a,b| a.to_s <=> b.to_s}
|
152
292
|
payload = {:name => name, :points => [], :columns => columns}
|
@@ -157,11 +297,7 @@ module InfluxDB
|
|
157
297
|
end
|
158
298
|
end
|
159
299
|
|
160
|
-
|
161
|
-
worker.push(payload)
|
162
|
-
else
|
163
|
-
_write([payload], time_precision)
|
164
|
-
end
|
300
|
+
payload
|
165
301
|
end
|
166
302
|
|
167
303
|
def _write(payload, time_precision=@time_precision)
|
@@ -201,19 +337,31 @@ module InfluxDB
|
|
201
337
|
private
|
202
338
|
|
203
339
|
def full_url(path, params={})
|
204
|
-
|
205
|
-
|
340
|
+
unless basic_auth?
|
341
|
+
params[:u] = @username
|
342
|
+
params[:p] = @password
|
343
|
+
end
|
206
344
|
|
207
345
|
query = params.map { |k, v| [CGI.escape(k.to_s), "=", CGI.escape(v.to_s)].join }.join("&")
|
208
346
|
|
209
|
-
URI::Generic.build(:path => path, :query => query).to_s
|
347
|
+
URI::Generic.build(:path => "#{@path}#{path}", :query => query).to_s
|
210
348
|
end
|
211
349
|
|
212
|
-
def
|
350
|
+
def basic_auth?
|
351
|
+
@auth_method == 'basic_auth'
|
352
|
+
end
|
353
|
+
|
354
|
+
def get(url, return_response = false)
|
213
355
|
connect_with_retry do |http|
|
214
|
-
|
356
|
+
request = Net::HTTP::Get.new(url)
|
357
|
+
request.basic_auth @username, @password if basic_auth?
|
358
|
+
response = http.request(request)
|
215
359
|
if response.kind_of? Net::HTTPSuccess
|
216
|
-
|
360
|
+
if return_response
|
361
|
+
return response
|
362
|
+
else
|
363
|
+
return JSON.parse(response.body)
|
364
|
+
end
|
217
365
|
elsif response.kind_of? Net::HTTPUnauthorized
|
218
366
|
raise InfluxDB::AuthenticationError.new response.body
|
219
367
|
else
|
@@ -225,7 +373,9 @@ module InfluxDB
|
|
225
373
|
def post(url, data)
|
226
374
|
headers = {"Content-Type" => "application/json"}
|
227
375
|
connect_with_retry do |http|
|
228
|
-
|
376
|
+
request = Net::HTTP::Post.new(url, headers)
|
377
|
+
request.basic_auth @username, @password if basic_auth?
|
378
|
+
response = http.request(request, data)
|
229
379
|
if response.kind_of? Net::HTTPSuccess
|
230
380
|
return response
|
231
381
|
elsif response.kind_of? Net::HTTPUnauthorized
|
@@ -239,7 +389,9 @@ module InfluxDB
|
|
239
389
|
def delete(url, data = nil)
|
240
390
|
headers = {"Content-Type" => "application/json"}
|
241
391
|
connect_with_retry do |http|
|
242
|
-
|
392
|
+
request = Net::HTTP::Delete.new(url, headers)
|
393
|
+
request.basic_auth @username, @password if basic_auth?
|
394
|
+
response = http.request(request, data)
|
243
395
|
if response.kind_of? Net::HTTPSuccess
|
244
396
|
return response
|
245
397
|
elsif response.kind_of? Net::HTTPUnauthorized
|
@@ -261,6 +413,21 @@ module InfluxDB
|
|
261
413
|
http.open_timeout = @open_timeout
|
262
414
|
http.read_timeout = @read_timeout
|
263
415
|
http.use_ssl = @use_ssl
|
416
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE unless @verify_ssl
|
417
|
+
|
418
|
+
if @use_ssl
|
419
|
+
store = OpenSSL::X509::Store.new
|
420
|
+
store.set_default_paths
|
421
|
+
if @ssl_ca_cert
|
422
|
+
if File.directory?(@ssl_ca_cert)
|
423
|
+
store.add_path(@ssl_ca_cert)
|
424
|
+
else
|
425
|
+
store.add_file(@ssl_ca_cert)
|
426
|
+
end
|
427
|
+
end
|
428
|
+
http.cert_store = store
|
429
|
+
end
|
430
|
+
|
264
431
|
block.call(http)
|
265
432
|
|
266
433
|
rescue Timeout::Error, *InfluxDB::NET_HTTP_EXCEPTIONS => e
|
@@ -272,7 +439,7 @@ module InfluxDB
|
|
272
439
|
delay = [@max_delay, delay * 2].min
|
273
440
|
retry
|
274
441
|
else
|
275
|
-
raise
|
442
|
+
raise InfluxDB::ConnectionError, "Tried #{retry_count-1} times to reconnect but failed."
|
276
443
|
end
|
277
444
|
ensure
|
278
445
|
http.finish if http.started?
|
data/lib/influxdb/logger.rb
CHANGED
@@ -9,12 +9,13 @@ module InfluxDB
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def self.logger
|
12
|
-
@logger
|
12
|
+
return @logger unless @logger.nil?
|
13
|
+
@logger = ::Logger.new(STDERR).tap {|logger| logger.level = Logger::INFO}
|
13
14
|
end
|
14
15
|
|
15
16
|
private
|
16
17
|
def log(level, message)
|
17
|
-
InfluxDB::Logging.logger.send(level.to_sym, PREFIX + message)
|
18
|
+
InfluxDB::Logging.logger.send(level.to_sym, PREFIX + message) if InfluxDB::Logging.logger
|
18
19
|
end
|
19
20
|
end
|
20
21
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "json"
|
2
|
+
|
3
|
+
module InfluxDB
|
4
|
+
class UDPClient
|
5
|
+
attr_accessor :socket
|
6
|
+
def initialize(host, port)
|
7
|
+
self.socket = UDPSocket.new
|
8
|
+
self.socket.connect(host, port)
|
9
|
+
end
|
10
|
+
|
11
|
+
def send(payload)
|
12
|
+
socket.send(JSON.generate(payload), 0)
|
13
|
+
rescue
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/influxdb/version.rb
CHANGED
data/lib/influxdb/worker.rb
CHANGED
@@ -17,6 +17,11 @@ module InfluxDB
|
|
17
17
|
@queue = InfluxDB::MaxQueue.new
|
18
18
|
@client = client
|
19
19
|
spawn_threads!
|
20
|
+
|
21
|
+
at_exit do
|
22
|
+
log :debug, "Thread exiting, flushing queue."
|
23
|
+
check_background_queue until @queue.empty?
|
24
|
+
end
|
20
25
|
end
|
21
26
|
|
22
27
|
def current_threads
|
@@ -28,7 +33,11 @@ module InfluxDB
|
|
28
33
|
end
|
29
34
|
|
30
35
|
def push(payload)
|
31
|
-
|
36
|
+
if payload.is_a? Array
|
37
|
+
payload.each {|p| queue.push(p) }
|
38
|
+
else
|
39
|
+
queue.push(payload)
|
40
|
+
end
|
32
41
|
end
|
33
42
|
|
34
43
|
def spawn_threads!
|
@@ -38,11 +47,6 @@ module InfluxDB
|
|
38
47
|
Thread.new do
|
39
48
|
Thread.current[:influxdb] = self.object_id
|
40
49
|
|
41
|
-
at_exit do
|
42
|
-
log :debug, "Thread exiting, flushing queue."
|
43
|
-
check_background_queue(thread_num) until @queue.empty?
|
44
|
-
end
|
45
|
-
|
46
50
|
while !client.stopped?
|
47
51
|
self.check_background_queue(thread_num)
|
48
52
|
sleep rand(SLEEP_INTERVAL)
|
@@ -22,6 +22,7 @@ describe InfluxDB::Client do
|
|
22
22
|
@influxdb.password.should == "root"
|
23
23
|
@influxdb.use_ssl.should be_falsey
|
24
24
|
@influxdb.time_precision.should == "s"
|
25
|
+
@influxdb.auth_method.should == "params"
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
@@ -101,16 +102,70 @@ describe InfluxDB::Client do
|
|
101
102
|
@influxdb.password.should == "root"
|
102
103
|
end
|
103
104
|
end
|
105
|
+
|
106
|
+
describe "with auth_method basic auth specified" do
|
107
|
+
it "should be initialized with basic auth enabled" do
|
108
|
+
@influxdb = InfluxDB::Client.new :auth_method => 'basic_auth'
|
109
|
+
|
110
|
+
@influxdb.should be_a(InfluxDB::Client)
|
111
|
+
@influxdb.auth_method.should == 'basic_auth'
|
112
|
+
@influxdb.username.should == "root"
|
113
|
+
@influxdb.password.should == "root"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe "with udp specified" do
|
118
|
+
it "should initialize a udp client" do
|
119
|
+
@influxdb = InfluxDB::Client.new :udp => { :host => 'localhost', :port => 4444 }
|
120
|
+
expect(@influxdb.udp_client).to be_a(InfluxDB::UDPClient)
|
121
|
+
end
|
122
|
+
|
123
|
+
context "without udp specfied" do
|
124
|
+
it "does not initialize a udp client" do
|
125
|
+
@influxdb = InfluxDB::Client.new
|
126
|
+
expect(@influxdb.udp_client).to be_nil
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
|
133
|
+
context "with basic auth enabled" do
|
134
|
+
let(:args) { { :auth_method => 'basic_auth' } }
|
135
|
+
it "should use basic authorization for get" do
|
136
|
+
stub_request(:get, "http://username:password@influxdb.test:9999/").to_return(:body => '[]')
|
137
|
+
@influxdb.send(:get , @influxdb.send(:full_url,'/')).should == []
|
138
|
+
end
|
139
|
+
it "should use basic authorization for post" do
|
140
|
+
stub_request(:post, "http://username:password@influxdb.test:9999/")
|
141
|
+
@influxdb.send(:post , @influxdb.send(:full_url,'/'), {}).should be_a(Net::HTTPOK)
|
142
|
+
end
|
143
|
+
it "should use basic authorization for delete" do
|
144
|
+
stub_request(:delete, "http://username:password@influxdb.test:9999/")
|
145
|
+
@influxdb.send(:delete , @influxdb.send(:full_url,'/')).should be_a(Net::HTTPOK)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
describe "#ping" do
|
150
|
+
it "should return status ok" do
|
151
|
+
status_ok = {"status" => "ok"}
|
152
|
+
stub_request(:get, "http://influxdb.test:9999/ping"
|
153
|
+
).to_return(:body => JSON.generate(status_ok), :status => 200)
|
154
|
+
|
155
|
+
@influxdb.ping.should == status_ok
|
156
|
+
end
|
104
157
|
end
|
105
158
|
|
106
159
|
describe "#create_database" do
|
107
160
|
it "should POST to create a new database" do
|
108
|
-
stub_request(
|
161
|
+
stub_request(
|
162
|
+
:post, 'http://influxdb.test:9999/cluster/database_configs/foo'
|
163
|
+
).with(
|
109
164
|
:query => {:u => "username", :p => "password"},
|
110
|
-
:body => {:
|
165
|
+
:body => {:spaces => []}
|
111
166
|
)
|
112
167
|
|
113
|
-
@influxdb.create_database("foo").should be_a(Net::HTTPOK)
|
168
|
+
@influxdb.create_database("foo", {:spaces => []}).should be_a(Net::HTTPOK)
|
114
169
|
end
|
115
170
|
end
|
116
171
|
|
@@ -135,6 +190,16 @@ describe InfluxDB::Client do
|
|
135
190
|
end
|
136
191
|
end
|
137
192
|
|
193
|
+
describe "#authenticate_cluster_admin" do
|
194
|
+
it "should GET to authenticate a cluster admin" do
|
195
|
+
stub_request(:get, "http://influxdb.test:9999/cluster_admins/authenticate").with(
|
196
|
+
:query => {:u => "username", :p => "password"}
|
197
|
+
)
|
198
|
+
|
199
|
+
@influxdb.authenticate_cluster_admin.should be_a(Net::HTTPOK)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
138
203
|
describe "#create_cluster_admin" do
|
139
204
|
it "should POST to create a new cluster admin" do
|
140
205
|
stub_request(:post, "http://influxdb.test:9999/cluster_admins").with(
|
@@ -178,6 +243,16 @@ describe InfluxDB::Client do
|
|
178
243
|
end
|
179
244
|
end
|
180
245
|
|
246
|
+
describe "#authenticate_database_user" do
|
247
|
+
it "should GET to authenticate a database database" do
|
248
|
+
stub_request(:get, "http://influxdb.test:9999/db/foo/authenticate").with(
|
249
|
+
:query => {:u => "username", :p => "password"}
|
250
|
+
).to_return(:body => '', :status => 200)
|
251
|
+
|
252
|
+
@influxdb.authenticate_database_user("foo").should be_a(Net::HTTPOK)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
181
256
|
describe "#create_database_user" do
|
182
257
|
it "should POST to create a new database user" do
|
183
258
|
stub_request(:post, "http://influxdb.test:9999/db/foo/users").with(
|
@@ -187,6 +262,20 @@ describe InfluxDB::Client do
|
|
187
262
|
|
188
263
|
@influxdb.create_database_user("foo", "useruser", "passpass").should be_a(Net::HTTPOK)
|
189
264
|
end
|
265
|
+
|
266
|
+
it "should POST to create a new database user with permissions" do
|
267
|
+
stub_request(:post, "http://influxdb.test:9999/db/foo/users").with(
|
268
|
+
:query => {:u => "username", :p => "password"},
|
269
|
+
:body => {:name => "useruser", :password => "passpass", :readFrom => "/read*/", :writeTo => "/write*/"}
|
270
|
+
)
|
271
|
+
|
272
|
+
@influxdb.create_database_user(
|
273
|
+
"foo",
|
274
|
+
"useruser",
|
275
|
+
"passpass",
|
276
|
+
{:readFrom => "/read*/", :writeTo => "/write*/"}
|
277
|
+
).should be_a(Net::HTTPOK)
|
278
|
+
end
|
190
279
|
end
|
191
280
|
|
192
281
|
describe "#update_database_user" do
|
@@ -261,7 +350,174 @@ describe InfluxDB::Client do
|
|
261
350
|
:query => {:u => "username", :p => "password"}
|
262
351
|
)
|
263
352
|
|
264
|
-
@influxdb.delete_shard(shard_id, [1, 2]
|
353
|
+
@influxdb.delete_shard(shard_id, [1, 2]).should be_a(Net::HTTPOK)
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
describe "#create_continuous_query" do
|
358
|
+
it "should GET to create a continuous query" do
|
359
|
+
stub_request(:get, "http://influxdb.test:9999/db/database/series").with(
|
360
|
+
:query => { :q => "select sys from cpu into sys", :u => "username", :p => "password", :time_precision => "s"}
|
361
|
+
).to_return(:body => JSON.generate({}))
|
362
|
+
|
363
|
+
@influxdb.create_continuous_query("select sys from cpu", "sys").should == {}
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
describe "#get_continuous_query_list" do
|
368
|
+
it "should GET to get continuous query list" do
|
369
|
+
body = [{
|
370
|
+
"name"=>"continuous queries",
|
371
|
+
"columns"=>["time", "sequence_number", "id", "query"],
|
372
|
+
"points"=>[
|
373
|
+
[1399, 1, 1, "select sys from cpu into sys"]
|
374
|
+
]
|
375
|
+
}]
|
376
|
+
expected = {
|
377
|
+
"continuous queries" => [
|
378
|
+
{
|
379
|
+
"time" => 1399,
|
380
|
+
"sequence_number" => 1,
|
381
|
+
"id" => 1,
|
382
|
+
"query" => "select sys from cpu into sys"
|
383
|
+
}
|
384
|
+
]
|
385
|
+
}
|
386
|
+
stub_request(:get, "http://influxdb.test:9999/db/database/series").with(
|
387
|
+
:query => { :q => "list continuous queries", :u => "username", :p => "password", :time_precision => "s"}
|
388
|
+
).to_return(:body => JSON.generate(body))
|
389
|
+
|
390
|
+
@influxdb.get_continuous_query_list.should == expected
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
describe "#delete_continuous_query" do
|
395
|
+
it "should GET to delete continuous query" do
|
396
|
+
id = 1
|
397
|
+
stub_request(:get, "http://influxdb.test:9999/db/database/series").with(
|
398
|
+
:query => { :q => "drop continuous query #{id}", :u => "username", :p => "password", :time_precision => "s"}
|
399
|
+
).to_return(:body => JSON.generate({}))
|
400
|
+
|
401
|
+
@influxdb.delete_continuous_query(id).should == {}
|
402
|
+
end
|
403
|
+
end
|
404
|
+
|
405
|
+
describe "#get_shard_space_list" do
|
406
|
+
let(:url) { "http://influxdb.test:9999/cluster/shard_spaces" }
|
407
|
+
let(:request_params) { {:query => {:u => "username", :p => "password"}} }
|
408
|
+
let(:response) { {:body => JSON.generate(shard_spaces, :status => 200)} }
|
409
|
+
let(:shard_spaces) { [@influxdb.default_shard_space_options.merge(:database => "foo")] }
|
410
|
+
|
411
|
+
it 'should GET a list of shard spaces' do
|
412
|
+
request = stub_request(:get, url).with(request_params).to_return(response)
|
413
|
+
|
414
|
+
@influxdb.get_shard_space_list
|
415
|
+
|
416
|
+
expect(request).to have_been_requested
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
describe "#get_shard_space" do
|
421
|
+
let(:url) { "http://influxdb.test:9999/cluster/shard_spaces" }
|
422
|
+
let(:request_params) { {:query => {:u => "username", :p => "password"}} }
|
423
|
+
let(:response) { {:body => JSON.generate(shard_spaces, :status => 200)} }
|
424
|
+
|
425
|
+
describe "#get_shard_space_list returns a non-empty list" do
|
426
|
+
let(:shard_spaces) { [@influxdb.default_shard_space_options.merge("database" => "foo")] }
|
427
|
+
|
428
|
+
it "finds the indicated shard space" do
|
429
|
+
request = stub_request(:get, url).with(request_params).to_return(response)
|
430
|
+
|
431
|
+
expect(@influxdb.get_shard_space('foo', 'default')).to eq shard_spaces.first
|
432
|
+
|
433
|
+
expect(request).to have_been_requested
|
434
|
+
end
|
435
|
+
end
|
436
|
+
|
437
|
+
describe "#get_shard_space_list returns an empty list" do
|
438
|
+
let(:shard_spaces) { [] }
|
439
|
+
|
440
|
+
it "finds no shard space" do
|
441
|
+
request = stub_request(:get, url).with(request_params).to_return(response)
|
442
|
+
|
443
|
+
expect(@influxdb.get_shard_space('foo', 'default')).to eq nil
|
444
|
+
|
445
|
+
expect(request).to have_been_requested
|
446
|
+
end
|
447
|
+
end
|
448
|
+
end
|
449
|
+
|
450
|
+
describe "#create_shard_space" do
|
451
|
+
let(:url) { "http://influxdb.test:9999/cluster/shard_spaces/foo" }
|
452
|
+
let(:request_params) do
|
453
|
+
{
|
454
|
+
:query => {:u => "username", :p => "password"},
|
455
|
+
:body => @influxdb.default_shard_space_options
|
456
|
+
}
|
457
|
+
end
|
458
|
+
|
459
|
+
it 'should POST to create a shard space' do
|
460
|
+
request = stub_request(:post, url).with(request_params)
|
461
|
+
|
462
|
+
@influxdb.create_shard_space("foo", @influxdb.default_shard_space_options)
|
463
|
+
|
464
|
+
expect(request).to have_been_requested
|
465
|
+
end
|
466
|
+
end
|
467
|
+
|
468
|
+
describe "#delete_shard_space" do
|
469
|
+
let(:url) { "http://influxdb.test:9999/cluster/shard_spaces/foo/default" }
|
470
|
+
let(:request_params) { {:query => {:u => "username", :p => "password"}} }
|
471
|
+
|
472
|
+
it 'should DELETE to delete the shard space' do
|
473
|
+
request = stub_request(:delete, url).with(request_params)
|
474
|
+
|
475
|
+
@influxdb.delete_shard_space("foo", "default")
|
476
|
+
|
477
|
+
expect(request).to have_been_requested
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
481
|
+
describe "#update_shard_space" do
|
482
|
+
let(:get_url) { "http://influxdb.test:9999/cluster/shard_spaces" }
|
483
|
+
let(:get_request_params) { {:query => {:u => "username", :p => "password"}} }
|
484
|
+
let(:get_response) { {:body => JSON.generate(shard_spaces, :status => 200)} }
|
485
|
+
let(:shard_spaces) { [@influxdb.default_shard_space_options.merge("database" => "foo")] }
|
486
|
+
|
487
|
+
let(:post_url) { "http://influxdb.test:9999/cluster/shard_spaces/foo/default" }
|
488
|
+
let(:post_request_params) do
|
489
|
+
{
|
490
|
+
:query => {:u => "username", :p => "password"},
|
491
|
+
:body => @influxdb.default_shard_space_options.merge("shardDuration" => "30d")
|
492
|
+
}
|
493
|
+
end
|
494
|
+
|
495
|
+
it 'should GET the shard space and then POST to update the shard space' do
|
496
|
+
get_request = stub_request(:get, get_url).with(get_request_params).to_return(get_response)
|
497
|
+
post_request = stub_request(:post, post_url).with(post_request_params)
|
498
|
+
|
499
|
+
@influxdb.update_shard_space("foo", "default", {"shardDuration" => "30d"})
|
500
|
+
|
501
|
+
expect(get_request).to have_been_requested
|
502
|
+
expect(post_request).to have_been_requested
|
503
|
+
end
|
504
|
+
end
|
505
|
+
|
506
|
+
describe "#configure_database" do
|
507
|
+
let(:url) { "http://influxdb.test:9999/cluster/database_configs/foo" }
|
508
|
+
let(:request_params) do
|
509
|
+
{
|
510
|
+
:query => {:u => "username", :p => "password"},
|
511
|
+
:body => @influxdb.default_database_configuration
|
512
|
+
}
|
513
|
+
end
|
514
|
+
|
515
|
+
it "should POST to create a new database config" do
|
516
|
+
request = stub_request(:post, url).with(request_params)
|
517
|
+
|
518
|
+
@influxdb.configure_database("foo").should be_a(Net::HTTPOK)
|
519
|
+
|
520
|
+
expect(request).to have_been_requested
|
265
521
|
end
|
266
522
|
end
|
267
523
|
|
@@ -307,14 +563,18 @@ describe InfluxDB::Client do
|
|
307
563
|
it "raises when stopped" do
|
308
564
|
@influxdb.stop!
|
309
565
|
@influxdb.should_not_receive :sleep
|
310
|
-
expect { subject }.to raise_error(
|
566
|
+
expect { subject }.to raise_error(InfluxDB::ConnectionError) do |e|
|
567
|
+
expect(e.cause).to be_an_instance_of(Timeout::Error)
|
568
|
+
end
|
311
569
|
end
|
312
570
|
|
313
571
|
context "when retry is 0" do
|
314
572
|
let(:args) { { :retry => 0 } }
|
315
573
|
it "raise error directly" do
|
316
574
|
@influxdb.should_not_receive :sleep
|
317
|
-
expect { subject }.to raise_error(
|
575
|
+
expect { subject }.to raise_error(InfluxDB::ConnectionError) do |e|
|
576
|
+
expect(e.cause).to be_an_instance_of(Timeout::Error)
|
577
|
+
end
|
318
578
|
end
|
319
579
|
end
|
320
580
|
|
@@ -323,7 +583,9 @@ describe InfluxDB::Client do
|
|
323
583
|
|
324
584
|
it "raise error after 'n' attemps" do
|
325
585
|
@influxdb.should_receive(:sleep).exactly(3).times
|
326
|
-
expect { subject }.to raise_error(
|
586
|
+
expect { subject }.to raise_error(InfluxDB::ConnectionError) do |e|
|
587
|
+
expect(e.cause).to be_an_instance_of(Timeout::Error)
|
588
|
+
end
|
327
589
|
end
|
328
590
|
end
|
329
591
|
|
@@ -471,21 +733,41 @@ describe InfluxDB::Client do
|
|
471
733
|
it "should push to the worker with payload if client is async" do
|
472
734
|
@influxdb = InfluxDB::Client.new "database", :host => "influxdb.test", :async => true
|
473
735
|
|
474
|
-
|
475
|
-
|
736
|
+
time = Time.now.to_i
|
737
|
+
data = {:name => "juan", :age => 87, :time => time}
|
738
|
+
expected_data = [{:name => 'seriez', :points => [[87, 'juan', time]], :columns => [:age, :name, :time]}]
|
739
|
+
@influxdb.stub_chain(:worker, :push).with(expected_data).and_return(:ok)
|
476
740
|
@influxdb.write_point("seriez", data).should eq(:ok)
|
477
741
|
end
|
478
742
|
|
479
743
|
it "should push to the worker with payload if write_point call is async" do
|
480
744
|
@influxdb = InfluxDB::Client.new "database", :host => "influxdb.test", :async => false
|
481
745
|
|
482
|
-
|
483
|
-
|
746
|
+
time = Time.now.to_i
|
747
|
+
data = {:name => "juan", :age => 87, :time => time}
|
748
|
+
expected_data = [{:name => 'seriez', :points => [[87, 'juan', time]], :columns => [:age, :name, :time]}]
|
749
|
+
@influxdb.stub_chain(:worker, :push).with(expected_data).and_return(:ok)
|
484
750
|
@influxdb.write_point("seriez", data, true).should eq(:ok)
|
485
751
|
end
|
486
752
|
|
487
753
|
end
|
488
754
|
|
755
|
+
describe "udp" do
|
756
|
+
let(:udp_client) { double }
|
757
|
+
let(:time) { Time.now.to_i }
|
758
|
+
let(:influxdb) { InfluxDB::Client.new(:udp => { :host => "localhost", :port => 44444 }) }
|
759
|
+
|
760
|
+
before do
|
761
|
+
allow(InfluxDB::UDPClient).to receive(:new).with('localhost', 44444).and_return(udp_client)
|
762
|
+
end
|
763
|
+
|
764
|
+
it "should send payload via udp if udp client is set up" do
|
765
|
+
expect(udp_client).to receive(:send).with([{:name=>"seriez", :points=>[[87, "juan", time]], :columns=>[:age, :name, :time]}])
|
766
|
+
data = {:name => "juan", :age => 87, :time => time}
|
767
|
+
influxdb.write_point("seriez", data)
|
768
|
+
end
|
769
|
+
end
|
770
|
+
|
489
771
|
end
|
490
772
|
|
491
773
|
describe "#execute_queries" do
|
@@ -23,6 +23,22 @@ describe InfluxDB::Logging do
|
|
23
23
|
InfluxDB::Logging.logger = new_logger
|
24
24
|
expect(InfluxDB::Logging.logger).to eq(new_logger)
|
25
25
|
end
|
26
|
+
|
27
|
+
it "allows disabling of a logger" do
|
28
|
+
InfluxDB::Logging.logger = false
|
29
|
+
expect(InfluxDB::Logging.logger).to eql false
|
30
|
+
end
|
31
|
+
|
32
|
+
context "when logging is disabled" do
|
33
|
+
|
34
|
+
subject { LoggerTest.new }
|
35
|
+
|
36
|
+
it "does not log" do
|
37
|
+
InfluxDB::Logging.logger = false
|
38
|
+
expect(InfluxDB::Logging.logger).not_to receive(:debug)
|
39
|
+
subject.write_to_log(:debug, 'test')
|
40
|
+
end
|
41
|
+
end
|
26
42
|
|
27
43
|
context "when included in classes" do
|
28
44
|
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "json"
|
3
|
+
|
4
|
+
describe InfluxDB::UDPClient do
|
5
|
+
subject { described_class.new("localhost", 44444) }
|
6
|
+
let(:message) { [{ "foo" => "bar" }] }
|
7
|
+
|
8
|
+
describe "#send" do
|
9
|
+
it "sends a UPD packet" do
|
10
|
+
s = UDPSocket.new
|
11
|
+
s.bind("localhost", 44444)
|
12
|
+
subject.send(message)
|
13
|
+
rec_mesage = JSON.parse(s.recvfrom(15).first)
|
14
|
+
expect(rec_mesage).to eq message
|
15
|
+
end
|
16
|
+
|
17
|
+
context "it can't connect" do
|
18
|
+
before do
|
19
|
+
subject.socket = FailingSocket.new
|
20
|
+
end
|
21
|
+
|
22
|
+
it "doesn't blow up" do
|
23
|
+
expect { subject.send(message) }.to_not raise_error
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class FailingSocket < UDPSocket
|
28
|
+
def send(*args)
|
29
|
+
fail
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,2 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'influxdb'
|
2
|
+
require 'webmock/rspec'
|
3
|
+
|
4
|
+
RSpec.configure do |config|
|
5
|
+
config.mock_with :rspec do |mocks|
|
6
|
+
mocks.syntax = [:should, :expect]
|
7
|
+
end
|
8
|
+
config.expect_with :rspec do |expectations|
|
9
|
+
expectations.syntax = [:should, :expect]
|
10
|
+
end
|
11
|
+
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.1.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Todd Persen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-07-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: cause
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -56,16 +70,16 @@ dependencies:
|
|
56
70
|
name: rspec
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
|
-
- -
|
73
|
+
- - ~>
|
60
74
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
75
|
+
version: 3.0.0
|
62
76
|
type: :development
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
66
|
-
- -
|
80
|
+
- - ~>
|
67
81
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
82
|
+
version: 3.0.0
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: webmock
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,11 +114,13 @@ files:
|
|
100
114
|
- lib/influxdb/logger.rb
|
101
115
|
- lib/influxdb/max_queue.rb
|
102
116
|
- lib/influxdb/point_value.rb
|
117
|
+
- lib/influxdb/udp_client.rb
|
103
118
|
- lib/influxdb/version.rb
|
104
119
|
- lib/influxdb/worker.rb
|
105
120
|
- spec/influxdb/client_spec.rb
|
106
121
|
- spec/influxdb/logger_spec.rb
|
107
122
|
- spec/influxdb/point_value_spec.rb
|
123
|
+
- spec/influxdb/udp_client_spec.rb
|
108
124
|
- spec/influxdb/worker_spec.rb
|
109
125
|
- spec/influxdb_spec.rb
|
110
126
|
- spec/max_queue_spec.rb
|
@@ -129,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
129
145
|
version: '0'
|
130
146
|
requirements: []
|
131
147
|
rubyforge_project:
|
132
|
-
rubygems_version: 2.
|
148
|
+
rubygems_version: 2.0.14
|
133
149
|
signing_key:
|
134
150
|
specification_version: 4
|
135
151
|
summary: Ruby library for InfluxDB.
|
@@ -137,6 +153,7 @@ test_files:
|
|
137
153
|
- spec/influxdb/client_spec.rb
|
138
154
|
- spec/influxdb/logger_spec.rb
|
139
155
|
- spec/influxdb/point_value_spec.rb
|
156
|
+
- spec/influxdb/udp_client_spec.rb
|
140
157
|
- spec/influxdb/worker_spec.rb
|
141
158
|
- spec/influxdb_spec.rb
|
142
159
|
- spec/max_queue_spec.rb
|