fluent-plugin-mongo 0.6.2 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
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