fluent-plugin-mysql-appender 0.1.6 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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'