influxdb 0.3.14 → 0.3.15

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ae726ac300f9a2011eba6e9ac4e6085637cf914d
4
- data.tar.gz: ed8ecb52b432e865b83fd4d52d7b16c8200f38f9
3
+ metadata.gz: 60063db18e559aa688b4c54f7b7b4a9b10112249
4
+ data.tar.gz: e2babb896952b556975099b7fc181401687211c9
5
5
  SHA512:
6
- metadata.gz: abcaa0deb749051a1dfd578f4f10686b6fab9f607a59105747f4cf9f35e556de8831c36e1e72b7d01358816cf45859dda54d52f1830601f080c13b12a1badb52
7
- data.tar.gz: 4bba860e2fc1bea053025979288d255d40e2cb775a11a1e59f4231284b439b560c5b4d7ef8bbfffc6f703ecd934dc77f8f2674bd049e71ad8b6aa83566128a04
6
+ metadata.gz: 922a93ef68a4b71a1dc33ad5d2b811af017db80b28899f0ac355bafe9551a3ce69d3ff9e064ff949f7a5fe39442d031ad58404ccddfb877318626d5370d2268f
7
+ data.tar.gz: add867058a65debfe4a31d0f8f11e2f94c46aa17d16bfa8b20da2d4608ab655ed80712bb1330a2897356d030181a86d7e7eac720d147bc14894182bdaedf39f5
@@ -1,12 +1,12 @@
1
1
  AllCops:
2
2
  Include:
3
- - 'Rakefile'
4
- - '*.gemspec'
5
- - 'lib/**/*.rb'
6
- - 'spec/**/*.rb'
3
+ - 'Rakefile'
4
+ - '*.gemspec'
5
+ - 'lib/**/*.rb'
6
+ - 'spec/**/*.rb'
7
7
  Exclude:
8
- - 'bin/**/*'
9
- - 'smoke/**/*'
8
+ - 'bin/**/*'
9
+ - 'smoke/**/*'
10
10
  DisplayCopNames: true
11
11
  StyleGuideCopsOnly: false
12
12
  TargetRubyVersion: 1.9
@@ -29,8 +29,16 @@ Style/RescueModifier:
29
29
  Metrics/LineLength:
30
30
  Max: 100
31
31
  Exclude:
32
- - 'spec/**/*.rb'
32
+ - 'spec/**/*.rb'
33
33
 
34
34
  Metrics/ModuleLength:
35
35
  CountComments: false # count full line comments?
36
36
  Max: 120
37
+
38
+ Style/TrailingCommaInLiteral:
39
+ EnforcedStyleForMultiline: comma
40
+ Exclude:
41
+ - "spec/**/*.rb"
42
+
43
+ Metrics/AbcSize:
44
+ Max: 20
@@ -35,7 +35,7 @@ matrix:
35
35
  - rvm: 2.4.0
36
36
  env: TEST_TASK=smoke influx_version=1.1.0 pkghash=682904c350ecfc2a60ec9c6c08453ef2
37
37
  - rvm: 2.4.0
38
- env: TEST_TASK=smoke influx_version=1.2.0 pkghash=f79959802930c7e9d6e81ffd366c0629
38
+ env: TEST_TASK=smoke influx_version=1.2.4 pkghash=0545d67217393282188e5d5cdedfdc85
39
39
  - rvm: 2.4.0
40
40
  env: TEST_TASK=smoke influx_version=nightly channel=nightlies
41
41
  fail_fast: true
@@ -4,7 +4,16 @@ For the full commit log, [see here](https://github.com/influxdata/influxdb-ruby/
4
4
 
5
5
  ## Unreleased changes
6
6
 
7
- - None.
7
+ - nothing yet
8
+
9
+ ## v0.3.15, released 2017-07-17
10
+
11
+ - Bugfix for `InfluxDB::Client#list_series` when no series available
12
+ (#195, @skladd).
13
+ - Clarified/expanded docs (also #190, @paneq).
14
+ - Added preliminary `show_field_keys` method to `InfluxDB::Client` (note:
15
+ the API for this is not stable yet).
16
+ - Degraded dependency on "cause" from runtime to development.
8
17
 
9
18
  ## v0.3.14, released 2017-02-06
10
19
 
@@ -19,7 +28,6 @@ For the full commit log, [see here](https://github.com/influxdata/influxdb-ruby/
19
28
  `#write` now accept an additional parameter to override the database on
20
29
  invokation time (#173, #176, @jfragoulis).
21
30
 
22
-
23
31
  ## v0.3.12, released 2016-11-15
24
32
 
25
33
  - Bugfix for broken Unicode support (regression introduced in #169).
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
1
  # influxdb-ruby
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/influxdb.svg)](https://badge.fury.io/rb/influxdb)
3
4
  [![Build Status](https://travis-ci.org/influxdata/influxdb-ruby.svg?branch=master)](https://travis-ci.org/influxdata/influxdb-ruby)
4
5
 
5
6
  The official Ruby client library for [InfluxDB](https://influxdata.com/time-series-platform/influxdb/).
@@ -12,17 +13,19 @@ Maintained by [@toddboom](https://github.com/toddboom) and [@dmke](https://githu
12
13
  - [Installation](#installation)
13
14
  - [Usage](#usage)
14
15
  - [Creating a client](#creating-a-client)
16
+ - [Writing data](#writing-data)
17
+ - [A Note About Time Precision](#a-note-about-time-precision)
18
+ - [Querying](#querying)
19
+ - [Advanced Topics](#advanced-topics)
15
20
  - [Administrative tasks](#administrative-tasks)
16
21
  - [Continuous queries](#continuous-queries)
17
22
  - [Retention policies](#retention-policies)
18
- - [Writing data](#writing-data)
19
23
  - [Reading data](#reading-data)
20
- - [Querying](#querying)
21
24
  - [De-normalization](#de--normalization)
22
25
  - [Streaming response](#streaming-response)
23
26
  - [Retry](#retry)
24
- - [Testing](#testing)
25
- - [Contributing](#contributing)
27
+ - [Testing](#testing)
28
+ - [Contributing](#contributing)
26
29
 
27
30
  ## Platform support
28
31
 
@@ -72,187 +75,6 @@ require 'influxdb'
72
75
  influxdb = InfluxDB::Client.new hosts: ["influxdb1.domain.com", "influxdb2.domain.com"]
73
76
  ```
74
77
 
75
- ### Administrative tasks
76
-
77
- Create a database:
78
-
79
- ``` ruby
80
- database = 'site_development'
81
-
82
- influxdb.create_database(database)
83
- ```
84
-
85
- Delete a database:
86
-
87
- ``` ruby
88
- database = 'site_development'
89
-
90
- influxdb.delete_database(database)
91
- ```
92
-
93
- List databases:
94
-
95
- ``` ruby
96
- influxdb.list_databases
97
- ```
98
-
99
- Create a user for a database:
100
-
101
- ``` ruby
102
- database = 'site_development'
103
- new_username = 'foo'
104
- new_password = 'bar'
105
- permission = :write
106
-
107
- # with all permissions
108
- influxdb.create_database_user(database, new_username, new_password)
109
-
110
- # with specified permission - options are: :read, :write, :all
111
- influxdb.create_database_user(database, new_username, new_password, permissions: permission)
112
- ```
113
-
114
- Update a user password:
115
-
116
- ``` ruby
117
- username = 'foo'
118
- new_password = 'bar'
119
-
120
- influxdb.update_user_password(username, new_password)
121
- ```
122
-
123
- Grant user privileges on database:
124
-
125
- ``` ruby
126
- username = 'foobar'
127
- database = 'foo'
128
- permission = :read # options are :read, :write, :all
129
-
130
- influxdb.grant_user_privileges(username, database, permission)
131
- ```
132
-
133
- Revoke user privileges from database:
134
-
135
- ``` ruby
136
- username = 'foobar'
137
- database = 'foo'
138
- permission = :write # options are :read, :write, :all
139
-
140
- influxdb.revoke_user_privileges(username, database, permission)
141
- ```
142
- Delete a user:
143
-
144
- ``` ruby
145
- username = 'foobar'
146
-
147
- influxdb.delete_user(username)
148
- ```
149
-
150
- List users:
151
-
152
- ``` ruby
153
- influxdb.list_users
154
- ```
155
-
156
- Create cluster admin:
157
-
158
- ``` ruby
159
- username = 'foobar'
160
- password = 'pwd'
161
-
162
- influxdb.create_cluster_admin(username, password)
163
- ```
164
-
165
- List cluster admins:
166
-
167
- ``` ruby
168
- influxdb.list_cluster_admins
169
- ```
170
-
171
- Revoke cluster admin privileges from user:
172
-
173
- ``` ruby
174
- username = 'foobar'
175
-
176
- influxdb.revoke_cluster_admin_privileges(username)
177
- ```
178
-
179
- ### Continuous Queries
180
-
181
- List continuous queries of a database:
182
-
183
- ``` ruby
184
- database = 'foo'
185
-
186
- influxdb.list_continuous_queries(database)
187
- ```
188
-
189
- Create a continuous query for a database:
190
-
191
- ``` ruby
192
- database = 'foo'
193
- name = 'clicks_count'
194
- query = 'SELECT COUNT(name) INTO clicksCount_1h FROM clicks GROUP BY time(1h)'
195
-
196
- influxdb.create_continuous_query(name, database, query)
197
- ```
198
-
199
- Additionally, you can specify the resample interval and the time range over
200
- which the CQ runs:
201
-
202
- ``` ruby
203
- influxdb.create_continuous_query(name, database, query, resample_every: "10m", resample_for: "65m")
204
- ```
205
-
206
- Delete a continuous query from a database:
207
-
208
- ``` ruby
209
- database = 'foo'
210
- name = 'clicks_count'
211
-
212
- influxdb.delete_continuous_query(name, database)
213
- ```
214
-
215
- ### Retention Policies
216
-
217
- List retention policies of a database:
218
-
219
- ``` ruby
220
- database = 'foo'
221
-
222
- influxdb.list_retention_policies(database)
223
- ```
224
-
225
- Create a retention policy for a database:
226
-
227
- ``` ruby
228
- database = 'foo'
229
- name = '1h.cpu'
230
- duration = '10m'
231
- replication = 2
232
-
233
- influxdb.create_retention_policy(name, database, duration, replication)
234
- ```
235
-
236
- Delete a retention policy from a database:
237
-
238
- ``` ruby
239
- database = 'foo'
240
- name = '1h.cpu'
241
-
242
- influxdb.delete_retention_policy(name, database)
243
- ```
244
-
245
- Alter a retention policy for a database:
246
-
247
- ``` ruby
248
- database = 'foo'
249
- name = '1h.cpu'
250
- duration = '10m'
251
- replication = 2
252
-
253
- influxdb.alter_retention_policy(name, database, duration, replication)
254
- ```
255
-
256
78
  ### Writing data
257
79
 
258
80
  Write some data:
@@ -306,24 +128,44 @@ influxdb.write_point(name, data)
306
128
 
307
129
  # or in a method call:
308
130
  influxdb.write_point(name, data, time_precision)
309
-
310
131
  ```
311
132
 
133
+ > ### A Note About Time Precision
134
+ >
135
+ > The default precision (in this Rubygem) is `"s"` (second), as Ruby's
136
+ > `Time#to_i` operates on this resolution.
137
+ >
138
+ > If you write data points with sub-second resolution (for example
139
+ > via `Time#to_r`), you need to configure your client instance with an
140
+ > appropiate `time_precision` option **and** you'll need to provide a
141
+ > timestamp value which reflects this precision:
142
+ >
143
+ > ```ruby
144
+ > influxdb = InfluxDB::Client.new time_precision: "ms"
145
+ > time = (Time.now.to_r * 10**6).to_i
146
+ > influxdb.write_point("foobar", { values: { n: 42 }, timestamp: time })
147
+ > ```
148
+
149
+ Allowed values for `time_precision` are:
150
+
151
+ - `"ns"` or `nil` for nanosecond
152
+ - `"u"` for microsecond
153
+ - `"ms"` for millisecond
154
+ - `"s"` for second
155
+ - `"m"` for minute
156
+ - `"h"` for hour
157
+
312
158
  Write data with a specific retention policy:
313
159
 
314
160
  ``` ruby
315
- require 'influxdb'
316
-
317
- username = 'foo'
318
- password = 'bar'
319
161
  database = 'site_development'
320
162
  name = 'foobar'
321
163
  precision = 's'
322
164
  retention = '1h.cpu'
323
165
 
324
166
  influxdb = InfluxDB::Client.new database,
325
- username: username,
326
- password: password
167
+ username: "foo",
168
+ password: "bar"
327
169
 
328
170
  data = {
329
171
  values: { value: 0 },
@@ -337,18 +179,14 @@ influxdb.write_point(name, data, precision, retention)
337
179
  Write data while choosing the database:
338
180
 
339
181
  ``` ruby
340
- require 'influxdb'
341
-
342
- username = 'foo'
343
- password = 'bar'
344
182
  database = 'site_development'
345
183
  name = 'foobar'
346
184
  precision = 's'
347
185
  retention = '1h.cpu'
348
186
 
349
187
  influxdb = InfluxDB::Client.new {
350
- username: username,
351
- password: password
188
+ username: "foo",
189
+ password: "bar"
352
190
  }
353
191
 
354
192
  data = {
@@ -363,7 +201,6 @@ influxdb.write_point(name, data, precision, retention, database)
363
201
  Write multiple points in a batch (performance boost):
364
202
 
365
203
  ``` ruby
366
-
367
204
  data = [
368
205
  {
369
206
  series: 'cpu',
@@ -402,22 +239,17 @@ data = [
402
239
  precision = 'm'
403
240
  retention = '1h.cpu'
404
241
  influxdb.write_points(data, precision, retention)
405
-
406
242
  ```
407
243
 
408
244
  Write asynchronously (note that a retention policy cannot be specified for asynchronous writes):
409
245
 
410
246
  ``` ruby
411
- require 'influxdb'
412
-
413
- username = 'foo'
414
- password = 'bar'
415
247
  database = 'site_development'
416
248
  name = 'foobar'
417
249
 
418
250
  influxdb = InfluxDB::Client.new database,
419
- username: username,
420
- password: password,
251
+ username: "foo",
252
+ password: "bar",
421
253
  async: true
422
254
 
423
255
  data = {
@@ -444,21 +276,13 @@ async_options = {
444
276
  sleep_interval: 5
445
277
  }
446
278
 
447
- influxdb = InfluxDB::Client.new database,
448
- username: username,
449
- password: password,
450
- async: async_options
279
+ influxdb = InfluxDB::Client.new database, async: async_options
451
280
  ```
452
281
 
453
-
454
282
  Write data via UDP (note that a retention policy cannot be specified for UDP writes):
455
283
 
456
284
  ``` ruby
457
- require 'influxdb'
458
- host = '127.0.0.1'
459
- port = 4444
460
-
461
- influxdb = InfluxDB::Client.new udp: { host: host, port: port }
285
+ influxdb = InfluxDB::Client.new udp: { host: "127.0.0.1", port: 4444 }
462
286
 
463
287
  name = 'hitchhiker'
464
288
 
@@ -473,30 +297,22 @@ influxdb.write_point(name, data)
473
297
  Discard write errors:
474
298
 
475
299
  ``` ruby
476
- require 'influxdb'
477
- host = '127.0.0.1'
478
- port = 4444
479
-
480
300
  influxdb = InfluxDB::Client.new(
481
- udp: { host: host, port: port },
301
+ udp: { host: "127.0.0.1", port: 4444 },
482
302
  discard_write_errors: true
483
303
  )
484
304
 
485
305
  influxdb.write_point('hitchhiker', { values: { value: 666 } })
486
306
  ```
487
307
 
488
- ### Reading data
489
308
 
490
- #### Querying
309
+ ### Querying
491
310
 
492
311
  ``` ruby
493
- username = 'foo'
494
- password = 'bar'
495
312
  database = 'site_development'
496
-
497
313
  influxdb = InfluxDB::Client.new database,
498
- username: username,
499
- password: password
314
+ username: "foo",
315
+ password: "bar"
500
316
 
501
317
  # without a block:
502
318
  influxdb.query 'select * from time_series_1 group by region'
@@ -523,9 +339,9 @@ influxdb.query 'select * from time_series_1 group by region'
523
339
 
524
340
  # with a block:
525
341
  influxdb.query 'select * from time_series_1 group by region' do |name, tags, points|
526
- puts "#{name} [ #{tags.inspect} ]"
342
+ printf "%s [ %p ]\n", name, tags
527
343
  points.each do |pt|
528
- puts " -> #{pt.inspect}"
344
+ printf " -> %p\n", pt
529
345
  end
530
346
  end
531
347
 
@@ -584,6 +400,190 @@ influxdb.query positional_params_query, params: ["foobar", 42]
584
400
  # select * from time_series_0 where f = 'foobar' and i < 42
585
401
  ```
586
402
 
403
+ ## Advanced Topics
404
+
405
+ ### Administrative tasks
406
+
407
+ Create a database:
408
+
409
+ ``` ruby
410
+ database = 'site_development'
411
+
412
+ influxdb.create_database(database)
413
+ ```
414
+
415
+ Delete a database:
416
+
417
+ ``` ruby
418
+ database = 'site_development'
419
+
420
+ influxdb.delete_database(database)
421
+ ```
422
+
423
+ List databases:
424
+
425
+ ``` ruby
426
+ influxdb.list_databases
427
+ ```
428
+
429
+ Create a user for a database:
430
+
431
+ ``` ruby
432
+ database = 'site_development'
433
+ new_username = 'foo'
434
+ new_password = 'bar'
435
+ permission = :write
436
+
437
+ # with all permissions
438
+ influxdb.create_database_user(database, new_username, new_password)
439
+
440
+ # with specified permission - options are: :read, :write, :all
441
+ influxdb.create_database_user(database, new_username, new_password, permissions: permission)
442
+ ```
443
+
444
+ Update a user password:
445
+
446
+ ``` ruby
447
+ username = 'foo'
448
+ new_password = 'bar'
449
+
450
+ influxdb.update_user_password(username, new_password)
451
+ ```
452
+
453
+ Grant user privileges on database:
454
+
455
+ ``` ruby
456
+ username = 'foobar'
457
+ database = 'foo'
458
+ permission = :read # options are :read, :write, :all
459
+
460
+ influxdb.grant_user_privileges(username, database, permission)
461
+ ```
462
+
463
+ Revoke user privileges from database:
464
+
465
+ ``` ruby
466
+ username = 'foobar'
467
+ database = 'foo'
468
+ permission = :write # options are :read, :write, :all
469
+
470
+ influxdb.revoke_user_privileges(username, database, permission)
471
+ ```
472
+ Delete a user:
473
+
474
+ ``` ruby
475
+ username = 'foobar'
476
+
477
+ influxdb.delete_user(username)
478
+ ```
479
+
480
+ List users:
481
+
482
+ ``` ruby
483
+ influxdb.list_users
484
+ ```
485
+
486
+ Create cluster admin:
487
+
488
+ ``` ruby
489
+ username = 'foobar'
490
+ password = 'pwd'
491
+
492
+ influxdb.create_cluster_admin(username, password)
493
+ ```
494
+
495
+ List cluster admins:
496
+
497
+ ``` ruby
498
+ influxdb.list_cluster_admins
499
+ ```
500
+
501
+ Revoke cluster admin privileges from user:
502
+
503
+ ``` ruby
504
+ username = 'foobar'
505
+
506
+ influxdb.revoke_cluster_admin_privileges(username)
507
+ ```
508
+
509
+ ### Continuous Queries
510
+
511
+ List continuous queries of a database:
512
+
513
+ ``` ruby
514
+ database = 'foo'
515
+
516
+ influxdb.list_continuous_queries(database)
517
+ ```
518
+
519
+ Create a continuous query for a database:
520
+
521
+ ``` ruby
522
+ database = 'foo'
523
+ name = 'clicks_count'
524
+ query = 'SELECT COUNT(name) INTO clicksCount_1h FROM clicks GROUP BY time(1h)'
525
+
526
+ influxdb.create_continuous_query(name, database, query)
527
+ ```
528
+
529
+ Additionally, you can specify the resample interval and the time range over
530
+ which the CQ runs:
531
+
532
+ ``` ruby
533
+ influxdb.create_continuous_query(name, database, query, resample_every: "10m", resample_for: "65m")
534
+ ```
535
+
536
+ Delete a continuous query from a database:
537
+
538
+ ``` ruby
539
+ database = 'foo'
540
+ name = 'clicks_count'
541
+
542
+ influxdb.delete_continuous_query(name, database)
543
+ ```
544
+
545
+ ### Retention Policies
546
+
547
+ List retention policies of a database:
548
+
549
+ ``` ruby
550
+ database = 'foo'
551
+
552
+ influxdb.list_retention_policies(database)
553
+ ```
554
+
555
+ Create a retention policy for a database:
556
+
557
+ ``` ruby
558
+ database = 'foo'
559
+ name = '1h.cpu'
560
+ duration = '10m'
561
+ replication = 2
562
+
563
+ influxdb.create_retention_policy(name, database, duration, replication)
564
+ ```
565
+
566
+ Delete a retention policy from a database:
567
+
568
+ ``` ruby
569
+ database = 'foo'
570
+ name = '1h.cpu'
571
+
572
+ influxdb.delete_retention_policy(name, database)
573
+ ```
574
+
575
+ Alter a retention policy for a database:
576
+
577
+ ``` ruby
578
+ database = 'foo'
579
+ name = '1h.cpu'
580
+ duration = '10m'
581
+ replication = 2
582
+
583
+ influxdb.alter_retention_policy(name, database, duration, replication)
584
+ ```
585
+
586
+ ### Reading data
587
587
 
588
588
  #### (De-) Normalization
589
589
 
@@ -616,13 +616,12 @@ influxdb.query 'select * from time_series_1 group by region', denormalize: false
616
616
 
617
617
 
618
618
  influxdb.query 'select * from time_series_1 group by region', denormalize: false do |name, tags, points|
619
- puts "#{name} [ #{tags.inspect} ]"
619
+ printf "%s [ %p ]\n", name, tags
620
620
  points.each do |key, values|
621
- puts " #{key.inspect} -> #{values.inspect}"
621
+ printf " %p -> %p\n", key, values
622
622
  end
623
623
  end
624
624
 
625
-
626
625
  # time_series_1 [ {"region"=>"uk"} ]
627
626
  # columns -> ["time", "count", "value"]
628
627
  # values -> [["2015-07-09T09:03:31Z", 32, 0.9673], ["2015-07-09T09:03:49Z", 122, 0.4444]]}
@@ -681,6 +680,7 @@ E, [2016-08-31T23:55:19.562428 #23476] ERROR -- InfluxDB: Failed to contact host
681
680
  InfluxDB::ConnectionError: Tried 8 times to reconnect but failed.
682
681
  ```
683
682
 
683
+
684
684
  ## Testing
685
685
 
686
686
  ```
@@ -20,11 +20,11 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ["lib"]
21
21
 
22
22
  spec.add_runtime_dependency "json"
23
- spec.add_runtime_dependency "cause"
24
23
 
25
24
  spec.add_development_dependency "rake"
26
25
  spec.add_development_dependency "bundler", "~> 1.3"
27
26
  spec.add_development_dependency "rspec", "~> 3.5.0"
28
27
  spec.add_development_dependency "webmock", "~> 2.1.0"
29
28
  spec.add_development_dependency "rubocop", "~> 0.41.2"
29
+ spec.add_development_dependency "cause"
30
30
  end
@@ -1,5 +1,4 @@
1
1
  require 'json'
2
- require 'cause' unless Exception.instance_methods.include?(:cause)
3
2
  require 'thread'
4
3
 
5
4
  module InfluxDB
@@ -49,6 +48,7 @@ module InfluxDB
49
48
  # +:verify_ssl+:: verify ssl server certificate?
50
49
  # +:ssl_ca_cert+:: ssl CA certificate, chainfile or CA path.
51
50
  # The system CA path is automatically included
51
+ # +:retry:: number of times a failed request should be retried. Defaults to infinite.
52
52
  def initialize(*args)
53
53
  opts = args.last.is_a?(Hash) ? args.last : {}
54
54
  opts[:database] = args.first if args.first.is_a? String
@@ -62,7 +62,6 @@ module InfluxDB
62
62
 
63
63
  private
64
64
 
65
- # rubocop:disable Metrics/AbcSize
66
65
  def extract_http_options!(opts)
67
66
  @port = opts.fetch :port, 8086
68
67
  @prefix = opts.fetch :prefix, "".freeze
@@ -36,7 +36,7 @@ module InfluxDB # :nodoc:
36
36
  Net::HTTPHeaderSyntaxError,
37
37
  Net::ProtocolError,
38
38
  SocketError,
39
- (OpenSSL::SSL::SSLError if defined?(OpenSSL))
39
+ (OpenSSL::SSL::SSLError if defined?(OpenSSL)),
40
40
  ].compact.freeze
41
41
 
42
42
  # Exception classes which hint to a larger problem on the server side,
@@ -44,7 +44,7 @@ module InfluxDB # :nodoc:
44
44
  # _don't_ retry a query but escalate it upwards.
45
45
  NON_RECOVERABLE_EXCEPTIONS = [
46
46
  EOFError,
47
- Zlib::Error
47
+ Zlib::Error,
48
48
  ].freeze
49
49
 
50
50
  NON_RECOVERABLE_MESSAGE = "The server has sent incomplete data" \
@@ -7,7 +7,6 @@ module InfluxDB
7
7
  @series = escape data[:series], :measurement
8
8
  @values = escape_values data[:values]
9
9
  @tags = escape_tags data[:tags]
10
-
11
10
  @timestamp = data[:timestamp]
12
11
  end
13
12
 
@@ -26,7 +25,7 @@ module InfluxDB
26
25
  tag_key: ['='.freeze, ' '.freeze, ','.freeze],
27
26
  tag_value: ['='.freeze, ' '.freeze, ','.freeze],
28
27
  field_key: ['='.freeze, ' '.freeze, ','.freeze, '"'.freeze],
29
- field_value: ['"'.freeze]
28
+ field_value: ['"'.freeze],
30
29
  }.freeze
31
30
 
32
31
  def escape(s, type)
@@ -69,8 +69,8 @@ module InfluxDB
69
69
 
70
70
  def write(data, precision, retention_policy = nil, database = nil)
71
71
  params = {
72
- db: database || config.database,
73
- precision: precision || config.time_precision
72
+ db: database || config.database,
73
+ precision: precision || config.time_precision,
74
74
  }
75
75
 
76
76
  params[:rp] = retention_policy if retention_policy
@@ -87,11 +87,12 @@ module InfluxDB
87
87
  chunk_size = opts.fetch(:chunk_size, config.chunk_size)
88
88
  database = opts.fetch(:database, config.database)
89
89
 
90
- params = { q: query, db: database, precision: precision }
91
- params[:epoch] = epoch if epoch
90
+ params = { q: query, db: database }
91
+ params[:precision] = precision if precision
92
+ params[:epoch] = epoch if epoch
92
93
 
93
94
  if chunk_size
94
- params[:chunked] = 'true'
95
+ params[:chunked] = 'true'.freeze
95
96
  params[:chunk_size] = chunk_size
96
97
  end
97
98
 
@@ -102,9 +103,9 @@ module InfluxDB
102
103
  def denormalized_series_list(series)
103
104
  series.map do |s|
104
105
  {
105
- "name" => s["name".freeze],
106
- "tags" => s["tags".freeze],
107
- "values" => denormalize_series(s)
106
+ "name".freeze => s["name".freeze],
107
+ "tags".freeze => s["tags".freeze],
108
+ "values".freeze => denormalize_series(s),
108
109
  }
109
110
  end
110
111
  end
@@ -13,9 +13,20 @@ module InfluxDB
13
13
  resp = execute("SHOW DATABASES".freeze, parse: true)
14
14
  fetch_series(resp)
15
15
  .fetch(0, {})
16
- .fetch('values', [])
16
+ .fetch("values".freeze, [])
17
17
  .flatten
18
- .map { |v| { 'name' => v } }
18
+ .map { |v| { "name".freeze => v } }
19
+ end
20
+
21
+ def show_field_keys
22
+ query("SHOW FIELD KEYS".freeze, precision: nil).each_with_object({}) do |collection, keys|
23
+ name = collection.fetch("name")
24
+ values = collection.fetch("values", [])
25
+
26
+ keys[name] = values.each_with_object({}) do |row, types|
27
+ types[row.fetch("fieldKey")] = [row.fetch("fieldType")]
28
+ end
29
+ end
19
30
  end
20
31
  end
21
32
  end
@@ -8,6 +8,7 @@ module InfluxDB
8
8
  def list_series
9
9
  resp = execute("SHOW SERIES".freeze, parse: true, db: config.database)
10
10
  resp = fetch_series(resp)
11
+ return [] if resp.empty?
11
12
  raw_values(resp[0])
12
13
  .fetch('values'.freeze, [])
13
14
  .map { |val| val[0].split(',')[0] }
@@ -1,3 +1,3 @@
1
1
  module InfluxDB # :nodoc:
2
- VERSION = "0.3.14".freeze
2
+ VERSION = "0.3.15".freeze
3
3
  end
@@ -35,6 +35,23 @@ describe InfluxDB::Client do
35
35
  end
36
36
  end
37
37
 
38
+ describe "GET empty #list_series" do
39
+ let(:response) { { "results" => [{ "series" => [] }] } }
40
+ let(:query) { "SHOW SERIES" }
41
+
42
+ before do
43
+ stub_request(:get, "http://influxdb.test:9999/query").with(
44
+ query: { u: "username", p: "password", q: query, db: "database" }
45
+ ).to_return(
46
+ body: JSON.generate(response)
47
+ )
48
+ end
49
+
50
+ it "returns a empty list" do
51
+ expect(subject.list_series).to eq []
52
+ end
53
+ end
54
+
38
55
  describe "#delete_series" do
39
56
  let(:name) { "events" }
40
57
  let(:query) { "DROP SERIES FROM #{name}" }
@@ -0,0 +1,60 @@
1
+ require "spec_helper"
2
+ require "json"
3
+
4
+ describe InfluxDB::Client do
5
+ let(:subject) do
6
+ described_class.new "database",
7
+ host: "influxdb.test",
8
+ port: 9999,
9
+ username: "username",
10
+ password: "password"
11
+ end
12
+
13
+ let(:query) { nil }
14
+ let(:response) { { "results" => [{ "statement_id" => 0 }] } }
15
+
16
+ before do
17
+ stub_request(:get, "http://influxdb.test:9999/query").with(
18
+ query: { u: "username", p: "password", q: query, db: "database" }
19
+ ).to_return(body: JSON.generate(response))
20
+ end
21
+
22
+ describe "#show_field_keys" do
23
+ let(:query) { "SHOW FIELD KEYS" }
24
+ let(:response) do
25
+ {
26
+ "results" => [{
27
+ "series" => [{
28
+ "name" => "measurement_a",
29
+ "columns" => %w(fieldKey fieldType),
30
+ "values" => [%w(a_string_field string),
31
+ %w(a_boolean_field boolean),
32
+ %w(a_float_field float),
33
+ %w(an_integer_field integer)]
34
+ }, {
35
+ "name" => "measurement_b",
36
+ "columns" => %w(fieldKey fieldType),
37
+ "values" => [%w(another_string string)]
38
+ }]
39
+ }]
40
+ }
41
+ end
42
+ let(:expected_result) do
43
+ {
44
+ "measurement_a" => {
45
+ "a_string_field" => ["string"],
46
+ "a_boolean_field" => ["boolean"],
47
+ "a_float_field" => ["float"],
48
+ "an_integer_field" => ["integer"],
49
+ },
50
+ "measurement_b" => {
51
+ "another_string" => ["string"],
52
+ }
53
+ }
54
+ end
55
+
56
+ it "should GET a list of field/type pairs per measurement" do
57
+ expect(subject.show_field_keys).to eq(expected_result)
58
+ end
59
+ end
60
+ end
@@ -39,35 +39,38 @@ describe InfluxDB::PointValue do
39
39
  'responses,region=eu,status=200 value=5i,threshold=0.54 1436349652'
40
40
  end
41
41
  it 'should have proper form' do
42
- point = InfluxDB::PointValue.new(series: "responses",
43
- values: { value: 5, threshold: 0.54 },
44
- tags: { region: 'eu', status: 200 },
45
- timestamp: 1_436_349_652)
42
+ point = InfluxDB::PointValue.new \
43
+ series: "responses",
44
+ values: { value: 5, threshold: 0.54 },
45
+ tags: { region: 'eu', status: 200 },
46
+ timestamp: 1_436_349_652
46
47
 
47
48
  expect(point.dump).to eq(expected_value)
48
49
  end
49
50
  end
50
51
 
51
- context "with no tags" do
52
+ context "without tags" do
52
53
  let(:expected_value) do
53
54
  "responses value=5i,threshold=0.54 1436349652"
54
55
  end
55
56
  it 'should have proper form' do
56
- point = InfluxDB::PointValue.new(series: "responses",
57
- values: { value: 5, threshold: 0.54 },
58
- timestamp: 1_436_349_652)
57
+ point = InfluxDB::PointValue.new \
58
+ series: "responses",
59
+ values: { value: 5, threshold: 0.54 },
60
+ timestamp: 1_436_349_652
59
61
 
60
62
  expect(point.dump).to eq(expected_value)
61
63
  end
62
64
  end
63
65
 
64
- context "with values only" do
66
+ context "without tags and timestamp" do
65
67
  let(:expected_value) do
66
68
  "responses value=5i,threshold=0.54"
67
69
  end
68
70
  it 'should have proper form' do
69
- point = InfluxDB::PointValue.new(series: "responses",
70
- values: { value: 5, threshold: 0.54 })
71
+ point = InfluxDB::PointValue.new \
72
+ series: "responses",
73
+ values: { value: 5, threshold: 0.54 }
71
74
 
72
75
  expect(point.dump).to eq(expected_value)
73
76
  end
@@ -79,9 +82,10 @@ describe InfluxDB::PointValue do
79
82
  end
80
83
 
81
84
  it "should be omitted" do
82
- point = InfluxDB::PointValue.new(series: "responses",
83
- values: { value: 5 },
84
- tags: { region: "eu", status: nil, other: "", nil => "ignored", "" => "ignored" })
85
+ point = InfluxDB::PointValue.new \
86
+ series: "responses",
87
+ values: { value: 5 },
88
+ tags: { region: "eu", status: nil, other: "", nil => "ignored", "" => "ignored" }
85
89
  expect(point.dump).to eq(expected_value)
86
90
  end
87
91
  end
@@ -1,5 +1,6 @@
1
1
  require "influxdb"
2
2
  require "webmock/rspec"
3
+ require "cause" unless Exception.instance_methods.include?(:cause)
3
4
 
4
5
  begin
5
6
  # rubocop:disable Lint/HandleExceptions
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.3.14
4
+ version: 0.3.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Todd Persen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-06 00:00:00.000000000 Z
11
+ date: 2017-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: json
@@ -24,20 +24,6 @@ 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'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: rake
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +94,20 @@ dependencies:
108
94
  - - "~>"
109
95
  - !ruby/object:Gem::Version
110
96
  version: 0.41.2
97
+ - !ruby/object:Gem::Dependency
98
+ name: cause
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
111
  description: This is the official Ruby library for InfluxDB.
112
112
  email:
113
113
  - influxdb@googlegroups.com
@@ -160,6 +160,7 @@ files:
160
160
  - spec/influxdb/cases/querying_issue_7000_spec.rb
161
161
  - spec/influxdb/cases/querying_spec.rb
162
162
  - spec/influxdb/cases/retry_requests_spec.rb
163
+ - spec/influxdb/cases/show_field_keys_spec.rb
163
164
  - spec/influxdb/cases/udp_client_spec.rb
164
165
  - spec/influxdb/cases/write_points_spec.rb
165
166
  - spec/influxdb/client_spec.rb
@@ -212,6 +213,7 @@ test_files:
212
213
  - spec/influxdb/cases/querying_issue_7000_spec.rb
213
214
  - spec/influxdb/cases/querying_spec.rb
214
215
  - spec/influxdb/cases/retry_requests_spec.rb
216
+ - spec/influxdb/cases/show_field_keys_spec.rb
215
217
  - spec/influxdb/cases/udp_client_spec.rb
216
218
  - spec/influxdb/cases/write_points_spec.rb
217
219
  - spec/influxdb/client_spec.rb