influxdb 0.3.8 → 0.3.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/.rubocop.yml +6 -0
- data/CHANGELOG.md +6 -0
- data/README.md +172 -96
- data/influxdb.gemspec +3 -3
- data/lib/influxdb/client/http.rb +3 -1
- data/lib/influxdb/errors.rb +16 -3
- data/lib/influxdb/query/retention_policy.rb +6 -4
- data/lib/influxdb/version.rb +1 -1
- data/spec/influxdb/cases/query_core_spec.rb +1 -1
- data/spec/influxdb/cases/query_with_params_spec.rb +1 -1
- data/spec/influxdb/client_spec.rb +7 -4
- data/spec/influxdb/query_builder_spec.rb +1 -1
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4126a6d8021cd7ae64f6ebc12bd9760ef482c9df
|
4
|
+
data.tar.gz: 33c78e146fc49a8d0302ae0f4704837d1f3f5b9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b9ec022755c6e03bb0c2473102358c3f60b64eb80a44160ae5b0398d413e5f90c293e596a0996935a35e2ef50a2c90d091a6cb0690eab380bdca5e24b9b06e7
|
7
|
+
data.tar.gz: 0058ee385c54b9b0a70bf794ab16b5a94a617825b58f4a9821fbdc668b0fa37bddea415fb762eab1b6cd7e3d517c2dc5da8d8ed9d9e35ea5fb50d796d27d9de0
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,12 @@ For the full commit log, [see here](https://github.com/influxdata/influxdb-ruby/
|
|
6
6
|
|
7
7
|
- None.
|
8
8
|
|
9
|
+
## v0.3.9, released 2016-09-20
|
10
|
+
|
11
|
+
- Changed retry behaviour slightly. When the server responds with an incomplete
|
12
|
+
response, we now assume a major server-side problem (insufficient resources,
|
13
|
+
e.g. out-of-memory) and cancel any retry attempts (#165, #166).
|
14
|
+
|
9
15
|
## v0.3.8, released 2016-08-31
|
10
16
|
|
11
17
|
- Added support for named and positional query parameters (#160, @retorquere).
|
data/README.md
CHANGED
@@ -5,23 +5,44 @@
|
|
5
5
|
The official Ruby client library for [InfluxDB](https://influxdata.com/time-series-platform/influxdb/).
|
6
6
|
Maintained by [@toddboom](https://github.com/toddboom) and [@dmke](https://github.com/dmke).
|
7
7
|
|
8
|
+
## Contents
|
9
|
+
|
10
|
+
- [Platform support](#platform-support)
|
11
|
+
- [Ruby support](#ruby-support)
|
12
|
+
- [Installation](#installation)
|
13
|
+
- [Usage](#usage)
|
14
|
+
- [Creating a client](#creating-a-client)
|
15
|
+
- [Administrative tasks](#administrative-tasks)
|
16
|
+
- [Continuous queries](#continuous-queries)
|
17
|
+
- [Retention policies](#retention-policies)
|
18
|
+
- [Writing data](#writing-data)
|
19
|
+
- [Reading data](#reading-data)
|
20
|
+
- [Querying](#querying)
|
21
|
+
- [De-normalization](#de--normalization)
|
22
|
+
- [Streaming response](#streaming-response)
|
23
|
+
- [Retry](#retry)
|
24
|
+
- [Testing](#testing)
|
25
|
+
- [Contributing](#contributing)
|
26
|
+
|
8
27
|
## Platform support
|
9
28
|
|
10
|
-
> **Support for InfluxDB v0.8.x is now deprecated**. The final version of this
|
11
|
-
> will support the older InfluxDB interface is `v0.1.9`, which is
|
12
|
-
> tagged on this repository.
|
29
|
+
> **Support for InfluxDB v0.8.x is now deprecated**. The final version of this
|
30
|
+
> library that will support the older InfluxDB interface is `v0.1.9`, which is
|
31
|
+
> available as a gem and tagged on this repository.
|
13
32
|
>
|
14
|
-
> If you're reading this message, then you should only expect support for
|
15
|
-
> and higher.
|
33
|
+
> If you're reading this message, then you should only expect support for
|
34
|
+
> InfluxDB v0.9.1 and higher.
|
16
35
|
|
17
36
|
## Ruby support
|
18
37
|
|
19
|
-
This gem should work with Ruby 1.9+, but starting with v0.4, we'll likely drop
|
38
|
+
This gem should work with Ruby 1.9+, but starting with v0.4, we'll likely drop
|
39
|
+
Ruby 1.9 support.
|
20
40
|
|
21
|
-
Please note that for Ruby 1.9, you'll need to install the JSON gem in version
|
22
|
-
for example by pinning the version in your `Gemfile` (i.e.
|
41
|
+
Please note that for Ruby 1.9, you'll need to install the JSON gem in version
|
42
|
+
1.8.x yourself, for example by pinning the version in your `Gemfile` (i.e.
|
43
|
+
`gem "json", "~> 1.8.3"`).
|
23
44
|
|
24
|
-
##
|
45
|
+
## Installation
|
25
46
|
|
26
47
|
```
|
27
48
|
$ [sudo] gem install influxdb
|
@@ -175,7 +196,8 @@ query = 'SELECT COUNT(name) INTO clicksCount_1h FROM clicks GROUP BY time(1h)'
|
|
175
196
|
influxdb.create_continuous_query(name, database, query)
|
176
197
|
```
|
177
198
|
|
178
|
-
Additionally, you can specify the resample interval and the time range over
|
199
|
+
Additionally, you can specify the resample interval and the time range over
|
200
|
+
which the CQ runs:
|
179
201
|
|
180
202
|
``` ruby
|
181
203
|
influxdb.create_continuous_query(name, database, query, resample_every: "10m", resample_for: "65m")
|
@@ -203,9 +225,9 @@ influxdb.list_retention_policies(database)
|
|
203
225
|
Create a retention policy for a database:
|
204
226
|
|
205
227
|
``` ruby
|
206
|
-
database
|
207
|
-
name
|
208
|
-
duration
|
228
|
+
database = 'foo'
|
229
|
+
name = '1h.cpu'
|
230
|
+
duration = '10m'
|
209
231
|
replication = 2
|
210
232
|
|
211
233
|
influxdb.create_retention_policy(name, database, duration, replication)
|
@@ -215,7 +237,7 @@ Delete a retention policy from a database:
|
|
215
237
|
|
216
238
|
``` ruby
|
217
239
|
database = 'foo'
|
218
|
-
name
|
240
|
+
name = '1h.cpu'
|
219
241
|
|
220
242
|
influxdb.delete_retention_policy(name, database)
|
221
243
|
```
|
@@ -223,9 +245,9 @@ influxdb.delete_retention_policy(name, database)
|
|
223
245
|
Alter a retention policy for a database:
|
224
246
|
|
225
247
|
``` ruby
|
226
|
-
database
|
227
|
-
name
|
228
|
-
duration
|
248
|
+
database = 'foo'
|
249
|
+
name = '1h.cpu'
|
250
|
+
duration = '10m'
|
229
251
|
replication = 2
|
230
252
|
|
231
253
|
influxdb.alter_retention_policy(name, database, duration, replication)
|
@@ -241,9 +263,7 @@ password = 'bar'
|
|
241
263
|
database = 'site_development'
|
242
264
|
name = 'foobar'
|
243
265
|
|
244
|
-
influxdb = InfluxDB::Client.new database,
|
245
|
-
username: username,
|
246
|
-
password: password
|
266
|
+
influxdb = InfluxDB::Client.new database, username: username, password: password
|
247
267
|
|
248
268
|
# Enumerator that emits a sine wave
|
249
269
|
Value = (0..360).to_a.map {|i| Math.send(:sin, i / 10.0) * 10 }.each
|
@@ -251,7 +271,7 @@ Value = (0..360).to_a.map {|i| Math.send(:sin, i / 10.0) * 10 }.each
|
|
251
271
|
loop do
|
252
272
|
data = {
|
253
273
|
values: { value: Value.next },
|
254
|
-
tags:
|
274
|
+
tags: { wave: 'sine' } # tags are optional
|
255
275
|
}
|
256
276
|
|
257
277
|
influxdb.write_point(name, data)
|
@@ -272,9 +292,10 @@ name = 'foobar'
|
|
272
292
|
time_precision = 's'
|
273
293
|
|
274
294
|
# either in the client initialization:
|
275
|
-
influxdb = InfluxDB::Client.new database,
|
276
|
-
|
277
|
-
|
295
|
+
influxdb = InfluxDB::Client.new database,
|
296
|
+
username: username,
|
297
|
+
password: password,
|
298
|
+
time_precision: time_precision
|
278
299
|
|
279
300
|
data = {
|
280
301
|
values: { value: 0 },
|
@@ -301,12 +322,12 @@ precision = 's'
|
|
301
322
|
retention = '1h.cpu'
|
302
323
|
|
303
324
|
influxdb = InfluxDB::Client.new database,
|
304
|
-
|
305
|
-
|
325
|
+
username: username,
|
326
|
+
password: password
|
306
327
|
|
307
328
|
data = {
|
308
|
-
values:
|
309
|
-
tags:
|
329
|
+
values: { value: 0 },
|
330
|
+
tags: { foo: 'bar', bar: 'baz' }
|
310
331
|
timestamp: Time.now.to_i
|
311
332
|
}
|
312
333
|
|
@@ -320,12 +341,12 @@ Write multiple points in a batch (performance boost):
|
|
320
341
|
data = [
|
321
342
|
{
|
322
343
|
series: 'cpu',
|
323
|
-
tags:
|
324
|
-
values: {internal: 5, external: 0.453345}
|
344
|
+
tags: { host: 'server_1', region: 'us' },
|
345
|
+
values: { internal: 5, external: 0.453345 }
|
325
346
|
},
|
326
347
|
{
|
327
348
|
series: 'gpu',
|
328
|
-
values: {value: 0.9999},
|
349
|
+
values: { value: 0.9999 },
|
329
350
|
}
|
330
351
|
]
|
331
352
|
|
@@ -335,22 +356,20 @@ influxdb.write_points(data)
|
|
335
356
|
|
336
357
|
precision = 'm'
|
337
358
|
influxdb.write_points(data, precision)
|
338
|
-
|
339
359
|
```
|
340
360
|
|
341
361
|
Write multiple points in a batch with a specific retention policy:
|
342
362
|
|
343
363
|
``` ruby
|
344
|
-
|
345
364
|
data = [
|
346
365
|
{
|
347
366
|
series: 'cpu',
|
348
|
-
tags:
|
349
|
-
values: {internal: 5, external: 0.453345}
|
367
|
+
tags: { host: 'server_1', region: 'us' },
|
368
|
+
values: { internal: 5, external: 0.453345 }
|
350
369
|
},
|
351
370
|
{
|
352
371
|
series: 'gpu',
|
353
|
-
values: {value: 0.9999},
|
372
|
+
values: { value: 0.9999 },
|
354
373
|
}
|
355
374
|
]
|
356
375
|
|
@@ -371,13 +390,13 @@ database = 'site_development'
|
|
371
390
|
name = 'foobar'
|
372
391
|
|
373
392
|
influxdb = InfluxDB::Client.new database,
|
374
|
-
|
375
|
-
|
376
|
-
|
393
|
+
username: username,
|
394
|
+
password: password,
|
395
|
+
async: true
|
377
396
|
|
378
397
|
data = {
|
379
|
-
values:
|
380
|
-
tags:
|
398
|
+
values: { value: 0 },
|
399
|
+
tags: { foo: 'bar', bar: 'baz' },
|
381
400
|
timestamp: Time.now.to_i
|
382
401
|
}
|
383
402
|
|
@@ -400,9 +419,9 @@ async_options = {
|
|
400
419
|
}
|
401
420
|
|
402
421
|
influxdb = InfluxDB::Client.new database,
|
403
|
-
|
404
|
-
|
405
|
-
|
422
|
+
username: username,
|
423
|
+
password: password,
|
424
|
+
async: async_options
|
406
425
|
```
|
407
426
|
|
408
427
|
|
@@ -419,7 +438,7 @@ name = 'hitchhiker'
|
|
419
438
|
|
420
439
|
data = {
|
421
440
|
values: { value: 666 },
|
422
|
-
tags:
|
441
|
+
tags: { foo: 'bar', bar: 'baz' }
|
423
442
|
}
|
424
443
|
|
425
444
|
influxdb.write_point(name, data)
|
@@ -435,40 +454,77 @@ password = 'bar'
|
|
435
454
|
database = 'site_development'
|
436
455
|
|
437
456
|
influxdb = InfluxDB::Client.new database,
|
438
|
-
|
439
|
-
|
457
|
+
username: username,
|
458
|
+
password: password
|
440
459
|
|
441
460
|
# without a block:
|
442
|
-
influxdb.query 'select * from time_series_1'
|
443
|
-
|
444
|
-
#
|
445
|
-
#
|
446
|
-
#
|
461
|
+
influxdb.query 'select * from time_series_1'
|
462
|
+
|
463
|
+
# results are grouped by name, but also their tags:
|
464
|
+
#
|
465
|
+
# [
|
466
|
+
# {
|
467
|
+
# "name"=>"time_series_1",
|
468
|
+
# "tags"=>{"region"=>"uk"},
|
469
|
+
# "values"=>[
|
470
|
+
# {"time"=>"2015-07-09T09:03:31Z", "count"=>32, "value"=>0.9673},
|
471
|
+
# {"time"=>"2015-07-09T09:03:49Z", "count"=>122, "value"=>0.4444}
|
472
|
+
# ]
|
473
|
+
# },
|
474
|
+
# {
|
475
|
+
# "name"=>"time_series_1",
|
476
|
+
# "tags"=>{"region"=>"us"},
|
477
|
+
# "values"=>[
|
478
|
+
# {"time"=>"2015-07-09T09:02:54Z", "count"=>55, "value"=>0.4343}
|
479
|
+
# ]
|
480
|
+
# }
|
481
|
+
# ]
|
447
482
|
|
448
483
|
# with a block:
|
449
484
|
influxdb.query 'select * from time_series_1' do |name, tags, points|
|
450
|
-
puts "#{name} [ #{tags} ]
|
485
|
+
puts "#{name} [ #{tags.inspect} ]"
|
486
|
+
points.each do |pt|
|
487
|
+
puts " -> #{pt.inspect}"
|
488
|
+
end
|
451
489
|
end
|
452
490
|
|
453
491
|
# result:
|
454
|
-
# time_series_1 [ {"region"=>"uk"} ]
|
455
|
-
#
|
492
|
+
# time_series_1 [ {"region"=>"uk"} ]
|
493
|
+
# -> {"time"=>"2015-07-09T09:03:31Z", "count"=>32, "value"=>0.9673}
|
494
|
+
# -> {"time"=>"2015-07-09T09:03:49Z", "count"=>122, "value"=>0.4444}]
|
495
|
+
# time_series_1 [ {"region"=>"us"} ]
|
496
|
+
# -> {"time"=>"2015-07-09T09:02:54Z", "count"=>55, "value"=>0.4343}
|
456
497
|
```
|
457
498
|
|
458
|
-
If you would rather receive points with integer timestamp, it's possible to set
|
499
|
+
If you would rather receive points with integer timestamp, it's possible to set
|
500
|
+
`epoch` parameter:
|
459
501
|
|
460
502
|
``` ruby
|
461
503
|
# globally, on client initialization:
|
462
504
|
influxdb = InfluxDB::Client.new database, epoch: 's'
|
463
505
|
|
464
506
|
influxdb.query 'select * from time_series'
|
465
|
-
#
|
466
|
-
#
|
507
|
+
# [
|
508
|
+
# {
|
509
|
+
# "name"=>"time_series",
|
510
|
+
# "tags"=>{"region"=>"uk"},
|
511
|
+
# "values"=>[
|
512
|
+
# {"time"=>1438411376, "count"=>32, "value"=>0.9673}
|
513
|
+
# ]
|
514
|
+
# }
|
515
|
+
# ]
|
467
516
|
|
468
517
|
# or for a specific query call:
|
469
518
|
influxdb.query 'select * from time_series', epoch: 'ms'
|
470
|
-
#
|
471
|
-
#
|
519
|
+
# [
|
520
|
+
# {
|
521
|
+
# "name"=>"time_series",
|
522
|
+
# "tags"=>{"region"=>"uk"},
|
523
|
+
# "values"=>[
|
524
|
+
# {"time"=>1438411376000, "count"=>32, "value"=>0.9673}
|
525
|
+
# ]
|
526
|
+
# }
|
527
|
+
# ]
|
472
528
|
```
|
473
529
|
|
474
530
|
Working with parameterized query strings works as expected:
|
@@ -490,28 +546,54 @@ influxdb.query positional_params_query, params: ["foobar", 42]
|
|
490
546
|
|
491
547
|
#### (De-) Normalization
|
492
548
|
|
493
|
-
By default, InfluxDB::Client will denormalize points (received from InfluxDB as
|
549
|
+
By default, InfluxDB::Client will denormalize points (received from InfluxDB as
|
550
|
+
columns and rows). If you want to get *raw* data add `denormalize: false` to
|
551
|
+
the initialization options or to query itself:
|
494
552
|
|
495
553
|
``` ruby
|
496
554
|
influxdb.query 'select * from time_series_1', denormalize: false
|
497
555
|
|
498
|
-
#
|
499
|
-
|
500
|
-
|
556
|
+
# [
|
557
|
+
# {
|
558
|
+
# "name"=>"time_series_1",
|
559
|
+
# "tags"=>{"region"=>"uk"},
|
560
|
+
# "columns"=>["time", "count", "value"],
|
561
|
+
# "values"=>[
|
562
|
+
# ["2015-07-09T09:03:31Z", 32, 0.9673],
|
563
|
+
# ["2015-07-09T09:03:49Z", 122, 0.4444]
|
564
|
+
# ]
|
565
|
+
# },
|
566
|
+
# {
|
567
|
+
# "name"=>"time_series_1",
|
568
|
+
# "tags"=>{"region"=>"us"},
|
569
|
+
# "columns"=>["time", "count", "value"],
|
570
|
+
# "values"=>[
|
571
|
+
# ["2015-07-09T09:02:54Z", 55, 0.4343]
|
572
|
+
# ]
|
573
|
+
# }
|
574
|
+
# ]
|
501
575
|
|
502
576
|
|
503
577
|
influxdb.query 'select * from time_series_1', denormalize: false do |name, tags, points|
|
504
|
-
puts "#{name} [ #{tags} ]
|
578
|
+
puts "#{name} [ #{tags.inspect} ]"
|
579
|
+
points.each do |key, values|
|
580
|
+
puts " #{key.inspect} -> #{values.inspect}"
|
581
|
+
end
|
505
582
|
end
|
506
583
|
|
507
|
-
|
508
|
-
# time_series_1 [ {"region"=>"uk"} ]
|
509
|
-
#
|
584
|
+
|
585
|
+
# time_series_1 [ {"region"=>"uk"} ]
|
586
|
+
# columns -> ["time", "count", "value"]
|
587
|
+
# values -> [["2015-07-09T09:03:31Z", 32, 0.9673], ["2015-07-09T09:03:49Z", 122, 0.4444]]}
|
588
|
+
# time_series_1 [ {"region"=>"us"} ]
|
589
|
+
# columns -> ["time", "count", "value"]
|
590
|
+
# values -> [["2015-07-09T09:02:54Z", 55, 0.4343]]}
|
510
591
|
```
|
511
592
|
|
512
593
|
#### Streaming response
|
513
594
|
|
514
|
-
If you expect large quantities of data in a response, you may want to enable
|
595
|
+
If you expect large quantities of data in a response, you may want to enable
|
596
|
+
JSON streaming by setting a `chunk_size`:
|
515
597
|
|
516
598
|
``` ruby
|
517
599
|
influxdb = InfluxDB::Client.new database,
|
@@ -520,43 +602,37 @@ influxdb = InfluxDB::Client.new database,
|
|
520
602
|
chunk_size: 10000
|
521
603
|
```
|
522
604
|
|
523
|
-
See the [official documentation](http://docs.influxdata.com/influxdb/v0.13/guides/querying_data/#chunking)
|
605
|
+
See the [official documentation](http://docs.influxdata.com/influxdb/v0.13/guides/querying_data/#chunking)
|
606
|
+
for more details.
|
524
607
|
|
525
608
|
|
526
609
|
#### Retry
|
527
610
|
|
528
|
-
By default, InfluxDB::Client will keep trying
|
529
|
-
|
530
|
-
|
611
|
+
By default, InfluxDB::Client will keep trying (with exponential fall-off) to
|
612
|
+
connect to the database until it gets a connection. If you want to retry only
|
613
|
+
a finite number of times (or disable retries altogether), you can pass the
|
614
|
+
`:retry` option.
|
531
615
|
|
532
|
-
`:retry` can be either `true`, `false` or an `Integer` to retry infinite times,
|
533
|
-
a finite number of times, respectively. `0` is
|
616
|
+
`:retry` can be either `true`, `false` or an `Integer` to retry infinite times,
|
617
|
+
disable retries or retry a finite number of times, respectively. Passing `0` is
|
618
|
+
equivalent to `false` and `-1` is equivalent to `true`.
|
534
619
|
|
535
620
|
```
|
536
621
|
$ irb -r influxdb
|
537
|
-
> influxdb = InfluxDB::Client.new 'database', :
|
538
|
-
=> #<InfluxDB::Client:0x00000002bb5ce0
|
539
|
-
@port=8086, @username="root", @password="root", @use_ssl=false,
|
540
|
-
@time_precision="s", @initial_delay=0.01, @max_delay=30,
|
541
|
-
@open_timeout=5, @read_timeout=300, @async=false, @retry=4>
|
622
|
+
> influxdb = InfluxDB::Client.new 'database', retry: 8
|
623
|
+
=> #<InfluxDB::Client:0x00000002bb5ce0 ...>
|
542
624
|
|
543
625
|
> influxdb.query 'select * from serie limit 1'
|
544
|
-
E, [
|
545
|
-
contact host localhost: #<
|
546
|
-
retrying in 0.
|
547
|
-
E, [
|
548
|
-
contact host localhost: #<
|
549
|
-
retrying in 0.
|
550
|
-
E, [
|
551
|
-
contact host localhost: #<
|
552
|
-
|
553
|
-
|
554
|
-
contact host localhost: #<SocketError: getaddrinfo: Name or service not known> -
|
555
|
-
retrying in 0.08s.
|
556
|
-
SocketError: Tried 4 times to reconnect but failed.
|
557
|
-
```
|
558
|
-
|
559
|
-
If you pass `:retry => -1` it will keep trying forever until it gets the connection.
|
626
|
+
E, [2016-08-31T23:55:18.287947 #23476] ERROR -- InfluxDB: Failed to contact host localhost: #<Errno::ECONNREFUSED: Failed to open TCP connection to localhost:8086 (Connection refused - connect(2) for "localhost" port 8086)> - retrying in 0.01s.
|
627
|
+
E, [2016-08-31T23:55:18.298455 #23476] ERROR -- InfluxDB: Failed to contact host localhost: #<Errno::ECONNREFUSED: Failed to open TCP connection to localhost:8086 (Connection refused - connect(2) for "localhost" port 8086)> - retrying in 0.02s.
|
628
|
+
E, [2016-08-31T23:55:18.319122 #23476] ERROR -- InfluxDB: Failed to contact host localhost: #<Errno::ECONNREFUSED: Failed to open TCP connection to localhost:8086 (Connection refused - connect(2) for "localhost" port 8086)> - retrying in 0.04s.
|
629
|
+
E, [2016-08-31T23:55:18.359785 #23476] ERROR -- InfluxDB: Failed to contact host localhost: #<Errno::ECONNREFUSED: Failed to open TCP connection to localhost:8086 (Connection refused - connect(2) for "localhost" port 8086)> - retrying in 0.08s.
|
630
|
+
E, [2016-08-31T23:55:18.440422 #23476] ERROR -- InfluxDB: Failed to contact host localhost: #<Errno::ECONNREFUSED: Failed to open TCP connection to localhost:8086 (Connection refused - connect(2) for "localhost" port 8086)> - retrying in 0.16s.
|
631
|
+
E, [2016-08-31T23:55:18.600936 #23476] ERROR -- InfluxDB: Failed to contact host localhost: #<Errno::ECONNREFUSED: Failed to open TCP connection to localhost:8086 (Connection refused - connect(2) for "localhost" port 8086)> - retrying in 0.32s.
|
632
|
+
E, [2016-08-31T23:55:18.921740 #23476] ERROR -- InfluxDB: Failed to contact host localhost: #<Errno::ECONNREFUSED: Failed to open TCP connection to localhost:8086 (Connection refused - connect(2) for "localhost" port 8086)> - retrying in 0.64s.
|
633
|
+
E, [2016-08-31T23:55:19.562428 #23476] ERROR -- InfluxDB: Failed to contact host localhost: #<Errno::ECONNREFUSED: Failed to open TCP connection to localhost:8086 (Connection refused - connect(2) for "localhost" port 8086)> - retrying in 1.28s.
|
634
|
+
InfluxDB::ConnectionError: Tried 8 times to reconnect but failed.
|
635
|
+
```
|
560
636
|
|
561
637
|
## Testing
|
562
638
|
|
data/influxdb.gemspec
CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
|
25
25
|
spec.add_development_dependency "rake"
|
26
26
|
spec.add_development_dependency "bundler", "~> 1.3"
|
27
|
-
spec.add_development_dependency "rspec", "~> 3.
|
28
|
-
spec.add_development_dependency "webmock", "~> 1.
|
29
|
-
spec.add_development_dependency "rubocop", "~> 0.
|
27
|
+
spec.add_development_dependency "rspec", "~> 3.5.0"
|
28
|
+
spec.add_development_dependency "webmock", "~> 2.1.0"
|
29
|
+
spec.add_development_dependency "rubocop", "~> 0.41.2"
|
30
30
|
end
|
data/lib/influxdb/client/http.rb
CHANGED
@@ -52,7 +52,9 @@ module InfluxDB
|
|
52
52
|
http = setup_ssl(http)
|
53
53
|
yield http
|
54
54
|
|
55
|
-
rescue
|
55
|
+
rescue *InfluxDB::NON_RECOVERABLE_EXCEPTIONS => e
|
56
|
+
raise InfluxDB::ConnectionError, InfluxDB::NON_RECOVERABLE_MESSAGE
|
57
|
+
rescue Timeout::Error, *InfluxDB::RECOVERABLE_EXCEPTIONS => e
|
56
58
|
retry_count += 1
|
57
59
|
if (config.retry == -1 || retry_count <= config.retry) && !stopped?
|
58
60
|
log :error, "Failed to contact host #{host}: #{e.inspect} - retrying in #{delay}s."
|
data/lib/influxdb/errors.rb
CHANGED
@@ -20,9 +20,12 @@ module InfluxDB # :nodoc:
|
|
20
20
|
class QueryError < Error
|
21
21
|
end
|
22
22
|
|
23
|
+
# When executing queries via HTTP, some errors can more or less safely
|
24
|
+
# be ignored and we can retry the query again. This following
|
25
|
+
# exception classes shall be deemed as "safe".
|
26
|
+
#
|
23
27
|
# Taken from: https://github.com/lostisland/faraday/blob/master/lib/faraday/adapter/net_http.rb
|
24
|
-
|
25
|
-
EOFError,
|
28
|
+
RECOVERABLE_EXCEPTIONS = [
|
26
29
|
Errno::ECONNABORTED,
|
27
30
|
Errno::ECONNREFUSED,
|
28
31
|
Errno::ECONNRESET,
|
@@ -33,7 +36,17 @@ module InfluxDB # :nodoc:
|
|
33
36
|
Net::HTTPHeaderSyntaxError,
|
34
37
|
Net::ProtocolError,
|
35
38
|
SocketError,
|
36
|
-
Zlib::GzipFile::Error,
|
37
39
|
(OpenSSL::SSL::SSLError if defined?(OpenSSL))
|
38
40
|
].compact.freeze
|
41
|
+
|
42
|
+
# Exception classes which hint to a larger problem on the server side,
|
43
|
+
# like insuffient resources. If we encouter on of the following, wo
|
44
|
+
# _don't_ retry a query but escalate it upwards.
|
45
|
+
NON_RECOVERABLE_EXCEPTIONS = [
|
46
|
+
EOFError,
|
47
|
+
Zlib::Error
|
48
|
+
].freeze
|
49
|
+
|
50
|
+
NON_RECOVERABLE_MESSAGE = "The server has sent incomplete data" \
|
51
|
+
" (insufficient resources are a possible cause).".freeze
|
39
52
|
end
|
@@ -3,8 +3,9 @@ module InfluxDB
|
|
3
3
|
module RetentionPolicy # :nodoc:
|
4
4
|
def create_retention_policy(name, database, duration, replication, default = false)
|
5
5
|
execute(
|
6
|
-
"CREATE RETENTION POLICY \"#{name}\" ON #{database} "\
|
7
|
-
"DURATION #{duration} REPLICATION #{replication}#{default ? ' DEFAULT' : ''}"
|
6
|
+
"CREATE RETENTION POLICY \"#{name}\" ON #{database} " \
|
7
|
+
"DURATION #{duration} REPLICATION #{replication}#{default ? ' DEFAULT' : ''}"
|
8
|
+
)
|
8
9
|
end
|
9
10
|
|
10
11
|
def list_retention_policies(database)
|
@@ -24,8 +25,9 @@ module InfluxDB
|
|
24
25
|
|
25
26
|
def alter_retention_policy(name, database, duration, replication, default = false)
|
26
27
|
execute(
|
27
|
-
"ALTER RETENTION POLICY \"#{name}\" ON #{database} "\
|
28
|
-
"DURATION #{duration} REPLICATION #{replication}#{default ? ' DEFAULT' : ''}"
|
28
|
+
"ALTER RETENTION POLICY \"#{name}\" ON #{database} " \
|
29
|
+
"DURATION #{duration} REPLICATION #{replication}#{default ? ' DEFAULT' : ''}"
|
30
|
+
)
|
29
31
|
end
|
30
32
|
end
|
31
33
|
end
|
data/lib/influxdb/version.rb
CHANGED
@@ -17,7 +17,7 @@ describe InfluxDB::Client do
|
|
17
17
|
let(:query) { "SELECT value FROM requests_per_minute WHERE time > 1437019900" }
|
18
18
|
let(:response) do
|
19
19
|
{ "results" => [{ "series" => [{ "name" => "requests_per_minute",
|
20
|
-
"columns" => %w(
|
20
|
+
"columns" => %w(time value) }] }] }
|
21
21
|
end
|
22
22
|
|
23
23
|
before do
|
@@ -22,16 +22,19 @@ describe InfluxDB::Client do
|
|
22
22
|
context "with basic auth" do
|
23
23
|
let(:args) { { auth_method: 'basic_auth' } }
|
24
24
|
|
25
|
-
let(:
|
26
|
-
let(:
|
25
|
+
let(:credentials) { "username:password" }
|
26
|
+
let(:auth_header) { { "Authorization" => "Basic " + Base64.encode64(credentials).chomp } }
|
27
|
+
|
28
|
+
let(:stub_url) { "http://influxdb.test:9999/" }
|
29
|
+
let(:url) { subject.send(:full_url, '/') }
|
27
30
|
|
28
31
|
it "GET" do
|
29
|
-
stub_request(:get, stub_url).to_return(body: '[]')
|
32
|
+
stub_request(:get, stub_url).with(headers: auth_header).to_return(body: '[]')
|
30
33
|
expect(subject.get(url, parse: true)).to eq []
|
31
34
|
end
|
32
35
|
|
33
36
|
it "POST" do
|
34
|
-
stub_request(:post, stub_url).to_return(status: 204)
|
37
|
+
stub_request(:post, stub_url).with(headers: auth_header).to_return(status: 204)
|
35
38
|
expect(subject.post(url, {})).to be_a(Net::HTTPNoContent)
|
36
39
|
end
|
37
40
|
end
|
@@ -48,7 +48,7 @@ RSpec.describe InfluxDB::Query::Builder do
|
|
48
48
|
let(:query) { "SELECT value FROM rpm WHERE time > %{1}" }
|
49
49
|
let(:params) { [] }
|
50
50
|
|
51
|
-
it { expect { subject }.to raise_error(/key
|
51
|
+
it { expect { subject }.to raise_error(/key.1. not found/) }
|
52
52
|
end
|
53
53
|
|
54
54
|
context "extra parameters" 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.3.
|
4
|
+
version: 0.3.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: 2016-
|
11
|
+
date: 2016-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -72,42 +72,42 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 3.
|
75
|
+
version: 3.5.0
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 3.
|
82
|
+
version: 3.5.0
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: webmock
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: 1.
|
89
|
+
version: 2.1.0
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: 1.
|
96
|
+
version: 2.1.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rubocop
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.
|
103
|
+
version: 0.41.2
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.
|
110
|
+
version: 0.41.2
|
111
111
|
description: This is the official Ruby library for InfluxDB.
|
112
112
|
email:
|
113
113
|
- influxdb@googlegroups.com
|