logstash-codec-avro 3.3.1-java → 3.4.0-java

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: 772c2d05da7c85d818be97b57d65587730bc7204624199b670ba1f40de35b8a6
4
- data.tar.gz: 124b77e35ebc93783576228831ee427081bc9b052535abe8f20108cf962293f4
3
+ metadata.gz: 6efff24db98db6b6bf7bdbd677b0d95ed3a17baf454e7f7dfc1fa1e250643021
4
+ data.tar.gz: 2db283db2f02ae5c71b711f073dcf3bafcb3e58e9ee89b291c40af24b83f69a6
5
5
  SHA512:
6
- metadata.gz: 42b7e3f92cca071b122851cd18c79735c109570ba42cd4ce82ab87bd19bd887297006d9822d7fecbc5b54e1034ba33b33ab4f98b1c0f1cbb76df4e5f6e3ce36f
7
- data.tar.gz: 79771d37cc0b6dde478dff2a1f09f026ce644967aaeaf7a8e6ddaf77318d995f17301da3c681391dacd1f8bce9a5ae5e43d6ac5e14b006a93845cc87ae386300
6
+ metadata.gz: 2e7dfc41f0ca4172e24d69d37dd73c5467efb2ae872cfb23b95e08d43c2caf9db9de47b5489a9c3d08c3c97a31c6f128e1d8d82cfbf1b4ab09a2dc144f5f57da
7
+ data.tar.gz: 3d7752ac2c947d2456908ff14df389cad64ea30a13ea4d6e38fb84e4fdc41bef7cee8f7d88a8e3c7fb3e4270df62ea27f5b3778cf9d080109119c6002049be40
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 3.4.0
2
+ - Add `encoding` option to select the encoding of Avro payload, could be `binary` or `base64` [#39](https://github.com/logstash-plugins/logstash-codec-avro/pull/39)
3
+
1
4
  ## 3.3.1
2
5
  - Pin avro gem to 1.10.x, as 1.11+ requires ruby 2.6+ [#37](https://github.com/logstash-plugins/logstash-codec-avro/pull/37)
3
6
 
data/docs/index.asciidoc CHANGED
@@ -81,6 +81,7 @@ output {
81
81
  [cols="<,<,<",options="header",]
82
82
  |=======================================================================
83
83
  |Setting |Input type|Required
84
+ | <<plugins-{type}s-{plugin}-encoding>> | <<string,string>>, one of `["binary", "base64"]`|No
84
85
  | <<plugins-{type}s-{plugin}-ecs_compatibility>> | <<string,string>>|No
85
86
  | <<plugins-{type}s-{plugin}-schema_uri>> |<<string,string>>|Yes
86
87
  | <<plugins-{type}s-{plugin}-tag_on_failure>> |<<boolean,boolean>>|No
@@ -99,6 +100,17 @@ output {
99
100
 
100
101
  Controls this plugin's compatibility with the {ecs-ref}[Elastic Common Schema (ECS)].
101
102
 
103
+ [id="plugins-{type}s-{plugin}-encoding"]
104
+ ===== `encoding`
105
+
106
+ * Value can be any of: `binary`, `base64`
107
+ * Default value is `base64`
108
+
109
+ Set encoding for Avro's payload.
110
+ Use `base64` (default) to indicate that this codec sends or expects to receive base64-encoded bytes.
111
+
112
+ Set this option to `binary` to indicate that this codec sends or expects to receive binary Avro data.
113
+
102
114
 
103
115
  [id="plugins-{type}s-{plugin}-schema_uri"]
104
116
  ===== `schema_uri`
@@ -59,6 +59,14 @@ class LogStash::Codecs::Avro < LogStash::Codecs::Base
59
59
 
60
60
  include LogStash::PluginMixins::EventSupport::EventFactoryAdapter
61
61
 
62
+ BINARY_ENCODING = "binary".freeze
63
+ BASE64_ENCODING = "base64".freeze
64
+
65
+ # Set encoding for Avro's payload.
66
+ # Use `base64` (default) encoding to convert the raw binary bytes to a `base64` encoded string.
67
+ # Set this option to `binary` to use the plain binary bytes.
68
+ config :encoding, :validate => [BINARY_ENCODING, BASE64_ENCODING], :default => BASE64_ENCODING
69
+
62
70
  # schema path to fetch the schema from.
63
71
  # This can be a 'http' or 'file' scheme URI
64
72
  # example:
@@ -92,7 +100,11 @@ class LogStash::Codecs::Avro < LogStash::Codecs::Base
92
100
 
93
101
  public
94
102
  def decode(data)
95
- datum = StringIO.new(Base64.strict_decode64(data)) rescue StringIO.new(data)
103
+ if encoding == BASE64_ENCODING
104
+ datum = StringIO.new(Base64.strict_decode64(data)) rescue StringIO.new(data)
105
+ else
106
+ datum = StringIO.new(data)
107
+ end
96
108
  decoder = Avro::IO::BinaryDecoder.new(datum)
97
109
  datum_reader = Avro::IO::DatumReader.new(@schema)
98
110
  event = targeted_event_factory.new_event(datum_reader.read(decoder))
@@ -113,6 +125,10 @@ class LogStash::Codecs::Avro < LogStash::Codecs::Base
113
125
  buffer = StringIO.new
114
126
  encoder = Avro::IO::BinaryEncoder.new(buffer)
115
127
  dw.write(event.to_hash, encoder)
116
- @on_event.call(event, Base64.strict_encode64(buffer.string))
128
+ if encoding == BASE64_ENCODING
129
+ @on_event.call(event, Base64.strict_encode64(buffer.string))
130
+ else
131
+ @on_event.call(event, buffer.string)
132
+ end
117
133
  end
118
134
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-codec-avro'
4
- s.version = '3.3.1'
4
+ s.version = '3.4.0'
5
5
  s.platform = 'java'
6
6
  s.licenses = ['Apache-2.0']
7
7
  s.summary = "Reads serialized Avro records as Logstash events"
@@ -55,6 +55,35 @@ describe LogStash::Codecs::Avro, :ecs_compatibility_support, :aggregate_failures
55
55
  end
56
56
  end
57
57
 
58
+ context "with binary encoding" do
59
+ let (:avro_config) { super().merge('encoding' => 'binary') }
60
+
61
+ it "should return an LogStash::Event from raw and base64 encoded avro data" do
62
+ schema = Avro::Schema.parse(avro_config['schema_uri'])
63
+ dw = Avro::IO::DatumWriter.new(schema)
64
+ buffer = StringIO.new
65
+ encoder = Avro::IO::BinaryEncoder.new(buffer)
66
+ dw.write(test_event.to_hash, encoder)
67
+
68
+ subject.decode(buffer.string) do |event|
69
+ expect(event).to be_a_kind_of(LogStash::Event)
70
+ expect(event.get("foo")).to eq(test_event.get("foo"))
71
+ expect(event.get("bar")).to eq(test_event.get("bar"))
72
+ expect(event.get('[event][original]')).to eq(buffer.string) if ecs_compatibility != :disabled
73
+ end
74
+ end
75
+
76
+ it "should raise an error if base64 encoded data is provided" do
77
+ schema = Avro::Schema.parse(avro_config['schema_uri'])
78
+ dw = Avro::IO::DatumWriter.new(schema)
79
+ buffer = StringIO.new
80
+ encoder = Avro::IO::BinaryEncoder.new(buffer)
81
+ dw.write(test_event.to_hash, encoder)
82
+
83
+ expect {subject.decode(Base64.strict_encode64(buffer.string))}.to raise_error
84
+ end
85
+ end
86
+
58
87
  context "#decode with tag_on_failure" do
59
88
  let (:avro_config) {{ 'schema_uri' => '
60
89
  {"type": "record", "name": "Test",
@@ -111,6 +140,28 @@ describe LogStash::Codecs::Avro, :ecs_compatibility_support, :aggregate_failures
111
140
  insist {got_event}
112
141
  end
113
142
 
143
+ context "with binary encoding" do
144
+ let (:avro_config) { super().merge('encoding' => 'binary') }
145
+
146
+ it "should return avro data from a LogStash::Event not base64 encoded" do
147
+ got_event = false
148
+ subject.on_event do |event, data|
149
+ schema = Avro::Schema.parse(avro_config['schema_uri'])
150
+ datum = StringIO.new(data)
151
+ decoder = Avro::IO::BinaryDecoder.new(datum)
152
+ datum_reader = Avro::IO::DatumReader.new(schema)
153
+ record = datum_reader.read(decoder)
154
+
155
+ expect(event).to be_a_kind_of(LogStash::Event)
156
+ expect(event.get("foo")).to eq(test_event.get("foo"))
157
+ expect(event.get("bar")).to eq(test_event.get("bar"))
158
+ got_event = true
159
+ end
160
+ subject.encode(test_event)
161
+ expect(got_event).to be true
162
+ end
163
+ end
164
+
114
165
  context "binary data" do
115
166
 
116
167
  let (:avro_config) {{ 'schema_uri' => '{"namespace": "com.systems.test.data",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-codec-avro
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.1
4
+ version: 3.4.0
5
5
  platform: java
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-12-07 00:00:00.000000000 Z
11
+ date: 2022-04-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement