fluent-plugin-mongo 1.2.1 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 892fbaf245b427435db3ebb4edaa6e4681d5fd07
4
- data.tar.gz: de0b7e9b1b054e02819f5242888361bb4ebbf8a5
2
+ SHA256:
3
+ metadata.gz: 6208365e5862e84db04e62061f822324bc6ce1f82ebb8b9b0c3cb6ed230d983e
4
+ data.tar.gz: 2c45c015dd0fc2cf98e3b309ec4d96865762ed6bf6e534d316f5c6b214c55fcb
5
5
  SHA512:
6
- metadata.gz: 9193319af1591a3b21b5ceeb1c98155434f41cb01ad5125fe6bb3dfaea30bd40d4fbea868421f38f85fccb30f8eea1480f912c84ddeea3f2415b3b2f6520e45a
7
- data.tar.gz: c486200f457c322e6c0350dfba0191776dac3909b85cf5e46547c705680ccae5c9b19be2857e7076c00f195e7d93528698bebd8aa7e76d81f1fa27d78ef536ca
6
+ metadata.gz: 046b7463bad7a1be9aae5f2a20991656392e32a4693de753aa0c5010f269d8708e0a2c085b5809408b17c5114aeff534e5cafe5b2527453a07f6707227bcbd15
7
+ data.tar.gz: 42d7e9a95afeb58709422a13e0e90a911a6e32b8d972e26982496b5e90c106db83eb7d5b06d6c775a4f16a92569f10f2e82764a26d20c1c061408ad2bee89cb9
@@ -1,9 +1,8 @@
1
1
  rvm:
2
- - 2.1
3
- - 2.2.4
4
- - 2.3.1
5
- - 2.4.3
6
- - 2.5.0
2
+ - 2.4.10
3
+ - 2.5
4
+ - 2.6
5
+ - 2.7
7
6
  - ruby-head
8
7
 
9
8
  gemfile:
@@ -12,11 +11,6 @@ gemfile:
12
11
  services:
13
12
  - mongodb
14
13
 
15
- before_install:
16
- - gem update --system
17
- before_script:
18
- - git submodule update -i
19
-
20
14
  script: bundle exec rake test
21
15
 
22
16
  matrix:
data/ChangeLog CHANGED
@@ -1,3 +1,24 @@
1
+ Release 1.5.0 - 2020/11/26
2
+
3
+ * out_mongo: Support nested fields in date_keys
4
+
5
+ Release 1.4.1 - 2020/08/21
6
+
7
+ * out_mongo: Add expire_after parameter
8
+
9
+ Release 1.4.0 - 2020/04/28
10
+
11
+ * out_mongo: Add date_keys parameter to support MongoDB Date object in record fields.
12
+
13
+ Release 1.3.0 - 2019/04/24
14
+
15
+ * out_mongo: Support auth_mech parameter to allow other authentication
16
+ * in_mongo_tail: Fix replicat set issue
17
+
18
+ Release 1.2.2 - 2019/04/01
19
+
20
+ * out_mongo: Don't handle database placholders when specifying connection_string parameter
21
+
1
22
  Release 1.2.1 - 2018/12/18
2
23
 
3
24
  * out_mongo_replset: Fix internal signature mismatch
@@ -53,6 +53,12 @@ Use _mongo_ type in match.
53
53
  capped
54
54
  capped_size 100m
55
55
 
56
+ # Specify date fields in record to use MongoDB's Date object (Optional) default: nil
57
+ # Supported data types are String/Integer/Float/Fuentd EventTime.
58
+ # For Integer type, milliseconds epoch and seconds epoch are supported.
59
+ # eg: updated_at: "2020-02-01T08:22:23.780Z" or updated_at: 1580546457010
60
+ date_keys updated_at
61
+
56
62
  # Other buffer configurations here
57
63
  </match>
58
64
 
@@ -223,7 +229,7 @@ BSON records which include '.' or start with '$' are invalid and they will be st
223
229
  ...
224
230
  # replace '.' in keys with '__dot__'
225
231
  replace_dot_in_key_with __dot__
226
-
232
+
227
233
  # replace '$' in keys with '__dollar__'
228
234
  # Note: This replaces '$' only on first character
229
235
  replace_dollar_in_key_with __dollar__
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.1
1
+ 1.5.0
@@ -10,14 +10,13 @@ Gem::Specification.new do |gem|
10
10
  gem.version = File.read("VERSION").strip
11
11
  gem.authors = ["Masahiro Nakagawa"]
12
12
  gem.email = "repeatedly@gmail.com"
13
- gem.has_rdoc = false
14
13
  #gem.platform = Gem::Platform::RUBY
15
14
  gem.files = `git ls-files`.split("\n")
16
15
  gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
16
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
17
  gem.require_paths = ['lib']
19
18
 
20
- gem.add_dependency "fluentd", [">= 0.14.12", "< 2"]
19
+ gem.add_dependency "fluentd", [">= 0.14.22", "< 2"]
21
20
  gem.add_runtime_dependency "mongo", "~> 2.6.0"
22
21
  gem.add_development_dependency "rake", ">= 0.9.2"
23
22
  gem.add_development_dependency "simplecov", ">= 0.5.4"
@@ -118,10 +118,10 @@ module Fluent::Plugin
118
118
  private
119
119
 
120
120
  def client
121
- @client_options[:database] = @database
121
+ @client_options[:database] = @database if @database
122
122
  @client_options[:user] = @user if @user
123
123
  @client_options[:password] = @password if @password
124
- Mongo::Client.new(["#{node_string}"], @client_options)
124
+ Mongo::Client.new(node_string, @client_options)
125
125
  end
126
126
 
127
127
  def get_collection
@@ -133,7 +133,7 @@ module Fluent::Plugin
133
133
  def node_string
134
134
  case
135
135
  when @database
136
- "#{@host}:#{@port}"
136
+ ["#{@host}:#{@port}"]
137
137
  when @url
138
138
  @url
139
139
  end
@@ -8,23 +8,25 @@ module Fluent
8
8
  config_param :password, :string, default: nil, secret: true
9
9
  desc "MongoDB authentication database"
10
10
  config_param :auth_source, :string, default: nil
11
+ desc "MongoDB authentication mechanism"
12
+ config_param :auth_mech, :string, default: nil
11
13
  }
12
14
  end
13
15
  end
14
16
 
15
17
  module MongoAuth
16
18
  def authenticate(client)
17
- unless @user.nil? || @password.nil?
18
- begin
19
- if @auth_source.nil?
20
- client = client.with(user: @user, password: @password)
21
- else
22
- client = client.with(user: @user, password: @password, auth_source: @auth_source)
23
- end
24
- rescue Mongo::Auth::Unauthorized => e
25
- log.fatal e
26
- exit!
19
+ begin
20
+ if [@user, @password, @auth_source].all?
21
+ client = client.with(user: @user, password: @password, auth_source: @auth_source)
22
+ elsif [@user, @password].all?
23
+ client = client.with(user: @user, password: @password)
24
+ elsif [@user, @auth_source, @auth_mech].all?
25
+ client = client.with(user: @user, auth_source: @auth_source, auth_mech: @auth_mech.to_sym)
27
26
  end
27
+ rescue Mongo::Auth::Unauthorized => e
28
+ log.fatal e
29
+ exit!
28
30
  end
29
31
  client
30
32
  end
@@ -8,7 +8,7 @@ module Fluent::Plugin
8
8
  class MongoOutput < Output
9
9
  Fluent::Plugin.register_output('mongo', self)
10
10
 
11
- helpers :event_emitter, :inject, :compat_parameters
11
+ helpers :event_emitter, :inject, :compat_parameters, :record_accessor
12
12
 
13
13
  include Fluent::MongoAuthParams
14
14
  include Fluent::MongoAuth
@@ -38,6 +38,13 @@ module Fluent::Plugin
38
38
  desc "Replace dollar with specified string"
39
39
  config_param :replace_dollar_in_key_with, :string, default: nil
40
40
 
41
+ # Additional date field to be used to Date object
42
+ desc "Specify keys to use MongoDB's Date. Supported value types are Integer/Float/EventTime/String"
43
+ config_param :date_keys, :array, default: nil
44
+ desc "Specify if the fields in date_keys are of type Integer or Float"
45
+ config_param :parse_string_number_date, :bool, default: false
46
+
47
+
41
48
  # tag mapping mode
42
49
  desc "Use tag_mapped mode"
43
50
  config_param :tag_mapped, :bool, default: false,
@@ -45,6 +52,9 @@ module Fluent::Plugin
45
52
  desc "Remove tag prefix"
46
53
  config_param :remove_tag_prefix, :string, default: nil,
47
54
  deprecated: "use @label instead for event routing."
55
+ # expire indexes
56
+ desc "Specify expire after seconds"
57
+ config_param :expire_after, :time, default: 0
48
58
 
49
59
  # SSL connection
50
60
  config_param :ssl, :bool, default: false
@@ -54,6 +64,7 @@ module Fluent::Plugin
54
64
  config_param :ssl_verify, :bool, default: false
55
65
  config_param :ssl_ca_cert, :string, default: nil
56
66
 
67
+
57
68
  config_section :buffer do
58
69
  config_set_default :@type, DEFAULT_BUFFER_TYPE
59
70
  config_set_default :chunk_keys, ['tag']
@@ -67,6 +78,7 @@ module Fluent::Plugin
67
78
  @nodes = nil
68
79
  @client_options = {}
69
80
  @collection_options = {capped: false}
81
+ @accessors = {}
70
82
  end
71
83
 
72
84
  # Following limits are heuristic. BSON is sometimes bigger than MessagePack and JSON.
@@ -108,12 +120,12 @@ module Fluent::Plugin
108
120
 
109
121
  super
110
122
 
111
- if @connection_string.nil? && @database.nil?
112
- raise Fluent::ConfigError, "connection_string or database parameter is required"
123
+ if @auth_mech && !Mongo::Auth::SOURCES.has_key?(@auth_mech.to_sym)
124
+ raise Fluent::ConfigError, Mongo::Auth::InvalidMechanism.new(@auth_mech.to_sym)
113
125
  end
114
126
 
115
- unless @ignore_invalid_record
116
- log.warn "Since v0.8, invalid record detection will be removed because mongo driver v2.x and API spec don't provide it. You may lose invalid records, so you should not send such records to mongo plugin"
127
+ if @connection_string.nil? && @database.nil?
128
+ raise Fluent::ConfigError, "connection_string or database parameter is required"
117
129
  end
118
130
 
119
131
  if conf.has_key?('tag_mapped')
@@ -149,6 +161,13 @@ module Fluent::Plugin
149
161
  configure_logger(@mongo_log_level)
150
162
 
151
163
  log.debug "Setup mongo configuration: mode = #{@tag_mapped ? 'tag mapped' : 'normal'}"
164
+
165
+ if @date_keys
166
+ @date_keys.each { |field_name|
167
+ @accessors[field_name.to_s] = record_accessor_create(field_name)
168
+ }
169
+ log.debug "Setup record accessor for every date key"
170
+ end
152
171
  end
153
172
 
154
173
  def start
@@ -172,8 +191,9 @@ module Fluent::Plugin
172
191
  end
173
192
 
174
193
  def write(chunk)
175
- collection_name = extract_placeholders(@collection, chunk.metadata)
176
- database_name = extract_placeholders(@database, chunk.metadata)
194
+ collection_name = extract_placeholders(@collection, chunk)
195
+ # In connection_string case, we shouldn't handle extract_placeholers for @database.
196
+ database_name = extract_placeholders(@database, chunk) unless @connection_string
177
197
  operate(database_name, format_collection_name(collection_name), collect_records(chunk))
178
198
  end
179
199
 
@@ -193,11 +213,58 @@ module Fluent::Plugin
193
213
  def collect_records(chunk)
194
214
  records = []
195
215
  time_key = @inject_config.time_key if @inject_config
216
+ date_keys = @date_keys
217
+
196
218
  tag = chunk.metadata.tag
197
219
  chunk.msgpack_each {|time, record|
198
220
  record = inject_values_to_record(tag, time, record)
199
221
  # MongoDB uses BSON's Date for time.
200
222
  record[time_key] = Time.at(time || record[time_key]) if time_key
223
+
224
+ if date_keys
225
+ @accessors.each_pair { |date_key, date_key_accessor|
226
+ begin
227
+ date_value = date_key_accessor.call(record)
228
+ case date_value
229
+ when Fluent::EventTime
230
+ value_to_set = date_value.to_time
231
+ when Integer
232
+ value_to_set = if date_value > 9999999999
233
+ # epoch with milliseconds: e.g. javascript
234
+ Time.at(date_value / 1000.0)
235
+ else
236
+ # epoch with seconds: e.g. ruby
237
+ Time.at(date_value)
238
+ end
239
+ when Float
240
+ value_to_set = Time.at(date_value)
241
+ else
242
+ if @parse_string_number_date
243
+ if date_value.to_i.to_s == date_value
244
+ date_value = date_value.to_i
245
+ value_to_set = if date_value > 9999999999
246
+ # epoch with milliseconds: e.g. javascript
247
+ date_value / 1000.0
248
+ else
249
+ # epoch with seconds: e.g. ruby
250
+ date_value
251
+ end
252
+ elsif date_value.to_f.to_s == date_value
253
+ date_value = date_value.to_f
254
+ end
255
+ value_to_set = date_value.is_a?(String) ? Time.parse(date_value) : Time.at(date_value)
256
+ else
257
+ value_to_set = Time.parse(date_value)
258
+ end
259
+ end
260
+
261
+ date_key_accessor.set(record, value_to_set)
262
+ rescue ArgumentError
263
+ log.warn "Failed to parse '#{date_key}' field. Expected date types are Integer/Float/String/EventTime: #{date_value}"
264
+ date_key_accessor.set(record, nil)
265
+ end
266
+ }
267
+ end
201
268
  records << record
202
269
  }
203
270
  records
@@ -235,6 +302,13 @@ module Fluent::Plugin
235
302
  unless collection_exists?(name)
236
303
  log.trace "Create collection #{name} with options #{options}"
237
304
  @client[name, options].create
305
+ if @expire_after > 0 && @inject_config
306
+ log.trace "Create expiring index with key: \"#{@inject_config.time_key}\" and seconds: \"#{@expire_after}\""
307
+ @client[name].indexes.create_one(
308
+ {"#{@inject_config.time_key}": 1},
309
+ expire_after: @expire_after
310
+ )
311
+ end
238
312
  end
239
313
  @collections[name] = true
240
314
  @client[name]
@@ -100,7 +100,7 @@ class MongoTailInputTest < Test::Unit::TestCase
100
100
  end
101
101
  events = d.events
102
102
  assert_equal "input.mongo", events[0][0]
103
- assert_equal event_time(@time.to_s), events[0][1]
103
+ assert events[0][1].is_a?(Fluent::EventTime)
104
104
  assert_equal "test", events[0][2]["message"]
105
105
  end
106
106
 
@@ -114,7 +114,7 @@ class MongoTailInputTest < Test::Unit::TestCase
114
114
  time_key time
115
115
  ])
116
116
  d.run(expect_records: 1, timeout: 5) do
117
- @client[collection_name].insert_one({message: "test", tag: "user.defined", time: Fluent::Engine.now})
117
+ @client[collection_name].insert_one({message: "test", tag: "user.defined", time: Time.at(Fluent::Engine.now)})
118
118
  end
119
119
  events = d.events
120
120
  assert_equal "user.defined", events[0][0]
@@ -138,7 +138,7 @@ class MongoTailInputTest < Test::Unit::TestCase
138
138
  events = d.events
139
139
  assert_equal 1, events.size
140
140
  assert_equal "input.mongo.last_id", events[0][0]
141
- assert_equal event_time(@time.to_s), events[0][1]
141
+ assert events[0][1].is_a?(Fluent::EventTime)
142
142
  assert_equal "can obtain", events[0][2]["message"]
143
143
  end
144
144
  end
@@ -92,6 +92,22 @@ class MongoOutputTest < ::Test::Unit::TestCase
92
92
  end
93
93
  end
94
94
 
95
+ def test_configure_auth_mechanism
96
+ Mongo::Auth::SOURCES.each do |key, value|
97
+ conf = default_config + %[
98
+ auth_mech #{key}
99
+ ]
100
+ d = create_driver(conf)
101
+ assert_equal(key.to_s, d.instance.auth_mech)
102
+ end
103
+ assert_raise Fluent::ConfigError do
104
+ conf = default_config + %[
105
+ auth_mech invalid
106
+ ]
107
+ d = create_driver(conf)
108
+ end
109
+ end
110
+
95
111
  def test_configure_with_ssl
96
112
  conf = default_config + %[
97
113
  ssl true
@@ -164,6 +180,10 @@ class MongoOutputTest < ::Test::Unit::TestCase
164
180
  @client[collection].find.to_a.map {|e| e.delete('_id'); e}
165
181
  end
166
182
 
183
+ def get_indexes(collection = collection_name)
184
+ @client[collection].indexes
185
+ end
186
+
167
187
  def emit_documents(d)
168
188
  time = event_time("2011-01-02 13:14:15 UTC")
169
189
  d.feed(time, {'a' => 1})
@@ -183,6 +203,52 @@ class MongoOutputTest < ::Test::Unit::TestCase
183
203
  assert_equal(expected, actual_documents)
184
204
  end
185
205
 
206
+ def test_write_with_connection_string
207
+ d = create_driver(%[
208
+ @type mongo
209
+ connection_string mongodb://localhost:#{port}/#{database_name}
210
+ collection #{collection_name}
211
+ capped
212
+ capped_size 100
213
+ ])
214
+ assert_equal("mongodb://localhost:#{port}/#{database_name}", d.instance.connection_string)
215
+ assert_nil d.instance.database
216
+
217
+ d.run(default_tag: 'test') do
218
+ emit_documents(d)
219
+ end
220
+ actual_documents = get_documents
221
+ time = event_time("2011-01-02 13:14:15 UTC")
222
+ expected = [{'a' => 1, d.instance.inject_config.time_key => Time.at(time).localtime},
223
+ {'a' => 2, d.instance.inject_config.time_key => Time.at(time).localtime}]
224
+ assert_equal(expected, actual_documents)
225
+ end
226
+
227
+ def test_write_with_expire_index
228
+ d = create_driver(%[
229
+ @type mongo
230
+ connection_string mongodb://localhost:#{port}/#{database_name}
231
+ collection #{collection_name}
232
+ capped
233
+ capped_size 100
234
+ expire_after 120
235
+ ])
236
+ assert_equal("mongodb://localhost:#{port}/#{database_name}", d.instance.connection_string)
237
+ assert_nil d.instance.database
238
+ d.run(default_tag: 'test') do
239
+ emit_documents(d)
240
+ end
241
+ actual_documents = get_documents
242
+ time = event_time("2011-01-02 13:14:15 UTC")
243
+ expected = [{'a' => 1, d.instance.inject_config.time_key => Time.at(time).localtime},
244
+ {'a' => 2, d.instance.inject_config.time_key => Time.at(time).localtime}]
245
+ assert_equal(expected, actual_documents)
246
+
247
+ indexes = get_indexes()
248
+ expire_after_hash = indexes.map {|e| e.select{|k, v| k == "expireAfterSeconds"} }.reject{|e| e.empty?}.first
249
+ assert_equal({"expireAfterSeconds"=>120.0}, expire_after_hash)
250
+ end
251
+
186
252
  class WriteWithCollectionPlaceholder < self
187
253
  def setup
188
254
  @tag = 'custom'
@@ -278,7 +344,7 @@ class MongoOutputTest < ::Test::Unit::TestCase
278
344
  "$foo$bar" => "baz"
279
345
  }
280
346
  ],
281
- })
347
+ })
282
348
  end
283
349
 
284
350
  documents = get_documents
@@ -351,4 +417,104 @@ class MongoOutputTest < ::Test::Unit::TestCase
351
417
  assert authenticate(@client)
352
418
  end
353
419
  end
420
+
421
+ sub_test_case 'date_keys' do
422
+ setup do
423
+ @updated_at_str = "2020-02-01T08:22:23.780Z"
424
+ @updated_at_t = Time.parse(@updated_at_str)
425
+ end
426
+
427
+ def emit_date_documents(d)
428
+ time = event_time("2011-01-02 13:14:15 UTC")
429
+ d.feed(time, {'a' => 1, updated_at: @updated_at_str})
430
+ d.feed(time, {'a' => 2, updated_at: @updated_at_t.to_f})
431
+ d.feed(time, {'a' => 3, updated_at: @updated_at_t.to_i})
432
+ time
433
+ end
434
+
435
+ def emit_invalid_date_documents(d)
436
+ time = event_time("2011-01-02 13:14:15 UTC")
437
+ d.feed(time, {'a' => 1, updated_at: "Invalid Date String"})
438
+ time
439
+ end
440
+
441
+ def emit_nested_date_documents(d)
442
+ time = event_time("2011-01-02 13:14:15 UTC")
443
+ d.feed(time, {'a' => 1, updated_at: { 'time': @updated_at_str}})
444
+ d.feed(time, {'a' => 2, updated_at: { 'time': @updated_at_t.to_f}})
445
+ d.feed(time, {'a' => 3, updated_at: { 'time': @updated_at_t.to_i}})
446
+ time
447
+ end
448
+
449
+ def emit_nested_invalid_date_documents(d)
450
+ time = event_time("2011-01-02 13:14:15 UTC")
451
+ d.feed(time, {'a' => 1, 'updated_at': { 'time': "Invalid Date String"}})
452
+ time
453
+ end
454
+
455
+ def test_write_with_date_keys
456
+ d = create_driver(default_config + %[
457
+ date_keys updated_at
458
+ time_key created_at
459
+ ])
460
+
461
+ d.run(default_tag: 'test') do
462
+ emit_date_documents(d)
463
+ end
464
+
465
+ actual_documents = get_documents
466
+ date_key = d.instance.date_keys.first
467
+ actual_documents.each_with_index { |doc, i|
468
+ assert_equal(i + 1, doc['a'])
469
+ assert doc[date_key].is_a?(Time)
470
+ }
471
+ end
472
+
473
+ def test_write_with_parsed_date_key_invalid_string
474
+ d = create_driver(default_config + %[
475
+ date_keys updated_at
476
+ time_key created_at
477
+ ])
478
+
479
+ d.run(default_tag: 'test') do
480
+ emit_invalid_date_documents(d)
481
+ end
482
+ actual_documents = get_documents
483
+ assert_nil actual_documents.first['updated_at']
484
+ end
485
+
486
+ def test_write_with_date_nested_keys
487
+ d = create_driver(default_config + %[
488
+ replace_dot_in_key_with _
489
+ replace_dollar_in_key_with _
490
+ date_keys $.updated_at.time
491
+ time_key created_at
492
+ ])
493
+
494
+ d.run(default_tag: 'test') do
495
+ emit_nested_date_documents(d)
496
+ end
497
+
498
+ actual_documents = get_documents
499
+ actual_documents.each_with_index { |doc, i|
500
+ assert_equal(i + 1, doc['a'])
501
+ assert doc['updated_at']['time'].is_a?(Time)
502
+ }
503
+ end
504
+
505
+ def test_write_with_parsed_date_nested_key_invalid_string
506
+ d = create_driver(default_config + %[
507
+ replace_dot_in_key_with _
508
+ replace_dollar_in_key_with _
509
+ date_keys $.updated_at.time
510
+ time_key created_at
511
+ ])
512
+
513
+ d.run(default_tag: 'test') do
514
+ emit_nested_invalid_date_documents(d)
515
+ end
516
+ actual_documents = get_documents
517
+ assert_nil actual_documents.first['updated_at']['time']
518
+ end
519
+ end
354
520
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-mongo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masahiro Nakagawa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-12-19 00:00:00.000000000 Z
11
+ date: 2020-11-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.14.12
19
+ version: 0.14.22
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '2'
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 0.14.12
29
+ version: 0.14.22
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2'
@@ -159,8 +159,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
159
159
  - !ruby/object:Gem::Version
160
160
  version: '0'
161
161
  requirements: []
162
- rubyforge_project:
163
- rubygems_version: 2.6.14.1
162
+ rubygems_version: 3.0.3
164
163
  signing_key:
165
164
  specification_version: 4
166
165
  summary: MongoDB plugin for Fluentd