fluent-plugin-formatter-protobuf 0.1.0 → 0.1.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: f49ca0a97713b1a0771cb9c73b38f49660b5fb4103a6d3f989140013fbd21bab
4
- data.tar.gz: d547aaeef78fb13b4d5747dcf26fa27f1912e33ee6b4f699db401f335525fa94
3
+ metadata.gz: ca1a8fea393af2eed56eac08ac8fe4f8122d0c1e5b5d36099580ff9e0c962c67
4
+ data.tar.gz: 9670c004adcabfe98e6ae98fe46a45ebe2a55e08df52d08e169fa149af2d032b
5
5
  SHA512:
6
- metadata.gz: c17daaf911ea6a58cdbd8bd39b25bdf500630a506ab29f384d1abcf01e178578bea74ecf4e9ebff6c0496bf67304324f49b00744d49911bd1db32177d7fbcaed
7
- data.tar.gz: bc2167f0f05d20594b453a7a40ba25c8e72ae085ed6c72a14714e2cdf617e9050f650b1c1aa1b82b5626f2c83666ef4015c19149deed227c4e0d39d79df910f2
6
+ metadata.gz: 8e8f996d0940c53666eae2cea2b7d9b47a6d57a15d6c2038c7d83accf592d89018e8c864731e5b574449cc7c5d2a9b4ea6f4153cbb9dbdd4de84cc3e5c8a57ec
7
+ data.tar.gz: 6b398f92c55ad9f8f6bc92b8da8947a887fa8bc3b3bd838c7973552e8aa12e353e04fcd76e13f9d314ace7429ced3c47b877b69f4d8b6270f7aefcfc0cb72758
data/README.md CHANGED
@@ -50,10 +50,13 @@ $ bundle
50
50
  2. Modify the `<format>` section to include `class_name`, which is your Protobuf message name, and `include_paths`, the path where the generated Ruby types are stored
51
51
  1. Given protobuf class `Your::Protobuf::Class::Name` class should be given as `Your.Protobuf.Class.Name` in `class_name`. The exact name can be found in the generated Ruby files
52
52
 
53
+ ## Note
54
+
55
+ This plugin only supports Protobuf v3.
53
56
 
54
57
  ## Example
55
58
 
56
- ```fluentd
59
+ ```aconf
57
60
  <source>
58
61
  @type tcp
59
62
  tag tcp.events
@@ -65,12 +68,14 @@ $ bundle
65
68
  </source>
66
69
 
67
70
  <match tcp.events>
68
- @type file
69
-
70
- path /opt/fluent-plugin-formatter-protobuf/out
71
+ @type kafka2
72
+
73
+ brokers "#{BROKER_ENDPOINTS}"
74
+ compression_codec lz4
71
75
 
72
- <buffer>
76
+ <buffer topic>
73
77
  @type memory
78
+ flush_interval 5s
74
79
  </buffer>
75
80
 
76
81
  <format>
@@ -83,13 +88,53 @@ $ bundle
83
88
 
84
89
  ## Configuration
85
90
 
86
- |parameter|type|description|default|
87
- |---|---|---|---|
88
- |include_paths|array (optional)| Generated Ruby Protobuf class files path |`[]`|
89
- |class_name|string (required)| Ruby Protobuf class name. Used to encode into Protobuf binary||
91
+ |parameter| type | description | default |
92
+ |---|--------------------|---------------------------------------------------------------|---------|
93
+ |include_paths| array (optional) | Generated Ruby Protobuf class files path | `[]` |
94
+ |class_name| string (required) | Ruby Protobuf class name. Used to encode into Protobuf binary ||
95
+ |decode_json| boolean (optional) | Serializes record from canonical proto3 JSON mapping (https://developers.google.com/protocol-buffers/docs/proto3#json) into binary | `false` |
96
+
97
+ ## Tips
98
+
99
+ #### 1. I have multiple `_pb.rb` files and they depend on one another. When I use this plugin, I'm getting a `LoadError`.
100
+
101
+ This happens because the plugin currently loads paths in `include_paths` sequentially. You can either sort the files in correct dependency order (which is cumbersome), or add to Ruby's `$LOAD_PATH`.
102
+
103
+ For example, you have 2 generated ruby files, `a_pb.rb` and `b_pb.rb`, and both `a_pb.rb` depends on `b_pb.rb`.
104
+
105
+ You can either order them in appropriate dependency order, such as
106
+
107
+ ```aconf
108
+ <format>
109
+ @type protobuf
110
+ class_name "SomePackage.A"
111
+ include_paths ["/some/path/b_pb.rb", "/some/path/a_pb.rb"]
112
+ </format>
113
+
114
+ ```
115
+
116
+ or you can put the generated files in a directory say `/some/path/`, and add to Ruby's `$LOAD_PATH` via the `RUBYLIB` environment variable.
117
+
118
+ e.g.
119
+
120
+ ```aconf
121
+ <format>
122
+ @type protobuf
123
+ class_name "SomePackage.A"
124
+ include_paths ["/some/path/a_pb.rb"]
125
+ </format>
126
+
127
+ ```
128
+
129
+ ```shell
130
+
131
+ export RUBYLIB="${RUBYLIB}:/some/path/"
132
+ fluentd \
133
+ --gemfile "/some/other/path/Gemfile" \
134
+ --config "/some/other/path/fluent.conf"
135
+
136
+ ```
90
137
 
91
- ## Copyright
138
+ ## License
92
139
 
93
- * Copyright(c) 2021 - Ray Tung
94
- * License
95
- * Apache License, Version 2.0
140
+ [Apache License, Version 2.0](./LICENSE)
@@ -9,6 +9,7 @@ Gem::Specification.new do |spec|
9
9
  spec.version = Fluent::Plugin::VERSION
10
10
  spec.authors = ['Ray Tung']
11
11
  spec.email = ['code@raytung.net']
12
+ spec.metadata['rubygems_mfa_required'] = 'true'
12
13
 
13
14
  spec.summary = 'Protobuf formatter for Fluentd'
14
15
  spec.description = 'This is a Fluentd formatter plugin designed to convert Protobuf JSON into Protobuf binary'
@@ -35,4 +36,5 @@ Gem::Specification.new do |spec|
35
36
  spec.add_development_dependency 'test-unit', '~> 3.3'
36
37
  spec.add_runtime_dependency 'fluentd', ['>= 1.0', '< 2']
37
38
  spec.add_runtime_dependency 'google-protobuf', ['~> 3.18']
39
+ spec.add_runtime_dependency 'oj', '~> 3.13'
38
40
  end
@@ -22,6 +22,7 @@ require 'google/protobuf'
22
22
 
23
23
  require 'fluent/env'
24
24
  require 'fluent/time'
25
+ require 'oj'
25
26
 
26
27
  module Fluent
27
28
  module Plugin
@@ -33,6 +34,9 @@ module Fluent
33
34
 
34
35
  config_param :class_name, :string, desc: 'Ruby Protobuf class name. Used to encode into Protobuf binary'
35
36
 
37
+ config_param :decode_json, :bool, default: false,
38
+ desc: 'Serializes record from canonical proto3 JSON mapping (https://developers.google.com/protocol-buffers/docs/proto3#json) into binary' # rubocop:disable Layout/LineLength
39
+
36
40
  def configure(conf)
37
41
  super(conf)
38
42
 
@@ -51,7 +55,7 @@ module Fluent
51
55
  end
52
56
 
53
57
  def format(_tag, _time, record)
54
- protobuf_msg = @protobuf_class.new(record)
58
+ protobuf_msg = @decode_json ? @protobuf_class.decode_json(Oj.dump(record)) : @protobuf_class.new(record)
55
59
  @protobuf_class.encode(protobuf_msg)
56
60
  end
57
61
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Fluent
4
4
  module Plugin
5
- VERSION = '0.1.0'
5
+ VERSION = '0.1.1'
6
6
  end
7
7
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  source 'https://rubygems.org'
4
4
 
5
- gem 'fluentd', '1.14.1'
6
- gem 'fluent-plugin-formatter-protobuf', '0.0.3'
5
+ gem 'fluentd', '1.14.2'
6
+ gem 'fluent-plugin-formatter-protobuf', '0.1.0'
@@ -3,23 +3,23 @@ GEM
3
3
  specs:
4
4
  concurrent-ruby (1.1.9)
5
5
  cool.io (1.7.1)
6
- fluent-plugin-formatter-protobuf (0.0.3)
6
+ fluent-plugin-formatter-protobuf (0.1.0)
7
7
  fluentd (>= 1.0, < 2)
8
8
  google-protobuf (~> 3.18)
9
- fluentd (1.14.1)
9
+ fluentd (1.14.2)
10
10
  bundler
11
11
  cool.io (>= 1.4.5, < 2.0.0)
12
12
  http_parser.rb (>= 0.5.1, < 0.8.0)
13
13
  msgpack (>= 1.3.1, < 2.0.0)
14
14
  serverengine (>= 2.2.2, < 3.0.0)
15
15
  sigdump (~> 0.2.2)
16
- strptime (>= 0.2.2, < 1.0.0)
16
+ strptime (>= 0.2.4, < 1.0.0)
17
17
  tzinfo (>= 1.0, < 3.0)
18
18
  tzinfo-data (~> 1.0)
19
19
  webrick (>= 1.4.2, < 1.8.0)
20
20
  yajl-ruby (~> 1.0)
21
- google-protobuf (3.18.1)
22
- google-protobuf (3.18.1-x86_64-linux)
21
+ google-protobuf (3.19.1)
22
+ google-protobuf (3.19.1-x86_64-linux)
23
23
  http_parser.rb (0.7.0)
24
24
  msgpack (1.4.2)
25
25
  serverengine (2.2.4)
@@ -28,7 +28,7 @@ GEM
28
28
  strptime (0.2.5)
29
29
  tzinfo (2.0.4)
30
30
  concurrent-ruby (~> 1.0)
31
- tzinfo-data (1.2021.3)
31
+ tzinfo-data (1.2021.5)
32
32
  tzinfo (>= 1.0.0)
33
33
  webrick (1.7.0)
34
34
  yajl-ruby (1.4.1)
@@ -38,8 +38,8 @@ PLATFORMS
38
38
  x86_64-linux
39
39
 
40
40
  DEPENDENCIES
41
- fluent-plugin-formatter-protobuf (= 0.0.3)
42
- fluentd (= 1.14.1)
41
+ fluent-plugin-formatter-protobuf (= 0.1.0)
42
+ fluentd (= 1.14.2)
43
43
 
44
44
  BUNDLED WITH
45
45
  2.2.29
@@ -19,7 +19,7 @@
19
19
 
20
20
  <format>
21
21
  @type protobuf
22
- message_name "Log"
22
+ class_name "Log"
23
23
  include_paths ["/opt/fluent-plugin-formatter-protobuf/log_pb.rb"]
24
24
  </format>
25
25
  </match>
@@ -45,15 +45,35 @@ class ProtobufFormatterTest < Test::Unit::TestCase
45
45
  end
46
46
  end
47
47
 
48
+ stub_ruby_hash = { people: [{ name: 'Masahiro', id: 1337,
49
+ email: 'repeatedly _at_ gmail.com',
50
+ last_updated: {
51
+ seconds: 1_638_489_505,
52
+ nanos: 318_000_000
53
+ } }] }
48
54
  sub_test_case 'format' do
49
55
  test 'encodes into Protobuf binary' do
50
56
  formatter = create_formatter({ class_name: 'tutorial.AddressBook',
51
57
  include_paths: VALID_INCLUDE_PATHS_ABSOLUTE })
52
58
 
53
59
  formatted = formatter.format('some-tag', 1234,
54
- { people: [{ name: 'Masahiro', id: 1337, email: 'repeatedly _at_ gmail.com' }] })
55
- golden_file = File.binread(File.expand_path(File.join(__dir__, '..', 'proto', 'addressbook.bin')))
56
- assert_equal(golden_file, formatted)
60
+ { people: [{ name: 'Masahiro', id: 1337, email: 'repeatedly _at_ gmail.com',
61
+ last_updated: { seconds: 1_638_489_505, nanos: 318_000_000 } }] })
62
+ address_book = Tutorial::AddressBook.new(stub_ruby_hash)
63
+ assert_equal(Tutorial::AddressBook.encode(address_book), formatted)
64
+ end
65
+
66
+ test 'encodes Protobuf JSON format into Protobuf binary if config_param decode_json is true' do
67
+ formatter = create_formatter({ class_name: 'tutorial.AddressBook',
68
+ decode_json: true,
69
+ include_paths: VALID_INCLUDE_PATHS_ABSOLUTE })
70
+
71
+ formatted = formatter.format('some-tag', 1234,
72
+ { people: [{ name: 'Masahiro', id: 1337, email: 'repeatedly _at_ gmail.com',
73
+ last_updated: '2021-12-02T23:58:25.318Z' }] })
74
+
75
+ address_book = Tutorial::AddressBook.new(stub_ruby_hash)
76
+ assert_equal(Tutorial::AddressBook.encode(address_book), formatted)
57
77
  end
58
78
  end
59
79
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-formatter-protobuf
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ray Tung
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-30 00:00:00.000000000 Z
11
+ date: 2021-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -114,6 +114,20 @@ dependencies:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
116
  version: '3.18'
117
+ - !ruby/object:Gem::Dependency
118
+ name: oj
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '3.13'
124
+ type: :runtime
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '3.13'
117
131
  description: This is a Fluentd formatter plugin designed to convert Protobuf JSON
118
132
  into Protobuf binary
119
133
  email:
@@ -148,14 +162,13 @@ files:
148
162
  - test/integration/run.sh
149
163
  - test/plugin/test_formatter_protobuf.rb
150
164
  - test/proto/README.md
151
- - test/proto/addressbook
152
- - test/proto/addressbook.bin
153
165
  - test/proto/addressbook.proto
154
166
  - test/proto/addressbook_pb.rb
155
167
  homepage: https://github.com/raytung/fluent-plugin-formatter-protobuf
156
168
  licenses:
157
169
  - Apache-2.0
158
170
  metadata:
171
+ rubygems_mfa_required: 'true'
159
172
  homepage_uri: https://github.com/raytung/fluent-plugin-formatter-protobuf
160
173
  source_code_uri: https://github.com/raytung/fluent-plugin-formatter-protobuf
161
174
  changelog_uri: https://github.com/raytung/fluent-plugin-formatter-protobuf/blob/main/CHANGELOG.md
@@ -190,7 +203,5 @@ test_files:
190
203
  - test/integration/run.sh
191
204
  - test/plugin/test_formatter_protobuf.rb
192
205
  - test/proto/README.md
193
- - test/proto/addressbook
194
- - test/proto/addressbook.bin
195
206
  - test/proto/addressbook.proto
196
207
  - test/proto/addressbook_pb.rb
@@ -1 +0,0 @@
1
- people: [{name:"Masahiro", id: 1337, email: "repeatedly _at_ gmail.com"}]
@@ -1,4 +0,0 @@
1
-
2
- (
3
- Masahiro�
4
- repeatedly _at_ gmail.com