influxdb-client 1.8.0.pre.1240 → 1.9.0.pre.1331
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +1 -1
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +7 -1
- data/README.md +2 -1
- data/bin/influxdb-restart.sh +1 -1
- data/lib/influxdb2/client/client.rb +2 -0
- data/lib/influxdb2/client/default_api.rb +25 -0
- data/lib/influxdb2/client/version.rb +1 -1
- data/lib/influxdb2/client/worker.rb +6 -2
- data/lib/influxdb2/client/write_api.rb +5 -2
- data/test/influxdb/default_api_test.rb +60 -0
- data/test/influxdb/delete_api_integration_test.rb +4 -0
- data/test/influxdb/write_api_batching_test.rb +140 -61
- data/test/test_helper.rb +12 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 13f587f991c459071204269e2e9efd40dc01b3e586710769beef4c70cb85071b
|
4
|
+
data.tar.gz: d8ef882a6370da524e67e926230196011a577f25d27fa0b80bd5372a3842027f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6333aa4d6ed7ce13b520d1659362e057a023c1beef668e23d9fdaa4eb89046f76a3a0f770a6dcdc3dfd3e9b593289d1fc696462c56310a3dc5f14d0449401e82
|
7
|
+
data.tar.gz: d97d59e3a14bfaf828801bbbb81d1abd00f5e865eed54bcddf8588732330c4f452a8d0d0d85cba4535d4a50b9731eaaa02a3ecdaaeee943f2760aae59902534e
|
data/.circleci/config.yml
CHANGED
@@ -78,7 +78,7 @@ jobs:
|
|
78
78
|
default: &default-ruby-image "circleci/ruby:2.6-stretch"
|
79
79
|
influxdb-image:
|
80
80
|
type: string
|
81
|
-
default: &default-influxdb-image "influxdb:2.0.0-
|
81
|
+
default: &default-influxdb-image "influxdb:2.0.0-rc"
|
82
82
|
docker:
|
83
83
|
- image: << parameters.ruby-image >>
|
84
84
|
- image: &influx-image quay.io/influxdb/<< parameters.influxdb-image >>
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,13 @@
|
|
1
|
-
## 1.
|
1
|
+
## 1.9.0 [unreleased]
|
2
|
+
|
3
|
+
### Features
|
4
|
+
1. [#55](https://github.com/influxdata/influxdb-client-runy/pull/55): Improved logging message for retries
|
5
|
+
|
6
|
+
## 1.8.0 [2020-10-02]
|
2
7
|
|
3
8
|
### Features
|
4
9
|
1. [#36](https://github.com/influxdata/influxdb-client-ruby/issues/36): Added support for default tags
|
10
|
+
1. [#53](https://github.com/influxdata/influxdb-client-ruby/pull/53): Default strategy for batching worker is best-effort
|
5
11
|
|
6
12
|
### API
|
7
13
|
1. [#50](https://github.com/influxdata/influxdb-client-ruby/pull/50): Default port changed from 9999 -> 8086
|
data/README.md
CHANGED
@@ -23,7 +23,7 @@ The client can be installed manually or with bundler.
|
|
23
23
|
To install the client gem manually:
|
24
24
|
|
25
25
|
```
|
26
|
-
gem install influxdb-client -v 1.
|
26
|
+
gem install influxdb-client -v 1.8.0
|
27
27
|
```
|
28
28
|
|
29
29
|
## Usage
|
@@ -128,6 +128,7 @@ The writes are processed in batches which are configurable by `WriteOptions`:
|
|
128
128
|
| max_retries | the number of max retries when write fails | 5 |
|
129
129
|
| max_retry_delay | maximum delay when retrying write in milliseconds | 180000 |
|
130
130
|
| exponential_base | the base for the exponential retry delay, the next delay is computed as `retry_interval * exponential_base^(attempts - 1) + random(jitter_interval)` | 5 |
|
131
|
+
| batch_abort_on_exception | the batching worker will be aborted after failed retry strategy | false |
|
131
132
|
```ruby
|
132
133
|
write_options = InfluxDB2::WriteOptions.new(write_type: InfluxDB2::WriteType::BATCHING,
|
133
134
|
batch_size: 10, flush_interval: 5_000,
|
data/bin/influxdb-restart.sh
CHANGED
@@ -27,7 +27,7 @@ DEFAULT_DOCKER_REGISTRY="quay.io/influxdb/"
|
|
27
27
|
DOCKER_REGISTRY="${DOCKER_REGISTRY:-$DEFAULT_DOCKER_REGISTRY}"
|
28
28
|
|
29
29
|
DEFAULT_INFLUXDB_V2_REPOSITORY="influxdb"
|
30
|
-
DEFAULT_INFLUXDB_V2_VERSION="2.0.0-
|
30
|
+
DEFAULT_INFLUXDB_V2_VERSION="2.0.0-rc"
|
31
31
|
INFLUXDB_V2_REPOSITORY="${INFLUXDB_V2_REPOSITORY:-$DEFAULT_INFLUXDB_V2_REPOSITORY}"
|
32
32
|
INFLUXDB_V2_VERSION="${INFLUXDB_V2_VERSION:-$DEFAULT_INFLUXDB_V2_VERSION}"
|
33
33
|
INFLUXDB_V2_IMAGE=${DOCKER_REGISTRY}${INFLUXDB_V2_REPOSITORY}:${INFLUXDB_V2_VERSION}
|
@@ -43,6 +43,7 @@ module InfluxDB2
|
|
43
43
|
# @option options [Integer] :read_timeout Number of seconds to wait for one block of data to be read
|
44
44
|
# @option options [Integer] :max_redirect_count Maximal number of followed HTTP redirects
|
45
45
|
# @option options [bool] :use_ssl Turn on/off SSL for HTTP communication
|
46
|
+
# @option options [Logger] :logger Logger used for logging. Disable logging by set to false.
|
46
47
|
# @option options [Hash] :tags Default tags which will be added to each point written by api.
|
47
48
|
# the body line-protocol
|
48
49
|
def initialize(url, token, options = nil)
|
@@ -50,6 +51,7 @@ module InfluxDB2
|
|
50
51
|
@options = options ? options.dup : {}
|
51
52
|
@options[:url] = url if url.is_a? String
|
52
53
|
@options[:token] = token if token.is_a? String
|
54
|
+
@options[:logger] = @options[:logger].nil? ? DefaultApi.create_logger : @options[:logger]
|
53
55
|
@closed = false
|
54
56
|
|
55
57
|
at_exit { close! }
|
@@ -18,6 +18,8 @@
|
|
18
18
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
19
|
# THE SOFTWARE.
|
20
20
|
|
21
|
+
require 'logger'
|
22
|
+
|
21
23
|
module InfluxDB2
|
22
24
|
# default api
|
23
25
|
class DefaultApi
|
@@ -32,6 +34,29 @@ module InfluxDB2
|
|
32
34
|
@max_redirect_count = @options[:max_redirect_count] || DEFAULT_REDIRECT_COUNT
|
33
35
|
end
|
34
36
|
|
37
|
+
def log(level, message)
|
38
|
+
return unless @options[:logger]
|
39
|
+
|
40
|
+
log_level = case level
|
41
|
+
when :debug then
|
42
|
+
Logger::DEBUG
|
43
|
+
when :warn then
|
44
|
+
Logger::WARN
|
45
|
+
when :error then
|
46
|
+
Logger::ERROR
|
47
|
+
when :fatal then
|
48
|
+
Logger::FATAL
|
49
|
+
else
|
50
|
+
Logger::INFO
|
51
|
+
end
|
52
|
+
|
53
|
+
@options[:logger].add(log_level) { message }
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.create_logger
|
57
|
+
Logger.new(STDOUT)
|
58
|
+
end
|
59
|
+
|
35
60
|
private
|
36
61
|
|
37
62
|
def _parse_uri(api_path)
|
@@ -37,7 +37,7 @@ module InfluxDB2
|
|
37
37
|
_check_background_queue
|
38
38
|
end
|
39
39
|
end
|
40
|
-
@thread_flush.abort_on_exception =
|
40
|
+
@thread_flush.abort_on_exception = @write_options.batch_abort_on_exception
|
41
41
|
|
42
42
|
@thread_size = Thread.new do
|
43
43
|
until api_client.closed
|
@@ -45,7 +45,7 @@ module InfluxDB2
|
|
45
45
|
sleep 0.01
|
46
46
|
end
|
47
47
|
end
|
48
|
-
@thread_size.abort_on_exception =
|
48
|
+
@thread_size.abort_on_exception = @write_options.batch_abort_on_exception
|
49
49
|
end
|
50
50
|
|
51
51
|
def push(payload)
|
@@ -116,6 +116,10 @@ module InfluxDB2
|
|
116
116
|
e.retry_after.to_f
|
117
117
|
end
|
118
118
|
|
119
|
+
message = 'The retriable error occurred during writing of data. '\
|
120
|
+
"Reason: '#{e.message}'. Retry in: #{timeout}s."
|
121
|
+
|
122
|
+
@api_client.log(:warn, message)
|
119
123
|
sleep timeout
|
120
124
|
_write_raw(key, points, attempts + 1, retry_interval * @write_options.exponential_base)
|
121
125
|
end
|
@@ -39,8 +39,10 @@ module InfluxDB2
|
|
39
39
|
# by a random amount
|
40
40
|
# @param [Integer] exponential_base: base for the exponential retry delay, the next delay is computed as
|
41
41
|
# "exponential_base^(attempts-1) + random(jitter_interval)"
|
42
|
+
# @param [Boolean] batch_abort_on_exception: batching worker will be aborted after failed retry strategy
|
42
43
|
def initialize(write_type: WriteType::SYNCHRONOUS, batch_size: 1_000, flush_interval: 1_000, retry_interval: 5_000,
|
43
|
-
jitter_interval: 0, max_retries: 5, max_retry_delay: 180_000, exponential_base: 5
|
44
|
+
jitter_interval: 0, max_retries: 5, max_retry_delay: 180_000, exponential_base: 5,
|
45
|
+
batch_abort_on_exception: false)
|
44
46
|
_check_not_negative('batch_size', batch_size)
|
45
47
|
_check_not_negative('flush_interval', flush_interval)
|
46
48
|
_check_not_negative('retry_interval', retry_interval)
|
@@ -56,10 +58,11 @@ module InfluxDB2
|
|
56
58
|
@max_retries = max_retries
|
57
59
|
@max_retry_delay = max_retry_delay
|
58
60
|
@exponential_base = exponential_base
|
61
|
+
@batch_abort_on_exception = batch_abort_on_exception
|
59
62
|
end
|
60
63
|
|
61
64
|
attr_reader :write_type, :batch_size, :flush_interval, :retry_interval, :jitter_interval,
|
62
|
-
:max_retries, :max_retry_delay, :exponential_base
|
65
|
+
:max_retries, :max_retry_delay, :exponential_base, :batch_abort_on_exception
|
63
66
|
|
64
67
|
def _check_not_negative(key, value)
|
65
68
|
raise ArgumentError, "The '#{key}' should be positive or zero, but is: #{value}" if value <= 0
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# The MIT License
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
# of this software and associated documentation files (the 'Software'), to deal
|
5
|
+
# in the Software without restriction, including without limitation the rights
|
6
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
# copies of the Software, and to permit persons to whom the Software is
|
8
|
+
# furnished to do so, subject to the following conditions:
|
9
|
+
#
|
10
|
+
# The above copyright notice and this permission notice shall be included in
|
11
|
+
# all copies or substantial portions of the Software.
|
12
|
+
#
|
13
|
+
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
19
|
+
# THE SOFTWARE.
|
20
|
+
|
21
|
+
require 'test_helper'
|
22
|
+
require 'influxdb2/client/default_api'
|
23
|
+
|
24
|
+
class DefaultApiTest < MiniTest::Test
|
25
|
+
def setup
|
26
|
+
@logger = MockLogger.new
|
27
|
+
@api = InfluxDB2::DefaultApi.new(options: { logger: @logger })
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_level
|
31
|
+
@api.log(:debug, 'debug message')
|
32
|
+
@api.log(:warn, 'warn message')
|
33
|
+
@api.log(:error, 'error message')
|
34
|
+
@api.log(:info, 'info message')
|
35
|
+
@api.log(:others, 'others message')
|
36
|
+
|
37
|
+
assert_equal 5, @logger.messages.count
|
38
|
+
|
39
|
+
assert_equal Logger::DEBUG, @logger.messages[0][0]
|
40
|
+
assert_equal 'debug message', @logger.messages[0][1]
|
41
|
+
|
42
|
+
assert_equal Logger::WARN, @logger.messages[1][0]
|
43
|
+
assert_equal 'warn message', @logger.messages[1][1]
|
44
|
+
|
45
|
+
assert_equal Logger::ERROR, @logger.messages[2][0]
|
46
|
+
assert_equal 'error message', @logger.messages[2][1]
|
47
|
+
|
48
|
+
assert_equal Logger::INFO, @logger.messages[3][0]
|
49
|
+
assert_equal 'info message', @logger.messages[3][1]
|
50
|
+
|
51
|
+
assert_equal Logger::INFO, @logger.messages[4][0]
|
52
|
+
assert_equal 'others message', @logger.messages[4][1]
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_supports_false
|
56
|
+
@api = InfluxDB2::DefaultApi.new(options: { logger: false })
|
57
|
+
|
58
|
+
@api.log(:info, 'without error')
|
59
|
+
end
|
60
|
+
end
|
@@ -73,12 +73,16 @@ class DeleteApiIntegrationTest < MiniTest::Test
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def test_delete_all
|
76
|
+
# TODO: https://github.com/influxdata/influxdb/issues/19545
|
77
|
+
skip
|
76
78
|
@client.create_delete_api.delete(Time.utc(2010, 10, 15, 7, 20, 15), Time.utc(2020, 10, 14, 8, 20, 15))
|
77
79
|
|
78
80
|
assert_equal 0, _query_count
|
79
81
|
end
|
80
82
|
|
81
83
|
def test_delete_without_interval
|
84
|
+
# TODO: https://github.com/influxdata/influxdb/issues/19545
|
85
|
+
skip
|
82
86
|
error = assert_raises InfluxDB2::InfluxError do
|
83
87
|
@client.create_delete_api.delete(nil, nil)
|
84
88
|
end
|
@@ -226,6 +226,7 @@ class WriteApiRetryStrategyTest < MiniTest::Test
|
|
226
226
|
def setup
|
227
227
|
WebMock.disable_net_connect!
|
228
228
|
|
229
|
+
@logger = MockLogger.new
|
229
230
|
@write_options = InfluxDB2::WriteOptions.new(write_type: InfluxDB2::WriteType::BATCHING,
|
230
231
|
batch_size: 2, flush_interval: 5_000, retry_interval: 2_000)
|
231
232
|
@client = InfluxDB2::Client.new('http://localhost:8086',
|
@@ -233,7 +234,8 @@ class WriteApiRetryStrategyTest < MiniTest::Test
|
|
233
234
|
bucket: 'my-bucket',
|
234
235
|
org: 'my-org',
|
235
236
|
precision: InfluxDB2::WritePrecision::NANOSECOND,
|
236
|
-
use_ssl: false
|
237
|
+
use_ssl: false,
|
238
|
+
logger: @logger)
|
237
239
|
|
238
240
|
@write_client = @client.create_write_api(write_options: @write_options)
|
239
241
|
end
|
@@ -338,38 +340,34 @@ class WriteApiRetryStrategyTest < MiniTest::Test
|
|
338
340
|
batch_size: 1, retry_interval: 2_000, max_retries: 3,
|
339
341
|
max_retry_delay: 5_000, exponential_base: 2)
|
340
342
|
|
341
|
-
|
342
|
-
@client.create_write_api(write_options: write_options).write(data: point)
|
343
|
-
|
344
|
-
sleep(0.5)
|
343
|
+
@client.create_write_api(write_options: write_options).write(data: point)
|
345
344
|
|
346
|
-
|
347
|
-
times: 1, body: request)
|
345
|
+
sleep(0.5)
|
348
346
|
|
349
|
-
|
347
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
348
|
+
times: 1, body: request)
|
350
349
|
|
351
|
-
|
352
|
-
times: 2, body: request)
|
350
|
+
sleep(2)
|
353
351
|
|
354
|
-
|
352
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
353
|
+
times: 2, body: request)
|
355
354
|
|
356
|
-
|
357
|
-
times: 3, body: request)
|
355
|
+
sleep(4)
|
358
356
|
|
359
|
-
|
357
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
358
|
+
times: 3, body: request)
|
360
359
|
|
361
|
-
|
362
|
-
times: 4, body: request)
|
360
|
+
sleep(5)
|
363
361
|
|
364
|
-
|
362
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
363
|
+
times: 4, body: request)
|
365
364
|
|
366
|
-
|
367
|
-
times: 4, body: request)
|
365
|
+
sleep(5)
|
368
366
|
|
369
|
-
|
370
|
-
|
367
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
368
|
+
times: 4, body: request)
|
371
369
|
|
372
|
-
|
370
|
+
sleep(5)
|
373
371
|
|
374
372
|
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
375
373
|
times: 4, body: request)
|
@@ -384,7 +382,8 @@ class WriteApiRetryStrategyTest < MiniTest::Test
|
|
384
382
|
|
385
383
|
write_options = InfluxDB2::WriteOptions.new(write_type: InfluxDB2::WriteType::BATCHING,
|
386
384
|
batch_size: 1, retry_interval: 2_000, max_retries: 3,
|
387
|
-
max_retry_delay: 5_000, exponential_base: 2
|
385
|
+
max_retry_delay: 5_000, exponential_base: 2,
|
386
|
+
batch_abort_on_exception: true)
|
388
387
|
|
389
388
|
error = assert_raises InfluxDB2::InfluxError do
|
390
389
|
@client.create_write_api(write_options: write_options).write(data: 'h2o,location=west value=33i 15')
|
@@ -420,33 +419,29 @@ class WriteApiRetryStrategyTest < MiniTest::Test
|
|
420
419
|
batch_size: 1, retry_interval: 2_000, max_retries: 3,
|
421
420
|
max_retry_delay: 5_000, exponential_base: 2)
|
422
421
|
|
423
|
-
|
424
|
-
@client.create_write_api(write_options: write_options).write(data: point)
|
425
|
-
|
426
|
-
sleep(0.5)
|
422
|
+
@client.create_write_api(write_options: write_options).write(data: point)
|
427
423
|
|
428
|
-
|
429
|
-
times: 1, body: request)
|
424
|
+
sleep(0.5)
|
430
425
|
|
431
|
-
|
426
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
427
|
+
times: 1, body: request)
|
432
428
|
|
433
|
-
|
434
|
-
times: 2, body: request)
|
429
|
+
sleep(3)
|
435
430
|
|
436
|
-
|
431
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
432
|
+
times: 2, body: request)
|
437
433
|
|
438
|
-
|
439
|
-
times: 3, body: request)
|
434
|
+
sleep(3)
|
440
435
|
|
441
|
-
|
436
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
437
|
+
times: 3, body: request)
|
442
438
|
|
443
|
-
|
444
|
-
times: 4, body: request)
|
439
|
+
sleep(3)
|
445
440
|
|
446
|
-
|
447
|
-
|
441
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
442
|
+
times: 4, body: request)
|
448
443
|
|
449
|
-
|
444
|
+
sleep(3)
|
450
445
|
|
451
446
|
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
452
447
|
times: 4, body: request)
|
@@ -473,38 +468,37 @@ class WriteApiRetryStrategyTest < MiniTest::Test
|
|
473
468
|
batch_size: 1, retry_interval: 2_000, max_retries: 3,
|
474
469
|
max_retry_delay: 5_000, exponential_base: 2)
|
475
470
|
|
476
|
-
|
477
|
-
@client.create_write_api(write_options: write_options).write(data: point)
|
471
|
+
@client.create_write_api(write_options: write_options).write(data: point)
|
478
472
|
|
479
|
-
|
473
|
+
sleep(0.5)
|
480
474
|
|
481
|
-
|
482
|
-
|
475
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
476
|
+
times: 1, body: request)
|
483
477
|
|
484
|
-
|
478
|
+
sleep(2)
|
485
479
|
|
486
|
-
|
487
|
-
|
480
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
481
|
+
times: 2, body: request)
|
488
482
|
|
489
|
-
|
483
|
+
sleep(4)
|
490
484
|
|
491
|
-
|
492
|
-
|
485
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
486
|
+
times: 3, body: request)
|
493
487
|
|
494
|
-
|
488
|
+
sleep(5)
|
495
489
|
|
496
|
-
|
497
|
-
|
490
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
491
|
+
times: 4, body: request)
|
498
492
|
|
499
|
-
|
493
|
+
sleep(5)
|
500
494
|
|
501
|
-
|
502
|
-
|
495
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
496
|
+
times: 4, body: request)
|
503
497
|
|
504
|
-
|
505
|
-
end
|
498
|
+
sleep(5)
|
506
499
|
|
507
|
-
|
500
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
501
|
+
times: 4, body: request)
|
508
502
|
end
|
509
503
|
|
510
504
|
def test_write_connection_error
|
@@ -545,4 +539,89 @@ class WriteApiRetryStrategyTest < MiniTest::Test
|
|
545
539
|
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
546
540
|
times: 3, body: request)
|
547
541
|
end
|
542
|
+
|
543
|
+
def test_abort_on_exception
|
544
|
+
error_body = '{"code":"invalid","message":"unable to parse '\
|
545
|
+
'\'h2o,location=europe 1\'"}'
|
546
|
+
|
547
|
+
stub_request(:any, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns')
|
548
|
+
.to_return(status: 400, headers: { 'X-Platform-Error-Code' => 'invalid' }, body: error_body)
|
549
|
+
.to_return(status: 204)
|
550
|
+
|
551
|
+
write_options = InfluxDB2::WriteOptions.new(write_type: InfluxDB2::WriteType::BATCHING,
|
552
|
+
batch_size: 1, retry_interval: 500, max_retries: 1,
|
553
|
+
max_retry_delay: 5_000, exponential_base: 1,
|
554
|
+
batch_abort_on_exception: true)
|
555
|
+
|
556
|
+
write_api = @client.create_write_api(write_options: write_options)
|
557
|
+
|
558
|
+
error = assert_raises InfluxDB2::InfluxError do
|
559
|
+
write_api.write(data: 'h2o,location=europe 1')
|
560
|
+
write_api.write(data: 'h2o,location=europe level=2.0 1')
|
561
|
+
|
562
|
+
sleep(2)
|
563
|
+
end
|
564
|
+
|
565
|
+
assert_equal("unable to parse 'h2o,location=europe 1'", error.message)
|
566
|
+
|
567
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
568
|
+
times: 1, body: 'h2o,location=europe 1')
|
569
|
+
|
570
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
571
|
+
times: 0, body: 'h2o,location=europe level=2.0 1')
|
572
|
+
end
|
573
|
+
|
574
|
+
def test_abort_on_exception_next_batch
|
575
|
+
error_body = '{"code":"invalid","message":"unable to parse '\
|
576
|
+
'\'h2o,location=europe 1\'"}'
|
577
|
+
|
578
|
+
stub_request(:any, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns')
|
579
|
+
.to_return(status: 400, headers: { 'X-Platform-Error-Code' => 'invalid' }, body: error_body)
|
580
|
+
.to_return(status: 204)
|
581
|
+
|
582
|
+
write_options = InfluxDB2::WriteOptions.new(write_type: InfluxDB2::WriteType::BATCHING,
|
583
|
+
batch_size: 1, retry_interval: 500, max_retries: 1,
|
584
|
+
max_retry_delay: 5_000, exponential_base: 1)
|
585
|
+
|
586
|
+
write_api = @client.create_write_api(write_options: write_options)
|
587
|
+
|
588
|
+
write_api.write(data: 'h2o,location=europe 1')
|
589
|
+
write_api.write(data: 'h2o,location=europe level=2.0 1')
|
590
|
+
|
591
|
+
sleep(2)
|
592
|
+
|
593
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
594
|
+
times: 1, body: 'h2o,location=europe 1')
|
595
|
+
|
596
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
597
|
+
times: 1, body: 'h2o,location=europe level=2.0 1')
|
598
|
+
end
|
599
|
+
|
600
|
+
def test_retry_contains_message
|
601
|
+
error_body = '{"code":"temporarily unavailable","message":"Server is temporarily unavailable to accept writes."}'
|
602
|
+
|
603
|
+
stub_request(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns')
|
604
|
+
.to_return(status: 429, headers: { 'X-Platform-Error-Code' => 'temporarily unavailable', 'Retry-After' => '3' },
|
605
|
+
body: error_body).then
|
606
|
+
.to_return(status: 204)
|
607
|
+
|
608
|
+
request = "h2o_feet,location=coyote_creek water_level=1.0 1\n" \
|
609
|
+
'h2o_feet,location=coyote_creek water_level=2.0 2'
|
610
|
+
|
611
|
+
@write_client.write(data: ['h2o_feet,location=coyote_creek water_level=1.0 1',
|
612
|
+
InfluxDB2::Point.new(name: 'h2o_feet')
|
613
|
+
.add_tag('location', 'coyote_creek')
|
614
|
+
.add_field('water_level', 2.0)
|
615
|
+
.time(2, InfluxDB2::WritePrecision::NANOSECOND)])
|
616
|
+
|
617
|
+
sleep(5)
|
618
|
+
|
619
|
+
assert_requested(:post, 'http://localhost:8086/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
|
620
|
+
times: 2, body: request)
|
621
|
+
|
622
|
+
message = 'The retriable error occurred during writing of data. '\
|
623
|
+
"Reason: 'Server is temporarily unavailable to accept writes.'. Retry in: 3.0s."
|
624
|
+
|
625
|
+
assert_equal(message, @logger.messages[0][1])
|
626
|
+
end
|
548
627
|
end
|
data/test/test_helper.rb
CHANGED
@@ -37,3 +37,15 @@ require 'minitest/reporters'
|
|
37
37
|
Minitest::Reporters.use!
|
38
38
|
|
39
39
|
require 'webmock/minitest'
|
40
|
+
|
41
|
+
class MockLogger
|
42
|
+
attr_accessor :messages
|
43
|
+
|
44
|
+
def initialize
|
45
|
+
@messages = []
|
46
|
+
end
|
47
|
+
|
48
|
+
def add(level, &block)
|
49
|
+
@messages << [level, yield(block)]
|
50
|
+
end
|
51
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: influxdb-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.9.0.pre.1331
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jakub Bednar
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -168,6 +168,7 @@ files:
|
|
168
168
|
- lib/influxdb2/client/worker.rb
|
169
169
|
- lib/influxdb2/client/write_api.rb
|
170
170
|
- test/influxdb/client_test.rb
|
171
|
+
- test/influxdb/default_api_test.rb
|
171
172
|
- test/influxdb/delete_api_integration_test.rb
|
172
173
|
- test/influxdb/delete_api_test.rb
|
173
174
|
- test/influxdb/flux_csv_parser_test.rb
|
@@ -207,6 +208,7 @@ specification_version: 4
|
|
207
208
|
summary: Ruby library for InfluxDB 2.
|
208
209
|
test_files:
|
209
210
|
- test/influxdb/client_test.rb
|
211
|
+
- test/influxdb/default_api_test.rb
|
210
212
|
- test/influxdb/delete_api_integration_test.rb
|
211
213
|
- test/influxdb/delete_api_test.rb
|
212
214
|
- test/influxdb/flux_csv_parser_test.rb
|