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 +4 -4
- data/.github/workflows/linux.yml +49 -0
- data/ChangeLog +5 -0
- data/README.rdoc +4 -0
- data/VERSION +1 -1
- data/fluent-plugin-mongo.gemspec +3 -2
- data/lib/fluent/plugin/out_mongo.rb +25 -4
- data/test/plugin/test_out_mongo.rb +91 -0
- metadata +31 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc300a11be780d8b3ea62e71db08393171fad3625d1d9259cb65a7abe11f9e5e
|
4
|
+
data.tar.gz: db12f19c83ae360e9720c41a2d64c3ce8bd65487d554ed2e416277d0f158b311
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
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.
|
1
|
+
1.6.0
|
data/fluent-plugin-mongo.gemspec
CHANGED
@@ -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", "
|
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.
|
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
|
-
@
|
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
|
-
@
|
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
|
-
@
|
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.
|
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:
|
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.
|
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.
|
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.
|
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.
|
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.
|
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: []
|