fluent-plugin-mysql-appender 0.1.6 → 0.2.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/Rakefile +3 -3
- data/fluent-plugin-mysql-appender.gemspec +3 -5
- data/lib/fluent/plugin/in_mysql_appender_multi.rb +141 -0
- data/test/helper.rb +30 -0
- data/test/plugin/test_in_mysql_appender.rb +23 -0
- metadata +16 -29
- data/test/fluent/plugin/in_mysql_appender_test.rb +0 -8
- data/test/test_helper.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be73928d90d0747392f99de85df361a0306d534b
|
4
|
+
data.tar.gz: bda6f8c57cd29be8957921b6cf6ed4b5bbebd6ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d24412a3c37128320e4cfbf93127e2e67616353f21f4bb226539daf2f7c42be6cc67c592ba53ed8b6b53890e8841a833bc1408700ddce6dfbb4121dc3b2856be
|
7
|
+
data.tar.gz: cf45032f22aa50410a4e5e5f51d75b2335a96453a8701696213734d94c737afb4e134a25ecc8db53787a584777f5177467494be5c69dbf77a114ad5cfa173026
|
data/Rakefile
CHANGED
@@ -2,9 +2,9 @@ require "bundler/gem_tasks"
|
|
2
2
|
require "rake/testtask"
|
3
3
|
|
4
4
|
Rake::TestTask.new(:test) do |t|
|
5
|
-
t.libs << "test
|
6
|
-
t.
|
7
|
-
t.
|
5
|
+
t.libs << "lib" << 'test'
|
6
|
+
t.pattern = 'test/**/test_*.rb'
|
7
|
+
t.verbose = true
|
8
8
|
end
|
9
9
|
|
10
10
|
task :default => :test
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
Gem::Specification.new do |spec|
|
3
3
|
spec.name = "fluent-plugin-mysql-appender"
|
4
|
-
spec.version = "0.
|
4
|
+
spec.version = "0.2.0"
|
5
5
|
spec.authors = ["TERASAKI Tsuyoshi"]
|
6
6
|
spec.email = ["tsuyoshi_terasaki@realworld.jp"]
|
7
7
|
|
@@ -18,8 +18,6 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.add_runtime_dependency "fluentd"
|
19
19
|
spec.add_runtime_dependency "mysql2"
|
20
20
|
|
21
|
-
spec.add_development_dependency "
|
22
|
-
spec.add_development_dependency "
|
23
|
-
spec.add_development_dependency "minitest", "~> 5.0"
|
24
|
-
|
21
|
+
spec.add_development_dependency "rake"
|
22
|
+
spec.add_development_dependency "test-unit"
|
25
23
|
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
module Fluent
|
2
|
+
class MysqlAppenderMultiInput < Fluent::Input
|
3
|
+
Plugin.register_input('mysql_appender_multi', self)
|
4
|
+
|
5
|
+
# Define `router` method to support v0.10.57 or earlier
|
6
|
+
unless method_defined?(:router)
|
7
|
+
define_method("router") { Engine }
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
require 'mysql2'
|
12
|
+
require 'time'
|
13
|
+
require 'yaml'
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
config_param :host, :string, :default => 'localhost'
|
18
|
+
config_param :port, :integer, :default => 3306
|
19
|
+
config_param :username, :string, :default => 'root'
|
20
|
+
config_param :password, :string, :default => nil, :secret => true
|
21
|
+
config_param :database, :string, :default => nil
|
22
|
+
config_param :encoding, :string, :default => 'utf8'
|
23
|
+
config_param :interval, :string, :default => '1m'
|
24
|
+
config_param :tag, :string, :default => 'appender_multi'
|
25
|
+
config_param :yaml_path, :string, :default=> nil
|
26
|
+
|
27
|
+
def configure(conf)
|
28
|
+
super
|
29
|
+
if @tag.nil?
|
30
|
+
raise Fluent::ConfigError, "mysql_appender_multi: missing 'tag' parameter. Please add following line into config like 'tag appender.${name}.${event}.${primary_key}'"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def start
|
35
|
+
begin
|
36
|
+
@threads = []
|
37
|
+
@mutex = Mutex.new
|
38
|
+
YAML.load_file(@yaml_path).each do |config|
|
39
|
+
@threads << Thread.new {
|
40
|
+
poll(config)
|
41
|
+
}
|
42
|
+
end
|
43
|
+
$log.error "mysql_appender_multi: stop working due to empty configuration" if @threads.empty?
|
44
|
+
rescue StandardError => e
|
45
|
+
$log.error "error: #{e.message}"
|
46
|
+
$log.error e.backtrace.join("\n")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def shutdown
|
51
|
+
@threads.each do |thread|
|
52
|
+
Thread.kill(thread)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def poll(config)
|
57
|
+
begin
|
58
|
+
@mutex.synchronize {
|
59
|
+
$log.info "mysql_appender_multi: polling start. :config=>#{masked_config}"
|
60
|
+
}
|
61
|
+
con = get_connection()
|
62
|
+
last_id = config['last_id']
|
63
|
+
loop do
|
64
|
+
rows_count = 0
|
65
|
+
start_time = Time.now
|
66
|
+
rows, con = query(get_query(config, last_id), con)
|
67
|
+
rows.each_with_index do |row, index|
|
68
|
+
tag = format_tag(config)
|
69
|
+
if @time_column.nil? then
|
70
|
+
td_time = Engine.now
|
71
|
+
else
|
72
|
+
if row[@time_column].kind_of?(Time) then
|
73
|
+
td_time = row[config['time_column']].to_i
|
74
|
+
else
|
75
|
+
td_time = Time.parse(row[config['time_column']].to_s).to_i
|
76
|
+
end
|
77
|
+
end
|
78
|
+
row.each {|k, v| row[k] = v.to_s if v.is_a?(Time) || v.is_a?(Date) || v.is_a?(BigDecimal)}
|
79
|
+
router.emit(tag, td_time, row)
|
80
|
+
rows_count += 1
|
81
|
+
if index == rows.size - 1
|
82
|
+
@last_id = row[config['primary_key']]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
con.close
|
86
|
+
elapsed_time = sprintf("%0.02f", Time.now - start_time)
|
87
|
+
@mutex.synchronize {
|
88
|
+
$log.info "mysql_appender: finished execution :tag=>#{tag} :rows_count=>#{rows_count} :last_id=>#{last_id} :elapsed_time=>#{elapsed_time} sec"
|
89
|
+
}
|
90
|
+
sleep @interval
|
91
|
+
end
|
92
|
+
rescue StandardError => e
|
93
|
+
@mutex.synchronize {
|
94
|
+
$log.error "mysql_appender_multi: failed to execute query. :config=>#{masked_config}"
|
95
|
+
$log.error "error: #{e.message}"
|
96
|
+
$log.error e.backtrace.join("\n")
|
97
|
+
}
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def get_query(config, last_id)
|
102
|
+
"SELECT #{config['columns'].join(",")} FROM #{config['table_name']} where #{config['primary_key']} > #{last_id} order by #{config['primary_key']} asc limit #{config['limit']}"
|
103
|
+
end
|
104
|
+
|
105
|
+
def query(query, con = nil)
|
106
|
+
begin
|
107
|
+
con = con.nil? ? get_connection : con
|
108
|
+
con = con.ping ? con : get_connection
|
109
|
+
return con.query(query), con
|
110
|
+
rescue Exception => e
|
111
|
+
$log.warn "mysql_appender_multi: #{e}"
|
112
|
+
sleep @interval
|
113
|
+
retry
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def format_tag(config)
|
118
|
+
"#{tag}.#{config['database']}.#{config['table_name']}"
|
119
|
+
end
|
120
|
+
|
121
|
+
def get_connection
|
122
|
+
begin
|
123
|
+
return Mysql2::Client.new({
|
124
|
+
:host => @host,
|
125
|
+
:port => @port,
|
126
|
+
:username => @username,
|
127
|
+
:password => @password,
|
128
|
+
:database => @database,
|
129
|
+
:encoding => @encoding,
|
130
|
+
:reconnect => true,
|
131
|
+
:stream => true,
|
132
|
+
:cache_rows => false
|
133
|
+
})
|
134
|
+
rescue Exception => e
|
135
|
+
$log.warn "mysql_appender: #{e}"
|
136
|
+
sleep @interval
|
137
|
+
retry
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
|
12
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
13
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
14
|
+
require 'fluent/test'
|
15
|
+
require 'fluent/input'
|
16
|
+
unless ENV.has_key?('VERBOSE')
|
17
|
+
nulllogger = Object.new
|
18
|
+
nulllogger.instance_eval {|obj|
|
19
|
+
def method_missing(method, *args)
|
20
|
+
# pass
|
21
|
+
end
|
22
|
+
}
|
23
|
+
$log = nulllogger
|
24
|
+
end
|
25
|
+
|
26
|
+
require 'fluent/plugin/in_mysql_appender'
|
27
|
+
require 'fluent/plugin/in_mysql_appender_multi'
|
28
|
+
|
29
|
+
class Test::Unit::TestCase
|
30
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class MysqlAppenderInputTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
Fluent::Test.setup
|
6
|
+
end
|
7
|
+
|
8
|
+
def create_driver(conf=CONFIG)
|
9
|
+
Fluent::Test::InputTestDriver.new(Fluent::MysqlAppenderInput).configure(conf)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_configure
|
13
|
+
d = create_driver %[
|
14
|
+
host localhost
|
15
|
+
interval 30
|
16
|
+
tag input.mysql
|
17
|
+
query SELECT id, text from search_text
|
18
|
+
]
|
19
|
+
assert_equal 'localhost', d.instance.host
|
20
|
+
assert_equal 30, d.instance.interval
|
21
|
+
assert_equal 'input.mysql', d.instance.tag
|
22
|
+
end
|
23
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-mysql-appender
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TERASAKI Tsuyoshi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|
@@ -38,48 +38,34 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: bundler
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '1.13'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '1.13'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: rake
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
58
44
|
requirements:
|
59
|
-
- - "
|
45
|
+
- - ">="
|
60
46
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
47
|
+
version: '0'
|
62
48
|
type: :development
|
63
49
|
prerelease: false
|
64
50
|
version_requirements: !ruby/object:Gem::Requirement
|
65
51
|
requirements:
|
66
|
-
- - "
|
52
|
+
- - ">="
|
67
53
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
54
|
+
version: '0'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
56
|
+
name: test-unit
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
72
58
|
requirements:
|
73
|
-
- - "
|
59
|
+
- - ">="
|
74
60
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
61
|
+
version: '0'
|
76
62
|
type: :development
|
77
63
|
prerelease: false
|
78
64
|
version_requirements: !ruby/object:Gem::Requirement
|
79
65
|
requirements:
|
80
|
-
- - "
|
66
|
+
- - ">="
|
81
67
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
68
|
+
version: '0'
|
83
69
|
description: Simple incremental id's insert.
|
84
70
|
email:
|
85
71
|
- tsuyoshi_terasaki@realworld.jp
|
@@ -95,8 +81,9 @@ files:
|
|
95
81
|
- Rakefile
|
96
82
|
- fluent-plugin-mysql-appender.gemspec
|
97
83
|
- lib/fluent/plugin/in_mysql_appender.rb
|
98
|
-
-
|
99
|
-
- test/
|
84
|
+
- lib/fluent/plugin/in_mysql_appender_multi.rb
|
85
|
+
- test/helper.rb
|
86
|
+
- test/plugin/test_in_mysql_appender.rb
|
100
87
|
homepage: https://github.com/rw-hub/fluent-plugin-mysql-appender
|
101
88
|
licenses:
|
102
89
|
- MIT
|
@@ -122,5 +109,5 @@ signing_key:
|
|
122
109
|
specification_version: 4
|
123
110
|
summary: Fluentd input plugin to insert from MySQL database server.
|
124
111
|
test_files:
|
125
|
-
- test/
|
126
|
-
- test/
|
112
|
+
- test/helper.rb
|
113
|
+
- test/plugin/test_in_mysql_appender.rb
|
data/test/test_helper.rb
DELETED