influxdb 0.4.3 → 0.5.0
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/CHANGELOG.md +10 -3
- data/README.md +1 -1
- data/lib/influxdb/version.rb +1 -1
- data/lib/influxdb/writer/async.rb +35 -30
- data/spec/influxdb/cases/async_client_spec.rb +46 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 170699d0f9146ed26b14a22529a83d4be2df7978
|
4
|
+
data.tar.gz: 1ec1e335f75c706b36e1f6a65ac5828d4fdf5f19
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d58bfb635ef085fc5e395f83539f0076ba68d77b919fba914c0000abe7c88447513b13f5298a213c5d32af20e0afb78ffa98a936f26bff8cc5d9d5fd89a4e99c
|
7
|
+
data.tar.gz: b560584b6c9722b4d5729715cdaa3b87a0485296d787383847b18be0b7b5761417e746cfb7f8fb223fa6722e3735fca2ab2ec1d776611db8a050bf48886b85aa
|
data/CHANGELOG.md
CHANGED
@@ -6,10 +6,17 @@ For the full commit log, [see here](https://github.com/influxdata/influxdb-ruby/
|
|
6
6
|
|
7
7
|
- None yet.
|
8
8
|
|
9
|
-
## v0.
|
9
|
+
## v0.5.0, released 2017-10-21
|
10
10
|
|
11
|
-
-
|
12
|
-
|
11
|
+
- Add support for precision, retention policy and database parameters
|
12
|
+
to async writer (#140, #202 @rockclimber73)
|
13
|
+
|
14
|
+
**Attention** You may need to validate that your calls to the write
|
15
|
+
API (`InfluxDB::Client#write`, `#write_point`, `#write_points`) don't
|
16
|
+
accidentally included a precision, RP, and/or database argument. These
|
17
|
+
arguments were ignored until now. This is likely if you have changed
|
18
|
+
your client instance configuration in the past, when you added a
|
19
|
+
`async: true`. **Updating might cause data inconsistencies!**
|
13
20
|
|
14
21
|
## v0.4.2, released 2017-09-26
|
15
22
|
|
data/README.md
CHANGED
@@ -256,7 +256,7 @@ retention = '1h.cpu'
|
|
256
256
|
influxdb.write_points(data, precision, retention)
|
257
257
|
```
|
258
258
|
|
259
|
-
Write asynchronously
|
259
|
+
Write asynchronously:
|
260
260
|
|
261
261
|
``` ruby
|
262
262
|
database = 'site_development'
|
data/lib/influxdb/version.rb
CHANGED
@@ -12,17 +12,8 @@ module InfluxDB
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def write(data, precision = nil, retention_policy = nil, database = nil)
|
15
|
-
if !precision.nil? || !retention_policy.nil? || !database.nil?
|
16
|
-
opts = {
|
17
|
-
precision: precision,
|
18
|
-
retention_policy: retention_policy,
|
19
|
-
database: database,
|
20
|
-
}.delete_if { |_, v| v.nil? }
|
21
|
-
warn_arguments(opts)
|
22
|
-
end
|
23
|
-
|
24
15
|
data = data.is_a?(Array) ? data : [data]
|
25
|
-
data.map { |
|
16
|
+
data.map { |payload| worker.push(payload, precision, retention_policy, database) }
|
26
17
|
end
|
27
18
|
|
28
19
|
WORKER_MUTEX = Mutex.new
|
@@ -36,17 +27,6 @@ module InfluxDB
|
|
36
27
|
end
|
37
28
|
end
|
38
29
|
|
39
|
-
private
|
40
|
-
|
41
|
-
def warn_arguments(**which)
|
42
|
-
warn [
|
43
|
-
"You are using influxdb in async mode, and have provided one or",
|
44
|
-
"more parameter which are currently ignored:",
|
45
|
-
which.map { |k, v| format "%s=%p", k, v }.join(", "),
|
46
|
-
"Starting with v0.5.0, these arguments will no longer be ignored.",
|
47
|
-
].join(" ")
|
48
|
-
end
|
49
|
-
|
50
30
|
class Worker
|
51
31
|
attr_reader :client,
|
52
32
|
:queue,
|
@@ -77,8 +57,8 @@ module InfluxDB
|
|
77
57
|
spawn_threads!
|
78
58
|
end
|
79
59
|
|
80
|
-
def push(payload)
|
81
|
-
queue.push(payload)
|
60
|
+
def push(payload, precision = nil, retention_policy = nil, database = nil)
|
61
|
+
queue.push([payload, precision, retention_policy, database])
|
82
62
|
end
|
83
63
|
|
84
64
|
def current_threads
|
@@ -117,22 +97,28 @@ module InfluxDB
|
|
117
97
|
end
|
118
98
|
|
119
99
|
loop do
|
120
|
-
data =
|
100
|
+
data = {}
|
121
101
|
|
122
|
-
while data.size < max_post_points && !queue.empty?
|
102
|
+
while data.all? { |_, points| points.size < max_post_points } && !queue.empty?
|
123
103
|
begin
|
124
|
-
|
125
|
-
|
104
|
+
payload, precision, retention_policy, database = queue.pop(true)
|
105
|
+
key = {
|
106
|
+
db: database,
|
107
|
+
pr: precision,
|
108
|
+
rp: retention_policy,
|
109
|
+
}
|
110
|
+
data[key] ||= []
|
111
|
+
data[key] << payload
|
126
112
|
rescue ThreadError
|
127
113
|
next
|
128
114
|
end
|
129
115
|
end
|
130
116
|
|
131
|
-
return if data.empty?
|
117
|
+
return if data.values.flatten.empty?
|
132
118
|
|
133
119
|
begin
|
134
|
-
log(:debug) { "Found data in the queue! (#{data
|
135
|
-
|
120
|
+
log(:debug) { "Found data in the queue! (#{sizes(data)})" }
|
121
|
+
write(data)
|
136
122
|
rescue StandardError => e
|
137
123
|
log :error, "Cannot write data: #{e.inspect}"
|
138
124
|
end
|
@@ -145,6 +131,25 @@ module InfluxDB
|
|
145
131
|
log(:debug) { "Thread exiting, flushing queue." }
|
146
132
|
check_background_queue until queue.empty?
|
147
133
|
end
|
134
|
+
|
135
|
+
private
|
136
|
+
|
137
|
+
def write(data)
|
138
|
+
data.each do |key, points|
|
139
|
+
client.write(points.join("\n"), key[:pr], key[:rp], key[:db])
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def sizes(data)
|
144
|
+
data.map do |key, points|
|
145
|
+
without_nils = key.reject { |_, v| v.nil? }
|
146
|
+
if without_nils.empty?
|
147
|
+
"#{points.size} points"
|
148
|
+
else
|
149
|
+
"#{key} => #{points.size} points"
|
150
|
+
end
|
151
|
+
end.join(', ')
|
152
|
+
end
|
148
153
|
end
|
149
154
|
end
|
150
155
|
end
|
@@ -35,6 +35,52 @@ describe InfluxDB::Client do
|
|
35
35
|
# but cannot be less than 2 due to MAX_POST_POINTS limit
|
36
36
|
expect(post_request).to have_been_requested.at_least_times(2)
|
37
37
|
end
|
38
|
+
|
39
|
+
context 'when precision, retention_policy and database are given' do
|
40
|
+
let(:series) { 'test_series' }
|
41
|
+
let(:precision) { 'test_precision' }
|
42
|
+
let(:retention_policy) { 'test_period' }
|
43
|
+
let(:database) { 'test_database' }
|
44
|
+
|
45
|
+
it "writes aggregate payload to the client" do
|
46
|
+
queue = Queue.new
|
47
|
+
allow(client).to receive(:write) do |*args|
|
48
|
+
queue.push(args)
|
49
|
+
end
|
50
|
+
|
51
|
+
subject.write_point(series, { values: { t: 60 } }, precision, retention_policy, database)
|
52
|
+
subject.write_point(series, { values: { t: 61 } }, precision, retention_policy, database)
|
53
|
+
|
54
|
+
Timeout.timeout(worker.sleep_interval) do
|
55
|
+
expect(queue.pop).to eq ["#{series} t=60i\n#{series} t=61i", precision, retention_policy, database]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'when different precision, retention_policy and database are given' do
|
60
|
+
let(:precision2) { 'test_precision2' }
|
61
|
+
let(:retention_policy2) { 'test_period2' }
|
62
|
+
let(:database2) { 'test_database2' }
|
63
|
+
|
64
|
+
it "writes separated payloads for each {precision, retention_policy, database} set" do
|
65
|
+
queue = Queue.new
|
66
|
+
allow(client).to receive(:write) do |*args|
|
67
|
+
queue.push(args)
|
68
|
+
end
|
69
|
+
|
70
|
+
subject.write_point(series, { values: { t: 60 } }, precision, retention_policy, database)
|
71
|
+
subject.write_point(series, { values: { t: 61 } }, precision2, retention_policy, database)
|
72
|
+
subject.write_point(series, { values: { t: 62 } }, precision, retention_policy2, database)
|
73
|
+
subject.write_point(series, { values: { t: 63 } }, precision, retention_policy, database2)
|
74
|
+
|
75
|
+
Timeout.timeout(worker.sleep_interval) do
|
76
|
+
expect(queue.pop).to eq ["#{series} t=60i", precision, retention_policy, database]
|
77
|
+
expect(queue.pop).to eq ["#{series} t=61i", precision2, retention_policy, database]
|
78
|
+
expect(queue.pop).to eq ["#{series} t=62i", precision, retention_policy2, database]
|
79
|
+
expect(queue.pop).to eq ["#{series} t=63i", precision, retention_policy, database2]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
38
84
|
end
|
39
85
|
|
40
86
|
describe "async options" do
|