influxdb 0.2.2 → 0.2.3

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: 48b3b597ccffb495aafb01038b0a00300a5aaf85
4
- data.tar.gz: ae802e95ce9675869e5ae482d30d6a46ed7318ac
3
+ metadata.gz: 91c31bce05c5e0a514a22cef9375f6f51e1f7e3d
4
+ data.tar.gz: 842b0127d866fb9ed3a3cf0e7d3b878c6d1c5d01
5
5
  SHA512:
6
- metadata.gz: 9725f16e1b6cf6b15dfab0b0717a30fff9a1eca6dc7b1b7463adf5a985745ff83c14e90191aa58a06167b6be7bc3e085a79424ce303d78172ef8e7f513816f43
7
- data.tar.gz: 6875eff543b72a4791fd8d7e73b0ceef5a079983dfee1356d758ad43a900d88f77f86bbdb3a0d9d789eeceaab576203a015e83e5ae09ad5ebda2ece3fb2fcfc3
6
+ metadata.gz: c3f979934171092ad2c2b3c5ff6041cd40663e55d87eaedc8473951097bb1f28d2089acf3448a8dda86e25e521f7ed606314eeb0a9399492a9427c35f39aaebf
7
+ data.tar.gz: 71d9c02ef46b61c64b6357e2df5886f1cc68517cbdf76da11104223535cb76dc88b73ffa671ad5a83d5afb344c99621c7b46df9d4462461364808f1f7c39810a
data/README.md CHANGED
@@ -194,6 +194,17 @@ name = '1h.cpu'
194
194
  influxdb.delete_retention_policy(name, database)
195
195
  ```
196
196
 
197
+ Alter a retention policy for a database:
198
+
199
+ ``` ruby
200
+ database = 'foo'
201
+ name = '1h.cpu'
202
+ duration = '10m'
203
+ replication = 2
204
+
205
+ influxdb.alter_retention_policy(name, database, duration, replication)
206
+ ```
207
+
197
208
  Write some data:
198
209
 
199
210
  ``` ruby
@@ -226,10 +237,10 @@ Write data with time precision (precision can be set in 2 ways):
226
237
  ``` ruby
227
238
  require 'influxdb'
228
239
 
229
- username = 'foo'
230
- password = 'bar'
231
- database = 'site_development'
232
- name = 'foobar'
240
+ username = 'foo'
241
+ password = 'bar'
242
+ database = 'site_development'
243
+ name = 'foobar'
233
244
  time_precision = 's'
234
245
 
235
246
  # either in the client initialization:
@@ -249,6 +260,31 @@ influxdb.write_point(name, data, time_precision)
249
260
 
250
261
  ```
251
262
 
263
+ Write data with a specific retention policy:
264
+
265
+ ``` ruby
266
+ require 'influxdb'
267
+
268
+ username = 'foo'
269
+ password = 'bar'
270
+ database = 'site_development'
271
+ name = 'foobar'
272
+ precision = 's'
273
+ retention = '1h.cpu'
274
+
275
+ influxdb = InfluxDB::Client.new database,
276
+ username: username,
277
+ password: password
278
+
279
+ data = {
280
+ values: { value: 0 },
281
+ tags: { foo: 'bar', bar: 'baz' }
282
+ timestamp: Time.now.to_i
283
+ }
284
+
285
+ influxdb.write_point(name, data, precision, retention)
286
+ ```
287
+
252
288
  Write multiple points in a batch (performance boost):
253
289
 
254
290
  ``` ruby
@@ -274,7 +310,29 @@ influxdb.write_points(data, precision)
274
310
 
275
311
  ```
276
312
 
277
- Write asynchronously:
313
+ Write multiple points in a batch with a specific retention policy:
314
+
315
+ ``` ruby
316
+
317
+ data = [
318
+ {
319
+ series: 'cpu',
320
+ tags: { host: 'server_1', regios: 'us' },
321
+ values: {internal: 5, external: 0.453345}
322
+ },
323
+ {
324
+ series: 'gpu',
325
+ values: {value: 0.9999},
326
+ }
327
+ ]
328
+
329
+ precision = 'm'
330
+ retention = '1h.cpu'
331
+ influxdb.write_points(data, precision, retention)
332
+
333
+ ```
334
+
335
+ Write asynchronously (note that a retention policy cannot be specified for asynchronous writes):
278
336
 
279
337
  ``` ruby
280
338
  require 'influxdb'
@@ -283,7 +341,6 @@ username = 'foo'
283
341
  password = 'bar'
284
342
  database = 'site_development'
285
343
  name = 'foobar'
286
- time_precision = 's'
287
344
 
288
345
  influxdb = InfluxDB::Client.new database,
289
346
  username: username,
@@ -299,7 +356,7 @@ data = {
299
356
  influxdb.write_point(name, data)
300
357
  ```
301
358
 
302
- Write data via UDP:
359
+ Write data via UDP (note that a retention policy cannot be specified for UDP writes):
303
360
 
304
361
  ``` ruby
305
362
  require 'influxdb'
@@ -333,8 +390,8 @@ influxdb = InfluxDB::Client.new database,
333
390
  influxdb.query 'select * from time_series_1' # results are grouped by name, but also their tags
334
391
 
335
392
  # result:
336
- [{"name"=>"time_series_1", "tags"=>{"region"=>"uk"}, "values"=>[{"time"=>"2015-07-09T09:03:31Z", "count"=>32, "value"=>0.9673}, {"time"=>"2015-07-09T09:03:49Z", "count"=>122, "value"=>0.4444}]},
337
- {"name"=>"time_series_1", "tags"=>{"region"=>"us"}, "values"=>[{"time"=>"2015-07-09T09:02:54Z", "count"=>55, "value"=>0.4343}]}]
393
+ # [{"name"=>"time_series_1", "tags"=>{"region"=>"uk"}, "values"=>[{"time"=>"2015-07-09T09:03:31Z", "count"=>32, "value"=>0.9673}, {"time"=>"2015-07-09T09:03:49Z", "count"=>122, "value"=>0.4444}]},
394
+ # {"name"=>"time_series_1", "tags"=>{"region"=>"us"}, "values"=>[{"time"=>"2015-07-09T09:02:54Z", "count"=>55, "value"=>0.4343}]}]
338
395
 
339
396
  # with a block:
340
397
  influxdb.query 'select * from time_series_1' do |name, tags, points|
@@ -346,6 +403,22 @@ end
346
403
  # time_series_1 [ {"region"=>"us"} ] => [{"time"=>"2015-07-09T09:02:54Z", "count"=>55, "value"=>0.4343}]
347
404
  ```
348
405
 
406
+ If you would rather receive points with integer timestamp, it's possible to set `epoch` parameter:
407
+
408
+ ``` ruby
409
+ # globally, on client initialization:
410
+ influxdb = InfluxDB::Client.new database, epoch: 's'
411
+
412
+ influxdb.query 'select * from time_series'
413
+ # result:
414
+ # [{"name"=>"time_series", "tags"=>{"region"=>"uk"}, "values"=>[{"time"=>1438411376, "count"=>32, "value"=>0.9673}]}]
415
+
416
+ # or for a specific query call:
417
+ influxdb.query 'select * from time_series', epoch: 'ms'
418
+ # result:
419
+ # [{"name"=>"time_series", "tags"=>{"region"=>"uk"}, "values"=>[{"time"=>1438411376000, "count"=>32, "value"=>0.9673}]}]
420
+ ```
421
+
349
422
  By default, InfluxDB::Client will denormalize points (received from InfluxDB as columns and rows), if you want to get _raw_ data add `denormalize: false` to initialization options or to query itself:
350
423
 
351
424
  ``` ruby
@@ -19,7 +19,8 @@ module InfluxDB
19
19
  :read_timeout,
20
20
  :retry,
21
21
  :prefix,
22
- :denormalize
22
+ :denormalize,
23
+ :epoch
23
24
 
24
25
  attr_reader :async, :udp
25
26
 
@@ -44,6 +45,7 @@ module InfluxDB
44
45
  @udp = opts.fetch(:udp, false)
45
46
  @retry = opts.fetch(:retry, nil)
46
47
  @denormalize = opts.fetch(:denormalize, true)
48
+ @epoch = opts.fetch(:epoch, false)
47
49
  @retry =
48
50
  case @retry
49
51
  when Integer
@@ -8,10 +8,9 @@ module InfluxDB
8
8
 
9
9
  # rubocop:disable Metrics/MethodLength
10
10
  def query(query, opts = {})
11
- precision = opts.fetch(:precision, config.time_precision)
12
11
  denormalize = opts.fetch(:denormalize, config.denormalize)
13
-
14
- url = full_url("/query", q: query, db: config.database, precision: precision)
12
+ params = query_params(query, opts)
13
+ url = full_url("/query", params)
15
14
  series = fetch_series(get(url, parse: true))
16
15
 
17
16
  if block_given?
@@ -37,27 +36,37 @@ module InfluxDB
37
36
  # values: {value: 0.9999},
38
37
  # }
39
38
  # ])
40
- def write_points(data, precision = nil)
39
+ def write_points(data, precision = nil, retention_policy = nil)
41
40
  data = data.is_a?(Array) ? data : [data]
42
41
  payload = generate_payload(data)
43
- writer.write(payload, precision)
42
+ writer.write(payload, precision, retention_policy)
44
43
  end
45
44
 
46
45
  # Example:
47
46
  # write_point('cpu', tags: {region: 'us'}, values: {internal: 60})
48
- def write_point(series, data, precision = nil)
49
- data.merge!(series: series)
50
- write_points(data, precision)
47
+ def write_point(series, data, precision = nil, retention_policy = nil)
48
+ write_points(data.merge(series: series), precision, retention_policy)
51
49
  end
52
50
 
53
- def write(data, precision)
51
+ def write(data, precision, retention_policy = nil)
54
52
  precision ||= config.time_precision
55
- url = full_url("/write", db: config.database, precision: precision)
53
+ params = { db: config.database, precision: precision }
54
+ params[:rp] = retention_policy if retention_policy
55
+ url = full_url("/write", params)
56
56
  post(url, data)
57
57
  end
58
58
 
59
59
  private
60
60
 
61
+ def query_params(query, opts)
62
+ precision = opts.fetch(:precision, config.time_precision)
63
+ epoch = opts.fetch(:epoch, config.epoch)
64
+
65
+ params = { q: query, db: config.database, precision: precision }
66
+ params.merge!(epoch: epoch) if epoch
67
+ params
68
+ end
69
+
61
70
  def denormalized_series_list(series)
62
71
  series.map do |s|
63
72
  {
@@ -8,7 +8,7 @@ module InfluxDB
8
8
  end
9
9
 
10
10
  def list_retention_policies(database)
11
- resp = execute("SHOW RETENTION POLICIES \"#{database}\"", parse: true)
11
+ resp = execute("SHOW RETENTION POLICIES ON \"#{database}\"", parse: true)
12
12
  data = fetch_series(resp).fetch(0)
13
13
 
14
14
  data['values'].map do |policy|
@@ -21,6 +21,12 @@ module InfluxDB
21
21
  def delete_retention_policy(name, database)
22
22
  execute("DROP RETENTION POLICY \"#{name}\" ON #{database}")
23
23
  end
24
+
25
+ def alter_retention_policy(name, database, duration, replication, default = false)
26
+ execute(
27
+ "ALTER RETENTION POLICY \"#{name}\" ON #{database} "\
28
+ "DURATION #{duration} REPLICATION #{replication}#{default ? ' DEFAULT' : ''}")
29
+ end
24
30
  end
25
31
  end
26
32
  end
@@ -15,11 +15,20 @@ module InfluxDB
15
15
  execute("SET PASSWORD FOR #{username} = '#{password}'")
16
16
  end
17
17
 
18
+ # permission => [:all]
19
+ def grant_user_admin_privileges(username)
20
+ execute("GRANT ALL PRIVILEGES TO #{username}")
21
+ end
22
+
18
23
  # permission => [:read|:write|:all]
19
24
  def grant_user_privileges(username, database, permission)
20
25
  execute("GRANT #{permission.to_s.upcase} ON #{database} TO #{username}")
21
26
  end
22
27
 
28
+ def list_user_grants(username)
29
+ execute("SHOW GRANTS FOR #{username}")
30
+ end
31
+
23
32
  # permission => [:read|:write|:all]
24
33
  def revoke_user_privileges(username, database, permission)
25
34
  execute("REVOKE #{permission.to_s.upcase} ON #{database} FROM #{username}")
@@ -1,3 +1,3 @@
1
1
  module InfluxDB # :nodoc:
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  end
@@ -12,7 +12,7 @@ module InfluxDB
12
12
  @config = config
13
13
  end
14
14
 
15
- def write(data, _precision = nil)
15
+ def write(data, _precision = nil, _retention_policy = nil)
16
16
  data = data.is_a?(Array) ? data : [data]
17
17
  data.map { |p| worker.push(p) }
18
18
  end
@@ -13,7 +13,7 @@ module InfluxDB
13
13
  socket.connect(host, port)
14
14
  end
15
15
 
16
- def write(payload, _precision = nil)
16
+ def write(payload, _precision = nil, _retention_policy = nil)
17
17
  socket.send(payload, 0)
18
18
  end
19
19
  end
@@ -23,7 +23,7 @@ describe InfluxDB::Client do
23
23
 
24
24
  before do
25
25
  stub_request(:get, "http://influxdb.test:9999/query").with(
26
- query: { u: "username", p: "password", q: "SHOW RETENTION POLICIES \"database\"" }
26
+ query: { u: "username", p: "password", q: "SHOW RETENTION POLICIES ON \"database\"" }
27
27
  ).to_return(body: JSON.generate(response), status: 200)
28
28
  end
29
29
 
@@ -81,4 +81,42 @@ describe InfluxDB::Client do
81
81
  expect(subject.delete_retention_policy('1h.cpu', 'foo')).to be_a(Net::HTTPOK)
82
82
  end
83
83
  end
84
+
85
+ describe "#alter_retention_policy" do
86
+ context "default" do
87
+ before do
88
+ stub_request(:get, "http://influxdb.test:9999/query")
89
+ .with(
90
+ query:
91
+ {
92
+ u: "username",
93
+ p: "password",
94
+ q: "ALTER RETENTION POLICY \"1h.cpu\" ON foo DURATION 1h REPLICATION 2 DEFAULT"
95
+ }
96
+ )
97
+ end
98
+
99
+ it "should GET to alter a new database" do
100
+ expect(subject.alter_retention_policy('1h.cpu', 'foo', '1h', 2, true)).to be_a(Net::HTTPOK)
101
+ end
102
+ end
103
+
104
+ context "non-default" do
105
+ before do
106
+ stub_request(:get, "http://influxdb.test:9999/query")
107
+ .with(
108
+ query:
109
+ {
110
+ u: "username",
111
+ p: "password",
112
+ q: "ALTER RETENTION POLICY \"1h.cpu\" ON foo DURATION 1h REPLICATION 2"
113
+ }
114
+ )
115
+ end
116
+
117
+ it "should GET to alter a new database" do
118
+ expect(subject.alter_retention_policy('1h.cpu', 'foo', '1h', 2)).to be_a(Net::HTTPOK)
119
+ end
120
+ end
121
+ end
84
122
  end
@@ -50,6 +50,21 @@ describe InfluxDB::Client do
50
50
  end
51
51
  end
52
52
 
53
+ describe "#grant_user_admin_privileges" do
54
+ let(:user) { 'useruser' }
55
+ let(:query) { "GRANT ALL PRIVILEGES TO #{user}" }
56
+
57
+ before do
58
+ stub_request(:get, "http://influxdb.test:9999/query").with(
59
+ query: { u: "username", p: "password", q: query }
60
+ )
61
+ end
62
+
63
+ it "should GET to grant privileges for a user on a database" do
64
+ expect(subject.grant_user_admin_privileges(user)).to be_a(Net::HTTPOK)
65
+ end
66
+ end
67
+
53
68
  describe "#revoke_user_privileges" do
54
69
  let(:user) { 'useruser' }
55
70
  let(:perm) { :write }
@@ -124,4 +139,19 @@ describe InfluxDB::Client do
124
139
  expect(subject.list_users).to eq(expected_result)
125
140
  end
126
141
  end
142
+
143
+ describe "#list_user_grants" do
144
+ let(:user) { 'useruser' }
145
+ let(:list_query) { "SHOW GRANTS FOR #{user}" }
146
+
147
+ before do
148
+ stub_request(:get, "http://influxdb.test:9999/query").with(
149
+ query: { u: "username", p: "password", q: list_query},
150
+ ).to_return(:status => 200, :body => "", :headers => {})
151
+ end
152
+
153
+ it "should GET for a user" do
154
+ expect(subject.list_user_grants(user)).to be_a(Net::HTTPOK)
155
+ end
156
+ end
127
157
  end
@@ -145,5 +145,38 @@ describe InfluxDB::Client do
145
145
  expect(results).to eq(expected_result)
146
146
  end
147
147
  end
148
+
149
+ context "with epoch set to seconds" do
150
+ let(:args) { {epoch: 's'} }
151
+
152
+ let(:response) do
153
+ { "results" =>
154
+ [{ "series" =>
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
+ }
160
+ end
161
+ let(:expected_result) do
162
+ [{ "name" => "cpu", "tags" => { "region" => "pl" },
163
+ "values" => [{ "time" => 1438580576, "temp" => 34, "value" => 0.343443 }] },
164
+ { "name" => "cpu", "tags" => { "region" => "us" },
165
+ "values" => [{ "time" => 1438612976, "temp" => 92, "value" => 0.3445 },
166
+ { "time" => 1438612989, "temp" => 68, "value" => 0.8787 }]
167
+ }]
168
+ end
169
+ let(:query) { 'SELECT * FROM cpu' }
170
+
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
+ it "should return results with integer timestamp" do
178
+ expect(subject.query(query)).to eq(expected_result)
179
+ end
180
+ end
148
181
  end
149
182
  end
@@ -40,6 +40,13 @@ describe InfluxDB::Client do
40
40
  it "should POST to add single point" do
41
41
  expect(subject.write_point(series, data)).to be_a(Net::HTTPOK)
42
42
  end
43
+
44
+ it "should not mutate data object" do
45
+ original_data = data
46
+ subject.write_point(series, data)
47
+ expect(data[:series]).to be_nil
48
+ expect(original_data).to eql(data)
49
+ end
43
50
  end
44
51
 
45
52
  describe "#write_points" do
@@ -136,5 +143,35 @@ describe InfluxDB::Client do
136
143
  expect(subject.write_points(data, 'm')).to be_a(Net::HTTPOK)
137
144
  end
138
145
  end
146
+
147
+ context "with retention policy" do
148
+ let(:data) do
149
+ [{
150
+ series: 'cpu',
151
+ values: { temp: 88, value: 54 }
152
+ },
153
+ {
154
+ series: 'gpu',
155
+ values: { value: 0.5435345 }
156
+ }]
157
+ end
158
+
159
+ let(:body) do
160
+ data.map do |point|
161
+ InfluxDB::PointValue.new(point).dump
162
+ end.join("\n")
163
+ end
164
+
165
+ before do
166
+ stub_request(:post, "http://influxdb.test:9999/write").with(
167
+ query: { u: "username", p: "password", precision: 's', db: database, rp: 'rp_1_hour' },
168
+ headers: { "Content-Type" => "application/octet-stream" },
169
+ body: body
170
+ )
171
+ end
172
+ it "should POST multiple points" do
173
+ expect(subject.write_points(data, nil, 'rp_1_hour')).to be_a(Net::HTTPOK)
174
+ end
175
+ end
139
176
  end
140
177
  end
@@ -19,6 +19,7 @@ describe InfluxDB::Config do
19
19
  specify { expect(conf.denormalize).to be_truthy }
20
20
  specify { expect(conf).not_to be_udp }
21
21
  specify { expect(conf).not_to be_async }
22
+ specify { expect(conf.epoch).to be_falsey }
22
23
  end
23
24
 
24
25
  context "with no database specified" do
@@ -38,6 +39,7 @@ describe InfluxDB::Config do
38
39
  specify { expect(conf.username).to eq "username" }
39
40
  specify { expect(conf.password).to eq "password" }
40
41
  specify { expect(conf.time_precision).to eq "m" }
42
+ specify { expect(conf.epoch).to be_falsey }
41
43
  end
42
44
 
43
45
  context "with both a database and options specified" do
@@ -58,6 +60,7 @@ describe InfluxDB::Config do
58
60
  specify { expect(conf.username).to eq "username" }
59
61
  specify { expect(conf.password).to eq "password" }
60
62
  specify { expect(conf.time_precision).to eq "m" }
63
+ specify { expect(conf.epoch).to be_falsey }
61
64
  end
62
65
 
63
66
  context "with ssl option specified" do
@@ -115,4 +118,10 @@ describe InfluxDB::Config do
115
118
 
116
119
  specify { expect(conf).to be_async }
117
120
  end
121
+
122
+ context "with epoch specified as seconds" do
123
+ let(:args) { [{ epoch: 's' }] }
124
+
125
+ specify { expect(conf.epoch).to eq 's' }
126
+ end
118
127
  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.2
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Todd Persen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-29 00:00:00.000000000 Z
11
+ date: 2015-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json