fluent-plugin-mongo 0.7.2 → 0.7.3
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 +4 -4
- data/.travis.yml +8 -2
- data/ChangeLog +7 -0
- data/README.rdoc +17 -2
- data/VERSION +1 -1
- data/fluent-plugin-mongo.gemspec +2 -2
- data/lib/fluent/plugin/in_mongo_tail.rb +7 -1
- data/lib/fluent/plugin/out_mongo.rb +31 -0
- data/test/plugin/out_mongo.rb +31 -2
- metadata +19 -20
- data/.gitmodules +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4c03c163ad52a2f48b8fa88d69370d4c1ed0810
|
4
|
+
data.tar.gz: cf0f26a570dcfaed4c24bde308446b36ba0c2cfd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 871f0d9f4880db300354aff08ba51f1a9f07718e01e9b3527ee22c5be107bda3f4ce9e96d7d5ed431a7ed704eb90fe421ba178a357216a1e9070630ff33847dd
|
7
|
+
data.tar.gz: 182460bff1536f1997c238537292cbb0a048af93ef74a2393e275b79b0ae969707336d4c3243cdfe50a8f717b3929ac8ab1cffd4b91a0e01c51499985dc035ee
|
data/.travis.yml
CHANGED
data/ChangeLog
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
Release 0.7.3 - 2014/03/09
|
2
|
+
|
3
|
+
* Add replace_dot_in_key_with and replace_dollar_in_key_with parameters to sanitize invalid key
|
4
|
+
* Add ssl parameter to enable SSL connection
|
5
|
+
* Relax gem version dependency
|
6
|
+
|
7
|
+
|
1
8
|
Release 0.7.2 - 2014/02/05
|
2
9
|
|
3
10
|
* Support log_level option
|
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
= MongoDB plugin for Fluentd
|
1
|
+
= MongoDB plugin for {Fluentd}[http://github.com/fluent/fluentd]
|
2
2
|
|
3
|
-
fluent-plugin-mongo provides input and output plugins for {Fluentd}[http://fluentd.org/]
|
3
|
+
fluent-plugin-mongo provides input and output plugins for {Fluentd}[http://fluentd.org] ({GitHub}[http://github.com/fluent/fluentd])
|
4
4
|
|
5
5
|
= Installation
|
6
6
|
|
@@ -199,6 +199,21 @@ If you want to exclude some fields from broken data marshaling, use _exclude_bro
|
|
199
199
|
Specified value is a comma separated keys(e.g. key1,key2,key3).
|
200
200
|
This parameter is useful for excluding shard keys in shard environment.
|
201
201
|
|
202
|
+
=== replace_dot_in_key_with and replace_dollar_in_key_with
|
203
|
+
|
204
|
+
BSON records which include '.' or start with '$' are invalid and they will be stored as broken data to MongoDB. If you want to sanitize keys, you can use _replace_dot_in_key_with_ and _replace_dollar_in_key_with_.
|
205
|
+
|
206
|
+
<match forward.*>
|
207
|
+
...
|
208
|
+
# replace '.' in keys with '__dot__'
|
209
|
+
replace_dot_in_key_with __dot__
|
210
|
+
|
211
|
+
# replace '$' in keys with '__dollar__'
|
212
|
+
# Note: This replaces '$' only on first character
|
213
|
+
replace_dollar_in_key_with __dollar__
|
214
|
+
...
|
215
|
+
</match>
|
216
|
+
|
202
217
|
== Buffer size limitation
|
203
218
|
|
204
219
|
Mongo plugin has the limitation of buffer size.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.3
|
data/fluent-plugin-mongo.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path('../lib', __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.name = "fluent-plugin-mongo"
|
6
|
-
gem.description = "MongoDB plugin for
|
6
|
+
gem.description = "MongoDB plugin for Fluentd"
|
7
7
|
gem.homepage = "https://github.com/fluent/fluent-plugin-mongo"
|
8
8
|
gem.summary = gem.description
|
9
9
|
gem.version = File.read("VERSION").strip
|
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.require_paths = ['lib']
|
18
18
|
|
19
19
|
gem.add_dependency "fluentd", "~> 0.10.9"
|
20
|
-
gem.add_dependency "mongo", "
|
20
|
+
gem.add_dependency "mongo", ">= 1.8.0"
|
21
21
|
gem.add_development_dependency "rake", ">= 0.9.2"
|
22
22
|
gem.add_development_dependency "simplecov", ">= 0.5.4"
|
23
23
|
gem.add_development_dependency "rr", ">= 1.0.0"
|
@@ -19,6 +19,9 @@ module Fluent
|
|
19
19
|
# To store last ObjectID
|
20
20
|
config_param :id_store_file, :string, :default => nil
|
21
21
|
|
22
|
+
# SSL connection
|
23
|
+
config_param :ssl, :bool, :default => false
|
24
|
+
|
22
25
|
unless method_defined?(:log)
|
23
26
|
define_method(:log) { $log }
|
24
27
|
end
|
@@ -27,6 +30,8 @@ module Fluent
|
|
27
30
|
super
|
28
31
|
require 'mongo'
|
29
32
|
require 'bson'
|
33
|
+
|
34
|
+
@connection_options = {}
|
30
35
|
end
|
31
36
|
|
32
37
|
def configure(conf)
|
@@ -37,6 +42,7 @@ module Fluent
|
|
37
42
|
end
|
38
43
|
|
39
44
|
@last_id = @id_store_file ? get_last_id : nil
|
45
|
+
@connection_options[:ssl] = @ssl
|
40
46
|
|
41
47
|
$log.debug "Setup mongo_tail configuration: mode = #{@id_store_file ? 'persistent' : 'non-persistent'}"
|
42
48
|
end
|
@@ -69,7 +75,7 @@ module Fluent
|
|
69
75
|
|
70
76
|
def get_capped_collection
|
71
77
|
begin
|
72
|
-
db = authenticate(Mongo::Connection.new(@host, @port).db(@database))
|
78
|
+
db = authenticate(Mongo::Connection.new(@host, @port, @connection_options).db(@database))
|
73
79
|
raise ConfigError, "'#{@database}.#{@collection}' not found: node = #{@host}:#{@port}" unless db.collection_names.include?(@collection)
|
74
80
|
collection = db.collection(@collection)
|
75
81
|
raise ConfigError, "'#{@database}.#{@collection}' is not capped: node = #{@host}:#{@port}" unless collection.capped?
|
@@ -19,11 +19,16 @@ module Fluent
|
|
19
19
|
config_param :disable_collection_check, :bool, :default => nil
|
20
20
|
config_param :exclude_broken_fields, :string, :default => nil
|
21
21
|
config_param :write_concern, :integer, :default => nil
|
22
|
+
config_param :replace_dot_in_key_with, :string, :default => nil
|
23
|
+
config_param :replace_dollar_in_key_with, :string, :default => nil
|
22
24
|
|
23
25
|
# tag mapping mode
|
24
26
|
config_param :tag_mapped, :bool, :default => false
|
25
27
|
config_param :remove_tag_prefix, :string, :default => nil
|
26
28
|
|
29
|
+
# SSL connection
|
30
|
+
config_param :ssl, :bool, :default => false
|
31
|
+
|
27
32
|
attr_reader :collection_options, :connection_options
|
28
33
|
|
29
34
|
unless method_defined?(:log)
|
@@ -65,6 +70,7 @@ module Fluent
|
|
65
70
|
end
|
66
71
|
|
67
72
|
@connection_options[:w] = @write_concern unless @write_concern.nil?
|
73
|
+
@connection_options[:ssl] = @ssl
|
68
74
|
|
69
75
|
# MongoDB uses BSON's Date for time.
|
70
76
|
def @timef.format_nocache(time)
|
@@ -116,6 +122,17 @@ module Fluent
|
|
116
122
|
|
117
123
|
def operate(collection, records)
|
118
124
|
begin
|
125
|
+
if @replace_dot_in_key_with
|
126
|
+
records.map! do |r|
|
127
|
+
replace_key_of_hash(r, ".", @replace_dot_in_key_with)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
if @replace_dollar_in_key_with
|
131
|
+
records.map! do |r|
|
132
|
+
replace_key_of_hash(r, /^\$/, @replace_dollar_in_key_with)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
119
136
|
record_ids, error_records = collection.insert(records, INSERT_ARGUMENT)
|
120
137
|
if !@ignore_invalid_record and error_records.size > 0
|
121
138
|
operate_invalid_records(collection, error_records)
|
@@ -235,5 +252,19 @@ module Fluent
|
|
235
252
|
|
236
253
|
version
|
237
254
|
end
|
255
|
+
|
256
|
+
def replace_key_of_hash(hash, pattern, replacement)
|
257
|
+
result = Hash.new
|
258
|
+
hash.each_pair do |k, v|
|
259
|
+
k = k.gsub(pattern, replacement)
|
260
|
+
|
261
|
+
if v.is_a?(Hash)
|
262
|
+
result[k] = replace_key_of_hash(v, pattern, replacement)
|
263
|
+
else
|
264
|
+
result[k] = (v.dup rescue v)
|
265
|
+
end
|
266
|
+
end
|
267
|
+
result
|
268
|
+
end
|
238
269
|
end
|
239
270
|
end
|
data/test/plugin/out_mongo.rb
CHANGED
@@ -51,7 +51,7 @@ class MongoOutputTest < Test::Unit::TestCase
|
|
51
51
|
assert_equal('localhost', d.instance.host)
|
52
52
|
assert_equal(@@mongod_port, d.instance.port)
|
53
53
|
assert_equal({:capped => true, :size => 100}, d.instance.collection_options)
|
54
|
-
|
54
|
+
assert_equal({:ssl => false}, d.instance.connection_options)
|
55
55
|
# buffer_chunk_limit moved from configure to start
|
56
56
|
# I will move this test to correct space after BufferedOutputTestDriver supports start method invoking
|
57
57
|
# assert_equal(Fluent::MongoOutput::LIMIT_BEFORE_v1_8, d.instance.instance_variable_get(:@buffer).buffer_chunk_limit)
|
@@ -62,7 +62,15 @@ class MongoOutputTest < Test::Unit::TestCase
|
|
62
62
|
write_concern 2
|
63
63
|
])
|
64
64
|
|
65
|
-
assert_equal({:w => 2}, d.instance.connection_options)
|
65
|
+
assert_equal({:w => 2, :ssl => false}, d.instance.connection_options)
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_configure_with_ssl
|
69
|
+
d = create_driver(default_config + %[
|
70
|
+
ssl true
|
71
|
+
])
|
72
|
+
|
73
|
+
assert_equal({:ssl => true}, d.instance.connection_options)
|
66
74
|
end
|
67
75
|
|
68
76
|
def test_format
|
@@ -120,6 +128,26 @@ class MongoOutputTest < Test::Unit::TestCase
|
|
120
128
|
time
|
121
129
|
end
|
122
130
|
|
131
|
+
def test_write_with_invalid_recoreds_with_keys_containing_dot_and_dollar
|
132
|
+
d = create_driver(default_config + %[
|
133
|
+
replace_dot_in_key_with _dot_
|
134
|
+
replace_dollar_in_key_with _dollar_
|
135
|
+
])
|
136
|
+
|
137
|
+
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
138
|
+
d.emit({
|
139
|
+
"foo.bar" => {
|
140
|
+
"$foo$bar" => "baz"
|
141
|
+
}
|
142
|
+
}, time)
|
143
|
+
d.run
|
144
|
+
|
145
|
+
documents = get_documents
|
146
|
+
assert_equal(1, documents.size)
|
147
|
+
assert_equal("baz", documents[0]["foo_dot_bar"]["_dollar_foo$bar"])
|
148
|
+
assert_equal(0, documents.select { |e| e.has_key?(Fluent::MongoOutput::BROKEN_DATA_KEY)}.size)
|
149
|
+
end
|
150
|
+
|
123
151
|
def test_write_with_invalid_recoreds
|
124
152
|
d = create_driver
|
125
153
|
t = emit_documents(d)
|
@@ -229,5 +257,6 @@ class MongoReplOutputTest < MongoOutputTest
|
|
229
257
|
assert_equal(build_seeds(3), d.instance.nodes)
|
230
258
|
assert_equal(45, d.instance.num_retries)
|
231
259
|
assert_equal({:capped => true, :size => 100}, d.instance.collection_options)
|
260
|
+
assert_equal({:ssl => false}, d.instance.connection_options)
|
232
261
|
end
|
233
262
|
end
|
metadata
CHANGED
@@ -1,95 +1,94 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-mongo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Masahiro Nakagawa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-03-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 0.10.9
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.10.9
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: mongo
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 1.8.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.8.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 0.9.2
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.9.2
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: simplecov
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 0.5.4
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 0.5.4
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rr
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: 1.0.0
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 1.0.0
|
83
|
-
description: MongoDB plugin for
|
83
|
+
description: MongoDB plugin for Fluentd
|
84
84
|
email: repeatedly@gmail.com
|
85
85
|
executables:
|
86
86
|
- mongo-tail
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
|
-
- .gitignore
|
91
|
-
- .
|
92
|
-
- .travis.yml
|
90
|
+
- ".gitignore"
|
91
|
+
- ".travis.yml"
|
93
92
|
- AUTHORS
|
94
93
|
- ChangeLog
|
95
94
|
- Gemfile
|
@@ -119,20 +118,20 @@ require_paths:
|
|
119
118
|
- lib
|
120
119
|
required_ruby_version: !ruby/object:Gem::Requirement
|
121
120
|
requirements:
|
122
|
-
- -
|
121
|
+
- - ">="
|
123
122
|
- !ruby/object:Gem::Version
|
124
123
|
version: '0'
|
125
124
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
126
125
|
requirements:
|
127
|
-
- -
|
126
|
+
- - ">="
|
128
127
|
- !ruby/object:Gem::Version
|
129
128
|
version: '0'
|
130
129
|
requirements: []
|
131
130
|
rubyforge_project:
|
132
|
-
rubygems_version: 2.0
|
131
|
+
rubygems_version: 2.2.0
|
133
132
|
signing_key:
|
134
133
|
specification_version: 4
|
135
|
-
summary: MongoDB plugin for
|
134
|
+
summary: MongoDB plugin for Fluentd
|
136
135
|
test_files:
|
137
136
|
- test/plugin/in_mongo_tail.rb
|
138
137
|
- test/plugin/out_mongo.rb
|
data/.gitmodules
DELETED