influxdb-client 1.1.0.pre.380 → 1.1.0.pre.459

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac72d5aebd28ce183dfff99beb7e258c3aaa4948f582b0b9616ec2cb0e780321
4
- data.tar.gz: d2cc1d8a74144cd95b17b6d9d1596cba76c1d65b9d561305f271e57eb3837295
3
+ metadata.gz: 8e48f3342f7073bb62a53a8665fb07e2ec1ce83d35badca54004db480b85eb5d
4
+ data.tar.gz: 4eda6f75500868cbb32cb7cb46abdf63e20cc3332952d5504d8d9e3e520860e7
5
5
  SHA512:
6
- metadata.gz: f17c6a9611e9528d38d32213d0c94fae2735fddd0a538fa35710f9d24fce84acac98457e2687007df94aa035669ae4d01770ec053482be23f6bbd57570901649
7
- data.tar.gz: 3d1b49817267f41d88f1c5d6704e45955bd059d4a807b9a3a3eb2f82a4d88f243cfe7106ea97924ab8561c41c9eb0880a3ed4e088bfea1dcfdfb8ae3d6462191
6
+ metadata.gz: 6fb77e117b116a87d58d3d8cc2bfb27c3557eeea523a4518892a6d6821653eea41bb0bf0c115a11039ef9bf6ec110deca808247c0d2bfc2cc7f73f04cebe72eb
7
+ data.tar.gz: 7ec5e8619def15d7e67d09c6ee068761aee2c902fc9be753ebba3cb173371f824717d778186a7ede2baf4db1a899f9df20ce0092920fb737035b44aa6d878030
@@ -3,6 +3,7 @@
3
3
  ### Features
4
4
  1. [#14](https://github.com/influxdata/influxdb-client-ruby/issues/14): Added QueryApi
5
5
  2. [#17](https://github.com/influxdata/influxdb-client-ruby/issues/17): Added possibility to stream query result
6
+ 3. [#19](https://github.com/influxdata/influxdb-client-ruby/issues/19): Added WriteOptions and possibility to batch write
6
7
 
7
8
  ## 1.0.0.beta [2020-01-17]
8
9
 
data/README.md CHANGED
@@ -105,6 +105,7 @@ end
105
105
  ```
106
106
 
107
107
  ### Writing data
108
+ 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
109
 
109
110
  ```ruby
110
111
  client = InfluxDB2::Client.new('https://localhost:9999', 'my-token',
@@ -116,6 +117,28 @@ write_api = client.create_write_api
116
117
  write_api.write(data: 'h2o,location=west value=33i 15')
117
118
  ```
118
119
 
120
+ #### Batching
121
+ The writes are processed in batches which are configurable by `WriteOptions`:
122
+
123
+ | Property | Description | Default Value |
124
+ | --- | --- | --- |
125
+ | **batchSize** | the number of data point to collect in batch | 1000 |
126
+ | **flushInterval** | the number of milliseconds before the batch is written | 1000 |
127
+
128
+ ```ruby
129
+ write_options = InfluxDB2::WriteOptions.new(write_type: InfluxDB2::WriteType::BATCHING,
130
+ batch_size: 10, flush_interval: 5_000)
131
+ client = InfluxDB2::Client.new('http://localhost:9999',
132
+ 'my-token',
133
+ bucket: 'my-bucket',
134
+ org: 'my-org',
135
+ precision: InfluxDB2::WritePrecision::NANOSECOND,
136
+ use_ssl: false)
137
+
138
+ write_api = client.create_write_api(write_options: write_options)
139
+ write_api.write(data: 'h2o,location=west value=33i 15')
140
+ ```
141
+
119
142
  #### Time precision
120
143
 
121
144
  Configure default time precision:
@@ -135,7 +158,6 @@ client = InfluxDB2::Client.new('https://localhost:9999', 'my-token',
135
158
  write_api = client.create_write_api
136
159
  write_api.write(data: 'h2o,location=west value=33i 15', precision: InfluxDB2::WritePrecision::SECOND)
137
160
  ```
138
-
139
161
  Allowed values for precision are:
140
162
  - `InfluxDB::WritePrecision::NANOSECOND` for nanosecond
141
163
  - `InfluxDB::WritePrecision::MICROSECOND` for microsecond
@@ -45,6 +45,7 @@ module InfluxDB2
45
45
  # @option options [bool] :use_ssl Turn on/off SSL for HTTP communication
46
46
  # the body line-protocol
47
47
  def initialize(url, token, options = nil)
48
+ @auto_closeable = []
48
49
  @options = options ? options.dup : {}
49
50
  @options[:url] = url if url.is_a? String
50
51
  @options[:token] = token if token.is_a? String
@@ -56,8 +57,10 @@ module InfluxDB2
56
57
  # Write time series data into InfluxDB thought WriteApi.
57
58
  #
58
59
  # @return [WriteApi] New instance of WriteApi.
59
- def create_write_api
60
- WriteApi.new(options: @options)
60
+ def create_write_api(write_options: InfluxDB2::SYNCHRONOUS)
61
+ write_api = WriteApi.new(options: @options, write_options: write_options)
62
+ @auto_closeable.push(write_api)
63
+ write_api
61
64
  end
62
65
 
63
66
  # Get the Query client.
@@ -72,6 +75,7 @@ module InfluxDB2
72
75
  # @return [ true ] Always true.
73
76
  def close!
74
77
  @closed = true
78
+ @auto_closeable.each(&:close!)
75
79
  true
76
80
  end
77
81
  end
@@ -45,6 +45,7 @@ module InfluxDB2
45
45
  @time = time
46
46
  @precision = precision
47
47
  end
48
+ attr_reader :precision
48
49
 
49
50
  # Create DataPoint instance from specified data.
50
51
  #
@@ -0,0 +1,89 @@
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
+ module InfluxDB2
22
+ # Worker for handling write batching queue
23
+ #
24
+ class Worker
25
+ def initialize(api_client, write_options)
26
+ @api_client = api_client
27
+ @write_options = write_options
28
+
29
+ @queue = Queue.new
30
+ @queue_event = Queue.new
31
+
32
+ @queue_event.push(true)
33
+
34
+ @thread_flush = Thread.new do
35
+ until api_client.closed
36
+ sleep @write_options.flush_interval / 1_000
37
+ check_background_queue
38
+ end
39
+ end
40
+
41
+ @thread_size = Thread.new do
42
+ until api_client.closed
43
+ check_background_queue(size: true) if @queue.length >= @write_options.batch_size
44
+ sleep 0.01
45
+ end
46
+ end
47
+ end
48
+
49
+ def push(payload)
50
+ @queue.push(payload)
51
+ end
52
+
53
+ def check_background_queue(size: false, flush_all: false)
54
+ @queue_event.pop
55
+ data = {}
56
+ points = 0
57
+
58
+ if size && @queue.length < @write_options.batch_size
59
+ @queue_event.push(true)
60
+ return
61
+ end
62
+
63
+ while (flush_all || points < @write_options.batch_size) && !@queue.empty?
64
+ begin
65
+ item = @queue.pop(true)
66
+ key = item.key
67
+ data[key] = [] unless data.key?(key)
68
+ data[key] << item.data
69
+ points += 1
70
+ rescue ThreadError
71
+ return
72
+ end
73
+ end
74
+
75
+ write(data) unless data.values.flatten.empty?
76
+ @queue_event.push(true)
77
+ end
78
+
79
+ def flush_all
80
+ check_background_queue(flush_all: true) unless @queue.empty?
81
+ end
82
+
83
+ def write(data)
84
+ data.each do |key, points|
85
+ @api_client.write_raw(points.join("\n"), precision: key.precision, bucket: key.bucket, org: key.org)
86
+ end
87
+ end
88
+ end
89
+ end
@@ -17,8 +17,31 @@
17
17
  # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
18
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
19
  # THE SOFTWARE.
20
+ require_relative 'worker'
20
21
 
21
22
  module InfluxDB2
23
+ module WriteType
24
+ SYNCHRONOUS = 1
25
+ BATCHING = 2
26
+ end
27
+
28
+ # Creates write api configuration.
29
+ #
30
+ # @param write_type: methods of write (batching, asynchronous, synchronous)
31
+ # @param batch_size: the number of data point to collect in batch
32
+ # @param flush_interval: flush data at least in this interval
33
+ class WriteOptions
34
+ def initialize(write_type: WriteType::SYNCHRONOUS, batch_size: 1_000, flush_interval: 1_000)
35
+ @write_type = write_type
36
+ @batch_size = batch_size
37
+ @flush_interval = flush_interval
38
+ end
39
+
40
+ attr_reader :write_type, :batch_size, :flush_interval
41
+ end
42
+
43
+ SYNCHRONOUS = InfluxDB2::WriteOptions.new(write_type: WriteType::SYNCHRONOUS)
44
+
22
45
  # Precision constants.
23
46
  #
24
47
  class WritePrecision
@@ -39,9 +62,13 @@ module InfluxDB2
39
62
  #
40
63
  class WriteApi < DefaultApi
41
64
  # @param [Hash] options The options to be used by the client.
42
- def initialize(options:)
65
+ # @param [WriteOptions] write_options Write api configuration.
66
+ def initialize(options:, write_options: SYNCHRONOUS)
43
67
  super(options: options)
68
+ @write_options = write_options
69
+ @closed = false
44
70
  end
71
+ attr_reader :closed
45
72
 
46
73
  # Write data into specified Bucket.
47
74
  #
@@ -83,33 +110,108 @@ module InfluxDB2
83
110
  _check('bucket', bucket_param)
84
111
  _check('org', org_param)
85
112
 
86
- payload = _generate_payload(data)
113
+ payload = _generate_payload(data, bucket: bucket_param, org: org_param, precision: precision_param)
87
114
  return nil if payload.nil?
88
115
 
116
+ if WriteType::BATCHING == @write_options.write_type
117
+ _worker.push(payload)
118
+ else
119
+ write_raw(payload, precision: precision_param, bucket: bucket_param, org: org_param)
120
+ end
121
+ end
122
+
123
+ # @return [ true ] Always true.
124
+ def close!
125
+ _worker.flush_all unless _worker.nil?
126
+ @closed = true
127
+ true
128
+ end
129
+
130
+ # @param [String] payload data as String
131
+ # @param [WritePrecision] precision The precision for the unix timestamps within the body line-protocol
132
+ # @param [String] bucket specifies the destination bucket for writes
133
+ # @param [String] org specifies the destination organization for writes
134
+ def write_raw(payload, precision: nil, bucket: nil, org: nil)
135
+ precision_param = precision || @options[:precision]
136
+ bucket_param = bucket || @options[:bucket]
137
+ org_param = org || @options[:org]
138
+ _check('precision', precision_param)
139
+ _check('bucket', bucket_param)
140
+ _check('org', org_param)
141
+
142
+ return nil unless payload.instance_of?(String) || payload.empty?
143
+
89
144
  uri = URI.parse(File.join(@options[:url], '/api/v2/write'))
90
145
  uri.query = URI.encode_www_form(bucket: bucket_param, org: org_param, precision: precision_param.to_s)
91
146
 
92
147
  _post(payload, uri)
93
148
  end
94
149
 
150
+ # Item for batching queue
151
+ class BatchItem
152
+ def initialize(key, data)
153
+ @key = key
154
+ @data = data
155
+ end
156
+ attr_reader :key, :data
157
+ end
158
+
159
+ # Key for batch item
160
+ class BatchItemKey
161
+ def initialize(bucket, org, precision = DEFAULT_WRITE_PRECISION)
162
+ @bucket = bucket
163
+ @org = org
164
+ @precision = precision
165
+ end
166
+ attr_reader :bucket, :org, :precision
167
+
168
+ def ==(other)
169
+ @bucket == other.bucket && @org == other.org && @precision == other.precision
170
+ end
171
+
172
+ alias eql? ==
173
+
174
+ def hash
175
+ @bucket.hash ^ @org.hash ^ @precision.hash # XOR
176
+ end
177
+ end
178
+
95
179
  private
96
180
 
97
- def _generate_payload(data)
181
+ WORKER_MUTEX = Mutex.new
182
+ def _worker
183
+ return nil unless @write_options.write_type == WriteType::BATCHING
184
+
185
+ return @worker if @worker
186
+
187
+ WORKER_MUTEX.synchronize do
188
+ # this return is necessary because the previous mutex holder
189
+ # might have already assigned the @worker
190
+ return @worker if @worker
191
+
192
+ @worker = Worker.new(self, @write_options)
193
+ end
194
+ end
195
+
196
+ def _generate_payload(data, precision: nil, bucket: nil, org: nil)
98
197
  if data.nil?
99
198
  nil
100
199
  elsif data.is_a?(Point)
101
- data.to_line_protocol
200
+ _generate_payload(data.to_line_protocol, bucket: bucket, org: org, precision: data.precision ||
201
+ DEFAULT_WRITE_PRECISION)
102
202
  elsif data.is_a?(String)
103
203
  if data.empty?
104
204
  nil
205
+ elsif @write_options.write_type == WriteType::BATCHING
206
+ BatchItem.new(BatchItemKey.new(bucket, org, precision), data)
105
207
  else
106
208
  data
107
209
  end
108
210
  elsif data.is_a?(Hash)
109
- _generate_payload(Point.from_hash(data))
211
+ _generate_payload(Point.from_hash(data), bucket: bucket, org: org, precision: precision)
110
212
  elsif data.respond_to? :map
111
213
  data.map do |item|
112
- _generate_payload(item)
214
+ _generate_payload(item, bucket: bucket, org: org, precision: precision)
113
215
  end.reject(&:nil?).join("\n".freeze)
114
216
  end
115
217
  end
@@ -0,0 +1,153 @@
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
+
23
+ class WriteApiBatchingTest < MiniTest::Test
24
+ def setup
25
+ WebMock.disable_net_connect!
26
+
27
+ @write_options = InfluxDB2::WriteOptions.new(write_type: InfluxDB2::WriteType::BATCHING,
28
+ batch_size: 2, flush_interval: 5_000)
29
+ @client = InfluxDB2::Client.new('http://localhost:9999',
30
+ 'my-token',
31
+ bucket: 'my-bucket',
32
+ org: 'my-org',
33
+ precision: InfluxDB2::WritePrecision::NANOSECOND,
34
+ use_ssl: false)
35
+
36
+ @write_client = @client.create_write_api(write_options: @write_options)
37
+ end
38
+
39
+ def teardown
40
+ @client.close!
41
+
42
+ assert_equal true, @write_client.closed
43
+
44
+ WebMock.reset!
45
+ end
46
+
47
+ def test_batch_size
48
+ stub_request(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=ns')
49
+ .to_return(status: 204)
50
+
51
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=1.0 1')
52
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=2.0 2')
53
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=3.0 3')
54
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=4.0 4')
55
+
56
+ sleep(1)
57
+
58
+ request1 = "h2o_feet,location=coyote_creek level\\ water_level=1.0 1\n" \
59
+ 'h2o_feet,location=coyote_creek level\\ water_level=2.0 2'
60
+ request2 = "h2o_feet,location=coyote_creek level\\ water_level=3.0 3\n" \
61
+ 'h2o_feet,location=coyote_creek level\\ water_level=4.0 4'
62
+
63
+ assert_requested(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
64
+ times: 1, body: request1)
65
+ assert_requested(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
66
+ times: 1, body: request2)
67
+ end
68
+
69
+ def test_batch_size_group_by
70
+ stub_request(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=ns')
71
+ .to_return(status: 204)
72
+ stub_request(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=s')
73
+ .to_return(status: 204)
74
+ stub_request(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org-a&precision=ns')
75
+ .to_return(status: 204)
76
+ stub_request(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket2&org=my-org-a&precision=ns')
77
+ .to_return(status: 204)
78
+
79
+ bucket = 'my-bucket'
80
+ bucket2 = 'my-bucket2'
81
+ org_a = 'my-org-a'
82
+
83
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=1.0 1', bucket: bucket, org: 'my-org')
84
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=2.0 2', bucket: bucket, org: 'my-org',
85
+ precision: InfluxDB2::WritePrecision::SECOND)
86
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=3.0 3', bucket: bucket, org: org_a)
87
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=4.0 4', bucket: bucket, org: org_a)
88
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=5.0 5', bucket: bucket2, org: org_a)
89
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=6.0 6', bucket: bucket, org: org_a)
90
+
91
+ sleep(1)
92
+
93
+ assert_requested(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
94
+ times: 1, body: 'h2o_feet,location=coyote_creek level\\ water_level=1.0 1')
95
+ assert_requested(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=s',
96
+ times: 1, body: 'h2o_feet,location=coyote_creek level\\ water_level=2.0 2')
97
+ assert_requested(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org-a&precision=ns',
98
+ times: 1, body: "h2o_feet,location=coyote_creek level\\ water_level=3.0 3\n" \
99
+ 'h2o_feet,location=coyote_creek level\\ water_level=4.0 4')
100
+ assert_requested(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket2&org=my-org-a&precision=ns',
101
+ times: 1, body: 'h2o_feet,location=coyote_creek level\\ water_level=5.0 5')
102
+ assert_requested(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org-a&precision=ns',
103
+ times: 1, body: 'h2o_feet,location=coyote_creek level\\ water_level=6.0 6')
104
+ end
105
+
106
+ def test_flush_interval
107
+ stub_request(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=ns')
108
+ .to_return(status: 204)
109
+
110
+ request1 = "h2o_feet,location=coyote_creek level\\ water_level=1.0 1\n" \
111
+ 'h2o_feet,location=coyote_creek level\\ water_level=2.0 2'
112
+ request2 = 'h2o_feet,location=coyote_creek level\\ water_level=3.0 3'
113
+
114
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=1.0 1')
115
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=2.0 2')
116
+
117
+ sleep(1)
118
+
119
+ assert_requested(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
120
+ times: 1, body: request1)
121
+
122
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=3.0 3')
123
+
124
+ sleep(2)
125
+
126
+ assert_requested(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
127
+ times: 0, body: request2)
128
+
129
+ sleep(3)
130
+
131
+ assert_requested(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
132
+ times: 1, body: request2)
133
+ end
134
+
135
+ def test_flush_all_by_close_client
136
+ stub_request(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=ns')
137
+ .to_return(status: 204)
138
+
139
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=1.0 1')
140
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=2.0 2')
141
+ @write_client.write(data: 'h2o_feet,location=coyote_creek level\\ water_level=3.0 3')
142
+
143
+ assert_requested(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
144
+ times: 0, body: 'h2o_feet,location=coyote_creek level\\ water_level=3.0 3')
145
+
146
+ @client.close!
147
+
148
+ assert_requested(:post, 'http://localhost:9999/api/v2/write?bucket=my-bucket&org=my-org&precision=ns',
149
+ times: 1, body: "h2o_feet,location=coyote_creek level\\ water_level=1.0 1\n" \
150
+ "h2o_feet,location=coyote_creek level\\ water_level=2.0 2\n" \
151
+ 'h2o_feet,location=coyote_creek level\\ water_level=3.0 3')
152
+ end
153
+ 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.1.0.pre.380
4
+ version: 1.1.0.pre.459
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-02-05 00:00:00.000000000 Z
11
+ date: 2020-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -157,6 +157,7 @@ files:
157
157
  - lib/influxdb2/client/point.rb
158
158
  - lib/influxdb2/client/query_api.rb
159
159
  - lib/influxdb2/client/version.rb
160
+ - lib/influxdb2/client/worker.rb
160
161
  - lib/influxdb2/client/write_api.rb
161
162
  - test/influxdb/client_test.rb
162
163
  - test/influxdb/flux_csv_parser_test.rb
@@ -164,6 +165,7 @@ files:
164
165
  - test/influxdb/query_api_integration_test.rb
165
166
  - test/influxdb/query_api_stream_test.rb
166
167
  - test/influxdb/query_api_test.rb
168
+ - test/influxdb/write_api_batching_test.rb
167
169
  - test/influxdb/write_api_integration_test.rb
168
170
  - test/influxdb/write_api_test.rb
169
171
  - test/test_helper.rb
@@ -200,6 +202,7 @@ test_files:
200
202
  - test/influxdb/query_api_integration_test.rb
201
203
  - test/influxdb/query_api_stream_test.rb
202
204
  - test/influxdb/query_api_test.rb
205
+ - test/influxdb/write_api_batching_test.rb
203
206
  - test/influxdb/write_api_integration_test.rb
204
207
  - test/influxdb/write_api_test.rb
205
208
  - test/test_helper.rb