fluent-plugin-mongo 0.7.0 → 0.7.1

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
+ SHA1:
3
+ metadata.gz: 223d88d3a35d00c18254bda1ffe8320900a5e76a
4
+ data.tar.gz: 5581a2106b77d3797dd6f0e67310a7e21305aafa
5
+ SHA512:
6
+ metadata.gz: a0b6292750fb0bcad9079ee182591fa6b0ac35d009931b240b7d5403890f22955df8f7f45782b476f1160e10ebf2f92b5e19dc525b937e151eb200d7de8e1aaa
7
+ data.tar.gz: 8ff33a0383a02d5b6b34418b9738a1afbd527eaaab67b33e9bc334e73854d3859eaaa4386215bab455fa0638ce6def3a6822b92a516b7f68a596d2a9a34fef4e
data/ChangeLog CHANGED
@@ -1,4 +1,11 @@
1
- Release 0.7.0 - 2012/03/20
1
+ Release 0.7.1 - 2013/07/31
2
+
3
+ * Fix incomprehensible code indent
4
+ * Remove mongo_backup output
5
+ * Fix getting version from mongod for broken mongod support
6
+
7
+
8
+ Release 0.7.0 - 2013/03/20
2
9
 
3
10
  * Upgrade mongo gem least version to 1.8
4
11
  * Upgrade fluentd gem least version to 0.10.9
@@ -7,7 +14,7 @@ Release 0.7.0 - 2012/03/20
7
14
  * Change buffer_chunk_limit to 8MB when mongod version is 1.8 or later.
8
15
 
9
16
 
10
- Release 0.6.13 - 2012/01/15
17
+ Release 0.6.13 - 2013/01/15
11
18
 
12
19
  * Add exclude_broken_fields config to output plugins
13
20
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.7.1
@@ -1,146 +1,142 @@
1
1
  module Fluent
2
+ class MongoTailInput < Input
3
+ Plugin.register_input('mongo_tail', self)
4
+
5
+ require 'fluent/plugin/mongo_util'
6
+ include MongoUtil
7
+
8
+ config_param :database, :string
9
+ config_param :collection, :string
10
+ config_param :host, :string, :default => 'localhost'
11
+ config_param :port, :integer, :default => 27017
12
+ config_param :wait_time, :integer, :default => 1
13
+
14
+ config_param :tag, :string, :default => nil
15
+ config_param :tag_key, :string, :default => nil
16
+ config_param :time_key, :string, :default => nil
17
+ config_param :time_format, :string, :default => nil
18
+
19
+ # To store last ObjectID
20
+ config_param :id_store_file, :string, :default => nil
21
+
22
+ def initialize
23
+ super
24
+ require 'mongo'
25
+ require 'bson'
26
+ end
2
27
 
28
+ def configure(conf)
29
+ super
3
30
 
4
- class MongoTailInput < Input
5
- Plugin.register_input('mongo_tail', self)
6
-
7
- require 'fluent/plugin/mongo_util'
8
- include MongoUtil
9
-
10
- config_param :database, :string
11
- config_param :collection, :string
12
- config_param :host, :string, :default => 'localhost'
13
- config_param :port, :integer, :default => 27017
14
- config_param :wait_time, :integer, :default => 1
31
+ if !@tag and !@tag_key
32
+ raise ConfigError, "'tag' or 'tag_key' option is required on mongo_tail input"
33
+ end
15
34
 
16
- config_param :tag, :string, :default => nil
17
- config_param :tag_key, :string, :default => nil
18
- config_param :time_key, :string, :default => nil
19
- config_param :time_format, :string, :default => nil
35
+ @last_id = @id_store_file ? get_last_id : nil
20
36
 
21
- # To store last ObjectID
22
- config_param :id_store_file, :string, :default => nil
37
+ $log.debug "Setup mongo_tail configuration: mode = #{@id_store_file ? 'persistent' : 'non-persistent'}"
38
+ end
23
39
 
24
- def initialize
25
- super
26
- require 'mongo'
27
- require 'bson'
28
- end
40
+ def start
41
+ super
42
+ @file = get_id_store_file if @id_store_file
43
+ @client = get_capped_collection
44
+ @thread = Thread.new(&method(:run))
45
+ end
29
46
 
30
- def configure(conf)
31
- super
47
+ def shutdown
48
+ if @id_store_file
49
+ save_last_id
50
+ @file.close
51
+ end
32
52
 
33
- if !@tag and !@tag_key
34
- raise ConfigError, "'tag' or 'tag_key' option is required on mongo_tail input"
53
+ @thread.join
54
+ @client.db.connection.close
55
+ super
35
56
  end
36
57
 
37
- @last_id = @id_store_file ? get_last_id : nil
58
+ def run
59
+ loop {
60
+ tailoop(Mongo::Cursor.new(@client, cursor_conf))
61
+ }
62
+ end
38
63
 
39
- $log.debug "Setup mongo_tail configuration: mode = #{@id_store_file ? 'persistent' : 'non-persistent'}"
40
- end
64
+ private
65
+
66
+ def get_capped_collection
67
+ begin
68
+ db = authenticate(Mongo::Connection.new(@host, @port).db(@database))
69
+ raise ConfigError, "'#{@database}.#{@collection}' not found: node = #{@host}:#{@port}" unless db.collection_names.include?(@collection)
70
+ collection = db.collection(@collection)
71
+ raise ConfigError, "'#{@database}.#{@collection}' is not capped: node = #{@host}:#{@port}" unless collection.capped?
72
+ collection
73
+ rescue Mongo::ConnectionFailure => e
74
+ $log.fatal "Failed to connect to 'mongod'. Please restart 'fluentd' after 'mongod' started: #{e}"
75
+ exit!
76
+ rescue Mongo::OperationFailure => e
77
+ $log.fatal "Operation failed. Probably, 'mongod' needs an authentication: #{e}"
78
+ exit!
79
+ end
80
+ end
41
81
 
42
- def start
43
- super
44
- @file = get_id_store_file if @id_store_file
45
- @client = get_capped_collection
46
- @thread = Thread.new(&method(:run))
47
- end
82
+ def tailoop(cursor)
83
+ loop {
84
+ cursor = Mongo::Cursor.new(@client, cursor_conf) unless cursor.alive?
85
+ if doc = cursor.next_document
86
+ time = if @time_key
87
+ t = doc.delete(@time_key)
88
+ t.nil? ? Engine.now : t.to_i
89
+ else
90
+ Engine.now
91
+ end
92
+ tag = if @tag_key
93
+ t = doc.delete(@tag_key)
94
+ t.nil? ? 'mongo.missing_tag' : t
95
+ else
96
+ @tag
97
+ end
98
+ if id = doc.delete('_id')
99
+ @last_id = id.to_s
100
+ doc['_id_str'] = @last_id
101
+ save_last_id if @id_store_file
102
+ end
103
+
104
+ # Should use MultiEventStream?
105
+ Engine.emit(tag, time, doc)
106
+ else
107
+ sleep @wait_time
108
+ end
109
+ }
110
+ rescue
111
+ # ignore Mongo::OperationFailuer at CURSOR_NOT_FOUND
112
+ end
48
113
 
49
- def shutdown
50
- if @id_store_file
51
- save_last_id
52
- @file.close
114
+ def cursor_conf
115
+ conf = {}
116
+ conf[:tailable] = true
117
+ conf[:selector] = {'_id' => {'$gt' => BSON::ObjectId(@last_id)}} if @last_id
118
+ conf
53
119
  end
54
120
 
55
- @thread.join
56
- @client.db.connection.close
57
- super
58
- end
121
+ # following methods are used when id_store_file is true
59
122
 
60
- def run
61
- loop {
62
- tailoop(Mongo::Cursor.new(@client, cursor_conf))
63
- }
64
- end
65
-
66
- private
67
-
68
- def get_capped_collection
69
- begin
70
- db = authenticate(Mongo::Connection.new(@host, @port).db(@database))
71
- raise ConfigError, "'#{@database}.#{@collection}' not found: node = #{@host}:#{@port}" unless db.collection_names.include?(@collection)
72
- collection = db.collection(@collection)
73
- raise ConfigError, "'#{@database}.#{@collection}' is not capped: node = #{@host}:#{@port}" unless collection.capped?
74
- collection
75
- rescue Mongo::ConnectionFailure => e
76
- $log.fatal "Failed to connect to 'mongod'. Please restart 'fluentd' after 'mongod' started: #{e}"
77
- exit!
78
- rescue Mongo::OperationFailure => e
79
- $log.fatal "Operation failed. Probably, 'mongod' needs an authentication: #{e}"
80
- exit!
123
+ def get_id_store_file
124
+ file = File.open(@id_store_file, 'w')
125
+ file.sync
126
+ file
81
127
  end
82
- end
83
-
84
- def tailoop(cursor)
85
- loop {
86
- cursor = Mongo::Cursor.new(@client, cursor_conf) unless cursor.alive?
87
- if doc = cursor.next_document
88
- time = if @time_key
89
- t = doc.delete(@time_key)
90
- t.nil? ? Engine.now : t.to_i
91
- else
92
- Engine.now
93
- end
94
- tag = if @tag_key
95
- t = doc.delete(@tag_key)
96
- t.nil? ? 'mongo.missing_tag' : t
97
- else
98
- @tag
99
- end
100
- if id = doc.delete('_id')
101
- @last_id = id.to_s
102
- doc['_id_str'] = @last_id
103
- save_last_id if @id_store_file
104
- end
105
128
 
106
- # Should use MultiEventStream?
107
- Engine.emit(tag, time, doc)
129
+ def get_last_id
130
+ if File.exist?(@id_store_file)
131
+ BSON::ObjectId(File.read(@id_store_file)).to_s rescue nil
108
132
  else
109
- sleep @wait_time
133
+ nil
110
134
  end
111
- }
112
- rescue
113
- # ignore Mongo::OperationFailuer at CURSOR_NOT_FOUND
114
- end
115
-
116
- def cursor_conf
117
- conf = {}
118
- conf[:tailable] = true
119
- conf[:selector] = {'_id' => {'$gt' => BSON::ObjectId(@last_id)}} if @last_id
120
- conf
121
- end
122
-
123
- # following methods are used when id_store_file is true
124
-
125
- def get_id_store_file
126
- file = File.open(@id_store_file, 'w')
127
- file.sync
128
- file
129
- end
130
-
131
- def get_last_id
132
- if File.exist?(@id_store_file)
133
- BSON::ObjectId(File.read(@id_store_file)).to_s rescue nil
134
- else
135
- nil
136
135
  end
137
- end
138
136
 
139
- def save_last_id
140
- @file.pos = 0
141
- @file.write(@last_id)
137
+ def save_last_id
138
+ @file.pos = 0
139
+ @file.write(@last_id)
140
+ end
142
141
  end
143
142
  end
144
-
145
-
146
- end
@@ -1,231 +1,235 @@
1
1
  module Fluent
2
+ class MongoOutput < BufferedOutput
3
+ Plugin.register_output('mongo', self)
2
4
 
5
+ require 'fluent/plugin/mongo_util'
6
+ include MongoUtil
3
7
 
4
- class MongoOutput < BufferedOutput
5
- Fluent::Plugin.register_output('mongo', self)
8
+ include SetTagKeyMixin
9
+ config_set_default :include_tag_key, false
6
10
 
7
- require 'fluent/plugin/mongo_util'
8
- include MongoUtil
11
+ include SetTimeKeyMixin
12
+ config_set_default :include_time_key, true
9
13
 
10
- include SetTagKeyMixin
11
- config_set_default :include_tag_key, false
14
+ config_param :database, :string
15
+ config_param :collection, :string, :default => 'untagged'
16
+ config_param :host, :string, :default => 'localhost'
17
+ config_param :port, :integer, :default => 27017
18
+ config_param :ignore_invalid_record, :bool, :default => false
19
+ config_param :disable_collection_check, :bool, :default => nil
20
+ config_param :exclude_broken_fields, :string, :default => nil
21
+ config_param :write_concern, :integer, :default => nil
12
22
 
13
- include SetTimeKeyMixin
14
- config_set_default :include_time_key, true
23
+ # tag mapping mode
24
+ config_param :tag_mapped, :bool, :default => false
25
+ config_param :remove_tag_prefix, :string, :default => nil
15
26
 
16
- config_param :database, :string
17
- config_param :collection, :string, :default => 'untagged'
18
- config_param :host, :string, :default => 'localhost'
19
- config_param :port, :integer, :default => 27017
20
- config_param :ignore_invalid_record, :bool, :default => false
21
- config_param :disable_collection_check, :bool, :default => nil
22
- config_param :exclude_broken_fields, :string, :default => nil
23
- config_param :write_concern, :integer, :default => nil
27
+ attr_reader :collection_options, :connection_options
24
28
 
25
- # tag mapping mode
26
- config_param :tag_mapped, :bool, :default => false
27
- config_param :remove_tag_prefix, :string, :default => nil
29
+ def initialize
30
+ super
31
+ require 'mongo'
32
+ require 'msgpack'
28
33
 
29
- attr_reader :collection_options, :connection_options
30
-
31
- def initialize
32
- super
33
- require 'mongo'
34
- require 'msgpack'
34
+ @clients = {}
35
+ @connection_options = {}
36
+ @collection_options = {:capped => false}
37
+ end
35
38
 
36
- @clients = {}
37
- @connection_options = {}
38
- @collection_options = {:capped => false}
39
- end
39
+ def configure(conf)
40
+ super
40
41
 
41
- def configure(conf)
42
- super
42
+ if conf.has_key?('tag_mapped')
43
+ @tag_mapped = true
44
+ @disable_collection_check = true if @disable_collection_check.nil?
45
+ else
46
+ @disable_collection_check = false if @disable_collection_check.nil?
47
+ end
48
+ raise ConfigError, "normal mode requires collection parameter" if !@tag_mapped and !conf.has_key?('collection')
43
49
 
44
- if conf.has_key?('tag_mapped')
45
- @tag_mapped = true
46
- @disable_collection_check = true if @disable_collection_check.nil?
47
- else
48
- @disable_collection_check = false if @disable_collection_check.nil?
49
- end
50
- raise ConfigError, "normal mode requires collection parameter" if !@tag_mapped and !conf.has_key?('collection')
50
+ if remove_tag_prefix = conf['remove_tag_prefix']
51
+ @remove_tag_prefix = Regexp.new('^' + Regexp.escape(remove_tag_prefix))
52
+ end
51
53
 
52
- if remove_tag_prefix = conf['remove_tag_prefix']
53
- @remove_tag_prefix = Regexp.new('^' + Regexp.escape(remove_tag_prefix))
54
- end
54
+ @exclude_broken_fields = @exclude_broken_fields.split(',') if @exclude_broken_fields
55
55
 
56
- @exclude_broken_fields = @exclude_broken_fields.split(',') if @exclude_broken_fields
56
+ if conf.has_key?('capped')
57
+ raise ConfigError, "'capped_size' parameter is required on <store> of Mongo output" unless conf.has_key?('capped_size')
58
+ @collection_options[:capped] = true
59
+ @collection_options[:size] = Config.size_value(conf['capped_size'])
60
+ @collection_options[:max] = Config.size_value(conf['capped_max']) if conf.has_key?('capped_max')
61
+ end
57
62
 
58
- if conf.has_key?('capped')
59
- raise ConfigError, "'capped_size' parameter is required on <store> of Mongo output" unless conf.has_key?('capped_size')
60
- @collection_options[:capped] = true
61
- @collection_options[:size] = Config.size_value(conf['capped_size'])
62
- @collection_options[:max] = Config.size_value(conf['capped_max']) if conf.has_key?('capped_max')
63
- end
63
+ @connection_options[:w] = @write_concern unless @write_concern.nil?
64
64
 
65
- @connection_options[:w] = @write_concern unless @write_concern.nil?
65
+ # MongoDB uses BSON's Date for time.
66
+ def @timef.format_nocache(time)
67
+ time
68
+ end
66
69
 
67
- # MongoDB uses BSON's Date for time.
68
- def @timef.format_nocache(time)
69
- time
70
+ $log.debug "Setup mongo configuration: mode = #{@tag_mapped ? 'tag mapped' : 'normal'}"
70
71
  end
71
72
 
72
- $log.debug "Setup mongo configuration: mode = #{@tag_mapped ? 'tag mapped' : 'normal'}"
73
- end
74
-
75
- def start
76
- # Non tag mapped mode, we can check collection configuration before server start.
77
- get_or_create_collection(@collection) unless @tag_mapped
73
+ def start
74
+ # Non tag mapped mode, we can check collection configuration before server start.
75
+ get_or_create_collection(@collection) unless @tag_mapped
78
76
 
79
- # From configure for avoding complex method dependency...
80
- @buffer.buffer_chunk_limit = available_buffer_chunk_limit
77
+ # From configure for avoding complex method dependency...
78
+ @buffer.buffer_chunk_limit = available_buffer_chunk_limit
81
79
 
82
- super
83
- end
80
+ super
81
+ end
84
82
 
85
- def shutdown
86
- # Mongo::Connection checks alive or closed myself
87
- @clients.values.each { |client| client.db.connection.close }
88
- super
89
- end
83
+ def shutdown
84
+ # Mongo::Connection checks alive or closed myself
85
+ @clients.values.each { |client| client.db.connection.close }
86
+ super
87
+ end
90
88
 
91
- def format(tag, time, record)
92
- [time, record].to_msgpack
93
- end
89
+ def format(tag, time, record)
90
+ [time, record].to_msgpack
91
+ end
94
92
 
95
- def emit(tag, es, chain)
96
- # TODO: Should replacement using eval in configure?
97
- if @tag_mapped
98
- super(tag, es, chain, tag)
99
- else
100
- super(tag, es, chain)
93
+ def emit(tag, es, chain)
94
+ # TODO: Should replacement using eval in configure?
95
+ if @tag_mapped
96
+ super(tag, es, chain, tag)
97
+ else
98
+ super(tag, es, chain)
99
+ end
101
100
  end
102
- end
103
101
 
104
- def write(chunk)
105
- # TODO: See emit comment
106
- collection_name = @tag_mapped ? chunk.key : @collection
107
- operate(get_or_create_collection(collection_name), collect_records(chunk))
108
- end
102
+ def write(chunk)
103
+ # TODO: See emit comment
104
+ collection_name = @tag_mapped ? chunk.key : @collection
105
+ operate(get_or_create_collection(collection_name), collect_records(chunk))
106
+ end
109
107
 
110
- private
108
+ private
111
109
 
112
- INSERT_ARGUMENT = {:collect_on_error => true}
113
- BROKEN_DATA_KEY = '__broken_data'
110
+ INSERT_ARGUMENT = {:collect_on_error => true}
111
+ BROKEN_DATA_KEY = '__broken_data'
114
112
 
115
- def operate(collection, records)
116
- begin
117
- record_ids, error_records = collection.insert(records, INSERT_ARGUMENT)
118
- if !@ignore_invalid_record and error_records.size > 0
119
- operate_invalid_records(collection, error_records)
120
- end
121
- rescue Mongo::OperationFailure => e
122
- # Probably, all records of _records_ are broken...
123
- if e.error_code == 13066 # 13066 means "Message contains no documents"
124
- operate_invalid_records(collection, records) unless @ignore_invalid_record
125
- else
126
- raise e
113
+ def operate(collection, records)
114
+ begin
115
+ record_ids, error_records = collection.insert(records, INSERT_ARGUMENT)
116
+ if !@ignore_invalid_record and error_records.size > 0
117
+ operate_invalid_records(collection, error_records)
118
+ end
119
+ rescue Mongo::OperationFailure => e
120
+ # Probably, all records of _records_ are broken...
121
+ if e.error_code == 13066 # 13066 means "Message contains no documents"
122
+ operate_invalid_records(collection, records) unless @ignore_invalid_record
123
+ else
124
+ raise e
125
+ end
127
126
  end
127
+ records
128
128
  end
129
- records
130
- end
131
129
 
132
- def operate_invalid_records(collection, records)
133
- converted_records = records.map { |record|
134
- new_record = {}
135
- new_record[@tag_key] = record.delete(@tag_key) if @include_tag_key
136
- new_record[@time_key] = record.delete(@time_key)
137
- if @exclude_broken_fields
138
- @exclude_broken_fields.each { |key|
139
- new_record[key] = record.delete(key)
140
- }
141
- end
142
- new_record[BROKEN_DATA_KEY] = BSON::Binary.new(Marshal.dump(record))
143
- new_record
144
- }
145
- collection.insert(converted_records)
146
- end
130
+ def operate_invalid_records(collection, records)
131
+ converted_records = records.map { |record|
132
+ new_record = {}
133
+ new_record[@tag_key] = record.delete(@tag_key) if @include_tag_key
134
+ new_record[@time_key] = record.delete(@time_key)
135
+ if @exclude_broken_fields
136
+ @exclude_broken_fields.each { |key|
137
+ new_record[key] = record.delete(key)
138
+ }
139
+ end
140
+ new_record[BROKEN_DATA_KEY] = BSON::Binary.new(Marshal.dump(record))
141
+ new_record
142
+ }
143
+ collection.insert(converted_records)
144
+ end
147
145
 
148
- def collect_records(chunk)
149
- records = []
150
- chunk.msgpack_each { |time, record|
151
- record[@time_key] = Time.at(time || record[@time_key]) if @include_time_key
152
- records << record
153
- }
154
- records
155
- end
146
+ def collect_records(chunk)
147
+ records = []
148
+ chunk.msgpack_each { |time, record|
149
+ record[@time_key] = Time.at(time || record[@time_key]) if @include_time_key
150
+ records << record
151
+ }
152
+ records
153
+ end
156
154
 
157
- FORMAT_COLLECTION_NAME_RE = /(^\.+)|(\.+$)/
155
+ FORMAT_COLLECTION_NAME_RE = /(^\.+)|(\.+$)/
158
156
 
159
- def format_collection_name(collection_name)
160
- formatted = collection_name
161
- formatted = formatted.gsub(@remove_tag_prefix, '') if @remove_tag_prefix
162
- formatted = formatted.gsub(FORMAT_COLLECTION_NAME_RE, '')
163
- formatted = @collection if formatted.size == 0 # set default for nil tag
164
- formatted
165
- end
157
+ def format_collection_name(collection_name)
158
+ formatted = collection_name
159
+ formatted = formatted.gsub(@remove_tag_prefix, '') if @remove_tag_prefix
160
+ formatted = formatted.gsub(FORMAT_COLLECTION_NAME_RE, '')
161
+ formatted = @collection if formatted.size == 0 # set default for nil tag
162
+ formatted
163
+ end
166
164
 
167
- def get_or_create_collection(collection_name)
168
- collection_name = format_collection_name(collection_name)
169
- return @clients[collection_name] if @clients[collection_name]
170
-
171
- @db ||= get_connection
172
- if @db.collection_names.include?(collection_name)
173
- collection = @db.collection(collection_name)
174
- unless @disable_collection_check
175
- capped = collection.capped?
176
- unless @collection_options[:capped] == capped # TODO: Verify capped configuration
177
- new_mode = format_collection_mode(@collection_options[:capped])
178
- old_mode = format_collection_mode(capped)
179
- raise ConfigError, "New configuration is different from existing collection: new = #{new_mode}, old = #{old_mode}"
165
+ def get_or_create_collection(collection_name)
166
+ collection_name = format_collection_name(collection_name)
167
+ return @clients[collection_name] if @clients[collection_name]
168
+
169
+ @db ||= get_connection
170
+ if @db.collection_names.include?(collection_name)
171
+ collection = @db.collection(collection_name)
172
+ unless @disable_collection_check
173
+ capped = collection.capped?
174
+ unless @collection_options[:capped] == capped # TODO: Verify capped configuration
175
+ new_mode = format_collection_mode(@collection_options[:capped])
176
+ old_mode = format_collection_mode(capped)
177
+ raise ConfigError, "New configuration is different from existing collection: new = #{new_mode}, old = #{old_mode}"
178
+ end
180
179
  end
180
+ else
181
+ collection = @db.create_collection(collection_name, @collection_options)
181
182
  end
182
- else
183
- collection = @db.create_collection(collection_name, @collection_options)
183
+
184
+ @clients[collection_name] = collection
184
185
  end
185
186
 
186
- @clients[collection_name] = collection
187
- end
187
+ def format_collection_mode(mode)
188
+ mode ? 'capped' : 'normal'
189
+ end
188
190
 
189
- def format_collection_mode(mode)
190
- mode ? 'capped' : 'normal'
191
- end
191
+ def get_connection
192
+ db = Mongo::MongoClient.new(@host, @port, @connection_options).db(@database)
193
+ authenticate(db)
194
+ end
192
195
 
193
- def get_connection
194
- db = Mongo::MongoClient.new(@host, @port, @connection_options).db(@database)
195
- authenticate(db)
196
- end
196
+ # Following limits are heuristic. BSON is sometimes bigger than MessagePack and JSON.
197
+ LIMIT_BEFORE_v1_8 = 2 * 1024 * 1024 # 2MB = 4MB / 2
198
+ LIMIT_AFTER_v1_8 = 8 * 1024 * 1024 # 8MB = 16MB / 2
199
+
200
+ def available_buffer_chunk_limit
201
+ begin
202
+ limit = mongod_version >= "1.8.0" ? LIMIT_AFTER_v1_8 : LIMIT_BEFORE_v1_8
203
+ rescue Mongo::ConnectionFailure => e
204
+ $log.fatal "Failed to connect to 'mongod'. Please restart 'fluentd' after 'mongod' started: #{e}"
205
+ exit!
206
+ rescue Mongo::OperationFailure => e
207
+ $log.fatal "Operation failed. Probably, 'mongod' needs an authentication: #{e}"
208
+ exit!
209
+ rescue Exception => e
210
+ $log.warn "mongo unknown error #{e}, set #{LIMIT_BEFORE_v1_8} to chunk limit"
211
+ limit = LIMIT_BEFORE_v1_8
212
+ end
197
213
 
198
- # Following limits are heuristic. BSON is sometimes bigger than MessagePack and JSON.
199
- LIMIT_BEFORE_v1_8 = 2 * 1024 * 1024 # 2MB = 4MB / 2
200
- LIMIT_AFTER_v1_8 = 8 * 1024 * 1024 # 8MB = 16MB / 2
201
-
202
- def available_buffer_chunk_limit
203
- begin
204
- limit = mongod_version >= "1.8.0" ? LIMIT_AFTER_v1_8 : LIMIT_BEFORE_v1_8
205
- rescue Mongo::ConnectionFailure => e
206
- $log.fatal "Failed to connect to 'mongod'. Please restart 'fluentd' after 'mongod' started: #{e}"
207
- exit!
208
- rescue Mongo::OperationFailure => e
209
- $log.fatal "Operation failed. Probably, 'mongod' needs an authentication: #{e}"
210
- exit!
211
- rescue Exception => e
212
- $log.warn "mongo unknown error #{e}, set #{LIMIT_BEFORE_v1_8} to chunk limit"
213
- limit = LIMIT_BEFORE_v1_8
214
- end
215
-
216
- if @buffer.buffer_chunk_limit > limit
217
- $log.warn ":buffer_chunk_limit(#{@buffer.buffer_chunk_limit}) is large. Reset :buffer_chunk_limit with #{limit}"
218
- limit
219
- else
220
- @buffer.buffer_chunk_limit
214
+ if @buffer.buffer_chunk_limit > limit
215
+ $log.warn ":buffer_chunk_limit(#{@buffer.buffer_chunk_limit}) is large. Reset :buffer_chunk_limit with #{limit}"
216
+ limit
217
+ else
218
+ @buffer.buffer_chunk_limit
219
+ end
221
220
  end
222
- end
223
221
 
224
- def mongod_version
225
- db = get_connection
226
- db.command('buildInfo' => 1)['version']
227
- end
228
- end
222
+ def mongod_version
223
+ version = nil
229
224
 
225
+ begin
226
+ version = get_connection.command('buildInfo' => 1)['version']
227
+ rescue Mongo::OperationFailure
228
+ # fallback for buggy mongod version support
229
+ version = authenticate(Mongo::MongoClient.new(@host, @port, @connection_options).db('admin')).command('buildInfo' => 1)['version']
230
+ end
230
231
 
232
+ version
233
+ end
234
+ end
231
235
  end
@@ -1,73 +1,69 @@
1
1
  require 'fluent/plugin/out_mongo'
2
2
 
3
3
  module Fluent
4
-
5
-
6
- class MongoOutputReplset < MongoOutput
7
- Fluent::Plugin.register_output('mongo_replset', self)
8
-
9
- config_param :nodes, :string
10
- config_param :name, :string, :default => nil
11
- config_param :read, :string, :default => nil
12
- config_param :refresh_mode, :string, :default => nil
13
- config_param :refresh_interval, :integer, :default => nil
14
- config_param :num_retries, :integer, :default => 60
15
-
16
- # disable single node configuration
17
- config_param :host, :string, :default => nil
18
- config_param :port, :integer, :default => nil
19
-
20
- def configure(conf)
21
- super
22
-
23
- @nodes = parse_nodes(conf['nodes'])
24
- if name = conf['name']
25
- @connection_options[:name] = conf['name']
26
- end
27
- if read = conf['read']
28
- @connection_options[:read] = read.to_sym
29
- end
30
- if refresh_mode = conf['refresh_mode']
31
- @connection_options[:refresh_mode] = refresh_mode.to_sym
4
+ class MongoOutputReplset < MongoOutput
5
+ Plugin.register_output('mongo_replset', self)
6
+
7
+ config_param :nodes, :string
8
+ config_param :name, :string, :default => nil
9
+ config_param :read, :string, :default => nil
10
+ config_param :refresh_mode, :string, :default => nil
11
+ config_param :refresh_interval, :integer, :default => nil
12
+ config_param :num_retries, :integer, :default => 60
13
+
14
+ # disable single node configuration
15
+ config_param :host, :string, :default => nil
16
+ config_param :port, :integer, :default => nil
17
+
18
+ def configure(conf)
19
+ super
20
+
21
+ @nodes = parse_nodes(conf['nodes'])
22
+ if name = conf['name']
23
+ @connection_options[:name] = conf['name']
24
+ end
25
+ if read = conf['read']
26
+ @connection_options[:read] = read.to_sym
27
+ end
28
+ if refresh_mode = conf['refresh_mode']
29
+ @connection_options[:refresh_mode] = refresh_mode.to_sym
30
+ end
31
+ if refresh_interval = conf['refresh_interval']
32
+ @connection_options[:refresh_interval] = refresh_interval
33
+ end
34
+
35
+ $log.debug "Setup replica set configuration: nodes = #{conf['nodes']}"
32
36
  end
33
- if refresh_interval = conf['refresh_interval']
34
- @connection_options[:refresh_interval] = refresh_interval
35
- end
36
-
37
- $log.debug "Setup replica set configuration: nodes = #{conf['nodes']}"
38
- end
39
37
 
40
- private
38
+ private
41
39
 
42
- def operate(collection, records)
43
- rescue_connection_failure do
44
- super(collection, records)
40
+ def operate(collection, records)
41
+ rescue_connection_failure do
42
+ super(collection, records)
43
+ end
45
44
  end
46
- end
47
45
 
48
- def parse_nodes(nodes)
49
- nodes.split(',')
50
- end
51
-
52
- def get_connection
53
- db = Mongo::MongoReplicaSetClient.new(@nodes, @connection_options).db(@database)
54
- authenticate(db)
55
- end
46
+ def parse_nodes(nodes)
47
+ nodes.split(',')
48
+ end
56
49
 
57
- def rescue_connection_failure
58
- retries = 0
59
- begin
60
- yield
61
- rescue Mongo::ConnectionFailure => e
62
- retries += 1
63
- raise e if retries > @num_retries
50
+ def get_connection
51
+ db = Mongo::MongoReplicaSetClient.new(@nodes, @connection_options).db(@database)
52
+ authenticate(db)
53
+ end
64
54
 
65
- $log.warn "Failed to connect to Replica Set. Try to retry: retry number = #{retries}"
66
- sleep 0.5
67
- retry
55
+ def rescue_connection_failure
56
+ retries = 0
57
+ begin
58
+ yield
59
+ rescue Mongo::ConnectionFailure => e
60
+ retries += 1
61
+ raise e if retries > @num_retries
62
+
63
+ $log.warn "Failed to connect to Replica Set. Try to retry: retry number = #{retries}"
64
+ sleep 0.5
65
+ retry
66
+ end
68
67
  end
69
68
  end
70
69
  end
71
-
72
-
73
- end
@@ -1,24 +1,20 @@
1
1
  require 'fluent/plugin/out_mongo'
2
2
 
3
3
  module Fluent
4
+ class MongoOutputTagCollection < MongoOutput
5
+ Plugin.register_output('mongo_tag_collection', self)
4
6
 
7
+ config_param :collection, :string, :default => 'untagged'
5
8
 
6
- class MongoOutputTagCollection < MongoOutput
7
- Fluent::Plugin.register_output('mongo_tag_collection', self)
9
+ def configure(conf)
10
+ super
8
11
 
9
- config_param :collection, :string, :default => 'untagged'
12
+ @tag_mapped = true
13
+ if remove_prefix_collection = conf['remove_prefix_collection']
14
+ @remove_tag_prefix = Regexp.new('^' + Regexp.escape(remove_prefix_collection))
15
+ end
10
16
 
11
- def configure(conf)
12
- super
13
-
14
- @tag_mapped = true
15
- if remove_prefix_collection = conf['remove_prefix_collection']
16
- @remove_tag_prefix = Regexp.new('^' + Regexp.escape(remove_prefix_collection))
17
+ $log.warn "'mongo_tag_collection' deprecated. Please use 'mongo' type with 'tag_mapped' parameter"
17
18
  end
18
-
19
- $log.warn "'mongo_tag_collection' deprecated. Please use 'mongo' type with 'tag_mapped' parameter"
20
19
  end
21
20
  end
22
-
23
-
24
- end
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-mongo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
5
- prerelease:
4
+ version: 0.7.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Masahiro Nakagawa
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-03-19 00:00:00.000000000 Z
11
+ date: 2013-07-31 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: fluentd
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
@@ -22,7 +20,6 @@ dependencies:
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - ~>
28
25
  - !ruby/object:Gem::Version
@@ -30,7 +27,6 @@ dependencies:
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: mongo
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
31
  - - ~>
36
32
  - !ruby/object:Gem::Version
@@ -38,7 +34,6 @@ dependencies:
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
38
  - - ~>
44
39
  - !ruby/object:Gem::Version
@@ -46,49 +41,43 @@ dependencies:
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: rake
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: 0.9.2
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: 0.9.2
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: simplecov
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: 0.5.4
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
68
  version: 0.5.4
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: rr
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: 1.0.0
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: 1.0.0
94
83
  description: MongoDB plugin for Fluent event collector
@@ -112,7 +101,6 @@ files:
112
101
  - lib/fluent/plugin/in_mongo_tail.rb
113
102
  - lib/fluent/plugin/mongo_util.rb
114
103
  - lib/fluent/plugin/out_mongo.rb
115
- - lib/fluent/plugin/out_mongo_backup.rb
116
104
  - lib/fluent/plugin/out_mongo_replset.rb
117
105
  - lib/fluent/plugin/out_mongo_tag_collection.rb
118
106
  - test/plugin/in_mongo_tail.rb
@@ -124,33 +112,26 @@ files:
124
112
  - test/tools/rs_test_helper.rb
125
113
  homepage: https://github.com/fluent/fluent-plugin-mongo
126
114
  licenses: []
115
+ metadata: {}
127
116
  post_install_message:
128
117
  rdoc_options: []
129
118
  require_paths:
130
119
  - lib
131
120
  required_ruby_version: !ruby/object:Gem::Requirement
132
- none: false
133
121
  requirements:
134
- - - ! '>='
122
+ - - '>='
135
123
  - !ruby/object:Gem::Version
136
124
  version: '0'
137
- segments:
138
- - 0
139
- hash: -2812294622738366735
140
125
  required_rubygems_version: !ruby/object:Gem::Requirement
141
- none: false
142
126
  requirements:
143
- - - ! '>='
127
+ - - '>='
144
128
  - !ruby/object:Gem::Version
145
129
  version: '0'
146
- segments:
147
- - 0
148
- hash: -2812294622738366735
149
130
  requirements: []
150
131
  rubyforge_project:
151
- rubygems_version: 1.8.23
132
+ rubygems_version: 2.0.2
152
133
  signing_key:
153
- specification_version: 3
134
+ specification_version: 4
154
135
  summary: MongoDB plugin for Fluent event collector
155
136
  test_files:
156
137
  - test/plugin/in_mongo_tail.rb
@@ -1,28 +0,0 @@
1
- require 'fluent/plugin/out_copy'
2
- require 'fluent/plugin/out_mongo'
3
-
4
-
5
- module Fluent
6
-
7
-
8
- class MongoBackupOutput < CopyOutput
9
- Fluent::Plugin.register_output('mongo_backup', self)
10
-
11
- class MongoOutputForBackup < MongoOutput
12
- config_param :database, :string, :default => 'fluent'
13
- config_param :collection, :string, :default => 'out_mongo_backup'
14
-
15
- # TODO: optimize
16
- end
17
-
18
- def configure(conf)
19
- super
20
-
21
- backup = MongoOutputForBackup.new
22
- backup.configure(conf.merge({'capped' => true}))
23
- @outputs.unshift(backup)
24
- end
25
- end
26
-
27
-
28
- end