fluent-plugin-mongo 1.5.0 → 1.6.0

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: fc300a11be780d8b3ea62e71db08393171fad3625d1d9259cb65a7abe11f9e5e
4
+ data.tar.gz: db12f19c83ae360e9720c41a2d64c3ce8bd65487d554ed2e416277d0f158b311
5
5
  SHA512:
6
- metadata.gz: 046b7463bad7a1be9aae5f2a20991656392e32a4693de753aa0c5010f269d8708e0a2c085b5809408b17c5114aeff534e5cafe5b2527453a07f6707227bcbd15
7
- data.tar.gz: 42d7e9a95afeb58709422a13e0e90a911a6e32b8d972e26982496b5e90c106db83eb7d5b06d6c775a4f16a92569f10f2e82764a26d20c1c061408ad2bee89cb9
6
+ metadata.gz: c105cf4d712af0524a554b072f86a2af2cfc5485825db24f47dcd47cc850628cfeb08af8f7db4337aefc7342b2325e35698707db22aa0e595d786a6d72317320
7
+ data.tar.gz: '08454ce8638ee2bf64d1f6ae2d6adfd0632ed43ad47667558b9ee00dccb54a12d8fbac31c0b8032bd69598752a442bac02e7425e2ccd649754d7c48df1723b8b'
@@ -0,0 +1,49 @@
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: [ '3.1', '3.0', '2.7', '2.6' ]
15
+ mongodb-version: ['5.0', '4.4', '4.2', '4.0']
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@v2
36
+ - uses: ruby/setup-ruby@v1
37
+ with:
38
+ ruby-version: ${{ matrix.ruby }}
39
+ - name: Start MongoDB
40
+ uses: supercharge/mongodb-github-action@1.3.0
41
+ with:
42
+ mongodb-version: ${{ matrix.mongodb-version }}
43
+ - name: unit testing
44
+ env:
45
+ CI: true
46
+ run: |
47
+ gem install bundler rake
48
+ bundle install --jobs 4 --retry 3
49
+ bundle exec rake test
data/ChangeLog CHANGED
@@ -1,3 +1,8 @@
1
+ Release 1.6.0 - 2022/07/15
2
+
3
+ * Update mongo gem dependency
4
+ * out_mongo: Add object_id_keys parameter to convert string to Mongo ObjectId
5
+
1
6
  Release 1.5.0 - 2020/11/26
2
7
 
3
8
  * 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.0
@@ -17,10 +17,11 @@ 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_runtime_dependency "mongo", ">= 2.15.0", "< 2.19.0"
21
21
  gem.add_development_dependency "rake", ">= 0.9.2"
22
22
  gem.add_development_dependency "simplecov", ">= 0.5.4"
23
23
  gem.add_development_dependency "rr", ">= 1.0.0"
24
24
  gem.add_development_dependency "test-unit", ">= 3.0.0"
25
- gem.add_development_dependency "timecop", "~> 0.8.0"
25
+ gem.add_development_dependency "timecop", "~> 0.9.4"
26
+ gem.add_development_dependency "webrick", ">= 1.7.0"
26
27
  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
@@ -517,4 +517,95 @@ class MongoOutputTest < ::Test::Unit::TestCase
517
517
  assert_nil actual_documents.first['updated_at']['time']
518
518
  end
519
519
  end
520
+
521
+ sub_test_case 'object_id_keys' do
522
+ setup do
523
+ @my_id_str = "507f1f77bcf86cd799439011"
524
+ end
525
+
526
+ def emit_date_documents(d)
527
+ time = event_time("2011-01-02 13:14:15 UTC")
528
+ d.feed(time, {'a' => 1, my_id: @my_id_str})
529
+ time
530
+ end
531
+
532
+ def emit_invalid_date_documents(d)
533
+ time = event_time("2011-01-02 13:14:15 UTC")
534
+ d.feed(time, {'a' => 1, my_id: "Invalid ObjectId String"})
535
+ time
536
+ end
537
+
538
+ def emit_nested_date_documents(d)
539
+ time = event_time("2011-01-02 13:14:15 UTC")
540
+ d.feed(time, {'a' => 1, my_id: { 'id': @my_id_str}})
541
+ time
542
+ end
543
+
544
+ def emit_nested_invalid_date_documents(d)
545
+ time = event_time("2011-01-02 13:14:15 UTC")
546
+ d.feed(time, {'a' => 1, 'my_id': { 'id': "Invalid ObjectId String"}})
547
+ time
548
+ end
549
+
550
+ def test_write_with_object_id_keys
551
+ d = create_driver(default_config + %[
552
+ object_id_keys my_id
553
+ ])
554
+
555
+ d.run(default_tag: 'test') do
556
+ emit_date_documents(d)
557
+ end
558
+
559
+ actual_documents = get_documents
560
+ object_id_key = d.instance.object_id_keys.first
561
+ actual_documents.each_with_index { |doc, i|
562
+ assert_equal(i + 1, doc['a'])
563
+ assert doc[object_id_key].is_a?(BSON::ObjectId)
564
+ }
565
+ end
566
+
567
+ def test_write_with_parsed_object_id_key_invalid_string
568
+ d = create_driver(default_config + %[
569
+ object_id_keys my_id
570
+ ])
571
+
572
+ d.run(default_tag: 'test') do
573
+ emit_invalid_date_documents(d)
574
+ end
575
+ actual_documents = get_documents
576
+ assert_nil actual_documents.first['my_id']
577
+ end
578
+
579
+ def test_write_with_date_nested_keys
580
+ d = create_driver(default_config + %[
581
+ replace_dot_in_key_with _
582
+ replace_dollar_in_key_with _
583
+ object_id_keys $.my_id.id
584
+ ])
585
+
586
+ d.run(default_tag: 'test') do
587
+ emit_nested_date_documents(d)
588
+ end
589
+
590
+ actual_documents = get_documents
591
+ actual_documents.each_with_index { |doc, i|
592
+ assert_equal(i + 1, doc['a'])
593
+ assert doc['my_id']['id'].is_a?(BSON::ObjectId)
594
+ }
595
+ end
596
+
597
+ def test_write_with_parsed_date_nested_key_invalid_string
598
+ d = create_driver(default_config + %[
599
+ replace_dot_in_key_with _
600
+ replace_dollar_in_key_with _
601
+ object_id_keys $.my_id.id
602
+ ])
603
+
604
+ d.run(default_tag: 'test') do
605
+ emit_nested_invalid_date_documents(d)
606
+ end
607
+ actual_documents = get_documents
608
+ assert_nil actual_documents.first['my_id']['id']
609
+ end
610
+ end
520
611
  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.5.0
4
+ version: 1.6.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: 2020-11-26 00:00:00.000000000 Z
11
+ date: 2022-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
@@ -34,16 +34,22 @@ dependencies:
34
34
  name: mongo
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
- - - "~>"
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 2.15.0
40
+ - - "<"
38
41
  - !ruby/object:Gem::Version
39
- version: 2.6.0
42
+ version: 2.19.0
40
43
  type: :runtime
41
44
  prerelease: false
42
45
  version_requirements: !ruby/object:Gem::Requirement
43
46
  requirements:
44
- - - "~>"
47
+ - - ">="
45
48
  - !ruby/object:Gem::Version
46
- version: 2.6.0
49
+ version: 2.15.0
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: 2.19.0
47
53
  - !ruby/object:Gem::Dependency
48
54
  name: rake
49
55
  requirement: !ruby/object:Gem::Requirement
@@ -106,14 +112,28 @@ dependencies:
106
112
  requirements:
107
113
  - - "~>"
108
114
  - !ruby/object:Gem::Version
109
- version: 0.8.0
115
+ version: 0.9.4
110
116
  type: :development
111
117
  prerelease: false
112
118
  version_requirements: !ruby/object:Gem::Requirement
113
119
  requirements:
114
120
  - - "~>"
115
121
  - !ruby/object:Gem::Version
116
- version: 0.8.0
122
+ version: 0.9.4
123
+ - !ruby/object:Gem::Dependency
124
+ name: webrick
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ version: 1.7.0
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: 1.7.0
117
137
  description: MongoDB plugin for Fluentd
118
138
  email: repeatedly@gmail.com
119
139
  executables:
@@ -121,6 +141,7 @@ executables:
121
141
  extensions: []
122
142
  extra_rdoc_files: []
123
143
  files:
144
+ - ".github/workflows/linux.yml"
124
145
  - ".gitignore"
125
146
  - ".travis.yml"
126
147
  - AUTHORS
@@ -159,12 +180,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
159
180
  - !ruby/object:Gem::Version
160
181
  version: '0'
161
182
  requirements: []
162
- rubygems_version: 3.0.3
183
+ rubygems_version: 3.3.5
163
184
  signing_key:
164
185
  specification_version: 4
165
186
  summary: MongoDB plugin for Fluentd
166
- test_files:
167
- - test/helper.rb
168
- - test/plugin/test_in_mongo_tail.rb
169
- - test/plugin/test_out_mongo.rb
170
- - test/plugin/test_out_mongo_replset.rb
187
+ test_files: []