fluent-plugin-mysql-replicator 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -94,6 +94,7 @@ CREATE TABLE `hash_tables` (
94
94
 
95
95
  CREATE TABLE `settings` (
96
96
  `id` int(11) NOT NULL AUTO_INCREMENT,
97
+ `is_active` int(11) NOT NULL DEFAULT '1',
97
98
  `name` varchar(255) NOT NULL,
98
99
  `host` varchar(255) NOT NULL DEFAULT 'localhost',
99
100
  `port` int(11) NOT NULL DEFAULT '3306',
@@ -102,7 +103,6 @@ CREATE TABLE `settings` (
102
103
  `database` varchar(255) NOT NULL,
103
104
  `query` TEXT NOT NULL,
104
105
  `interval` int(11) NOT NULL,
105
- `tag` varchar(255) NOT NULL,
106
106
  `primary_key` varchar(11) DEFAULT 'id',
107
107
  `enable_delete` int(11) DEFAULT '1',
108
108
  PRIMARY KEY (`id`),
@@ -121,19 +121,30 @@ mysql> insert into source ...snip...;
121
121
  `````
122
122
  <source>
123
123
  type mysql_replicator_multi
124
+
125
+ # Database connection setting for manager table.
124
126
  manager_host localhost
125
127
  manager_username your_mysql_user
126
128
  manager_password your_mysql_password
127
129
  manager_database replicator_manager
130
+
131
+ # Format output tag for each events. Placeholders usage as described below.
132
+ tag replicator.${name}.${event}.${primary_key}
133
+ # ${name} : the value of `replicator_manager.settings.name` in manager table.
134
+ # ${event} : the variation of row event type by insert/update/delete.
135
+ # ${primary_key} : the value of `replicator_manager.settings.primary_key` in manager table.
128
136
  </source>
129
137
 
130
- <match replicator.*>
138
+ <match replicator.**>
131
139
  type stdout
132
140
  </match>
133
141
  `````
134
142
 
135
143
  ## TODO
136
144
 
145
+ * support string type primary_key.
146
+ * support reload setting on demand.
147
+
137
148
  Pull requests are very welcome!!
138
149
 
139
150
  ## Copyright
@@ -1,11 +1,11 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |s|
3
3
  s.name = "fluent-plugin-mysql-replicator"
4
- s.version = "0.1.0"
4
+ s.version = "0.1.1"
5
5
  s.authors = ["Kentaro Yoshida"]
6
6
  s.email = ["y.ken.studio@gmail.com"]
7
7
  s.homepage = "https://github.com/y-ken/fluent-plugin-mysql-replicator"
8
- s.summary = %q{Fluentd input plugin to track insert/update/delete event from MySQL databases. It will support multiple table replication to another RDB/noSQL like Elasticsearch.}
8
+ s.summary = %q{Fluentd input plugin to track insert/update/delete event from MySQL databases. It's comming support multiple table replication to another RDB/noSQL like Elasticsearch.}
9
9
 
10
10
  s.files = `git ls-files`.split("\n")
11
11
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
@@ -52,6 +52,7 @@ module Fluent
52
52
  query(@query).each do |row|
53
53
  current_ids << row[@primary_key]
54
54
  current_hash = Digest::SHA1.hexdigest(row.flatten.join)
55
+ row.each {|k, v| row[k] = v.to_s if v.is_a? Time}
55
56
  if !table_hash.include?(row[@primary_key])
56
57
  emit_record(:insert, row)
57
58
  elsif table_hash[row[@primary_key]] != current_hash
@@ -13,10 +13,14 @@ module Fluent
13
13
  config_param :manager_username, :string, :default => nil
14
14
  config_param :manager_password, :string, :default => ''
15
15
  config_param :manager_database, :string, :default => 'replicator_manager'
16
+ config_param :tag, :string, :default => nil
16
17
 
17
18
  def configure(conf)
18
19
  super
19
20
  @reconnect_interval = Config.time_value('10sec')
21
+ if @tag.nil?
22
+ raise Fluent::ConfigError, "mysql_replicator_multi: missing 'tag' parameter. Please add following line into config like 'tag replicator.${name}.${event}.${primary_key}'"
23
+ end
20
24
  end
21
25
 
22
26
  def start
@@ -44,7 +48,7 @@ module Fluent
44
48
  def get_settings
45
49
  manager_db = get_manager_connection
46
50
  settings = []
47
- query = "SELECT * FROM settings"
51
+ query = "SELECT * FROM settings WHERE is_active = 1;"
48
52
  manager_db.query(query).each do |row|
49
53
  settings << row
50
54
  end
@@ -64,6 +68,7 @@ module Fluent
64
68
  db = get_origin_connection(config)
65
69
  db.query(config['query']).each do |row|
66
70
  @mutex.lock
71
+ row.each {|k, v| row[k] = v.to_s if v.is_a? Time}
67
72
  current_id = row[primary_key]
68
73
  detect_insert_update(config, row)
69
74
  detect_delete(config, current_id, previous_id)
@@ -92,7 +97,8 @@ module Fluent
92
97
  event = :update
93
98
  end
94
99
  unless event.nil?
95
- emit_record("#{config['tag']}.#{event.to_s}", row)
100
+ tag = format_tag(@tag, {:name => config['name'], :event => event, :primary_key => config['primary_key']})
101
+ emit_record(tag, row)
96
102
  update_hashtable({:event => event, :ids => current_id, :setting_name => config['name'], :hash => current_hash})
97
103
  end
98
104
  end
@@ -110,7 +116,8 @@ module Fluent
110
116
  unless deleted_ids.empty?
111
117
  event = :delete
112
118
  deleted_ids.each do |id|
113
- emit_record("#{config['tag']}.#{event.to_s}", {config['primary_key'] => id})
119
+ tag = format_tag(@tag, {:name => config['name'], :event => event, :primary_key => config['primary_key']})
120
+ emit_record(tag, {config['primary_key'] => id})
114
121
  end
115
122
  update_hashtable({:event => event, :ids => deleted_ids, :setting_name => config['name']})
116
123
  end
@@ -154,6 +161,14 @@ module Fluent
154
161
  end
155
162
  end
156
163
 
164
+ def format_tag(tag, param)
165
+ pattern = {'${name}' => param[:name], '${event}' => param[:event].to_s, '${primary_key}' => param[:primary_key]}
166
+ tag.gsub(/\${[a-z_]+(\[[0-9]+\])?}/, pattern) do
167
+ $log.warn "mysql_replicator_multi: missing placeholder. tag:#{tag} placeholder:#{$1}" unless pattern.include?($1)
168
+ pattern[$1]
169
+ end
170
+ end
171
+
157
172
  def emit_record(tag, record)
158
173
  Engine.emit(tag, Engine.now, record)
159
174
  end
@@ -12,6 +12,7 @@ CREATE TABLE `hash_tables` (
12
12
 
13
13
  CREATE TABLE `settings` (
14
14
  `id` int(11) NOT NULL AUTO_INCREMENT,
15
+ `is_active` int(11) NOT NULL DEFAULT '1',
15
16
  `name` varchar(255) NOT NULL,
16
17
  `host` varchar(255) NOT NULL DEFAULT 'localhost',
17
18
  `port` int(11) NOT NULL DEFAULT '3306',
@@ -20,7 +21,6 @@ CREATE TABLE `settings` (
20
21
  `database` varchar(255) NOT NULL,
21
22
  `query` TEXT NOT NULL,
22
23
  `interval` int(11) NOT NULL,
23
- `tag` varchar(255) NOT NULL,
24
24
  `primary_key` varchar(11) DEFAULT 'id',
25
25
  `enable_delete` int(11) DEFAULT '1',
26
26
  PRIMARY KEY (`id`),
@@ -10,6 +10,7 @@ class MysqlReplicatorMultiInputTest < Test::Unit::TestCase
10
10
  manager_port 3306
11
11
  manager_username foo
12
12
  manager_password bar
13
+ tag replicator.${name}.${event}.${primary_key}
13
14
  ]
14
15
 
15
16
  def create_driver(conf=CONFIG,tag='test')
@@ -17,6 +18,9 @@ class MysqlReplicatorMultiInputTest < Test::Unit::TestCase
17
18
  end
18
19
 
19
20
  def test_configure
21
+ assert_raise(Fluent::ConfigError) {
22
+ d = create_driver('')
23
+ }
20
24
  d = create_driver(CONFIG)
21
25
  d.instance.inspect
22
26
  assert_equal 'localhost', d.instance.manager_host
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-mysql-replicator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-12-09 00:00:00.000000000 Z
12
+ date: 2013-12-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -103,7 +103,7 @@ rubygems_version: 1.8.23
103
103
  signing_key:
104
104
  specification_version: 3
105
105
  summary: Fluentd input plugin to track insert/update/delete event from MySQL databases.
106
- It will support multiple table replication to another RDB/noSQL like Elasticsearch.
106
+ It's comming support multiple table replication to another RDB/noSQL like Elasticsearch.
107
107
  test_files:
108
108
  - test/helper.rb
109
109
  - test/plugin/test_in_mysql_replicator.rb