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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7b69ab435ca209ad259788a0e6c4110cc22ee339
4
- data.tar.gz: 24b99fb9a0a9ace7240c7b92d740ae3590425e3d
3
+ metadata.gz: be73928d90d0747392f99de85df361a0306d534b
4
+ data.tar.gz: bda6f8c57cd29be8957921b6cf6ed4b5bbebd6ed
5
5
  SHA512:
6
- metadata.gz: d21432fe704fbd97539f7bd9dbffeb9dba8200ab3af2b10daed1ac82925f024cad5d3a5dcc9fe4ed856148ec48d1f9d00bb3a2d34c5be00010b5cf82460e837a
7
- data.tar.gz: 78d8cad493d54cd553de76621ef9cb4aa610ab77334f99eec092dd65aaf30601e64a8d1a4d5cbc472f2a91995efd1662596fa8c2d5a43553fe047af560f8cdae
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.libs << "lib"
7
- t.test_files = FileList['test/**/*_test.rb']
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.1.6"
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 "bundler", "~> 1.13"
22
- spec.add_development_dependency "rake", "~> 10.0"
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.1.6
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-10 00:00:00.000000000 Z
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: '10.0'
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: '10.0'
54
+ version: '0'
69
55
  - !ruby/object:Gem::Dependency
70
- name: minitest
56
+ name: test-unit
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
- - - "~>"
59
+ - - ">="
74
60
  - !ruby/object:Gem::Version
75
- version: '5.0'
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: '5.0'
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
- - test/fluent/plugin/in_mysql_appender_test.rb
99
- - test/test_helper.rb
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/fluent/plugin/in_mysql_appender_test.rb
126
- - test/test_helper.rb
112
+ - test/helper.rb
113
+ - test/plugin/test_in_mysql_appender.rb
@@ -1,8 +0,0 @@
1
- require 'test_helper'
2
-
3
- class MysqlAppenderInputTest < Minitest::Test
4
-
5
- def test_it_does_something_useful
6
- assert true
7
- end
8
- end
data/test/test_helper.rb DELETED
@@ -1,3 +0,0 @@
1
- require 'fluent/plugin/in_mysql_appender'
2
-
3
- require 'minitest/autorun'