influxdb-client 1.7.0.pre.1015 → 1.8.0.pre.1240
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/.circleci/config.yml +2 -5
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +15 -1
- data/README.md +51 -17
- data/bin/influxdb-onboarding.sh +2 -2
- data/bin/influxdb-restart.sh +2 -1
- data/lib/influxdb2/client/client.rb +5 -4
- data/lib/influxdb2/client/default_api.rb +2 -0
- data/lib/influxdb2/client/influx_error.rb +20 -1
- data/lib/influxdb2/client/point.rb +1 -1
- data/lib/influxdb2/client/version.rb +1 -1
- data/lib/influxdb2/client/worker.rb +17 -5
- data/lib/influxdb2/client/write_api.rb +65 -4
- data/test/influxdb/client_test.rb +10 -10
- data/test/influxdb/delete_api_integration_test.rb +5 -1
- data/test/influxdb/delete_api_test.rb +15 -15
- data/test/influxdb/query_api_integration_test.rb +1 -1
- data/test/influxdb/query_api_stream_test.rb +1 -1
- data/test/influxdb/query_api_test.rb +7 -7
- data/test/influxdb/write_api_batching_test.rb +308 -52
- data/test/influxdb/write_api_integration_test.rb +2 -2
- data/test/influxdb/write_api_test.rb +135 -38
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e49b8841c9ce5b13c24595d8fec2b2ed6eb8fe6676b606b9a10ef851d8ea98a9
|
4
|
+
data.tar.gz: 328d60cf43f6d5c1a43e5ac22945a76175c2752b370a5ca155a7236aedbe79be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a20d45c4dad7031e96bedb7ac76c3f146a17d8bec00fad5eba2d6cba062bcef172b5c389dce7db589b8d5481256cc246d652c48019fb6087b4d49f88c45c7d6
|
7
|
+
data.tar.gz: 707f373b6a72790a4e34b40490077b2da5e2bd1b2fd703d48237a1a80a4b5fe1053bb2b4263fb8f586e37c85544ac3b292f22d9c8012f101e0db56f483ba617c
|
data/.circleci/config.yml
CHANGED
@@ -82,6 +82,8 @@ jobs:
|
|
82
82
|
docker:
|
83
83
|
- image: << parameters.ruby-image >>
|
84
84
|
- image: &influx-image quay.io/influxdb/<< parameters.influxdb-image >>
|
85
|
+
environment:
|
86
|
+
INFLUXD_HTTP_BIND_ADDRESS: :8086
|
85
87
|
steps:
|
86
88
|
- prepare
|
87
89
|
- test:
|
@@ -89,13 +91,8 @@ jobs:
|
|
89
91
|
- storing-test-results
|
90
92
|
|
91
93
|
deploy-preview:
|
92
|
-
parameters:
|
93
|
-
influxdb-image:
|
94
|
-
type: string
|
95
|
-
default: *default-influxdb-image
|
96
94
|
docker:
|
97
95
|
- image: *default-ruby-image
|
98
|
-
- image: *influx-image
|
99
96
|
steps:
|
100
97
|
- run:
|
101
98
|
name: Early return if this build is from a forked repository
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,18 @@
|
|
1
|
-
## 1.
|
1
|
+
## 1.8.0 [unreleased]
|
2
|
+
|
3
|
+
### Features
|
4
|
+
1. [#36](https://github.com/influxdata/influxdb-client-ruby/issues/36): Added support for default tags
|
5
|
+
|
6
|
+
### API
|
7
|
+
1. [#50](https://github.com/influxdata/influxdb-client-ruby/pull/50): Default port changed from 9999 -> 8086
|
8
|
+
|
9
|
+
### Bug Fixes
|
10
|
+
1. [#52](https://github.com/influxdata/influxdb-client-ruby/pull/52): Fixed aborting of background threads
|
11
|
+
|
12
|
+
## 1.7.0 [2020-08-14]
|
13
|
+
|
14
|
+
### Features
|
15
|
+
1. [#47](https://github.com/influxdata/influxdb-client-ruby/pull/47): Added max_retries, max_retry_delay and exponential_base to WriteApi
|
2
16
|
|
3
17
|
## 1.6.0 [2020-07-17]
|
4
18
|
|
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.7.0
|
27
27
|
```
|
28
28
|
|
29
29
|
## Usage
|
@@ -33,7 +33,7 @@ gem install influxdb-client -v 1.6.0
|
|
33
33
|
Use **InfluxDB::Client** to create a client connected to a running InfluxDB 2 instance.
|
34
34
|
|
35
35
|
```ruby
|
36
|
-
client = InfluxDB2::Client.new('https://localhost:
|
36
|
+
client = InfluxDB2::Client.new('https://localhost:8086', 'my-token')
|
37
37
|
```
|
38
38
|
|
39
39
|
#### Client Options
|
@@ -50,7 +50,7 @@ client = InfluxDB2::Client.new('https://localhost:9999', 'my-token')
|
|
50
50
|
| use_ssl | Turn on/off SSL for HTTP communication | bool | true |
|
51
51
|
|
52
52
|
```ruby
|
53
|
-
client = InfluxDB2::Client.new('https://localhost:
|
53
|
+
client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
|
54
54
|
bucket: 'my-bucket',
|
55
55
|
org: 'my-org',
|
56
56
|
precision: InfluxDB2::WritePrecision::NANOSECOND)
|
@@ -68,7 +68,7 @@ The result retrieved by [QueryApi](https://github.com/influxdata/influxdb-client
|
|
68
68
|
|
69
69
|
Synchronously executes the Flux query and return result as unprocessed String
|
70
70
|
```ruby
|
71
|
-
client = InfluxDB2::Client.new('https://localhost:
|
71
|
+
client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
|
72
72
|
bucket: 'my-bucket',
|
73
73
|
org: 'my-org')
|
74
74
|
|
@@ -78,7 +78,7 @@ result = query_api.query_raw(query: 'from(bucket:"' + bucket + '") |> range(star
|
|
78
78
|
#### Synchronous query
|
79
79
|
Synchronously executes the Flux query and return result as a Array of [FluxTables](https://github.com/influxdata/influxdb-client-ruby/blob/master/lib/influxdb2/client/flux_table.rb)
|
80
80
|
```ruby
|
81
|
-
client = InfluxDB2::Client.new('https://localhost:
|
81
|
+
client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
|
82
82
|
bucket: 'my-bucket',
|
83
83
|
org: 'my-org')
|
84
84
|
|
@@ -89,7 +89,7 @@ result = query_api.query(query: 'from(bucket:"' + bucket + '") |> range(start: 1
|
|
89
89
|
#### Query stream
|
90
90
|
Synchronously executes the Flux query and return stream of [FluxRecord](https://github.com/influxdata/influxdb-client-ruby/blob/master/lib/influxdb2/client/flux_table.rb)
|
91
91
|
```ruby
|
92
|
-
client = InfluxDB2::Client.new('https://localhost:
|
92
|
+
client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
|
93
93
|
bucket: 'my-bucket',
|
94
94
|
org: 'my-org')
|
95
95
|
|
@@ -107,7 +107,7 @@ end
|
|
107
107
|
The [WriteApi](https://github.com/influxdata/influxdb-client-ruby/blob/master/lib/influxdb2/client/write_api.rb) supports synchronous and batching writes into InfluxDB 2.0. In default api uses synchronous write. To enable batching you can use WriteOption.
|
108
108
|
|
109
109
|
```ruby
|
110
|
-
client = InfluxDB2::Client.new('https://localhost:
|
110
|
+
client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
|
111
111
|
bucket: 'my-bucket',
|
112
112
|
org: 'my-org',
|
113
113
|
precision: InfluxDB2::WritePrecision::NANOSECOND)
|
@@ -123,13 +123,17 @@ The writes are processed in batches which are configurable by `WriteOptions`:
|
|
123
123
|
| --- | --- | --- |
|
124
124
|
| batchSize | the number of data point to collect in batch | 1000 |
|
125
125
|
| flush_interval | the number of milliseconds before the batch is written | 1000 |
|
126
|
-
| retry_interval | the number of milliseconds to retry unsuccessful write. The retry interval is used when the InfluxDB server does not specify "Retry-After" header. |
|
126
|
+
| retry_interval | the number of milliseconds to retry unsuccessful write. The retry interval is used when the InfluxDB server does not specify "Retry-After" header. | 5000 |
|
127
127
|
| jitter_interval | the number of milliseconds to increase the batch flush interval by a random amount | 0 |
|
128
|
-
|
128
|
+
| max_retries | the number of max retries when write fails | 5 |
|
129
|
+
| max_retry_delay | maximum delay when retrying write in milliseconds | 180000 |
|
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 |
|
129
131
|
```ruby
|
130
132
|
write_options = InfluxDB2::WriteOptions.new(write_type: InfluxDB2::WriteType::BATCHING,
|
131
|
-
batch_size: 10, flush_interval: 5_000
|
132
|
-
|
133
|
+
batch_size: 10, flush_interval: 5_000,
|
134
|
+
max_retries: 3, max_retry_delay: 15_000,
|
135
|
+
exponential_base: 2)
|
136
|
+
client = InfluxDB2::Client.new('http://localhost:8086',
|
133
137
|
'my-token',
|
134
138
|
bucket: 'my-bucket',
|
135
139
|
org: 'my-org',
|
@@ -144,7 +148,7 @@ write_api.write(data: 'h2o,location=west value=33i 15')
|
|
144
148
|
|
145
149
|
Configure default time precision:
|
146
150
|
```ruby
|
147
|
-
client = InfluxDB2::Client.new('https://localhost:
|
151
|
+
client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
|
148
152
|
bucket: 'my-bucket',
|
149
153
|
org: 'my-org',
|
150
154
|
precision: InfluxDB2::WritePrecision::NANOSECOND)
|
@@ -152,7 +156,7 @@ client = InfluxDB2::Client.new('https://localhost:9999', 'my-token',
|
|
152
156
|
|
153
157
|
Configure precision per write:
|
154
158
|
```ruby
|
155
|
-
client = InfluxDB2::Client.new('https://localhost:
|
159
|
+
client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
|
156
160
|
bucket: 'my-bucket',
|
157
161
|
org: 'my-org')
|
158
162
|
|
@@ -169,7 +173,7 @@ Allowed values for precision are:
|
|
169
173
|
|
170
174
|
Default `bucket` and `organization` destination are configured via `InfluxDB::Client`:
|
171
175
|
```ruby
|
172
|
-
client = InfluxDB2::Client.new('https://localhost:
|
176
|
+
client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
|
173
177
|
bucket: 'my-bucket',
|
174
178
|
org: 'my-org')
|
175
179
|
```
|
@@ -177,7 +181,7 @@ client = InfluxDB2::Client.new('https://localhost:9999', 'my-token',
|
|
177
181
|
but there is also possibility to override configuration per write:
|
178
182
|
|
179
183
|
```ruby
|
180
|
-
client = InfluxDB2::Client.new('https://localhost:
|
184
|
+
client = InfluxDB2::Client.new('https://localhost:8086', 'my-token')
|
181
185
|
|
182
186
|
write_api = client.create_write_api
|
183
187
|
write_api.write(data: 'h2o,location=west value=33i 15', bucket: 'production-data', org: 'customer-1')
|
@@ -193,7 +197,7 @@ The data could be written as:
|
|
193
197
|
1. `Array` of above items
|
194
198
|
|
195
199
|
```ruby
|
196
|
-
client = InfluxDB2::Client.new('https://localhost:
|
200
|
+
client = InfluxDB2::Client.new('https://localhost:8086', 'my-token',
|
197
201
|
bucket: 'my-bucket',
|
198
202
|
org: 'my-org',
|
199
203
|
precision: InfluxDB2::WritePrecision::NANOSECOND)
|
@@ -210,12 +214,42 @@ write_api = client.create_write_api
|
|
210
214
|
write_api.write(data: ['h2o,location=west value=33i 15', point, hash])
|
211
215
|
```
|
212
216
|
|
217
|
+
#### Default Tags
|
218
|
+
|
219
|
+
Sometimes is useful to store same information in every measurement e.g. `hostname`, `location`, `customer`.
|
220
|
+
The client is able to use static value, app settings or env variable as a tag value.
|
221
|
+
|
222
|
+
The expressions:
|
223
|
+
- `California Miner` - static value
|
224
|
+
- `${env.hostname}` - environment property
|
225
|
+
|
226
|
+
##### Via API
|
227
|
+
|
228
|
+
```ruby
|
229
|
+
client = InfluxDB2::Client.new('http://localhost:8086', 'my-token',
|
230
|
+
bucket: 'my-bucket',
|
231
|
+
org: 'my-org',
|
232
|
+
precision: InfluxDB2::WritePrecision::NANOSECOND,
|
233
|
+
use_ssl: false,
|
234
|
+
tags: { id: '132-987-655' })
|
235
|
+
|
236
|
+
point_settings = InfluxDB2::PointSettings.new(default_tags: { customer: 'California Miner' })
|
237
|
+
point_settings.add_default_tag('data_center', '${env.data_center}')
|
238
|
+
|
239
|
+
write_api = client.create_write_api(write_options: InfluxDB2::SYNCHRONOUS,
|
240
|
+
point_settings: point_settings)
|
241
|
+
|
242
|
+
write_api.write(data: InfluxDB2::Point.new(name: 'h2o')
|
243
|
+
.add_tag('location', 'europe')
|
244
|
+
.add_field('level', 2))
|
245
|
+
```
|
246
|
+
|
213
247
|
### Delete data
|
214
248
|
|
215
249
|
The [DeleteApi](https://github.com/influxdata/influxdb-client-ruby/blob/master/lib/influxdb2/client/delete_api.rb) supports deletes [points](https://v2.docs.influxdata.com/v2.0/reference/glossary/#point) from an InfluxDB bucket.
|
216
250
|
|
217
251
|
```ruby
|
218
|
-
client = InfluxDB2::Client.new('http://localhost:
|
252
|
+
client = InfluxDB2::Client.new('http://localhost:8086', 'my-token',
|
219
253
|
bucket: 'my-bucket',
|
220
254
|
org: 'my-org',
|
221
255
|
precision: InfluxDB2::WritePrecision::NANOSECOND)
|
data/bin/influxdb-onboarding.sh
CHANGED
@@ -24,12 +24,12 @@
|
|
24
24
|
set -e
|
25
25
|
|
26
26
|
echo "Wait to start InfluxDB 2.0"
|
27
|
-
wget -S --spider --tries=20 --retry-connrefused --waitretry=5 http://localhost:
|
27
|
+
wget -S --spider --tries=20 --retry-connrefused --waitretry=5 http://localhost:8086/metrics
|
28
28
|
|
29
29
|
echo
|
30
30
|
echo "Post onBoarding request, to setup initial user (my-user@my-password), org (my-org) and bucketSetup (my-bucket)"
|
31
31
|
echo
|
32
|
-
curl -i -X POST http://localhost:
|
32
|
+
curl -i -X POST http://localhost:8086/api/v2/setup -H 'accept: application/json' \
|
33
33
|
-d '{
|
34
34
|
"username": "my-user",
|
35
35
|
"password": "my-password",
|
data/bin/influxdb-restart.sh
CHANGED
@@ -49,9 +49,10 @@ echo
|
|
49
49
|
docker pull "${INFLUXDB_V2_IMAGE}" || true
|
50
50
|
docker run \
|
51
51
|
--detach \
|
52
|
+
--env INFLUXD_HTTP_BIND_ADDRESS=:8086 \
|
52
53
|
--name influxdb_v2 \
|
53
54
|
--network influx_network \
|
54
|
-
--publish
|
55
|
+
--publish 8086:8086 \
|
55
56
|
"${INFLUXDB_V2_IMAGE}"
|
56
57
|
|
57
58
|
#
|
@@ -29,10 +29,10 @@ module InfluxDB2
|
|
29
29
|
# Instantiate a new InfluxDB client.
|
30
30
|
#
|
31
31
|
# @example Instantiate a client.
|
32
|
-
# InfluxDBClient::Client.new(url: 'https://localhost:
|
32
|
+
# InfluxDBClient::Client.new(url: 'https://localhost:8086', token: 'my-token')
|
33
33
|
#
|
34
34
|
# @param [Hash] options The options to be used by the client.
|
35
|
-
# @param [String] url InfluxDB URL to connect to (ex. https://localhost:
|
35
|
+
# @param [String] url InfluxDB URL to connect to (ex. https://localhost:8086).
|
36
36
|
# @param [String] token Access Token used for authenticating/authorizing the InfluxDB request sent by client.
|
37
37
|
#
|
38
38
|
# @option options [String] :bucket the default destination bucket for writes
|
@@ -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 [Hash] :tags Default tags which will be added to each point written by api.
|
46
47
|
# the body line-protocol
|
47
48
|
def initialize(url, token, options = nil)
|
48
49
|
@auto_closeable = []
|
@@ -57,8 +58,8 @@ module InfluxDB2
|
|
57
58
|
# Write time series data into InfluxDB thought WriteApi.
|
58
59
|
#
|
59
60
|
# @return [WriteApi] New instance of WriteApi.
|
60
|
-
def create_write_api(write_options: InfluxDB2::SYNCHRONOUS)
|
61
|
-
write_api = WriteApi.new(options: @options, write_options: write_options)
|
61
|
+
def create_write_api(write_options: InfluxDB2::SYNCHRONOUS, point_settings: InfluxDB2::DEFAULT_POINT_SETTINGS)
|
62
|
+
write_api = WriteApi.new(options: @options, write_options: write_options, point_settings: point_settings)
|
62
63
|
@auto_closeable.push(write_api)
|
63
64
|
write_api
|
64
65
|
end
|
@@ -1,19 +1,33 @@
|
|
1
1
|
module InfluxDB2
|
2
2
|
# InfluxError that is raised during HTTP communication.
|
3
3
|
class InfluxError < StandardError
|
4
|
+
HTTP_ERRORS = [
|
5
|
+
EOFError,
|
6
|
+
Errno::ECONNREFUSED,
|
7
|
+
Errno::ECONNRESET,
|
8
|
+
Errno::EINVAL,
|
9
|
+
Net::HTTPBadResponse,
|
10
|
+
Net::HTTPHeaderSyntaxError,
|
11
|
+
Net::ProtocolError,
|
12
|
+
Timeout::Error
|
13
|
+
].freeze
|
14
|
+
|
4
15
|
# HTTP status code
|
5
16
|
attr_reader :code
|
6
17
|
# Reference code unique to the error type
|
7
18
|
attr_reader :reference
|
8
19
|
# The Retry-After header describes when to try the request again.
|
9
20
|
attr_reader :retry_after
|
21
|
+
# original error
|
22
|
+
attr_reader :original
|
10
23
|
|
11
|
-
def initialize(message:, code:, reference:, retry_after:)
|
24
|
+
def initialize(original = nil, message:, code:, reference:, retry_after:)
|
12
25
|
super(message)
|
13
26
|
|
14
27
|
@code = code
|
15
28
|
@reference = reference
|
16
29
|
@retry_after = retry_after
|
30
|
+
@original = original
|
17
31
|
end
|
18
32
|
|
19
33
|
def self.from_response(response)
|
@@ -27,5 +41,10 @@ module InfluxDB2
|
|
27
41
|
obj = new(message: message, code: '', reference: '', retry_after: '')
|
28
42
|
obj
|
29
43
|
end
|
44
|
+
|
45
|
+
def self.from_error(error)
|
46
|
+
obj = new(error, message: error.message, code: '', reference: '', retry_after: '')
|
47
|
+
obj
|
48
|
+
end
|
30
49
|
end
|
31
50
|
end
|
@@ -37,6 +37,7 @@ module InfluxDB2
|
|
37
37
|
_check_background_queue
|
38
38
|
end
|
39
39
|
end
|
40
|
+
@thread_flush.abort_on_exception = true
|
40
41
|
|
41
42
|
@thread_size = Thread.new do
|
42
43
|
until api_client.closed
|
@@ -44,6 +45,7 @@ module InfluxDB2
|
|
44
45
|
sleep 0.01
|
45
46
|
end
|
46
47
|
end
|
48
|
+
@thread_size.abort_on_exception = true
|
47
49
|
end
|
48
50
|
|
49
51
|
def push(payload)
|
@@ -94,22 +96,32 @@ module InfluxDB2
|
|
94
96
|
|
95
97
|
def _write(data)
|
96
98
|
data.each do |key, points|
|
97
|
-
_write_raw(key, points)
|
99
|
+
_write_raw(key, points, 1, @write_options.retry_interval)
|
98
100
|
end
|
99
101
|
end
|
100
102
|
|
101
|
-
def _write_raw(key, points)
|
103
|
+
def _write_raw(key, points, attempts, retry_interval)
|
102
104
|
if @write_options.jitter_interval > 0
|
103
105
|
jitter_delay = (@write_options.jitter_interval.to_f / 1_000) * rand
|
104
106
|
sleep jitter_delay
|
105
107
|
end
|
106
108
|
@api_client.write_raw(points.join("\n"), precision: key.precision, bucket: key.bucket, org: key.org)
|
107
109
|
rescue InfluxError => e
|
108
|
-
raise e if
|
110
|
+
raise e if attempts > @write_options.max_retries
|
111
|
+
raise e if (e.code.nil? || e.code.to_i < 429) && !_connection_error(e.original)
|
112
|
+
|
113
|
+
timeout = if e.retry_after.empty?
|
114
|
+
[retry_interval.to_f, @write_options.max_retry_delay.to_f].min / 1_000
|
115
|
+
else
|
116
|
+
e.retry_after.to_f
|
117
|
+
end
|
109
118
|
|
110
|
-
timeout = e.retry_after.empty? ? @write_options.retry_interval.to_f / 1_000 : e.retry_after.to_f
|
111
119
|
sleep timeout
|
112
|
-
_write_raw(key, points)
|
120
|
+
_write_raw(key, points, attempts + 1, retry_interval * @write_options.exponential_base)
|
121
|
+
end
|
122
|
+
|
123
|
+
def _connection_error(error)
|
124
|
+
InfluxError::HTTP_ERRORS.any? { |c| error.instance_of? c }
|
113
125
|
end
|
114
126
|
end
|
115
127
|
end
|
@@ -34,21 +34,32 @@ module InfluxDB2
|
|
34
34
|
# @param [Integer] retry_interval: number of milliseconds to retry unsuccessful write.
|
35
35
|
# The retry interval is used when the InfluxDB server does not specify "Retry-After" header.
|
36
36
|
# @param [Integer] jitter_interval: the number of milliseconds to increase the batch flush interval
|
37
|
+
# @param [Integer] max_retries: max number of retries when write fails
|
38
|
+
# @param [Integer] max_retry_delay: maximum delay when retrying write in milliseconds
|
37
39
|
# by a random amount
|
38
|
-
|
39
|
-
|
40
|
+
# @param [Integer] exponential_base: base for the exponential retry delay, the next delay is computed as
|
41
|
+
# "exponential_base^(attempts-1) + random(jitter_interval)"
|
42
|
+
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)
|
40
44
|
_check_not_negative('batch_size', batch_size)
|
41
45
|
_check_not_negative('flush_interval', flush_interval)
|
42
46
|
_check_not_negative('retry_interval', retry_interval)
|
43
47
|
_check_positive('jitter_interval', jitter_interval)
|
48
|
+
_check_positive('max_retries', jitter_interval)
|
49
|
+
_check_positive('max_retry_delay', jitter_interval)
|
50
|
+
_check_positive('exponential_base', exponential_base)
|
44
51
|
@write_type = write_type
|
45
52
|
@batch_size = batch_size
|
46
53
|
@flush_interval = flush_interval
|
47
54
|
@retry_interval = retry_interval
|
48
55
|
@jitter_interval = jitter_interval
|
56
|
+
@max_retries = max_retries
|
57
|
+
@max_retry_delay = max_retry_delay
|
58
|
+
@exponential_base = exponential_base
|
49
59
|
end
|
50
60
|
|
51
|
-
attr_reader :write_type, :batch_size, :flush_interval, :retry_interval, :jitter_interval
|
61
|
+
attr_reader :write_type, :batch_size, :flush_interval, :retry_interval, :jitter_interval,
|
62
|
+
:max_retries, :max_retry_delay, :exponential_base
|
52
63
|
|
53
64
|
def _check_not_negative(key, value)
|
54
65
|
raise ArgumentError, "The '#{key}' should be positive or zero, but is: #{value}" if value <= 0
|
@@ -61,6 +72,30 @@ module InfluxDB2
|
|
61
72
|
|
62
73
|
SYNCHRONOUS = InfluxDB2::WriteOptions.new(write_type: WriteType::SYNCHRONOUS)
|
63
74
|
|
75
|
+
# Settings to store default tags.
|
76
|
+
#
|
77
|
+
class PointSettings
|
78
|
+
# @param [Hash] default_tags Default tags which will be added to each point written by api.
|
79
|
+
def initialize(default_tags: nil)
|
80
|
+
@default_tags = default_tags || {}
|
81
|
+
end
|
82
|
+
attr_reader :default_tags
|
83
|
+
|
84
|
+
def add_default_tag(key, expression)
|
85
|
+
@default_tags[key] = expression
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.get_value(value)
|
89
|
+
if value.start_with?('${env.')
|
90
|
+
ENV[value[6..-2]]
|
91
|
+
else
|
92
|
+
value
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
DEFAULT_POINT_SETTINGS = InfluxDB2::PointSettings.new
|
98
|
+
|
64
99
|
# Precision constants.
|
65
100
|
#
|
66
101
|
class WritePrecision
|
@@ -82,10 +117,13 @@ module InfluxDB2
|
|
82
117
|
class WriteApi < DefaultApi
|
83
118
|
# @param [Hash] options The options to be used by the client.
|
84
119
|
# @param [WriteOptions] write_options Write api configuration.
|
85
|
-
|
120
|
+
# @param [PointSettings] point_settings Default tags configuration
|
121
|
+
def initialize(options:, write_options: SYNCHRONOUS, point_settings: InfluxDB2::PointSettings.new)
|
86
122
|
super(options: options)
|
87
123
|
@write_options = write_options
|
124
|
+
@point_settings = point_settings
|
88
125
|
@closed = false
|
126
|
+
@options[:tags].each { |key, value| point_settings.add_default_tag(key, value) } if @options.key?(:tags)
|
89
127
|
end
|
90
128
|
attr_reader :closed
|
91
129
|
|
@@ -129,6 +167,8 @@ module InfluxDB2
|
|
129
167
|
_check('bucket', bucket_param)
|
130
168
|
_check('org', org_param)
|
131
169
|
|
170
|
+
_add_default_tags(data)
|
171
|
+
|
132
172
|
payload = _generate_payload(data, bucket: bucket_param, org: org_param, precision: precision_param)
|
133
173
|
return nil if payload.nil?
|
134
174
|
|
@@ -212,6 +252,27 @@ module InfluxDB2
|
|
212
252
|
end
|
213
253
|
end
|
214
254
|
|
255
|
+
def _add_default_tags(data)
|
256
|
+
default_tags = @point_settings.default_tags
|
257
|
+
|
258
|
+
default_tags.each do |key, expression|
|
259
|
+
value = PointSettings.get_value(expression)
|
260
|
+
_add_default_tag(data, key, value)
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
def _add_default_tag(data, key, value)
|
265
|
+
if data.is_a?(Point)
|
266
|
+
data.add_tag(key, value)
|
267
|
+
elsif data.is_a?(Hash)
|
268
|
+
data[:tags][key] = value
|
269
|
+
elsif data.respond_to? :map
|
270
|
+
data.map do |item|
|
271
|
+
_add_default_tag(item, key, value)
|
272
|
+
end.reject(&:nil?)
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
215
276
|
def _generate_payload(data, precision: nil, bucket: nil, org: nil)
|
216
277
|
if data.nil?
|
217
278
|
nil
|