fluent-plugin-mongo 0.6.2 → 0.6.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.
data/README.rdoc CHANGED
@@ -1,33 +1,26 @@
1
- = MongoDB plugin for Fluent
1
+ = MongoDB plugin for Fluentd
2
2
 
3
- == Component
3
+ fluent-plugin-mongo provides input and output plugins for {Fluentd}[http://fluentd.org/].
4
4
 
5
- === MongoOutput
5
+ = Installation
6
6
 
7
- Store Fluentd event as a MongoDB Document to MongoDB database.
7
+ == Gems
8
8
 
9
- MongoOutput set "time" field to a document by default.
10
- You set _false_ to _include_time_key_ parameter if you disable this behaivor.
9
+ The gem is hosted at {Rubygems.org}[http://rubygems.org]. You can install the gem as follows:
11
10
 
12
- ==== tag mapped mode
11
+ $ fluent-gem install fluent-plugin-mongo
13
12
 
14
- Tag mapped to MongoDB collection automatically.
15
-
16
- === MongoReplSetOutput
17
-
18
- Replica Set version of MongoOutput
13
+ = Plugins
19
14
 
20
- === MongoBackupOutput
15
+ == Output plugin
21
16
 
22
- Store fluent-event to local capped collection for backup.
17
+ === mongo
23
18
 
24
- === MongoTailInput
19
+ Store Fluentd event to MongoDB database.
25
20
 
26
- Tail capped collection to input data.
27
-
28
- == Configuration
21
+ ==== Configuration
29
22
 
30
- === MongoOutput
23
+ Use _mongo_ type in match.
31
24
 
32
25
  <match mongo.**>
33
26
  type mongo
@@ -42,12 +35,20 @@ Tail capped collection to input data.
42
35
  capped
43
36
  capped_size 100m
44
37
 
38
+ # Set 'user' and 'password' for authentication
39
+ user handa
40
+ password shinobu
41
+
45
42
  # Other buffer configurations here
46
43
  </match>
47
44
 
48
- ==== Tag mapped mode
45
+ === mongo(tag mapped mode)
49
46
 
50
- Use _tag_mapped_ parameter.
47
+ Tag mapped to MongoDB collection automatically.
48
+
49
+ ==== Configuration
50
+
51
+ Use _tag_mapped_ parameter in match of _mongo_ type.
51
52
 
52
53
  If tag name is "foo.bar", auto create collection "foo.bar" and insert data.
53
54
 
@@ -68,48 +69,11 @@ If tag name is "foo.bar", auto create collection "foo.bar" and insert data.
68
69
  # Other configurations here
69
70
  </match>
70
71
 
71
- ==== NOTE
72
+ === mongo_replset
72
73
 
73
- ===== Broken data as a BSON
74
+ Replica Set version of mongo.
74
75
 
75
- Fluentd event sometimes has an invalid record as a BSON.
76
- In such case, Mongo plugin marshals an invalid record using Marshal.dump
77
- and re-inserts its to same collection.
78
-
79
- If passed following invalid record:
80
-
81
- {"key1": "invalid value", "key2": "valid value", "time": ISODate("2012-01-15T21:09:53Z") }
82
-
83
- then Mongo plugin converts this record to following format:
84
-
85
- {"__broken_data": Marshal.dump result of {"key1": "invalid value", "key2": "valid value"}, "time": ISODate("2012-01-15T21:09:53Z") }
86
-
87
- Mongo-Ruby-Driver cannot detect an invalid attribute,
88
- so Mongo plugin marshals all attributes excluding Fluentd keys("tag_key" and "time_key").
89
-
90
- If you want to ignore an invalid record, set _true_ to _ignore_invalid_record_ parameter in match.
91
-
92
- <match forward.*>
93
- ...
94
-
95
- # ignore invalid documents at write operation
96
- ignore_invalid_document true
97
-
98
- ...
99
- </match>
100
-
101
- ===== Buffer size limitation
102
-
103
- Mongo plugin has the limitation of buffer size.
104
- Because MongoDB and mongo-ruby-driver checks the total object size at each insertion.
105
- If total object size gets over the size limitation, then
106
- MongoDB returns error or mongo-ruby-driver raises an exception.
107
-
108
- So, Mongo plugin resets _buffer_chunk_limit_ if configurated value is larger than above limitation:
109
- - Before v1.8, max of _buffer_chunk_limit_ is 2MB
110
- - After v1.8, max of _buffer_chunk_limit_ is 10MB
111
-
112
- === MongoReplSetOutput
76
+ ==== Configuration
113
77
 
114
78
  Use _mongo_replset_ type in match.
115
79
 
@@ -133,7 +97,11 @@ Use _mongo_replset_ type in match.
133
97
  #refresh_interval 60
134
98
  </match>
135
99
 
136
- === MongoBackupOutput
100
+ === mongo_backup
101
+
102
+ Store Fluentd event to local capped collection for backup.
103
+
104
+ ==== Configuration
137
105
 
138
106
  Use _mongo_backup_ type in match. _mongo_backup_ alwalys use capped collection.
139
107
 
@@ -148,7 +116,13 @@ Use _mongo_backup_ type in match. _mongo_backup_ alwalys use capped collection.
148
116
  </store>
149
117
  </match>
150
118
 
151
- === Tail capped collection
119
+ == Input plugin
120
+
121
+ === mongo_tail
122
+
123
+ Tail capped collection to input data.
124
+
125
+ ==== Configuration
152
126
 
153
127
  Use _mongo_tail_ type in source.
154
128
 
@@ -166,21 +140,61 @@ Use _mongo_tail_ type in source.
166
140
  id_store_file /Users/repeatedly/devel/fluent-plugin-mongo/last_id
167
141
  </source>
168
142
 
169
- == TODO
143
+ = NOTE
170
144
 
171
- === More configuration
145
+ == Broken data as a BSON
172
146
 
173
- - Authentication
174
- - Select insert or update
175
- - etc
147
+ Fluentd event sometimes has an invalid record as a BSON.
148
+ In such case, Mongo plugin marshals an invalid record using Marshal.dump
149
+ and re-inserts its to same collection.
150
+
151
+ If passed following invalid record:
152
+
153
+ {"key1": "invalid value", "key2": "valid value", "time": ISODate("2012-01-15T21:09:53Z") }
154
+
155
+ then Mongo plugin converts this record to following format:
156
+
157
+ {"__broken_data": Marshal.dump result of {"key1": "invalid value", "key2": "valid value"}, "time": ISODate("2012-01-15T21:09:53Z") }
158
+
159
+ Mongo-Ruby-Driver cannot detect an invalid attribute,
160
+ so Mongo plugin marshals all attributes excluding Fluentd keys("tag_key" and "time_key").
161
+
162
+ If you want to ignore an invalid record, set _true_ to _ignore_invalid_record_ parameter in match.
176
163
 
177
- == Tool
164
+ <match forward.*>
165
+ ...
166
+
167
+ # ignore invalid documents at write operation
168
+ ignore_invalid_record true
169
+
170
+ ...
171
+ </match>
172
+
173
+ == Buffer size limitation
174
+
175
+ Mongo plugin has the limitation of buffer size.
176
+ Because MongoDB and mongo-ruby-driver checks the total object size at each insertion.
177
+ If total object size gets over the size limitation, then
178
+ MongoDB returns error or mongo-ruby-driver raises an exception.
179
+
180
+ So, Mongo plugin resets _buffer_chunk_limit_ if configurated value is larger than above limitation:
181
+ - Before v1.8, max of _buffer_chunk_limit_ is 2MB
182
+ - After v1.8, max of _buffer_chunk_limit_ is 10MB
183
+
184
+ = Tool
178
185
 
179
186
  You can tail mongo capped collection.
180
187
 
181
- mongo-tail -f
188
+ $ mongo-tail -f
189
+
190
+ = TODO
191
+
192
+ == More configuration
193
+
194
+ - Multi process
195
+ - etc
182
196
 
183
- == Copyright
197
+ = Copyright
184
198
 
185
199
  Copyright:: Copyright (c) 2011- Masahiro Nakagawa
186
200
  License:: Apache License, Version 2.0
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.2
1
+ 0.6.3
@@ -4,6 +4,9 @@ module Fluent
4
4
  class MongoTailInput < Input
5
5
  Plugin.register_input('mongo_tail', self)
6
6
 
7
+ require 'fluent/plugin/mongo_util'
8
+ include MongoUtil
9
+
7
10
  config_param :database, :string
8
11
  config_param :collection, :string
9
12
  config_param :host, :string, :default => 'localhost'
@@ -18,9 +21,9 @@ class MongoTailInput < Input
18
21
  config_param :id_store_file, :string, :default => nil
19
22
 
20
23
  def initialize
24
+ super
21
25
  require 'mongo'
22
26
  require 'bson'
23
- super
24
27
  end
25
28
 
26
29
  def configure(conf)
@@ -62,11 +65,19 @@ class MongoTailInput < Input
62
65
  private
63
66
 
64
67
  def get_capped_collection
65
- db = Mongo::Connection.new(@host, @port).db(@database)
66
- raise ConfigError, "'#{@database}.#{@collection}' not found: node = #{@host}:#{@port}" unless db.collection_names.include?(@collection)
67
- collection = db.collection(@collection)
68
- raise ConfigError, "'#{@database}.#{@collection}' is not capped: node = #{@host}:#{@port}" unless collection.capped?
69
- collection
68
+ begin
69
+ db = authenticate(Mongo::Connection.new(@host, @port).db(@database))
70
+ raise ConfigError, "'#{@database}.#{@collection}' not found: node = #{@host}:#{@port}" unless db.collection_names.include?(@collection)
71
+ collection = db.collection(@collection)
72
+ raise ConfigError, "'#{@database}.#{@collection}' is not capped: node = #{@host}:#{@port}" unless collection.capped?
73
+ collection
74
+ rescue Mongo::ConnectionFailure => e
75
+ $log.fatal "Failed to connect to 'mongod'. Please restart 'fluentd' after 'mongod' started: #{e}"
76
+ exit!
77
+ rescue Mongo::OperationFailure => e
78
+ $log.fatal "Operation failed. Probably, 'mongod' needs an authentication: #{e}"
79
+ exit!
80
+ end
70
81
  end
71
82
 
72
83
  def tailoop(cursor)
@@ -0,0 +1,27 @@
1
+ module Fluent
2
+
3
+
4
+ module MongoUtil
5
+ def self.included(klass)
6
+ klass.instance_eval {
7
+ config_param :user, :string, :default => nil
8
+ config_param :password, :string, :default => nil
9
+ }
10
+ end
11
+
12
+ def authenticate(db)
13
+ unless @user.nil? || @password.nil?
14
+ begin
15
+ db.authenticate(@user, @password)
16
+ rescue Mongo::AuthenticationError => e
17
+ $log.fatal e
18
+ exit!
19
+ end
20
+ end
21
+
22
+ db
23
+ end
24
+ end
25
+
26
+
27
+ end
@@ -4,6 +4,9 @@ module Fluent
4
4
  class MongoOutput < BufferedOutput
5
5
  Fluent::Plugin.register_output('mongo', self)
6
6
 
7
+ require 'fluent/plugin/mongo_util'
8
+ include MongoUtil
9
+
7
10
  include SetTagKeyMixin
8
11
  config_set_default :include_tag_key, false
9
12
 
@@ -26,8 +29,8 @@ class MongoOutput < BufferedOutput
26
29
  def initialize
27
30
  super
28
31
  require 'mongo'
29
- require 'fluent/plugin/mongo_ext'
30
32
  require 'msgpack'
33
+ require 'fluent/plugin/mongo_ext'
31
34
 
32
35
  @clients = {}
33
36
  @connection_options = {}
@@ -168,7 +171,8 @@ class MongoOutput < BufferedOutput
168
171
  end
169
172
 
170
173
  def get_connection
171
- Mongo::Connection.new(@host, @port, @connection_options).db(@database)
174
+ db = Mongo::Connection.new(@host, @port, @connection_options).db(@database)
175
+ authenticate(db)
172
176
  end
173
177
 
174
178
  # Following limits are heuristic. BSON is sometimes bigger than MessagePack and JSON.
@@ -179,9 +183,13 @@ class MongoOutput < BufferedOutput
179
183
  begin
180
184
  limit = mongod_version >= "1.8.0" ? LIMIT_AFTER_v1_8 : LIMIT_BEFORE_v1_8 # TODO: each version comparison
181
185
  rescue Mongo::ConnectionFailure => e
182
- $log.warn "mongo connection failed, set #{LIMIT_BEFORE_v1_8} to chunk limit"
183
- limit = LIMIT_BEFORE_v1_8
186
+ $log.fatal "Failed to connect to 'mongod'. Please restart 'fluentd' after 'mongod' started: #{e}"
187
+ exit!
188
+ rescue Mongo::OperationFailure => e
189
+ $log.fatal "Operation failed. Probably, 'mongod' needs an authentication: #{e}"
190
+ exit!
184
191
  rescue Exception => e
192
+ # TODO: should do exit?
185
193
  $log.warn "mongo unknown error #{e}, set #{LIMIT_BEFORE_v1_8} to chunk limit"
186
194
  limit = LIMIT_BEFORE_v1_8
187
195
  end
@@ -195,7 +203,8 @@ class MongoOutput < BufferedOutput
195
203
  end
196
204
 
197
205
  def mongod_version
198
- Mongo::Connection.new(@host, @port).db('admin').command('serverStatus' => 1)['version']
206
+ db = authenticate(Mongo::Connection.new(@host, @port).db('admin'))
207
+ db.command('serverStatus' => 1)['version']
199
208
  end
200
209
  end
201
210
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-mongo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.6.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-23 00:00:00.000000000Z
12
+ date: 2012-02-07 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd
16
- requirement: &2152067980 !ruby/object:Gem::Requirement
16
+ requirement: &2152356120 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 0.10.7
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2152067980
24
+ version_requirements: *2152356120
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: mongo
27
- requirement: &2152067040 !ruby/object:Gem::Requirement
27
+ requirement: &2152354440 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -35,10 +35,10 @@ dependencies:
35
35
  version: 1.5.2
36
36
  type: :runtime
37
37
  prerelease: false
38
- version_requirements: *2152067040
38
+ version_requirements: *2152354440
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: rake
41
- requirement: &2152065820 !ruby/object:Gem::Requirement
41
+ requirement: &2152352640 !ruby/object:Gem::Requirement
42
42
  none: false
43
43
  requirements:
44
44
  - - ! '>='
@@ -46,10 +46,10 @@ dependencies:
46
46
  version: 0.9.2
47
47
  type: :development
48
48
  prerelease: false
49
- version_requirements: *2152065820
49
+ version_requirements: *2152352640
50
50
  - !ruby/object:Gem::Dependency
51
51
  name: simplecov
52
- requirement: &2152064740 !ruby/object:Gem::Requirement
52
+ requirement: &2152351520 !ruby/object:Gem::Requirement
53
53
  none: false
54
54
  requirements:
55
55
  - - ! '>='
@@ -57,10 +57,10 @@ dependencies:
57
57
  version: 0.5.4
58
58
  type: :development
59
59
  prerelease: false
60
- version_requirements: *2152064740
60
+ version_requirements: *2152351520
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rr
63
- requirement: &2152042360 !ruby/object:Gem::Requirement
63
+ requirement: &2152350480 !ruby/object:Gem::Requirement
64
64
  none: false
65
65
  requirements:
66
66
  - - ! '>='
@@ -68,7 +68,7 @@ dependencies:
68
68
  version: 1.0.0
69
69
  type: :development
70
70
  prerelease: false
71
- version_requirements: *2152042360
71
+ version_requirements: *2152350480
72
72
  description: MongoDB plugin for Fluent event collector
73
73
  email: repeatedly@gmail.com
74
74
  executables:
@@ -88,6 +88,7 @@ files:
88
88
  - fluent-plugin-mongo.gemspec
89
89
  - lib/fluent/plugin/in_mongo_tail.rb
90
90
  - lib/fluent/plugin/mongo_ext.rb
91
+ - lib/fluent/plugin/mongo_util.rb
91
92
  - lib/fluent/plugin/out_mongo.rb
92
93
  - lib/fluent/plugin/out_mongo_backup.rb
93
94
  - lib/fluent/plugin/out_mongo_replset.rb
@@ -110,7 +111,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
110
111
  version: '0'
111
112
  segments:
112
113
  - 0
113
- hash: 2968858870877082029
114
+ hash: 688925002882805851
114
115
  required_rubygems_version: !ruby/object:Gem::Requirement
115
116
  none: false
116
117
  requirements:
@@ -119,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
120
  version: '0'
120
121
  segments:
121
122
  - 0
122
- hash: 2968858870877082029
123
+ hash: 688925002882805851
123
124
  requirements: []
124
125
  rubyforge_project:
125
126
  rubygems_version: 1.8.10