fluent-plugin-mongo 1.5.0 → 1.6.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6208365e5862e84db04e62061f822324bc6ce1f82ebb8b9b0c3cb6ed230d983e
4
- data.tar.gz: 2c45c015dd0fc2cf98e3b309ec4d96865762ed6bf6e534d316f5c6b214c55fcb
3
+ metadata.gz: 0a7505d5d82e1fcf8aa0625efa3bd19f68d7ddd6a9ec8ef75050d5aba1b663a1
4
+ data.tar.gz: a0efb583886eb8e8880881d3727dd61e6e2d19c3d2a3d34e4e5d94f0d843b3c3
5
5
  SHA512:
6
- metadata.gz: 046b7463bad7a1be9aae5f2a20991656392e32a4693de753aa0c5010f269d8708e0a2c085b5809408b17c5114aeff534e5cafe5b2527453a07f6707227bcbd15
7
- data.tar.gz: 42d7e9a95afeb58709422a13e0e90a911a6e32b8d972e26982496b5e90c106db83eb7d5b06d6c775a4f16a92569f10f2e82764a26d20c1c061408ad2bee89cb9
6
+ metadata.gz: c26d8de1f5c46fbeec69a871fcd26ac83969b58b49990a458f8a25eff830a2b35197267a002d657d3ae751aced56d5637ed1fbc394635e2c59886b4ba2fbe82f
7
+ data.tar.gz: 4a33374071ca219f56bb3be9132c1e05d3c2bf1c4018d769fbf2cb7ea61b4eb8f0cabbb6e85baceea9dfcd44c80bc11e7fce75356abe7846fdb6b6a150d082b3
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: 'github-actions'
4
+ directory: '/'
5
+ schedule:
6
+ interval: 'weekly'
@@ -0,0 +1,48 @@
1
+ name: Test
2
+ on:
3
+ push:
4
+ branches: [master]
5
+ pull_request:
6
+ branches: [master]
7
+ jobs:
8
+ build:
9
+ runs-on: ${{ matrix.os }}
10
+ continue-on-error: ${{ matrix.experimental }}
11
+ strategy:
12
+ fail-fast: false
13
+ matrix:
14
+ ruby: [ '4.0', '3.4', '3.3', '3.2', '3.1', '3.0', '2.7' ]
15
+ mongodb-version: ['5.0', '4.4', '4.2']
16
+ os:
17
+ - ubuntu-latest
18
+ experimental: [false]
19
+ include:
20
+ - ruby: head
21
+ os: ubuntu-latest
22
+ experimental: true
23
+ mongodb-version: '4.0'
24
+ - ruby: head
25
+ os: ubuntu-latest
26
+ experimental: true
27
+ mongodb-version: '4.2'
28
+ - ruby: head
29
+ os: ubuntu-latest
30
+ experimental: true
31
+ mongodb-version: '4.4'
32
+
33
+ name: Ruby ${{ matrix.ruby }} and MongoDB ${{ matrix.mongodb-version }} on ${{ matrix.os }}
34
+ steps:
35
+ - uses: actions/checkout@v3
36
+ - uses: ruby/setup-ruby@v1
37
+ with:
38
+ ruby-version: ${{ matrix.ruby }}
39
+ - name: Start MongoDB
40
+ uses: supercharge/mongodb-github-action@1.8.0
41
+ with:
42
+ mongodb-version: ${{ matrix.mongodb-version }}
43
+ - name: unit testing
44
+ env:
45
+ CI: true
46
+ run: |
47
+ bundle install --jobs 4 --retry 3
48
+ bundle exec rake test
data/ChangeLog CHANGED
@@ -1,3 +1,14 @@
1
+ Release 1.6.1 - 2026/02/12
2
+
3
+ * out_mongo: Fix RangeError by converting large integers to BSON::Decimal128
4
+ * gem: add bigdecimal as dependency for Ruby 3.4
5
+ * Drop support for MongoDB 4.0.
6
+
7
+ Release 1.6.0 - 2022/07/15
8
+
9
+ * Update mongo gem dependency
10
+ * out_mongo: Add object_id_keys parameter to convert string to Mongo ObjectId
11
+
1
12
  Release 1.5.0 - 2020/11/26
2
13
 
3
14
  * out_mongo: Support nested fields in date_keys
data/README.rdoc CHANGED
@@ -59,6 +59,10 @@ Use _mongo_ type in match.
59
59
  # eg: updated_at: "2020-02-01T08:22:23.780Z" or updated_at: 1580546457010
60
60
  date_keys updated_at
61
61
 
62
+ # Specify id fields in record to use MongoDB's BSON ObjectID (Optional) default: nil
63
+ # eg: my_id: "507f1f77bcf86cd799439011"
64
+ object_id_keys my_id
65
+
62
66
  # Other buffer configurations here
63
67
  </match>
64
68
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.5.0
1
+ 1.6.1
@@ -17,10 +17,12 @@ Gem::Specification.new do |gem|
17
17
  gem.require_paths = ['lib']
18
18
 
19
19
  gem.add_dependency "fluentd", [">= 0.14.22", "< 2"]
20
- gem.add_runtime_dependency "mongo", "~> 2.6.0"
20
+ gem.add_dependency "bigdecimal", "~> 4.0"
21
+ gem.add_runtime_dependency "mongo", ">= 2.15.0", "< 2.19.0"
21
22
  gem.add_development_dependency "rake", ">= 0.9.2"
22
23
  gem.add_development_dependency "simplecov", ">= 0.5.4"
23
24
  gem.add_development_dependency "rr", ">= 1.0.0"
24
25
  gem.add_development_dependency "test-unit", ">= 3.0.0"
25
- gem.add_development_dependency "timecop", "~> 0.8.0"
26
+ gem.add_development_dependency "timecop", "~> 0.9.4"
27
+ gem.add_development_dependency "webrick", ">= 1.7.0"
26
28
  end
@@ -43,7 +43,8 @@ module Fluent::Plugin
43
43
  config_param :date_keys, :array, default: nil
44
44
  desc "Specify if the fields in date_keys are of type Integer or Float"
45
45
  config_param :parse_string_number_date, :bool, default: false
46
-
46
+ desc "Specify keys to use MongoDB's ObjectId"
47
+ config_param :object_id_keys, :array, default: nil
47
48
 
48
49
  # tag mapping mode
49
50
  desc "Use tag_mapped mode"
@@ -78,7 +79,8 @@ module Fluent::Plugin
78
79
  @nodes = nil
79
80
  @client_options = {}
80
81
  @collection_options = {capped: false}
81
- @accessors = {}
82
+ @date_accessors = {}
83
+ @object_id_accessors = {}
82
84
  end
83
85
 
84
86
  # Following limits are heuristic. BSON is sometimes bigger than MessagePack and JSON.
@@ -164,10 +166,16 @@ module Fluent::Plugin
164
166
 
165
167
  if @date_keys
166
168
  @date_keys.each { |field_name|
167
- @accessors[field_name.to_s] = record_accessor_create(field_name)
169
+ @date_accessors[field_name.to_s] = record_accessor_create(field_name)
168
170
  }
169
171
  log.debug "Setup record accessor for every date key"
170
172
  end
173
+ if @object_id_keys
174
+ @object_id_keys.each { |field_name|
175
+ @object_id_accessors[field_name.to_s] = record_accessor_create(field_name)
176
+ }
177
+ log.debug "Setup record accessor for every object_id key"
178
+ end
171
179
  end
172
180
 
173
181
  def start
@@ -214,6 +222,7 @@ module Fluent::Plugin
214
222
  records = []
215
223
  time_key = @inject_config.time_key if @inject_config
216
224
  date_keys = @date_keys
225
+ object_id_keys = @object_id_keys
217
226
 
218
227
  tag = chunk.metadata.tag
219
228
  chunk.msgpack_each {|time, record|
@@ -222,7 +231,7 @@ module Fluent::Plugin
222
231
  record[time_key] = Time.at(time || record[time_key]) if time_key
223
232
 
224
233
  if date_keys
225
- @accessors.each_pair { |date_key, date_key_accessor|
234
+ @date_accessors.each_pair { |date_key, date_key_accessor|
226
235
  begin
227
236
  date_value = date_key_accessor.call(record)
228
237
  case date_value
@@ -265,6 +274,18 @@ module Fluent::Plugin
265
274
  end
266
275
  }
267
276
  end
277
+ if object_id_keys
278
+ @object_id_accessors.each_pair { |object_id_key, object_id_key_accessor|
279
+ begin
280
+ object_id_value = object_id_key_accessor.call(record)
281
+ value_to_set = BSON::ObjectId(object_id_value)
282
+ object_id_key_accessor.set(record, value_to_set)
283
+ rescue BSON::ObjectId::Invalid
284
+ log.warn "Failed to parse '#{object_id_key}' field. Expected object_id types are String: #{object_id_value}"
285
+ object_id_key_accessor.set(record, nil)
286
+ end
287
+ }
288
+ end
268
289
  records << record
269
290
  }
270
291
  records
@@ -330,6 +351,9 @@ module Fluent::Plugin
330
351
  replace_key_of_hash(r, /^\$/, @replace_dollar_in_key_with)
331
352
  end
332
353
  end
354
+ records.map! do |r|
355
+ replace_value_of_hash(r)
356
+ end
333
357
 
334
358
  get_collection(database, collection, @collection_options).insert_many(records)
335
359
  rescue Mongo::Error::BulkWriteError => e
@@ -363,5 +387,23 @@ module Fluent::Plugin
363
387
  hash_or_array
364
388
  end
365
389
  end
390
+
391
+ INT64_MAX = (2 ** 63) - 1
392
+ def replace_value_of_hash(hash_or_array)
393
+ case hash_or_array
394
+ when Array
395
+ hash_or_array.map { |v| replace_value_of_hash(v) }
396
+ when Hash
397
+ hash_or_array.each_pair { |k, v| hash_or_array[k] = replace_value_of_hash(v) }
398
+ when Integer
399
+ if hash_or_array > INT64_MAX
400
+ BSON::Decimal128.new(hash_or_array.to_s)
401
+ else
402
+ hash_or_array
403
+ end
404
+ else
405
+ hash_or_array
406
+ end
407
+ end
366
408
  end
367
409
  end
@@ -249,6 +249,20 @@ class MongoOutputTest < ::Test::Unit::TestCase
249
249
  assert_equal({"expireAfterSeconds"=>120.0}, expire_after_hash)
250
250
  end
251
251
 
252
+ def test_overflow_integer_value
253
+ d = create_driver
254
+ d.run(default_tag: 'test') do
255
+ time = event_time("2011-01-02 13:14:15 UTC")
256
+ d.feed(time, {'overflow' => (2 ** 63)})
257
+ d.feed(time, {'nested' => {'overflow' => (2 ** 63)}})
258
+ d.feed(time, {'array' => [(2 ** 63)]})
259
+ end
260
+ documents = get_documents
261
+ assert_equal(BSON::Decimal128.new((2 ** 63).to_s), documents[0]['overflow'])
262
+ assert_equal(BSON::Decimal128.new((2 ** 63).to_s), documents[1]['nested']['overflow'])
263
+ assert_equal(BSON::Decimal128.new((2 ** 63).to_s), documents[2]['array'][0])
264
+ end
265
+
252
266
  class WriteWithCollectionPlaceholder < self
253
267
  def setup
254
268
  @tag = 'custom'
@@ -517,4 +531,95 @@ class MongoOutputTest < ::Test::Unit::TestCase
517
531
  assert_nil actual_documents.first['updated_at']['time']
518
532
  end
519
533
  end
534
+
535
+ sub_test_case 'object_id_keys' do
536
+ setup do
537
+ @my_id_str = "507f1f77bcf86cd799439011"
538
+ end
539
+
540
+ def emit_date_documents(d)
541
+ time = event_time("2011-01-02 13:14:15 UTC")
542
+ d.feed(time, {'a' => 1, my_id: @my_id_str})
543
+ time
544
+ end
545
+
546
+ def emit_invalid_date_documents(d)
547
+ time = event_time("2011-01-02 13:14:15 UTC")
548
+ d.feed(time, {'a' => 1, my_id: "Invalid ObjectId String"})
549
+ time
550
+ end
551
+
552
+ def emit_nested_date_documents(d)
553
+ time = event_time("2011-01-02 13:14:15 UTC")
554
+ d.feed(time, {'a' => 1, my_id: { 'id': @my_id_str}})
555
+ time
556
+ end
557
+
558
+ def emit_nested_invalid_date_documents(d)
559
+ time = event_time("2011-01-02 13:14:15 UTC")
560
+ d.feed(time, {'a' => 1, 'my_id': { 'id': "Invalid ObjectId String"}})
561
+ time
562
+ end
563
+
564
+ def test_write_with_object_id_keys
565
+ d = create_driver(default_config + %[
566
+ object_id_keys my_id
567
+ ])
568
+
569
+ d.run(default_tag: 'test') do
570
+ emit_date_documents(d)
571
+ end
572
+
573
+ actual_documents = get_documents
574
+ object_id_key = d.instance.object_id_keys.first
575
+ actual_documents.each_with_index { |doc, i|
576
+ assert_equal(i + 1, doc['a'])
577
+ assert doc[object_id_key].is_a?(BSON::ObjectId)
578
+ }
579
+ end
580
+
581
+ def test_write_with_parsed_object_id_key_invalid_string
582
+ d = create_driver(default_config + %[
583
+ object_id_keys my_id
584
+ ])
585
+
586
+ d.run(default_tag: 'test') do
587
+ emit_invalid_date_documents(d)
588
+ end
589
+ actual_documents = get_documents
590
+ assert_nil actual_documents.first['my_id']
591
+ end
592
+
593
+ def test_write_with_date_nested_keys
594
+ d = create_driver(default_config + %[
595
+ replace_dot_in_key_with _
596
+ replace_dollar_in_key_with _
597
+ object_id_keys $.my_id.id
598
+ ])
599
+
600
+ d.run(default_tag: 'test') do
601
+ emit_nested_date_documents(d)
602
+ end
603
+
604
+ actual_documents = get_documents
605
+ actual_documents.each_with_index { |doc, i|
606
+ assert_equal(i + 1, doc['a'])
607
+ assert doc['my_id']['id'].is_a?(BSON::ObjectId)
608
+ }
609
+ end
610
+
611
+ def test_write_with_parsed_date_nested_key_invalid_string
612
+ d = create_driver(default_config + %[
613
+ replace_dot_in_key_with _
614
+ replace_dollar_in_key_with _
615
+ object_id_keys $.my_id.id
616
+ ])
617
+
618
+ d.run(default_tag: 'test') do
619
+ emit_nested_invalid_date_documents(d)
620
+ end
621
+ actual_documents = get_documents
622
+ assert_nil actual_documents.first['my_id']['id']
623
+ end
624
+ end
520
625
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-mongo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masahiro Nakagawa
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2020-11-26 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: fluentd
@@ -31,19 +30,39 @@ dependencies:
31
30
  - !ruby/object:Gem::Version
32
31
  version: '2'
33
32
  - !ruby/object:Gem::Dependency
34
- name: mongo
33
+ name: bigdecimal
35
34
  requirement: !ruby/object:Gem::Requirement
36
35
  requirements:
37
36
  - - "~>"
38
37
  - !ruby/object:Gem::Version
39
- version: 2.6.0
38
+ version: '4.0'
40
39
  type: :runtime
41
40
  prerelease: false
42
41
  version_requirements: !ruby/object:Gem::Requirement
43
42
  requirements:
44
43
  - - "~>"
45
44
  - !ruby/object:Gem::Version
46
- version: 2.6.0
45
+ version: '4.0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: mongo
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 2.15.0
53
+ - - "<"
54
+ - !ruby/object:Gem::Version
55
+ version: 2.19.0
56
+ type: :runtime
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 2.15.0
63
+ - - "<"
64
+ - !ruby/object:Gem::Version
65
+ version: 2.19.0
47
66
  - !ruby/object:Gem::Dependency
48
67
  name: rake
49
68
  requirement: !ruby/object:Gem::Requirement
@@ -106,14 +125,28 @@ dependencies:
106
125
  requirements:
107
126
  - - "~>"
108
127
  - !ruby/object:Gem::Version
109
- version: 0.8.0
128
+ version: 0.9.4
110
129
  type: :development
111
130
  prerelease: false
112
131
  version_requirements: !ruby/object:Gem::Requirement
113
132
  requirements:
114
133
  - - "~>"
115
134
  - !ruby/object:Gem::Version
116
- version: 0.8.0
135
+ version: 0.9.4
136
+ - !ruby/object:Gem::Dependency
137
+ name: webrick
138
+ requirement: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: 1.7.0
143
+ type: :development
144
+ prerelease: false
145
+ version_requirements: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: 1.7.0
117
150
  description: MongoDB plugin for Fluentd
118
151
  email: repeatedly@gmail.com
119
152
  executables:
@@ -121,8 +154,9 @@ executables:
121
154
  extensions: []
122
155
  extra_rdoc_files: []
123
156
  files:
157
+ - ".github/dependabot.yml"
158
+ - ".github/workflows/linux.yml"
124
159
  - ".gitignore"
125
- - ".travis.yml"
126
160
  - AUTHORS
127
161
  - ChangeLog
128
162
  - Gemfile
@@ -144,7 +178,6 @@ homepage: https://github.com/fluent/fluent-plugin-mongo
144
178
  licenses:
145
179
  - Apache-2.0
146
180
  metadata: {}
147
- post_install_message:
148
181
  rdoc_options: []
149
182
  require_paths:
150
183
  - lib
@@ -159,8 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
159
192
  - !ruby/object:Gem::Version
160
193
  version: '0'
161
194
  requirements: []
162
- rubygems_version: 3.0.3
163
- signing_key:
195
+ rubygems_version: 4.0.3
164
196
  specification_version: 4
165
197
  summary: MongoDB plugin for Fluentd
166
198
  test_files:
data/.travis.yml DELETED
@@ -1,18 +0,0 @@
1
- rvm:
2
- - 2.4.10
3
- - 2.5
4
- - 2.6
5
- - 2.7
6
- - ruby-head
7
-
8
- gemfile:
9
- - Gemfile
10
-
11
- services:
12
- - mongodb
13
-
14
- script: bundle exec rake test
15
-
16
- matrix:
17
- allow_failures:
18
- - rvm: ruby-head