fluent-plugin-sql 0.5.0 → 0.5.1
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/.travis.yml +16 -0
- data/Rakefile +7 -7
- data/VERSION +1 -1
- data/fluent-plugin-sql.gemspec +4 -0
- data/lib/fluent/plugin/in_sql.rb +2 -0
- data/lib/fluent/plugin/out_sql.rb +11 -11
- data/test/fixtures/schema.rb +24 -0
- data/test/helper.rb +8 -0
- data/test/plugin/test_in_sql.rb +86 -0
- data/test/plugin/test_out_sql.rb +112 -0
- metadata +68 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3e23b9247528a135033b20b8948e2c7c8553e8a7
|
4
|
+
data.tar.gz: 3f6b03e77450c220f17851b50c1f799e80f1e4e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6259bf6a96579679fa63f3cd7af978a8f5c23134a41438ba81f0c7d0744b3fd883f761c326156907e85d4b8f1d7d122f8841fbdd8905999f397f0a12a9f8ab2
|
7
|
+
data.tar.gz: 2eefbca9a6c289f8286bfe98472c43abe6cb5343c056f59f1490e67af65a2709157c1f7007e53fba102ef17f584352e2c139983768ec2a75b4bb9b11f1362b3f
|
data/.travis.yml
CHANGED
@@ -1,4 +1,20 @@
|
|
1
1
|
sudo: false
|
2
|
+
language: ruby
|
3
|
+
|
4
|
+
addons:
|
5
|
+
postgresql: "9.4"
|
6
|
+
|
7
|
+
rvm:
|
8
|
+
- 2.0.0
|
9
|
+
- 2.1
|
10
|
+
- 2.2
|
11
|
+
- 2.3.0
|
2
12
|
|
3
13
|
before_install:
|
4
14
|
- gem install bundler
|
15
|
+
|
16
|
+
before_script:
|
17
|
+
- psql -U postgres -c "CREATE ROLE fluentd WITH LOGIN ENCRYPTED PASSWORD 'fluentd';"
|
18
|
+
- psql -U postgres -c "CREATE DATABASE fluentd_test OWNER fluentd;"
|
19
|
+
|
20
|
+
script: bundle exec rake test
|
data/Rakefile
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
require 'bundler'
|
3
3
|
Bundler::GemHelper.install_tasks
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
5
|
+
require 'rake/testtask'
|
6
|
+
|
7
|
+
Rake::TestTask.new(:test) do |test|
|
8
|
+
test.libs << 'lib' << 'test'
|
9
|
+
test.test_files = FileList['test/*/*.rb']
|
10
|
+
test.verbose = true
|
11
|
+
end
|
12
12
|
|
13
13
|
task :default => [:build]
|
14
14
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.1
|
data/fluent-plugin-sql.gemspec
CHANGED
@@ -21,4 +21,8 @@ Gem::Specification.new do |gem|
|
|
21
21
|
gem.add_dependency 'activerecord', "~> 4.2"
|
22
22
|
gem.add_dependency 'activerecord-import', "~> 0.7"
|
23
23
|
gem.add_development_dependency "rake", ">= 0.9.2"
|
24
|
+
gem.add_development_dependency "test-unit", "~> 3.1.0"
|
25
|
+
gem.add_development_dependency "test-unit-rr"
|
26
|
+
gem.add_development_dependency "test-unit-notify"
|
27
|
+
gem.add_development_dependency "pg"
|
24
28
|
end
|
data/lib/fluent/plugin/in_sql.rb
CHANGED
@@ -96,7 +96,7 @@ module Fluent
|
|
96
96
|
}
|
97
97
|
begin
|
98
98
|
@model.import(records)
|
99
|
-
rescue ActiveRecord::StatementInvalid, ActiveRecord::
|
99
|
+
rescue ActiveRecord::StatementInvalid, ActiveRecord::Import::MissingColumnError => e
|
100
100
|
# ignore other exceptions to use Fluentd retry mechanizm
|
101
101
|
@log.warn "Got deterministic error. Fallback to one-by-one import", :error => e.message, :error_class => e.class
|
102
102
|
one_by_one_import(records)
|
@@ -108,7 +108,7 @@ module Fluent
|
|
108
108
|
retries = 0
|
109
109
|
begin
|
110
110
|
@model.import([record])
|
111
|
-
rescue ActiveRecord::StatementInvalid, ActiveRecord::
|
111
|
+
rescue ActiveRecord::StatementInvalid, ActiveRecord::Import::MissingColumnError => e
|
112
112
|
@log.error "Got deterministic error again. Dump a record", :error => e.message, :error_class => e.class, :record => record
|
113
113
|
rescue => e
|
114
114
|
retries += 1
|
@@ -189,7 +189,7 @@ module Fluent
|
|
189
189
|
end
|
190
190
|
|
191
191
|
SQLOutput.const_set("BaseModel_#{rand(1 << 31)}", @base_model)
|
192
|
-
|
192
|
+
ActiveRecord::Base.establish_connection(config)
|
193
193
|
|
194
194
|
# ignore tables if TableElement#init failed
|
195
195
|
@tables.reject! do |te|
|
@@ -215,15 +215,15 @@ module Fluent
|
|
215
215
|
end
|
216
216
|
|
217
217
|
def write(chunk)
|
218
|
-
|
219
|
-
conn.active? || conn.reconnect!
|
218
|
+
ActiveRecord::Base.connection_pool.with_connection do
|
220
219
|
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
220
|
+
@tables.each { |table|
|
221
|
+
if table.pattern.match(chunk.key)
|
222
|
+
return table.import(chunk)
|
223
|
+
end
|
224
|
+
}
|
225
|
+
@default_table.import(chunk)
|
226
|
+
end
|
227
227
|
end
|
228
228
|
|
229
229
|
private
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "active_record"
|
2
|
+
ActiveRecord::Base.establish_connection(host: "localhost",
|
3
|
+
port: 5432,
|
4
|
+
username: "fluentd",
|
5
|
+
password: "fluentd",
|
6
|
+
adapter: "postgresql",
|
7
|
+
database: "fluentd_test")
|
8
|
+
ActiveRecord::Schema.define(version: 20160225030107) do
|
9
|
+
create_table "logs", force: :cascade do |t|
|
10
|
+
t.string "host"
|
11
|
+
t.string "ident"
|
12
|
+
t.string "pid"
|
13
|
+
t.text "message"
|
14
|
+
t.datetime "created_at", null: false
|
15
|
+
t.datetime "updated_at", null: false
|
16
|
+
end
|
17
|
+
|
18
|
+
create_table "messages", force: :cascade do |t|
|
19
|
+
t.string "message"
|
20
|
+
t.datetime "created_at", null: false
|
21
|
+
t.datetime "updated_at", null: false
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
data/test/helper.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class SqlInputTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
Fluent::Test.setup
|
6
|
+
end
|
7
|
+
|
8
|
+
def teardown
|
9
|
+
end
|
10
|
+
|
11
|
+
CONFIG = %[
|
12
|
+
adapter postgresql
|
13
|
+
host localhost
|
14
|
+
port 5432
|
15
|
+
database fluentd_test
|
16
|
+
|
17
|
+
username fluentd
|
18
|
+
password fluentd
|
19
|
+
|
20
|
+
tag_prefix db
|
21
|
+
|
22
|
+
<table>
|
23
|
+
table messages
|
24
|
+
tag logs
|
25
|
+
update_column updated_at
|
26
|
+
time_column updated_at
|
27
|
+
</table>
|
28
|
+
]
|
29
|
+
|
30
|
+
def create_driver(conf = CONFIG)
|
31
|
+
Fluent::Test::InputTestDriver.new(Fluent::SQLInput).configure(conf)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_configure
|
35
|
+
d = create_driver
|
36
|
+
expected = {
|
37
|
+
host: "localhost",
|
38
|
+
port: 5432,
|
39
|
+
adapter: "postgresql",
|
40
|
+
database: "fluentd_test",
|
41
|
+
username: "fluentd",
|
42
|
+
password: "fluentd",
|
43
|
+
tag_prefix: "db"
|
44
|
+
}
|
45
|
+
actual = {
|
46
|
+
host: d.instance.host,
|
47
|
+
port: d.instance.port,
|
48
|
+
adapter: d.instance.adapter,
|
49
|
+
database: d.instance.database,
|
50
|
+
username: d.instance.username,
|
51
|
+
password: d.instance.password,
|
52
|
+
tag_prefix: d.instance.tag_prefix
|
53
|
+
}
|
54
|
+
assert_equal(expected, actual)
|
55
|
+
tables = d.instance.instance_variable_get(:@tables)
|
56
|
+
assert_equal(1, tables.size)
|
57
|
+
messages = tables.first
|
58
|
+
assert_equal("messages", messages.table)
|
59
|
+
assert_equal("logs", messages.tag)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_message
|
63
|
+
d = create_driver(CONFIG + "select_interval 1")
|
64
|
+
Message.create!(message: "message 1")
|
65
|
+
Message.create!(message: "message 2")
|
66
|
+
Message.create!(message: "message 3")
|
67
|
+
|
68
|
+
d.run
|
69
|
+
|
70
|
+
assert_equal("db.logs", d.emits[0][0])
|
71
|
+
expected = [
|
72
|
+
[d.emits[0][1], "message 1"],
|
73
|
+
[d.emits[1][1], "message 2"],
|
74
|
+
[d.emits[2][1], "message 3"],
|
75
|
+
]
|
76
|
+
actual = [
|
77
|
+
[Time.parse(d.emits[0][2]["updated_at"]).to_i, d.emits[0][2]["message"]],
|
78
|
+
[Time.parse(d.emits[1][2]["updated_at"]).to_i, d.emits[1][2]["message"]],
|
79
|
+
[Time.parse(d.emits[2][2]["updated_at"]).to_i, d.emits[2][2]["message"]],
|
80
|
+
]
|
81
|
+
assert_equal(expected, actual)
|
82
|
+
end
|
83
|
+
|
84
|
+
class Message < ActiveRecord::Base
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class SqlOutputTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
Fluent::Test.setup
|
6
|
+
end
|
7
|
+
|
8
|
+
def teardown
|
9
|
+
end
|
10
|
+
|
11
|
+
CONFIG = %[
|
12
|
+
host localhost
|
13
|
+
port 5432
|
14
|
+
adapter postgresql
|
15
|
+
|
16
|
+
database fluentd_test
|
17
|
+
username fluentd
|
18
|
+
password fluentd
|
19
|
+
|
20
|
+
remove_tag_prefix db
|
21
|
+
|
22
|
+
<table>
|
23
|
+
table logs
|
24
|
+
column_mapping timestamp:created_at,host:host,ident:ident,pid:pid,message:message
|
25
|
+
</table>
|
26
|
+
]
|
27
|
+
|
28
|
+
def create_driver(conf = CONFIG)
|
29
|
+
Fluent::Test::BufferedOutputTestDriver.new(Fluent::SQLOutput).configure(conf)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_configure
|
33
|
+
d = create_driver
|
34
|
+
expected = {
|
35
|
+
host: "localhost",
|
36
|
+
port: 5432,
|
37
|
+
adapter: "postgresql",
|
38
|
+
database: "fluentd_test",
|
39
|
+
username: "fluentd",
|
40
|
+
password: "fluentd",
|
41
|
+
remove_tag_suffix: /^db/
|
42
|
+
}
|
43
|
+
actual = {
|
44
|
+
host: d.instance.host,
|
45
|
+
port: d.instance.port,
|
46
|
+
adapter: d.instance.adapter,
|
47
|
+
database: d.instance.database,
|
48
|
+
username: d.instance.username,
|
49
|
+
password: d.instance.password,
|
50
|
+
remove_tag_suffix: d.instance.remove_tag_prefix
|
51
|
+
}
|
52
|
+
assert_equal(expected, actual)
|
53
|
+
assert_empty(d.instance.tables)
|
54
|
+
default_table = d.instance.instance_variable_get(:@default_table)
|
55
|
+
assert_equal("logs", default_table.table)
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_emit
|
59
|
+
d = create_driver
|
60
|
+
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
61
|
+
|
62
|
+
d.emit({"message" => "message1"}, time)
|
63
|
+
d.emit({"message" => "message2"}, time)
|
64
|
+
|
65
|
+
d.run
|
66
|
+
|
67
|
+
default_table = d.instance.instance_variable_get(:@default_table)
|
68
|
+
model = default_table.instance_variable_get(:@model)
|
69
|
+
assert_equal(2, model.all.count)
|
70
|
+
messages = model.pluck(:message).sort
|
71
|
+
assert_equal(["message1", "message2"], messages)
|
72
|
+
end
|
73
|
+
|
74
|
+
class Fallback < self
|
75
|
+
def test_simple
|
76
|
+
d = create_driver
|
77
|
+
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
78
|
+
|
79
|
+
d.emit({"message" => "message1"}, time)
|
80
|
+
d.emit({"message" => "message2"}, time)
|
81
|
+
|
82
|
+
d.run do
|
83
|
+
default_table = d.instance.instance_variable_get(:@default_table)
|
84
|
+
model = default_table.instance_variable_get(:@model)
|
85
|
+
mock(model).import(anything).at_least(1) do
|
86
|
+
raise ActiveRecord::Import::MissingColumnError.new("dummy_table", "dummy_column")
|
87
|
+
end
|
88
|
+
mock(default_table).one_by_one_import(anything)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_limit
|
93
|
+
d = create_driver
|
94
|
+
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
95
|
+
|
96
|
+
d.emit({"message" => "message1"}, time)
|
97
|
+
d.emit({"message" => "message2"}, time)
|
98
|
+
|
99
|
+
d.run do
|
100
|
+
default_table = d.instance.instance_variable_get(:@default_table)
|
101
|
+
model = default_table.instance_variable_get(:@model)
|
102
|
+
mock(model).import([anything, anything]).once do
|
103
|
+
raise ActiveRecord::Import::MissingColumnError.new("dummy_table", "dummy_column")
|
104
|
+
end
|
105
|
+
mock(model).import([anything]).times(12) do
|
106
|
+
raise StandardError
|
107
|
+
end
|
108
|
+
assert_equal(5, default_table.instance_variable_get(:@num_retries))
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-sql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|
@@ -72,6 +72,62 @@ dependencies:
|
|
72
72
|
- - ">="
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: 0.9.2
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: test-unit
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 3.1.0
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 3.1.0
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: test-unit-rr
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: test-unit-notify
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
- !ruby/object:Gem::Dependency
|
118
|
+
name: pg
|
119
|
+
requirement: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
type: :development
|
125
|
+
prerelease: false
|
126
|
+
version_requirements: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - ">="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '0'
|
75
131
|
description: SQL input/output plugin for Fluentd event collector
|
76
132
|
email: frsyuki@gmail.com
|
77
133
|
executables: []
|
@@ -86,6 +142,10 @@ files:
|
|
86
142
|
- fluent-plugin-sql.gemspec
|
87
143
|
- lib/fluent/plugin/in_sql.rb
|
88
144
|
- lib/fluent/plugin/out_sql.rb
|
145
|
+
- test/fixtures/schema.rb
|
146
|
+
- test/helper.rb
|
147
|
+
- test/plugin/test_in_sql.rb
|
148
|
+
- test/plugin/test_out_sql.rb
|
89
149
|
homepage: https://github.com/frsyuki/fluent-plugin-sql
|
90
150
|
licenses:
|
91
151
|
- Apache-2.0
|
@@ -106,8 +166,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
166
|
version: '0'
|
107
167
|
requirements: []
|
108
168
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
169
|
+
rubygems_version: 2.5.1
|
110
170
|
signing_key:
|
111
171
|
specification_version: 4
|
112
172
|
summary: SQL input/output plugin for Fluentd event collector
|
113
|
-
test_files:
|
173
|
+
test_files:
|
174
|
+
- test/fixtures/schema.rb
|
175
|
+
- test/helper.rb
|
176
|
+
- test/plugin/test_in_sql.rb
|
177
|
+
- test/plugin/test_out_sql.rb
|