fluent-plugin-formatter-protobuf 0.1.0 → 0.1.1

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
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