logstash-codec-fluent 3.2.0-java → 3.3.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: ee03e06bd2f0fc38268db7f16e6de3405328331f63e08007feb24a91bd4cef34
4
- data.tar.gz: 2413c637ab79150cc9dc6731f6cefd36969909487ac217d145d7f1298ba28250
3
+ metadata.gz: 03c1ce6a081dedf60755a7a37842e814dd3a1ffc3af4d433a00cdaba91f9bc69
4
+ data.tar.gz: bb1c16c6a60754f41fb7285a5b9fe422dbf4c1d85bfd2e5040793cffd810ec5c
5
5
  SHA512:
6
- metadata.gz: 9932e23fdfe7efd1896fa45be2b86c630a8150ad2d823f7b6ab980ce458045db9e019580dcf33b14565d3411efea0b5b1c88d0c5e8a7fbffc7bb622f8a85b70b
7
- data.tar.gz: 3ee22d094f5be07cb97310a94d9de06127377d757770d0899ae0ff11ad0f45969ac4fde29b1866e964691a24bd228c61a62b945114b0ae59819ee1ae9b17f47d
6
+ metadata.gz: a2bf6928d517ebeca49942829d246965f14d1efaf08628e5b1767e5059f33df17e64f56338db35a5033b163fd87820388fd7d958a98179f80f3676af67baad29
7
+ data.tar.gz: 820ae450a849d4aaa24eb5cd0814ed066bfc1f7abb98c24428f676c87beb10e745c7d5c9cb96d8549bb7c9a8749e02955e4f00bf88340127cd0680df90967401
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 3.3.0
2
+ - Handle EventTime msgpack extension to handle nanosecond precision time and add its parameter [#18](https://github.com/logstash-plugins/logstash-codec-fluent/pull/18)
3
+
1
4
  ## 3.2.0
2
5
  - Encode tags as fluent forward protocol tags. Ref: https://github.com/logstash-plugins/logstash-codec-fluent/pull/21
3
6
 
@@ -10,7 +10,9 @@ require "logstash/util"
10
10
  # [source,ruby]
11
11
  # input {
12
12
  # tcp {
13
- # codec => fluent
13
+ # codec => fluent {
14
+ # nanosecond_precision => true
15
+ # }
14
16
  # port => 4000
15
17
  # }
16
18
  # }
@@ -22,15 +24,23 @@ require "logstash/util"
22
24
  #
23
25
  # Notes:
24
26
  #
25
- # * the fluent uses a second-precision time for events, so you will never see
26
- # subsecond precision on events processed by this codec.
27
+ # * to handle EventTime msgpack extension, you must specify nanosecond_precision parameter as true.
27
28
  #
28
29
  class LogStash::Codecs::Fluent < LogStash::Codecs::Base
30
+ require "logstash/codecs/fluent/event_time"
31
+
29
32
  config_name "fluent"
30
33
 
34
+ config :nanosecond_precision, :validate => :boolean, :default => false
35
+
31
36
  def register
32
37
  require "msgpack"
33
- @decoder = MessagePack::Unpacker.new
38
+ @factory = MessagePack::Factory.new
39
+ if @nanosecond_precision
40
+ @factory.register_type(EventTime::TYPE, EventTime)
41
+ end
42
+ @packer = @factory.packer
43
+ @decoder = @factory.unpacker
34
44
  end
35
45
 
36
46
  def decode(data, &block)
@@ -43,14 +53,19 @@ class LogStash::Codecs::Fluent < LogStash::Codecs::Base
43
53
  # Ensure tag to "tag1.tag2.tag3" style string.
44
54
  # Fluentd cannot handle Array class value in forward protocol's tag.
45
55
  tag = forwardable_tag(event)
46
- epochtime = event.timestamp.to_i
56
+ epochtime = if @nanosecond_precision
57
+ EventTime.new(event.timestamp.to_i, event.timestamp.usec * 1000)
58
+ else
59
+ event.timestamp.to_i
60
+ end
47
61
 
48
62
  # use normalize to make sure returned Hash is pure Ruby for
49
63
  # MessagePack#pack which relies on pure Ruby object recognition
50
64
  data = LogStash::Util.normalize(event.to_hash)
51
65
  # timestamp is serialized as a iso8601 string
52
66
  # merge to avoid modifying data which could have side effects if multiple outputs
53
- @on_event.call(event, MessagePack.pack([tag, epochtime, data.merge(LogStash::Event::TIMESTAMP => event.timestamp.to_iso8601)]))
67
+ @packer.clear
68
+ @on_event.call(event, @packer.pack([tag, epochtime, data.merge(LogStash::Event::TIMESTAMP => event.timestamp.to_iso8601)]))
54
69
  end # def encode
55
70
 
56
71
  def forwardable_tag(event)
@@ -67,6 +82,15 @@ class LogStash::Codecs::Fluent < LogStash::Codecs::Base
67
82
 
68
83
  private
69
84
 
85
+ def decode_fluent_time(fluent_time)
86
+ case fluent_time
87
+ when Fixnum
88
+ fluent_time
89
+ when EventTime
90
+ Time.at(fluent_time.sec, fluent_time.nsec)
91
+ end
92
+ end
93
+
70
94
  def decode_event(data, &block)
71
95
  tag = data[0]
72
96
  entries = data[1]
@@ -80,9 +104,9 @@ class LogStash::Codecs::Fluent < LogStash::Codecs::Base
80
104
  raise(LogStash::Error, "PackedForward with compression is not supported")
81
105
  end
82
106
 
83
- entries_decoder = MessagePack::Unpacker.new
107
+ entries_decoder = @decoder
84
108
  entries_decoder.feed_each(entries) do |entry|
85
- epochtime = entry[0]
109
+ epochtime = decode_fluent_time(entry[0])
86
110
  map = entry[1]
87
111
  event = LogStash::Event.new(map.merge(
88
112
  LogStash::Event::TIMESTAMP => LogStash::Timestamp.at(epochtime),
@@ -93,7 +117,7 @@ class LogStash::Codecs::Fluent < LogStash::Codecs::Base
93
117
  when Array
94
118
  # Forward
95
119
  entries.each do |entry|
96
- epochtime = entry[0]
120
+ epochtime = decode_fluent_time(entry[0])
97
121
  map = entry[1]
98
122
  event = LogStash::Event.new(map.merge(
99
123
  LogStash::Event::TIMESTAMP => LogStash::Timestamp.at(epochtime),
@@ -101,9 +125,9 @@ class LogStash::Codecs::Fluent < LogStash::Codecs::Base
101
125
  ))
102
126
  yield event
103
127
  end
104
- when Fixnum
128
+ when Fixnum, EventTime
105
129
  # Message
106
- epochtime = entries
130
+ epochtime = decode_fluent_time(entries)
107
131
  map = data[2]
108
132
  event = LogStash::Event.new(map.merge(
109
133
  LogStash::Event::TIMESTAMP => LogStash::Timestamp.at(epochtime),
@@ -0,0 +1,28 @@
1
+ module LogStash; module Codecs; class Fluent;
2
+ class EventTime
3
+ attr_reader :sec, :nsec
4
+
5
+ TYPE = 0
6
+
7
+ def initialize(sec, nsec = 0)
8
+ @sec = sec
9
+ @nsec = nsec
10
+ end
11
+
12
+ def to_msgpack(io = nil)
13
+ @sec.to_msgpack(io)
14
+ end
15
+
16
+ def to_msgpack_ext
17
+ [@sec, @nsec].pack('NN')
18
+ end
19
+
20
+ def self.from_msgpack_ext(data)
21
+ new(*data.unpack('NN'))
22
+ end
23
+
24
+ def to_json(*args)
25
+ @sec
26
+ end
27
+ end
28
+ end; end; end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-codec-fluent'
4
- s.version = '3.2.0'
4
+ s.version = '3.3.0'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "Reads the `fluentd` `msgpack` schema"
7
7
  s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
@@ -2,8 +2,16 @@
2
2
  require_relative "../spec_helper"
3
3
  require "logstash/plugin"
4
4
  require "logstash/event"
5
+ require "msgpack"
5
6
 
6
7
  describe LogStash::Codecs::Fluent do
8
+ before do
9
+ @factory = MessagePack::Factory.new
10
+ @factory.register_type(LogStash::Codecs::Fluent::EventTime::TYPE,
11
+ LogStash::Codecs::Fluent::EventTime)
12
+ @packer = @factory.packer
13
+ @unpacker = @factory.unpacker
14
+ end
7
15
 
8
16
  let(:properties) { {:name => "foo" } }
9
17
  let(:event) { LogStash::Event.new(properties) }
@@ -17,9 +25,25 @@ describe LogStash::Codecs::Fluent do
17
25
 
18
26
  it "should encode as message pack format" do
19
27
  subject.on_event do |event, data|
20
- fields = MessagePack.unpack(data)
21
- expect(fields[0]).to eq("log")
22
- expect(fields[2]["name"]).to eq("foo")
28
+ @unpacker.feed_each(data) do |fields|
29
+ expect(fields[0]).to eq("log")
30
+ expect(fields[2]["name"]).to eq("foo")
31
+ end
32
+ end
33
+ subject.encode(event)
34
+ end
35
+
36
+ end
37
+
38
+ describe "event encoding with EventTime" do
39
+ subject { LogStash::Plugin.lookup("codec", "fluent").new({"nanosecond_precision" => true}) }
40
+
41
+ it "should encode as message pack format" do
42
+ subject.on_event do |event, data|
43
+ @unpacker.feed_each(data) do |fields|
44
+ expect(fields[0]).to eq("log")
45
+ expect(fields[2]["name"]).to eq("foo")
46
+ end
23
47
  end
24
48
  subject.encode(event)
25
49
  end
@@ -32,8 +56,27 @@ describe LogStash::Codecs::Fluent do
32
56
  let(:epochtime) { event.timestamp.to_i }
33
57
  let(:data) { LogStash::Util.normalize(event.to_hash) }
34
58
  let(:message) do
35
- MessagePack.pack([tag, epochtime, data.merge(LogStash::Event::TIMESTAMP => event.timestamp.to_iso8601)])
59
+ @packer.pack([tag, epochtime, data.merge(LogStash::Event::TIMESTAMP => event.timestamp.to_iso8601)])
60
+ end
61
+
62
+ it "should decode without errors" do
63
+ subject.decode(message) do |event|
64
+ expect(event.get("name")).to eq("foo")
65
+ end
66
+ end
67
+
68
+ end
69
+
70
+ describe "event decoding with EventTime" do
71
+
72
+ let(:tag) { "mytag" }
73
+ let(:epochtime) { LogStash::Codecs::Fluent::EventTime.new(event.timestamp.to_i,
74
+ event.timestamp.usec * 1000) }
75
+ let(:data) { LogStash::Util.normalize(event.to_hash) }
76
+ let(:message) do
77
+ @packer.pack([tag, epochtime, data.merge(LogStash::Event::TIMESTAMP => event.timestamp.to_iso8601)])
36
78
  end
79
+ subject { LogStash::Plugin.lookup("codec", "fluent").new({"nanosecond_precision" => true}) }
37
80
 
38
81
  it "should decode without errors" do
39
82
  subject.decode(message) do |event|
@@ -87,13 +130,13 @@ describe LogStash::Codecs::Fluent do
87
130
  let(:epochtime) { event.timestamp.to_i }
88
131
  let(:data) { LogStash::Util.normalize(event.to_hash) }
89
132
  let(:message) do
90
- MessagePack.pack([tag,
91
- [
92
- [epochtime, data.merge(LogStash::Event::TIMESTAMP => event.timestamp.to_iso8601)],
93
- [epochtime, data.merge(LogStash::Event::TIMESTAMP => event.timestamp.to_iso8601)],
94
- [epochtime, data.merge(LogStash::Event::TIMESTAMP => event.timestamp.to_iso8601)]
95
- ]
96
- ])
133
+ @packer.pack([tag,
134
+ [
135
+ [epochtime, data.merge(LogStash::Event::TIMESTAMP => event.timestamp.to_iso8601)],
136
+ [epochtime, data.merge(LogStash::Event::TIMESTAMP => event.timestamp.to_iso8601)],
137
+ [epochtime, data.merge(LogStash::Event::TIMESTAMP => event.timestamp.to_iso8601)]
138
+ ]
139
+ ])
97
140
  end
98
141
 
99
142
  it "should decode without errors" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-codec-fluent
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.0
4
+ version: 3.3.0
5
5
  platform: java
6
6
  authors:
7
7
  - Elastic
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-02-06 00:00:00.000000000 Z
11
+ date: 2019-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -74,6 +74,7 @@ files:
74
74
  - README.md
75
75
  - docs/index.asciidoc
76
76
  - lib/logstash/codecs/fluent.rb
77
+ - lib/logstash/codecs/fluent/event_time.rb
77
78
  - logstash-codec-fluent.gemspec
78
79
  - spec/codecs/fluent_spec.rb
79
80
  - spec/spec_helper.rb