influxdb 0.0.17 → 0.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0d70a9878bd1e5c317027674416232aa8a04ae7d
4
- data.tar.gz: 04aa90bf5904206307fe68d2ea09dec094792e9a
3
+ metadata.gz: b18af835198acf64a60f0b61b3464e79dcbf98e8
4
+ data.tar.gz: 068c5f701cfe5a346778017cfdb72ae622ecaa37
5
5
  SHA512:
6
- metadata.gz: be3a486311a2a5506dad439e1aba5d6dfd1c11d54bfd665be5f80d89a958ae40ae641eb40718c4ffe422a1b4d1a02dac4a7ec7dbdb530c7dff1dee91dc4caa62
7
- data.tar.gz: 59e4d64307c3b4662cf652511ec9f2a1b4c0df7cb293792d5eccfa0d4c804f65ecce0b970ee22c3cd607f39d8d778142f86917df467c1127191ea3e54c47709e
6
+ metadata.gz: 63fe3e1f05b0a61c685a2fc8d536b5d343311c315d5c3ae9502a8fe1b1526657e544087afa330570c840d7bcdca85d28785cb654034b2832206b5397a902f9eb
7
+ data.tar.gz: 6e885b8eac8803845c3779d801e1eac99c5d90836de81f3f70ed92a8cf0400e9cd333790a6f303a13cbacf298c64606f2185f312e6532f293f70a893e4b623c8
@@ -5,7 +5,14 @@ require 'json'
5
5
 
6
6
  module InfluxDB
7
7
  class Client
8
- attr_accessor :host, :port, :username, :password, :database, :time_precision
8
+ attr_accessor :hosts,
9
+ :port,
10
+ :username,
11
+ :password,
12
+ :database,
13
+ :time_precision,
14
+ :use_ssl
15
+
9
16
  attr_accessor :queue, :worker
10
17
 
11
18
  include InfluxDB::Logger
@@ -34,13 +41,21 @@ module InfluxDB
34
41
  def initialize *args
35
42
  @database = args.first if args.first.is_a? String
36
43
  opts = args.last.is_a?(Hash) ? args.last : {}
37
- @host = opts[:host] || "localhost"
44
+ @hosts = opts[:hosts] || opts[:host] || ["localhost"]
38
45
  @port = opts[:port] || 8086
39
46
  @username = opts[:username] || "root"
40
47
  @password = opts[:password] || "root"
41
- @http = Net::HTTP.new(@host, @port)
42
- @http.use_ssl = opts[:use_ssl]
48
+ @use_ssl = opts[:use_ssl] || false
43
49
  @time_precision = opts[:time_precision] || "s"
50
+ @initial_delay = opts[:initial_delay] || 0.01
51
+ @max_delay = opts[:max_delay] || 30
52
+ @open_timeout = opts[:write_timeout] || 5
53
+ @read_timeout = opts[:read_timeout] || 300
54
+ @async = opts[:async] || false
55
+
56
+ unless @hosts.is_a? Array
57
+ @hosts = [@hosts]
58
+ end
44
59
  end
45
60
 
46
61
  ## allow options, e.g. influxdb.create_database('foo', replicationFactor: 3)
@@ -111,7 +126,7 @@ module InfluxDB
111
126
  get full_url("continuous_queries")
112
127
  end
113
128
 
114
- def write_point(name, data, async=false, time_precision=@time_precision)
129
+ def write_point(name, data, async=@async, time_precision=@time_precision)
115
130
  data = data.is_a?(Array) ? data : [data]
116
131
  columns = data.reduce(:merge).keys.sort {|a,b| a.to_s <=> b.to_s}
117
132
  payload = {:name => name, :points => [], :columns => columns}
@@ -123,14 +138,14 @@ module InfluxDB
123
138
  end
124
139
 
125
140
  if async
126
- @worker = InfluxDB::Worker.new if @worker.nil?
141
+ @worker = InfluxDB::Worker.new(self) if @worker.nil?
127
142
  @worker.queue.push(payload)
128
143
  else
129
144
  _write([payload], time_precision)
130
145
  end
131
146
  end
132
147
 
133
- def _write(payload, time_precision=nil)
148
+ def _write(payload, time_precision=@time_precision)
134
149
  url = full_url("db/#{@database}/series", "time_precision=#{time_precision}")
135
150
  data = JSON.generate(payload)
136
151
  post(url, data)
@@ -161,36 +176,63 @@ module InfluxDB
161
176
  end
162
177
 
163
178
  def get(url)
164
- response = @http.request(Net::HTTP::Get.new(url))
165
- if response.kind_of? Net::HTTPSuccess
166
- return JSON.parse(response.body)
167
- elsif response.kind_of? Net::HTTPUnauthorized
168
- raise InfluxDB::AuthenticationError.new response.body
169
- else
170
- raise InfluxDB::Error.new response.body
179
+ connect_with_retry do |http|
180
+ response = http.request(Net::HTTP::Get.new(url))
181
+ if response.kind_of? Net::HTTPSuccess
182
+ return JSON.parse(response.body)
183
+ elsif response.kind_of? Net::HTTPUnauthorized
184
+ raise InfluxDB::AuthenticationError.new response.body
185
+ else
186
+ raise InfluxDB::Error.new response.body
187
+ end
171
188
  end
172
189
  end
173
190
 
174
191
  def post(url, data)
175
192
  headers = {"Content-Type" => "application/json"}
176
- response = @http.request(Net::HTTP::Post.new(url, headers), data)
177
- if response.kind_of? Net::HTTPSuccess
178
- return response
179
- elsif response.kind_of? Net::HTTPUnauthorized
180
- raise InfluxDB::AuthenticationError.new response.body
181
- else
182
- raise InfluxDB::Error.new response.body
193
+ connect_with_retry do |http|
194
+ response = http.request(Net::HTTP::Post.new(url, headers), data)
195
+ if response.kind_of? Net::HTTPSuccess
196
+ return response
197
+ elsif response.kind_of? Net::HTTPUnauthorized
198
+ raise InfluxDB::AuthenticationError.new response.body
199
+ else
200
+ raise InfluxDB::Error.new response.body
201
+ end
183
202
  end
184
203
  end
185
204
 
186
205
  def delete(url)
187
- response = @http.request(Net::HTTP::Delete.new(url))
188
- if response.kind_of? Net::HTTPSuccess
189
- return response
190
- elsif response.kind_of? Net::HTTPUnauthorized
191
- raise InfluxDB::AuthenticationError.new response.body
192
- else
193
- raise InfluxDB::Error.new response.body
206
+ connect_with_retry do |http|
207
+ response = http.request(Net::HTTP::Delete.new(url))
208
+ if response.kind_of? Net::HTTPSuccess
209
+ return response
210
+ elsif response.kind_of? Net::HTTPUnauthorized
211
+ raise InfluxDB::AuthenticationError.new response.body
212
+ else
213
+ raise InfluxDB::Error.new response.body
214
+ end
215
+ end
216
+ end
217
+
218
+ def connect_with_retry(&block)
219
+ hosts = @hosts.dup
220
+ delay = @initial_delay
221
+
222
+ begin
223
+ hosts.push(host = hosts.shift)
224
+ http = Net::HTTP.new(host, @port)
225
+ http.open_timeout = @open_timeout
226
+ http.read_timeout = @read_timeout
227
+ http.use_ssl = @use_ssl
228
+ block.call(http)
229
+ rescue StandardError => e
230
+ log :error, "Failed to contact host #{host}: #{e.inspect} - retrying in #{delay}s."
231
+ log :info, "Queue size is #{@queue.length}." unless @queue.nil?
232
+
233
+ sleep delay
234
+ delay = [@max_delay, delay * 2].min
235
+ retry
194
236
  end
195
237
  end
196
238
 
@@ -1,5 +1,5 @@
1
1
  module InfluxDB
2
- class Error < StandardError
2
+ class Error < Exception
3
3
  end
4
4
 
5
5
  class AuthenticationError < Error
@@ -1,3 +1,3 @@
1
1
  module InfluxDB
2
- VERSION = "0.0.17"
2
+ VERSION = "0.1.0"
3
3
  end
@@ -4,16 +4,18 @@ require "uri"
4
4
 
5
5
  module InfluxDB
6
6
  class Worker
7
+ attr_reader :client
7
8
  attr_accessor :queue
8
9
 
9
10
  include InfluxDB::Logger
10
11
 
11
- MAX_POST_POINTS = 200
12
+ MAX_POST_POINTS = 1000
12
13
  NUM_WORKER_THREADS = 3
13
- SLEEP_INTERVAL = 500
14
+ SLEEP_INTERVAL = 5
14
15
 
15
- def initialize
16
+ def initialize(client)
16
17
  @queue = InfluxDB::MaxQueue.new
18
+ @client = client
17
19
  spawn_threads!
18
20
  end
19
21
 
@@ -38,8 +40,8 @@ module InfluxDB
38
40
  end
39
41
 
40
42
  while true
41
- sleep SLEEP_INTERVAL
42
43
  self.check_background_queue(thread_num)
44
+ sleep SLEEP_INTERVAL
43
45
  end
44
46
  end
45
47
  end
@@ -53,12 +55,14 @@ module InfluxDB
53
55
 
54
56
  while data.size < MAX_POST_POINTS && !@queue.empty?
55
57
  p = @queue.pop(true) rescue next;
56
- log :debug, "Found data in the queue! (#{p[:n]})"
57
58
  data.push p
58
59
  end
59
60
 
61
+ return if data.empty?
62
+
60
63
  begin
61
- _write(data)
64
+ log :debug, "Found data in the queue! (#{data.length} points)"
65
+ @client._write(data)
62
66
  rescue => e
63
67
  puts "Cannot write data: #{e.inspect}"
64
68
  end
@@ -14,18 +14,18 @@ describe InfluxDB::Client do
14
14
 
15
15
  @influxdb.should be_a InfluxDB::Client
16
16
  @influxdb.database.should be_nil
17
- @influxdb.host.should == "localhost"
17
+ @influxdb.hosts.should == ["localhost"]
18
18
  @influxdb.port.should == 8086
19
19
  @influxdb.username.should == "root"
20
20
  @influxdb.password.should == "root"
21
- @influxdb.instance_variable_get(:@http).use_ssl?.should == false
21
+ @influxdb.use_ssl.should be_false
22
22
  @influxdb.time_precision.should == "s"
23
23
  end
24
24
  end
25
25
 
26
26
  describe "with no database specified" do
27
27
  it "should be initialized with a nil database and the specified options" do
28
- @influxdb = InfluxDB::Client.new :hostname => "host",
28
+ @influxdb = InfluxDB::Client.new :host => "host",
29
29
  :port => "port",
30
30
  :username => "username",
31
31
  :password => "password",
@@ -33,7 +33,7 @@ describe InfluxDB::Client do
33
33
 
34
34
  @influxdb.should be_a InfluxDB::Client
35
35
  @influxdb.database.should be_nil
36
- @influxdb.host.should == "localhost"
36
+ @influxdb.hosts.should == ["host"]
37
37
  @influxdb.port.should == "port"
38
38
  @influxdb.username.should == "username"
39
39
  @influxdb.password.should == "password"
@@ -47,7 +47,7 @@ describe InfluxDB::Client do
47
47
 
48
48
  @influxdb.should be_a(InfluxDB::Client)
49
49
  @influxdb.database.should == "database"
50
- @influxdb.host.should == "localhost"
50
+ @influxdb.hosts.should == ["localhost"]
51
51
  @influxdb.port.should == 8086
52
52
  @influxdb.username.should == "root"
53
53
  @influxdb.password.should == "root"
@@ -57,7 +57,7 @@ describe InfluxDB::Client do
57
57
 
58
58
  describe "with both a database and options specified" do
59
59
  it "should be initialized with the specified database and options" do
60
- @influxdb = InfluxDB::Client.new "database", :hostname => "host",
60
+ @influxdb = InfluxDB::Client.new "database", :host => "host",
61
61
  :port => "port",
62
62
  :username => "username",
63
63
  :password => "password",
@@ -65,7 +65,7 @@ describe InfluxDB::Client do
65
65
 
66
66
  @influxdb.should be_a(InfluxDB::Client)
67
67
  @influxdb.database.should == "database"
68
- @influxdb.host.should == "localhost"
68
+ @influxdb.hosts.should == ["host"]
69
69
  @influxdb.port.should == "port"
70
70
  @influxdb.username.should == "username"
71
71
  @influxdb.password.should == "password"
@@ -75,15 +75,28 @@ describe InfluxDB::Client do
75
75
 
76
76
  describe "with ssl option specified" do
77
77
  it "should be initialized with ssl enabled" do
78
- @influxdb = InfluxDB::Client.new nil, :use_ssl => true
78
+ @influxdb = InfluxDB::Client.new :use_ssl => true
79
79
 
80
80
  @influxdb.should be_a InfluxDB::Client
81
81
  @influxdb.database.should be_nil
82
- @influxdb.host.should == "localhost"
82
+ @influxdb.hosts.should == ["localhost"]
83
+ @influxdb.port.should == 8086
84
+ @influxdb.username.should == "root"
85
+ @influxdb.password.should == "root"
86
+ @influxdb.use_ssl.should be_true
87
+ end
88
+ end
89
+
90
+ describe "with multiple hosts specified" do
91
+ it "should be initialized with ssl enabled" do
92
+ @influxdb = InfluxDB::Client.new :hosts => ["1.1.1.1", "2.2.2.2"]
93
+
94
+ @influxdb.should be_a InfluxDB::Client
95
+ @influxdb.database.should be_nil
96
+ @influxdb.hosts.should == ["1.1.1.1", "2.2.2.2"]
83
97
  @influxdb.port.should == 8086
84
98
  @influxdb.username.should == "root"
85
99
  @influxdb.password.should == "root"
86
- @influxdb.instance_variable_get(:@http).use_ssl?.should == true
87
100
  end
88
101
  end
89
102
  end
@@ -349,7 +362,7 @@ describe InfluxDB::Client do
349
362
  data = {:name => "juan", :age => 87, :time => time_in_seconds}
350
363
 
351
364
  @influxdb.write_point("seriez", data).should be_a(Net::HTTPOK)
352
- end
365
+ end
353
366
 
354
367
  it "should POST to add points with time field with precision defined in call of write function" do
355
368
  time_in_milliseconds = (Time.now.to_f * 1000).to_i
@@ -367,7 +380,7 @@ describe InfluxDB::Client do
367
380
  data = {:name => "juan", :age => 87, :time => time_in_milliseconds}
368
381
 
369
382
  @influxdb.write_point("seriez", data, false, "m").should be_a(Net::HTTPOK)
370
- end
383
+ end
371
384
  end
372
385
 
373
386
  describe "#execute_queries" do
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.0.17
4
+ version: 0.1.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: 2014-03-13 00:00:00.000000000 Z
11
+ date: 2014-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json