fluent-plugin-mysql 0.1.5 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +0 -6
- data/README.md +88 -0
- data/fluent-plugin-mysql.gemspec +3 -2
- data/lib/fluent/plugin/out_mysql_bulk.rb +47 -31
- data/test/plugin/test_out_mysql_bulk.rb +108 -10
- metadata +25 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c8d2f2fd5a6164a01413ca4d9179d6a93d8b4f0
|
4
|
+
data.tar.gz: 05a99dbf24a3458cbd2031f87da2b1cd154c7d66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1aaf277b0400baf6235a2a1ebfa954e55c3f1b09f63c81f524f1d8af2751eb9e53de9f0828630de1e2bf8c36468445a51951e88f6823528b18db4716226c0a75
|
7
|
+
data.tar.gz: f1889ff991d71cc77e0c35201ed8bd169464e118671865ad839717d97082b3e9118c416342f568a2e2506f290760da350034c5e9835cf5120a468a64c1caf774
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -8,6 +8,8 @@ fluent-plugin-mysql-bulk merged this repository.
|
|
8
8
|
|
9
9
|
[mysql plugin](README_mysql.md) is deprecated. You should use mysql_bulk.
|
10
10
|
|
11
|
+
v0.1.5 only supports fluentd-0.12.X and v0.2.0 only supports fluentd-0.14.X.
|
12
|
+
|
11
13
|
## Parameters
|
12
14
|
|
13
15
|
param|value
|
@@ -228,6 +230,92 @@ then `created_at` column is set from time attribute in a fluentd packet with tim
|
|
228
230
|
+-----+-----------+---------------------+
|
229
231
|
```
|
230
232
|
|
233
|
+
## Configuration Example(bulk insert with tag placeholder for table name)
|
234
|
+
|
235
|
+
This description is for v0.14.X users.
|
236
|
+
|
237
|
+
```
|
238
|
+
<match mysql.input>
|
239
|
+
@type mysql_bulk
|
240
|
+
host localhost
|
241
|
+
database test_app_development
|
242
|
+
username root
|
243
|
+
password hogehoge
|
244
|
+
column_names id,user_name,created_at
|
245
|
+
key_names id,user,${time}
|
246
|
+
table users_${tag}
|
247
|
+
<buffer tag>
|
248
|
+
@type memory
|
249
|
+
flush_interval 60s
|
250
|
+
</buffer>
|
251
|
+
</match>
|
252
|
+
```
|
253
|
+
|
254
|
+
Assume following input is coming:
|
255
|
+
|
256
|
+
```js
|
257
|
+
2016-09-26 18:42:13+09:00: mysql.input: {"user":"toyama","dummy":"hogehoge"}
|
258
|
+
2016-09-26 18:42:16+09:00: mysql.input: {"user":"toyama2","dummy":"hogehoge"}
|
259
|
+
2016-09-26 18:42:19+09:00: mysql.input: {"user":"toyama3","dummy":"hogehoge"}
|
260
|
+
```
|
261
|
+
|
262
|
+
then `created_at` column is set from time attribute in a fluentd packet:
|
263
|
+
|
264
|
+
```sql
|
265
|
+
mysql> select * from users_mysql_input;
|
266
|
+
+----+-----------+---------------------+
|
267
|
+
| id | user_name | created_at |
|
268
|
+
+----+-----------+---------------------+
|
269
|
+
| 1 | toyama | 2016-09-26 18:42:13 |
|
270
|
+
| 2 | toyama2 | 2016-09-26 18:42:16 |
|
271
|
+
| 3 | toyama3 | 2016-09-26 18:42:19 |
|
272
|
+
+----+-----------+---------------------+
|
273
|
+
3 rows in set (0.00 sec)
|
274
|
+
```
|
275
|
+
|
276
|
+
## Configuration Example(bulk insert with time format placeholder for table name)
|
277
|
+
|
278
|
+
This description is for v0.14.X users.
|
279
|
+
|
280
|
+
```
|
281
|
+
<match mysql.input>
|
282
|
+
@type mysql_bulk
|
283
|
+
host localhost
|
284
|
+
database test_app_development
|
285
|
+
username root
|
286
|
+
password hogehoge
|
287
|
+
column_names id,user_name,created_at
|
288
|
+
key_names id,user,${time}
|
289
|
+
table users_%Y%m%d
|
290
|
+
<buffer time>
|
291
|
+
@type memory
|
292
|
+
timekey 60s
|
293
|
+
timekey_wait 60s
|
294
|
+
</buffer>
|
295
|
+
</match>
|
296
|
+
```
|
297
|
+
|
298
|
+
Assume following input is coming:
|
299
|
+
|
300
|
+
```js
|
301
|
+
2016-09-26 18:37:06+09:00: mysql.input: {"user":"toyama","dummy":"hogehoge"}
|
302
|
+
2016-09-26 18:37:08+09:00: mysql.input: {"user":"toyama2","dummy":"hogehoge"}
|
303
|
+
2016-09-26 18:37:11+09:00: mysql.input: {"user":"toyama3","dummy":"hogehoge"}
|
304
|
+
```
|
305
|
+
|
306
|
+
then `created_at` column is set from time attribute in a fluentd packet:
|
307
|
+
|
308
|
+
```sql
|
309
|
+
mysql> select * from users_20160926;
|
310
|
+
+----+-----------+---------------------+
|
311
|
+
| id | user_name | created_at |
|
312
|
+
+----+-----------+---------------------+
|
313
|
+
| 1 | toyama | 2016-09-26 18:37:06 |
|
314
|
+
| 2 | toyama2 | 2016-09-26 18:37:08 |
|
315
|
+
| 3 | toyama3 | 2016-09-26 18:37:11 |
|
316
|
+
+----+-----------+---------------------+
|
317
|
+
3 rows in set (0.00 sec)
|
318
|
+
```
|
231
319
|
|
232
320
|
## spec
|
233
321
|
|
data/fluent-plugin-mysql.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
Gem::Specification.new do |gem|
|
3
3
|
gem.name = "fluent-plugin-mysql"
|
4
|
-
gem.version = "0.
|
4
|
+
gem.version = "0.2.0"
|
5
5
|
gem.authors = ["TAGOMORI Satoshi", "Toyama Hiroshi"]
|
6
6
|
gem.email = ["tagomoris@gmail.com", "toyama0919@gmail.com"]
|
7
7
|
gem.description = %q{fluent plugin to insert mysql as json(single column) or insert statement}
|
@@ -14,9 +14,10 @@ Gem::Specification.new do |gem|
|
|
14
14
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
|
17
|
-
gem.add_runtime_dependency "fluentd", '
|
17
|
+
gem.add_runtime_dependency "fluentd", ['>= 0.14.8', '< 2']
|
18
18
|
gem.add_runtime_dependency "mysql2-cs-bind"
|
19
19
|
gem.add_runtime_dependency "jsonpath"
|
20
20
|
gem.add_development_dependency "rake"
|
21
21
|
gem.add_development_dependency "test-unit"
|
22
|
+
gem.add_development_dependency "timecop", "~> 0.8.0"
|
22
23
|
end
|
@@ -1,36 +1,38 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
|
-
|
3
|
-
|
2
|
+
require 'fluent/plugin/output'
|
3
|
+
|
4
|
+
module Fluent::Plugin
|
5
|
+
class MysqlBulkOutput < Output
|
4
6
|
Fluent::Plugin.register_output('mysql_bulk', self)
|
5
7
|
|
6
|
-
|
8
|
+
helpers :compat_parameters, :inject
|
7
9
|
|
8
10
|
config_param :host, :string, default: '127.0.0.1',
|
9
|
-
:
|
11
|
+
desc: "Database host."
|
10
12
|
config_param :port, :integer, default: 3306,
|
11
|
-
:
|
13
|
+
desc: "Database port."
|
12
14
|
config_param :database, :string,
|
13
|
-
:
|
15
|
+
desc: "Database name."
|
14
16
|
config_param :username, :string,
|
15
|
-
:
|
17
|
+
desc: "Database user."
|
16
18
|
config_param :password, :string, default: '', secret: true,
|
17
|
-
:
|
19
|
+
desc: "Database password."
|
18
20
|
|
19
21
|
config_param :column_names, :string,
|
20
|
-
:
|
22
|
+
desc: "Bulk insert column."
|
21
23
|
config_param :key_names, :string, default: nil,
|
22
|
-
:
|
24
|
+
desc: <<-DESC
|
23
25
|
Value key names, ${time} is placeholder Time.at(time).strftime("%Y-%m-%d %H:%M:%S").
|
24
26
|
DESC
|
25
27
|
config_param :json_key_names, :string, default: nil,
|
26
|
-
:
|
28
|
+
desc: "Key names which store data as json"
|
27
29
|
config_param :table, :string,
|
28
|
-
:
|
30
|
+
desc: "Bulk insert table."
|
29
31
|
|
30
32
|
config_param :on_duplicate_key_update, :bool, default: false,
|
31
|
-
:
|
33
|
+
desc: "On duplicate key update enable."
|
32
34
|
config_param :on_duplicate_update_keys, :string, default: nil,
|
33
|
-
:
|
35
|
+
desc: "On duplicate key update column, comma separator."
|
34
36
|
|
35
37
|
attr_accessor :handler
|
36
38
|
|
@@ -39,12 +41,8 @@ DESC
|
|
39
41
|
require 'mysql2-cs-bind'
|
40
42
|
end
|
41
43
|
|
42
|
-
# Define `log` method for v0.10.42 or earlier
|
43
|
-
unless method_defined?(:log)
|
44
|
-
define_method("log") { $log }
|
45
|
-
end
|
46
|
-
|
47
44
|
def configure(conf)
|
45
|
+
compat_parameters_convert(conf, :buffer, :inject)
|
48
46
|
super
|
49
47
|
|
50
48
|
if @column_names.nil?
|
@@ -72,8 +70,11 @@ DESC
|
|
72
70
|
|
73
71
|
def start
|
74
72
|
super
|
75
|
-
|
76
|
-
|
73
|
+
end
|
74
|
+
|
75
|
+
def check_table_schema(database: @database, table: @table)
|
76
|
+
result = client(database).xquery("SHOW COLUMNS FROM #{table}")
|
77
|
+
max_lengths = []
|
77
78
|
@column_names.each do |column|
|
78
79
|
info = result.select { |x| x['Field'] == column }.first
|
79
80
|
r = /(char|varchar)\(([\d]+)\)/
|
@@ -82,8 +83,9 @@ DESC
|
|
82
83
|
rescue
|
83
84
|
max_length = nil
|
84
85
|
end
|
85
|
-
|
86
|
+
max_lengths << max_length
|
86
87
|
end
|
88
|
+
max_lengths
|
87
89
|
end
|
88
90
|
|
89
91
|
def shutdown
|
@@ -91,31 +93,45 @@ DESC
|
|
91
93
|
end
|
92
94
|
|
93
95
|
def format(tag, time, record)
|
94
|
-
|
96
|
+
record = inject_values_to_record(tag, time, record)
|
97
|
+
[tag, time, record].to_msgpack
|
95
98
|
end
|
96
99
|
|
97
|
-
def
|
100
|
+
def formatted_to_msgpack_binary
|
101
|
+
true
|
102
|
+
end
|
103
|
+
|
104
|
+
def client(database)
|
98
105
|
Mysql2::Client.new(
|
99
106
|
host: @host,
|
100
107
|
port: @port,
|
101
108
|
username: @username,
|
102
109
|
password: @password,
|
103
|
-
database:
|
110
|
+
database: database,
|
104
111
|
flags: Mysql2::Client::MULTI_STATEMENTS
|
105
112
|
)
|
106
113
|
end
|
107
114
|
|
115
|
+
def expand_placeholders(metadata)
|
116
|
+
database = extract_placeholders(@database, metadata).gsub('.', '_')
|
117
|
+
table = extract_placeholders(@table, metadata).gsub('.', '_')
|
118
|
+
return database, table
|
119
|
+
end
|
120
|
+
|
108
121
|
def write(chunk)
|
109
|
-
|
122
|
+
database, table = expand_placeholders(chunk.metadata)
|
123
|
+
max_lengths = check_table_schema(database: database, table: table)
|
124
|
+
@handler = client(database)
|
110
125
|
values = []
|
111
126
|
values_template = "(#{ @column_names.map { |key| '?' }.join(',') })"
|
112
127
|
chunk.msgpack_each do |tag, time, data|
|
128
|
+
data = format_proc.call(tag, time, data, max_lengths)
|
113
129
|
values << Mysql2::Client.pseudo_bind(values_template, data)
|
114
130
|
end
|
115
|
-
sql = "INSERT INTO #{
|
131
|
+
sql = "INSERT INTO #{table} (#{@column_names.join(',')}) VALUES #{values.join(',')}"
|
116
132
|
sql += @on_duplicate_key_update_sql if @on_duplicate_key_update
|
117
133
|
|
118
|
-
log.info "bulk insert values size (table: #{
|
134
|
+
log.info "bulk insert values size (table: #{table}) => #{values.size}"
|
119
135
|
@handler.xquery(sql)
|
120
136
|
@handler.close
|
121
137
|
end
|
@@ -123,16 +139,16 @@ DESC
|
|
123
139
|
private
|
124
140
|
|
125
141
|
def format_proc
|
126
|
-
proc do |tag, time, record|
|
142
|
+
proc do |tag, time, record, max_lengths|
|
127
143
|
values = []
|
128
144
|
@key_names.each_with_index do |key, i|
|
129
145
|
if key == '${time}'
|
130
146
|
value = Time.at(time).strftime('%Y-%m-%d %H:%M:%S')
|
131
147
|
else
|
132
|
-
if
|
148
|
+
if max_lengths[i].nil? || record[key].nil?
|
133
149
|
value = record[key]
|
134
150
|
else
|
135
|
-
value = record[key].slice(0,
|
151
|
+
value = record[key].slice(0, max_lengths[i])
|
136
152
|
end
|
137
153
|
|
138
154
|
if @json_key_names && @json_key_names.include?(key)
|
@@ -1,13 +1,32 @@
|
|
1
|
+
# coding: utf-8
|
1
2
|
require 'helper'
|
2
3
|
require 'mysql2-cs-bind'
|
4
|
+
require 'fluent/test/driver/output'
|
5
|
+
require 'fluent/plugin/buffer'
|
6
|
+
require 'fluent/config'
|
7
|
+
require 'time'
|
8
|
+
require 'timecop'
|
3
9
|
|
4
10
|
class MysqlBulkOutputTest < Test::Unit::TestCase
|
5
11
|
def setup
|
6
12
|
Fluent::Test.setup
|
7
13
|
end
|
8
14
|
|
9
|
-
def
|
10
|
-
|
15
|
+
def config_element(name = 'test', argument = '', params = {}, elements = [])
|
16
|
+
Fluent::Config::Element.new(name, argument, params, elements)
|
17
|
+
end
|
18
|
+
|
19
|
+
CONFIG = %[
|
20
|
+
database test_app_development
|
21
|
+
username root
|
22
|
+
password hogehoge
|
23
|
+
column_names id,user_name,created_at
|
24
|
+
key_names id,users,created_at
|
25
|
+
table users
|
26
|
+
]
|
27
|
+
|
28
|
+
def create_driver(conf = CONFIG)
|
29
|
+
d = Fluent::Test::Driver::Output.new(Fluent::Plugin::MysqlBulkOutput).configure(conf)
|
11
30
|
d.instance.instance_eval {
|
12
31
|
def client
|
13
32
|
obj = Object.new
|
@@ -21,9 +40,88 @@ class MysqlBulkOutputTest < Test::Unit::TestCase
|
|
21
40
|
d
|
22
41
|
end
|
23
42
|
|
43
|
+
def create_metadata(timekey: nil, tag: nil, variables: nil)
|
44
|
+
Fluent::Plugin::Buffer::Metadata.new(timekey, tag, variables)
|
45
|
+
end
|
46
|
+
|
47
|
+
class TestExpandPlaceholders < self
|
48
|
+
data("table" => {"database" => "test_app_development",
|
49
|
+
"table" => "users_${tag}",
|
50
|
+
"extracted_database" => "test_app_development",
|
51
|
+
"extracted_table" => "users_input_mysql"
|
52
|
+
},
|
53
|
+
"database" => {"database" => "test_app_development_${tag}",
|
54
|
+
"table" => "users",
|
55
|
+
"extracted_database" => "test_app_development_input_mysql",
|
56
|
+
"extracted_table" => "users"
|
57
|
+
},
|
58
|
+
)
|
59
|
+
def test_expand_tag_placeholder(data)
|
60
|
+
config = config_element('ROOT', '', {
|
61
|
+
"@type" => "mysql_bulk",
|
62
|
+
"host" => "localhost",
|
63
|
+
"database" => data["database"],
|
64
|
+
"username" => "root",
|
65
|
+
"password" => "hogehoge",
|
66
|
+
"column_names" => "id,user_name,created_at",
|
67
|
+
"table" => data["table"],
|
68
|
+
}, [config_element('buffer', 'tag', {
|
69
|
+
"@type" => "memory",
|
70
|
+
"flush_interval" => "60s",
|
71
|
+
}, [])])
|
72
|
+
d = create_driver(config)
|
73
|
+
time = Time.now
|
74
|
+
metadata = create_metadata(timekey: time.to_i, tag: 'input.mysql')
|
75
|
+
database, table = d.instance.expand_placeholders(metadata)
|
76
|
+
assert_equal(data["extracted_database"], database)
|
77
|
+
assert_equal(data["extracted_table"], table)
|
78
|
+
end
|
79
|
+
|
80
|
+
def setup
|
81
|
+
Timecop.freeze(Time.parse("2016-09-26"))
|
82
|
+
end
|
83
|
+
|
84
|
+
data("table" => {"database" => "test_app_development",
|
85
|
+
"table" => "users_%Y%m%d",
|
86
|
+
"extracted_database" => "test_app_development",
|
87
|
+
"extracted_table" => "users_20160926"
|
88
|
+
},
|
89
|
+
"database" => {"database" => "test_app_development_%Y%m%d",
|
90
|
+
"table" => "users",
|
91
|
+
"extracted_database" => "test_app_development_20160926",
|
92
|
+
"extracted_table" => "users"
|
93
|
+
},
|
94
|
+
)
|
95
|
+
def test_expand_time_placeholder(data)
|
96
|
+
config = config_element('ROOT', '', {
|
97
|
+
"@type" => "mysql_bulk",
|
98
|
+
"host" => "localhost",
|
99
|
+
"database" => data["database"],
|
100
|
+
"username" => "root",
|
101
|
+
"password" => "hogehoge",
|
102
|
+
"column_names" => "id,user_name,created_at",
|
103
|
+
"table" => data["table"],
|
104
|
+
}, [config_element('buffer', 'time', {
|
105
|
+
"@type" => "memory",
|
106
|
+
"timekey" => "60s",
|
107
|
+
"timekey_wait" => "60s"
|
108
|
+
}, [])])
|
109
|
+
d = create_driver(config)
|
110
|
+
time = Time.now
|
111
|
+
metadata = create_metadata(timekey: time.to_i, tag: 'input.mysql')
|
112
|
+
database, table = d.instance.expand_placeholders(metadata)
|
113
|
+
assert_equal(data["extracted_database"], database)
|
114
|
+
assert_equal(data["extracted_table"], table)
|
115
|
+
end
|
116
|
+
|
117
|
+
def teardown
|
118
|
+
Timecop.return
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
24
122
|
def test_configure_error
|
25
123
|
assert_raise(Fluent::ConfigError) do
|
26
|
-
|
124
|
+
create_driver %[
|
27
125
|
host localhost
|
28
126
|
database test_app_development
|
29
127
|
username root
|
@@ -36,7 +134,7 @@ class MysqlBulkOutputTest < Test::Unit::TestCase
|
|
36
134
|
end
|
37
135
|
|
38
136
|
assert_raise(Fluent::ConfigError) do
|
39
|
-
|
137
|
+
create_driver %[
|
40
138
|
host localhost
|
41
139
|
database test_app_development
|
42
140
|
username root
|
@@ -49,7 +147,7 @@ class MysqlBulkOutputTest < Test::Unit::TestCase
|
|
49
147
|
end
|
50
148
|
|
51
149
|
assert_raise(Fluent::ConfigError) do
|
52
|
-
|
150
|
+
create_driver %[
|
53
151
|
host localhost
|
54
152
|
username root
|
55
153
|
password hogehoge
|
@@ -65,7 +163,7 @@ class MysqlBulkOutputTest < Test::Unit::TestCase
|
|
65
163
|
def test_configure
|
66
164
|
# not define format(default csv)
|
67
165
|
assert_nothing_raised(Fluent::ConfigError) do
|
68
|
-
|
166
|
+
create_driver %[
|
69
167
|
host localhost
|
70
168
|
database test_app_development
|
71
169
|
username root
|
@@ -79,7 +177,7 @@ class MysqlBulkOutputTest < Test::Unit::TestCase
|
|
79
177
|
end
|
80
178
|
|
81
179
|
assert_nothing_raised(Fluent::ConfigError) do
|
82
|
-
|
180
|
+
create_driver %[
|
83
181
|
database test_app_development
|
84
182
|
username root
|
85
183
|
password hogehoge
|
@@ -89,7 +187,7 @@ class MysqlBulkOutputTest < Test::Unit::TestCase
|
|
89
187
|
end
|
90
188
|
|
91
189
|
assert_nothing_raised(Fluent::ConfigError) do
|
92
|
-
|
190
|
+
create_driver %[
|
93
191
|
database test_app_development
|
94
192
|
username root
|
95
193
|
password hogehoge
|
@@ -101,7 +199,7 @@ class MysqlBulkOutputTest < Test::Unit::TestCase
|
|
101
199
|
end
|
102
200
|
|
103
201
|
assert_nothing_raised(Fluent::ConfigError) do
|
104
|
-
|
202
|
+
create_driver %[
|
105
203
|
database test_app_development
|
106
204
|
username root
|
107
205
|
password hogehoge
|
@@ -114,7 +212,7 @@ class MysqlBulkOutputTest < Test::Unit::TestCase
|
|
114
212
|
end
|
115
213
|
|
116
214
|
assert_nothing_raised(Fluent::ConfigError) do
|
117
|
-
|
215
|
+
create_driver %[
|
118
216
|
database test_app_development
|
119
217
|
username root
|
120
218
|
password hogehoge
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-mysql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TAGOMORI Satoshi
|
@@ -15,16 +15,22 @@ dependencies:
|
|
15
15
|
name: fluentd
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - ">="
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 0.14.8
|
21
|
+
- - "<"
|
19
22
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
23
|
+
version: '2'
|
21
24
|
type: :runtime
|
22
25
|
prerelease: false
|
23
26
|
version_requirements: !ruby/object:Gem::Requirement
|
24
27
|
requirements:
|
25
|
-
- - "
|
28
|
+
- - ">="
|
26
29
|
- !ruby/object:Gem::Version
|
27
|
-
version: 0.
|
30
|
+
version: 0.14.8
|
31
|
+
- - "<"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2'
|
28
34
|
- !ruby/object:Gem::Dependency
|
29
35
|
name: mysql2-cs-bind
|
30
36
|
requirement: !ruby/object:Gem::Requirement
|
@@ -81,6 +87,20 @@ dependencies:
|
|
81
87
|
- - ">="
|
82
88
|
- !ruby/object:Gem::Version
|
83
89
|
version: '0'
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: timecop
|
92
|
+
requirement: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 0.8.0
|
97
|
+
type: :development
|
98
|
+
prerelease: false
|
99
|
+
version_requirements: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 0.8.0
|
84
104
|
description: fluent plugin to insert mysql as json(single column) or insert statement
|
85
105
|
email:
|
86
106
|
- tagomoris@gmail.com
|