fluent-plugin-mysql-2 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: b08ae8a41a2889d1785aec8b5441392ffbcd249e5c38d78e257dd27e64465d2b
4
+ data.tar.gz: 6853750e68fffe251f60737fc2f8773201d976faafa71d13db0b9cec6eee87e2
5
+ SHA512:
6
+ metadata.gz: 68c4733f8c8ac2f1f585f09316c911611722f7b7c9486f658de414f04dc4be35a0bf17a6574048aa4334d58285c7f707a466680f421a9206ee9e54f4f9165818
7
+ data.tar.gz: 928424531e1218fc9be1c001d65faabc8d2fff84c3694b9fe9b35a4fce803682af344390c579b3016f41a2c5cb2edee6319e688439bf277c6f482a355da56691
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ test.conf
data/.travis.yml ADDED
@@ -0,0 +1,14 @@
1
+ language: ruby
2
+
3
+ rvm:
4
+ - 2.1
5
+ - 2.2.3
6
+ - 2.3.0
7
+
8
+ gemfile:
9
+ - Gemfile
10
+
11
+ before_install:
12
+ - gem update bundler
13
+
14
+ script: 'bundle exec rake test'
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fluent-plugin-mysql.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,13 @@
1
+ Copyright (c) 2012- TAGOMORI Satoshi
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
data/README.md ADDED
@@ -0,0 +1,350 @@
1
+
2
+ # fluent-plugin-mysql, a plugin for [Fluentd](http://fluentd.org) [![Build Status](https://secure.travis-ci.org/tagomoris/fluent-plugin-mysql.png?branch=master)](http://travis-ci.org/tagomoris/fluent-plugin-mysql)
3
+
4
+ fluent plugin mysql bulk insert is high performance and on duplicate key update respond.
5
+
6
+ ## Note
7
+ fluent-plugin-mysql-bulk merged this repository.
8
+
9
+ [mysql plugin](README_mysql.md) is deprecated. You should use mysql_bulk.
10
+
11
+ v0.1.5 only supports fluentd-0.12.X and v0.2.0 only supports fluentd-0.14.X.
12
+
13
+ ## Parameters
14
+
15
+ param|value
16
+ --------|------
17
+ host|database host(default: 127.0.0.1)
18
+ port|database port(default: 3306)
19
+ database|database name(require)
20
+ username|user(require)
21
+ password|password(default: blank)
22
+ sslkey|path to client key(default: nil)
23
+ sslcert|path to client cert(default: nil)
24
+ sslca|path to ca cert(default: nil)
25
+ sslcapath|path to ca certs(default: nil)
26
+ sslcipher|ssl cipher(default: nil)
27
+ sslverify|verify server certificate(default: nil)
28
+ column_names|bulk insert column (require)
29
+ key_names|value key names, ${time} is placeholder Time.at(time).strftime("%Y-%m-%d %H:%M:%S") (default : column_names)
30
+ json_key_names|Key names which store data as json, comma separator.
31
+ unixtimestamp_key_names|Key names which store data as datetime from unix time stamp
32
+ table|bulk insert table (require)
33
+ on_duplicate_key_update|on duplicate key update enable (true:false)
34
+ on_duplicate_update_keys|on duplicate key update column, comma separator
35
+ transaction_isolation_level|set transaction isolation level(default: nil)
36
+
37
+ ## Configuration Example(bulk insert)
38
+
39
+ ```
40
+ <match mysql.input>
41
+ @type mysql_bulk
42
+ host localhost
43
+ database test_app_development
44
+ username root
45
+ password hogehoge
46
+ column_names id,user_name,created_at,updated_at
47
+ table users
48
+ flush_interval 10s
49
+ </match>
50
+ ```
51
+
52
+ Assume following input is coming:
53
+
54
+ ```js
55
+ mysql.input: {"user_name":"toyama","created_at":"2014/01/03 21:35:15","updated_at":"2014/01/03 21:35:15","dummy":"hogehoge"}
56
+ mysql.input: {"user_name":"toyama2","created_at":"2014/01/03 21:35:21","updated_at":"2014/01/03 21:35:21","dummy":"hogehoge"}
57
+ mysql.input: {"user_name":"toyama3","created_at":"2014/01/03 21:35:27","updated_at":"2014/01/03 21:35:27","dummy":"hogehoge"}
58
+ ```
59
+
60
+ then result becomes as below (indented):
61
+
62
+ ```sql
63
+ +-----+-----------+---------------------+---------------------+
64
+ | id | user_name | created_at | updated_at |
65
+ +-----+-----------+---------------------+---------------------+
66
+ | 1 | toyama | 2014-01-03 21:35:15 | 2014-01-03 21:35:15 |
67
+ | 2 | toyama2 | 2014-01-03 21:35:21 | 2014-01-03 21:35:21 |
68
+ | 3 | toyama3 | 2014-01-03 21:35:27 | 2014-01-03 21:35:27 |
69
+ +-----+-----------+---------------------+---------------------+
70
+ ```
71
+
72
+ running query
73
+
74
+ ```sql
75
+ INSERT INTO users (id,user_name,created_at,updated_at) VALUES (NULL,'toyama','2014/01/03 21:35:15','2014/01/03 21:35:15'),(NULL,'toyama2','2014/01/03 21:35:21','2014/01/03 21:35:21')
76
+ ```
77
+
78
+ ## Configuration Example(bulk insert , if duplicate error record update)
79
+
80
+ ```
81
+ <match mysql.input>
82
+ @type mysql_bulk
83
+ host localhost
84
+ database test_app_development
85
+ username root
86
+ password hogehoge
87
+ column_names id,user_name,created_at,updated_at
88
+ table users
89
+ on_duplicate_key_update true
90
+ on_duplicate_update_keys user_name,updated_at
91
+ flush_interval 60s
92
+ </match>
93
+ ```
94
+
95
+ Assume following input is coming:
96
+
97
+ ```js
98
+ mysql.input: {"id":"1" ,"user_name":"toyama7","created_at":"2014/01/03 21:58:03","updated_at":"2014/01/03 21:58:03"}
99
+ mysql.input: {"id":"2" ,"user_name":"toyama7","created_at":"2014/01/03 21:58:06","updated_at":"2014/01/03 21:58:06"}
100
+ mysql.input: {"id":"3" ,"user_name":"toyama7","created_at":"2014/01/03 21:58:08","updated_at":"2014/01/03 21:58:08"}
101
+ mysql.input: {"id":"10","user_name":"toyama7","created_at":"2014/01/03 21:58:18","updated_at":"2014/01/03 21:58:18"}
102
+ ```
103
+
104
+ then result becomes as below (indented):
105
+
106
+ ```sql
107
+ +-----+-----------+---------------------+---------------------+
108
+ | id | user_name | created_at | updated_at |
109
+ +-----+-----------+---------------------+---------------------+
110
+ | 1 | toyama7 | 2014-01-03 21:35:15 | 2014-01-03 21:58:03 |
111
+ | 2 | toyama7 | 2014-01-03 21:35:21 | 2014-01-03 21:58:06 |
112
+ | 3 | toyama7 | 2014-01-03 21:35:27 | 2014-01-03 21:58:08 |
113
+ | 10 | toyama7 | 2014-01-03 21:58:18 | 2014-01-03 21:58:18 |
114
+ +-----+-----------+---------------------+---------------------+
115
+ ```
116
+
117
+ if duplicate id , update username and updated_at
118
+
119
+
120
+ ## Configuration Example(bulk insert,fluentd key different column name)
121
+
122
+ ```
123
+ <match mysql.input>
124
+ @type mysql_bulk
125
+ host localhost
126
+ database test_app_development
127
+ username root
128
+ password hogehoge
129
+ column_names id,user_name,created_at,updated_at
130
+ key_names id,user,created_date,updated_date
131
+ table users
132
+ flush_interval 10s
133
+ </match>
134
+ ```
135
+
136
+ Assume following input is coming:
137
+
138
+ ```js
139
+ mysql.input: {"user":"toyama","created_date":"2014/01/03 21:35:15","updated_date":"2014/01/03 21:35:15","dummy":"hogehoge"}
140
+ mysql.input: {"user":"toyama2","created_date":"2014/01/03 21:35:21","updated_date":"2014/01/03 21:35:21","dummy":"hogehoge"}
141
+ mysql.input: {"user":"toyama3","created_date":"2014/01/03 21:35:27","updated_date":"2014/01/03 21:35:27","dummy":"hogehoge"}
142
+ ```
143
+
144
+ then result becomes as below (indented):
145
+
146
+ ```sql
147
+ +-----+-----------+---------------------+---------------------+
148
+ | id | user_name | created_at | updated_at |
149
+ +-----+-----------+---------------------+---------------------+
150
+ | 1 | toyama | 2014-01-03 21:35:15 | 2014-01-03 21:35:15 |
151
+ | 2 | toyama2 | 2014-01-03 21:35:21 | 2014-01-03 21:35:21 |
152
+ | 3 | toyama3 | 2014-01-03 21:35:27 | 2014-01-03 21:35:27 |
153
+ +-----+-----------+---------------------+---------------------+
154
+ ```
155
+
156
+ ## Configuration Example(bulk insert, time complement)
157
+
158
+ ```
159
+ <match mysql.input>
160
+ @type mysql_bulk
161
+ host localhost
162
+ database test_app_development
163
+ username root
164
+ password hogehoge
165
+ column_names id,user_name,created_at
166
+ key_names id,user,${time}
167
+ table users
168
+ flush_interval 10s
169
+ </match>
170
+ ```
171
+
172
+ Assume following input is coming:
173
+
174
+ ```js
175
+ 2014-01-03 21:35:15+09:00: mysql.input: {"user":"toyama","dummy":"hogehoge"}
176
+ 2014-01-03 21:35:21+09:00: mysql.input: {"user":"toyama2","dummy":"hogehoge"}
177
+ 2014-01-03 21:35:27+09:00: mysql.input: {"user":"toyama3","dummy":"hogehoge"}
178
+ ```
179
+
180
+ then `created_at` column is set from time attribute in a fluentd packet:
181
+
182
+ ```sql
183
+ +-----+-----------+---------------------+
184
+ | id | user_name | created_at |
185
+ +-----+-----------+---------------------+
186
+ | 1 | toyama | 2014-01-03 21:35:15 |
187
+ | 2 | toyama2 | 2014-01-03 21:35:21 |
188
+ | 3 | toyama3 | 2014-01-03 21:35:27 |
189
+ +-----+-----------+---------------------+
190
+ ```
191
+
192
+ ## Configuration Example(bulk insert, time complement with specific timezone)
193
+
194
+ As described above, `${time}` placeholder sets time with `Time.at(time).strftime("%Y-%m-%d %H:%M:%S")`.
195
+ This handles the time with fluentd server default timezone.
196
+ If you want to use the specific timezone, you can use the include_time_key feature.
197
+ This is useful in case fluentd server and mysql have different timezone.
198
+ You can use various timezone format. See below.
199
+ http://docs.fluentd.org/articles/formatter-plugin-overview
200
+
201
+ ```
202
+ <match mysql.input>
203
+ @type mysql_bulk
204
+ host localhost
205
+ database test_app_development
206
+ username root
207
+ password hogehoge
208
+
209
+ include_time_key yes
210
+ timezone +00
211
+ time_format %Y-%m-%d %H:%M:%S
212
+ time_key created_at
213
+
214
+ column_names id,user_name,created_at
215
+ key_names id,user,created_at
216
+ table users
217
+ flush_interval 10s
218
+ </match>
219
+ ```
220
+
221
+ Assume following input is coming(fluentd server is using JST +09 timezone):
222
+
223
+ ```js
224
+ 2014-01-03 21:35:15+09:00: mysql.input: {"user":"toyama","dummy":"hogehoge"}
225
+ 2014-01-03 21:35:21+09:00: mysql.input: {"user":"toyama2","dummy":"hogehoge"}
226
+ 2014-01-03 21:35:27+09:00: mysql.input: {"user":"toyama3","dummy":"hogehoge"}
227
+ ```
228
+
229
+ then `created_at` column is set from time attribute in a fluentd packet with timezone converted to +00 UTC:
230
+
231
+ ```sql
232
+ +-----+-----------+---------------------+
233
+ | id | user_name | created_at |
234
+ +-----+-----------+---------------------+
235
+ | 1 | toyama | 2014-01-03 12:35:15 |
236
+ | 2 | toyama2 | 2014-01-03 12:35:21 |
237
+ | 3 | toyama3 | 2014-01-03 12:35:27 |
238
+ +-----+-----------+---------------------+
239
+ ```
240
+
241
+ ## Configuration Example(bulk insert with tag placeholder for table name)
242
+
243
+ This description is for v0.14.X users.
244
+
245
+ ```
246
+ <match mysql.input>
247
+ @type mysql_bulk
248
+ host localhost
249
+ database test_app_development
250
+ username root
251
+ password hogehoge
252
+ column_names id,user_name,created_at
253
+ key_names id,user,${time}
254
+ table users_${tag}
255
+ <buffer tag>
256
+ @type memory
257
+ flush_interval 60s
258
+ </buffer>
259
+ </match>
260
+ ```
261
+
262
+ Assume following input is coming:
263
+
264
+ ```js
265
+ 2016-09-26 18:42:13+09:00: mysql.input: {"user":"toyama","dummy":"hogehoge"}
266
+ 2016-09-26 18:42:16+09:00: mysql.input: {"user":"toyama2","dummy":"hogehoge"}
267
+ 2016-09-26 18:42:19+09:00: mysql.input: {"user":"toyama3","dummy":"hogehoge"}
268
+ ```
269
+
270
+ then `created_at` column is set from time attribute in a fluentd packet:
271
+
272
+ ```sql
273
+ mysql> select * from users_mysql_input;
274
+ +----+-----------+---------------------+
275
+ | id | user_name | created_at |
276
+ +----+-----------+---------------------+
277
+ | 1 | toyama | 2016-09-26 18:42:13 |
278
+ | 2 | toyama2 | 2016-09-26 18:42:16 |
279
+ | 3 | toyama3 | 2016-09-26 18:42:19 |
280
+ +----+-----------+---------------------+
281
+ 3 rows in set (0.00 sec)
282
+ ```
283
+
284
+ ## Configuration Example(bulk insert with time format placeholder for table name)
285
+
286
+ This description is for v0.14.X users.
287
+
288
+ ```
289
+ <match mysql.input>
290
+ @type mysql_bulk
291
+ host localhost
292
+ database test_app_development
293
+ username root
294
+ password hogehoge
295
+ column_names id,user_name,created_at
296
+ key_names id,user,${time}
297
+ table users_%Y%m%d
298
+ <buffer time>
299
+ @type memory
300
+ timekey 60s
301
+ timekey_wait 60s
302
+ </buffer>
303
+ </match>
304
+ ```
305
+
306
+ Assume following input is coming:
307
+
308
+ ```js
309
+ 2016-09-26 18:37:06+09:00: mysql.input: {"user":"toyama","dummy":"hogehoge"}
310
+ 2016-09-26 18:37:08+09:00: mysql.input: {"user":"toyama2","dummy":"hogehoge"}
311
+ 2016-09-26 18:37:11+09:00: mysql.input: {"user":"toyama3","dummy":"hogehoge"}
312
+ ```
313
+
314
+ then `created_at` column is set from time attribute in a fluentd packet:
315
+
316
+ ```sql
317
+ mysql> select * from users_20160926;
318
+ +----+-----------+---------------------+
319
+ | id | user_name | created_at |
320
+ +----+-----------+---------------------+
321
+ | 1 | toyama | 2016-09-26 18:37:06 |
322
+ | 2 | toyama2 | 2016-09-26 18:37:08 |
323
+ | 3 | toyama3 | 2016-09-26 18:37:11 |
324
+ +----+-----------+---------------------+
325
+ 3 rows in set (0.00 sec)
326
+ ```
327
+
328
+ ## spec
329
+
330
+ ```
331
+ bundle install
332
+ rake test
333
+ ```
334
+
335
+ ## todo
336
+
337
+ divide bulk insert(exsample 1000 per)
338
+
339
+
340
+ ## Contributing
341
+
342
+ 1. Fork it
343
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
344
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
345
+ 4. Push to the branch (`git push origin my-new-feature`)
346
+ 5. Create new [Pull Request](../../pull/new/master)
347
+
348
+ ## Copyright
349
+
350
+ Copyright (c) 2016 Hiroshi Toyama. See [LICENSE](LICENSE.txt) for details.
data/README_mysql.md ADDED
@@ -0,0 +1,140 @@
1
+ # fluent-plugin-mysql
2
+
3
+ ## Component
4
+
5
+ ### MysqlOutput
6
+
7
+ [Fluentd](http://fluentd.org) plugin to store mysql tables over SQL, to each columns per values, or to single column as json.
8
+
9
+ ## Configuration
10
+
11
+ ### MysqlOutput
12
+
13
+ MysqlOutput needs MySQL server's host/port/database/username/password, and INSERT format as SQL, or as table name and columns.
14
+
15
+ <match output.by.sql.*>
16
+ type mysql
17
+ host master.db.service.local
18
+ # port 3306 # default
19
+ database application_logs
20
+ username myuser
21
+ password mypass
22
+ key_names status,bytes,vhost,path,rhost,agent,referer
23
+ sql INSERT INTO accesslog (status,bytes,vhost,path,rhost,agent,referer) VALUES (?,?,?,?,?,?,?)
24
+ flush_interval 5s
25
+ </match>
26
+
27
+ <match output.by.names.*>
28
+ type mysql
29
+ host master.db.service.local
30
+ database application_logs
31
+ username myuser
32
+ password mypass
33
+ key_names status,bytes,vhost,path,rhost,agent,referer
34
+ table accesslog
35
+ # 'columns' names order must be same with 'key_names'
36
+ columns status,bytes,vhost,path,rhost,agent,referer
37
+ flush_interval 5s
38
+ </match>
39
+
40
+ Or, insert json into single column.
41
+
42
+ <match output.as.json.*>
43
+ type mysql
44
+ host master.db.service.local
45
+ database application_logs
46
+ username root
47
+ table accesslog
48
+ columns jsondata
49
+ format json
50
+ flush_interval 5s
51
+ </match>
52
+
53
+ To include time/tag into output, use `include_time_key` and `include_tag_key`, like this:
54
+
55
+ <match output.with.tag.and.time.*>
56
+ type mysql
57
+ host my.mysql.local
58
+ database anydatabase
59
+ username yourusername
60
+ password secret
61
+
62
+ include_time_key yes
63
+ ### default `time_format` is ISO-8601
64
+ # time_format %Y%m%d-%H%M%S
65
+ ### default `time_key` is 'time'
66
+ # time_key timekey
67
+
68
+ include_tag_key yes
69
+ ### default `tag_key` is 'tag'
70
+ # tag_key tagkey
71
+
72
+ table anydata
73
+ key_names time,tag,field1,field2,field3,field4
74
+ sql INSERT INTO baz (coltime,coltag,col1,col2,col3,col4) VALUES (?,?,?,?,?,?)
75
+ </match>
76
+
77
+ Or, for json:
78
+
79
+ <match output.with.tag.and.time.as.json.*>
80
+ type mysql
81
+ host database.local
82
+ database foo
83
+ username root
84
+
85
+ include_time_key yes
86
+ utc # with UTC timezone output (default: localtime)
87
+ time_format %Y%m%d-%H%M%S
88
+ time_key timeattr
89
+
90
+ include_tag_key yes
91
+ tag_key tagattr
92
+ table accesslog
93
+ columns jsondata
94
+ format json
95
+ </match>
96
+ #=> inserted json data into column 'jsondata' with addtional attribute 'timeattr' and 'tagattr'
97
+
98
+ ### JsonPath format
99
+
100
+ You can use [JsonPath](http://goessner.net/articles/JsonPath/) selectors as key_names, such as:
101
+
102
+ <match output.with.jsonpath.format.*>
103
+ type mysql
104
+ host database.local
105
+ database foo
106
+ username bar
107
+
108
+ include_time_key yes
109
+ utc
110
+ include_tag_key yes
111
+ table baz
112
+
113
+ format jsonpath
114
+ key_names time, tag, id, data.name, tags[0]
115
+ sql INSERT INTO baz (coltime,coltag,id,name,tag1) VALUES (?,?,?,?,?)
116
+ </match>
117
+
118
+ Which for a record like:
119
+
120
+ `{ 'id' => 15, 'data'=> {'name' => 'jsonpath' }, 'tags' => ['unit', 'simple'] }`
121
+
122
+ will generate the following insert values:
123
+
124
+ `('2012-12-17T01:23:45Z','test',15,'jsonpath','unit')`
125
+
126
+ ## Prerequisites
127
+
128
+ `fluent-plugin-mysql` uses `mysql2` gem, and `mysql2` links against `libmysqlclient`. See [Installing](https://github.com/brianmario/mysql2#installing) for its installation.
129
+
130
+ ## TODO
131
+
132
+ * implement 'tag_mapped'
133
+ * dynamic tag based table selection
134
+
135
+ ## Copyright
136
+
137
+ * Copyright
138
+ * Copyright(C) 2016- TAGOMORI Satoshi (tagomoris)
139
+ * License
140
+ * Apache License, Version 2.0
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+
4
+ require 'rake/testtask'
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << 'lib' << 'test'
7
+ test.pattern = 'test/**/test_*.rb'
8
+ test.verbose = true
9
+ end
10
+
11
+ task :default => :test
@@ -0,0 +1,24 @@
1
+ # -*- encoding: utf-8 -*-
2
+ Gem::Specification.new do |gem|
3
+ gem.name = "fluent-plugin-mysql-2"
4
+ gem.version = "0.3.7"
5
+ gem.authors = ["TAGOMORI Satoshi", "Toyama Hiroshi", "Alex Scarborough"]
6
+ gem.email = ["tagomoris@gmail.com", "toyama0919@gmail.com", "alex@teak.io"]
7
+ gem.description = %q{fluent plugin to insert mysql as json(single column) or insert statement}
8
+ gem.summary = %q{fluent plugin to insert mysql}
9
+ gem.homepage = "https://github.com/GoCarrot/fluent-plugin-mysql"
10
+ gem.license = "Apache-2.0"
11
+
12
+ gem.files = `git ls-files`.split($\)
13
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
14
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
15
+ gem.require_paths = ["lib"]
16
+
17
+ gem.add_runtime_dependency "fluentd", ['>= 0.14.8', '< 2']
18
+ gem.add_runtime_dependency "mysql2-cs-bind"
19
+ gem.add_runtime_dependency "jsonpath"
20
+ gem.add_runtime_dependency "oj"
21
+ gem.add_development_dependency "rake"
22
+ gem.add_development_dependency "test-unit"
23
+ gem.add_development_dependency "timecop", "~> 0.8.0"
24
+ end