logstash-input-gelf 2.0.2 → 2.0.3
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/CHANGELOG.md +4 -1
- data/README.md +3 -0
- data/lib/logstash/inputs/gelf.rb +40 -10
- data/logstash-input-gelf.gemspec +1 -1
- data/spec/inputs/gelf_spec.rb +78 -0
- metadata +33 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 943a77f8602e7e8cfa73b87113150d15fdb5ba7b
|
4
|
+
data.tar.gz: 1698c9d2177fa3b5f1fdd2df9c2a06e0ca871633
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec422f290472e01dd2a5e2d1482f00d82d0d51d000686d6b1fb5d5ed44e47f3927484b1687e2477c6625eaffc00aecad5559da433eeb5fc0a36b8baa53e30a74
|
7
|
+
data.tar.gz: d36417132925a905b0b91012a92c65428a2d3443bb1252300982361585d9d35f73883b2939bfc3fc67a177b542faa3c27e347117e4d36c29c6ca5f0fa8b8fb2e
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
## 2.0.3
|
2
|
+
- Fix Timestamp coercion to preserve upto microsecond precision, https://github.com/logstash-plugins/logstash-input-gelf/pull/35
|
3
|
+
|
1
4
|
## 2.0.0
|
2
|
-
- Plugins were updated to follow the new shutdown semantic, this mainly allows Logstash to instruct input plugins to terminate gracefully,
|
5
|
+
- Plugins were updated to follow the new shutdown semantic, this mainly allows Logstash to instruct input plugins to terminate gracefully,
|
3
6
|
instead of using Thread.raise on the plugins' threads. Ref: https://github.com/elastic/logstash/pull/3895
|
4
7
|
- Dependency on logstash-core update to 2.0
|
5
8
|
|
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# Logstash Plugin
|
2
2
|
|
3
|
+
[](http://build-eu-00.elastic.co/view/LS%20Plugins/view/LS%20Inputs/job/logstash-plugin-input-gelf-unit/)
|
5
|
+
|
3
6
|
This is a plugin for [Logstash](https://github.com/elastic/logstash).
|
4
7
|
|
5
8
|
It is fully free and fully open source. The license is Apache 2.0, meaning you are pretty much free to use it however you want in whatever way.
|
data/lib/logstash/inputs/gelf.rb
CHANGED
@@ -11,7 +11,15 @@ require "socket"
|
|
11
11
|
# making it a good choice if you already use Graylog2 today.
|
12
12
|
#
|
13
13
|
# The main use case for this input is to leverage existing GELF
|
14
|
-
# logging libraries such as the GELF log4j appender.
|
14
|
+
# logging libraries such as the GELF log4j appender. A library used
|
15
|
+
# by this plugin has a bug which prevents it parsing uncompressed data.
|
16
|
+
# If you use the log4j appender you need to configure it like this to force
|
17
|
+
# gzip even for small messages:
|
18
|
+
#
|
19
|
+
# <Socket name="logstash" protocol="udp" host="logstash.example.com" port="5001">
|
20
|
+
# <GelfLayout compressionType="GZIP" compressionThreshold="1" />
|
21
|
+
# </Socket>
|
22
|
+
#
|
15
23
|
#
|
16
24
|
class LogStash::Inputs::Gelf < LogStash::Inputs::Base
|
17
25
|
config_name "gelf"
|
@@ -44,6 +52,8 @@ class LogStash::Inputs::Gelf < LogStash::Inputs::Base
|
|
44
52
|
config :strip_leading_underscore, :validate => :boolean, :default => true
|
45
53
|
|
46
54
|
RECONNECT_BACKOFF_SLEEP = 5
|
55
|
+
TIMESTAMP_GELF_FIELD = "timestamp".freeze
|
56
|
+
SOURCE_HOST_FIELD = "source_host".freeze
|
47
57
|
|
48
58
|
public
|
49
59
|
def initialize(params)
|
@@ -96,13 +106,7 @@ class LogStash::Inputs::Gelf < LogStash::Inputs::Base
|
|
96
106
|
# Gelfd parser outputs null if it received and cached a non-final chunk
|
97
107
|
next if data.nil?
|
98
108
|
|
99
|
-
event =
|
100
|
-
|
101
|
-
event["source_host"] = client[3]
|
102
|
-
if event["timestamp"].is_a?(Numeric)
|
103
|
-
event.timestamp = LogStash::Timestamp.at(event["timestamp"])
|
104
|
-
event.remove("timestamp")
|
105
|
-
end
|
109
|
+
event = self.class.new_event(data, client[3])
|
106
110
|
|
107
111
|
remap_gelf(event) if @remap
|
108
112
|
strip_leading_underscore(event) if @strip_leading_underscore
|
@@ -112,15 +116,41 @@ class LogStash::Inputs::Gelf < LogStash::Inputs::Base
|
|
112
116
|
end
|
113
117
|
end # def udp_listener
|
114
118
|
|
119
|
+
# generate a new LogStash::Event from json input and assign host to source_host event field.
|
120
|
+
# @param json_gelf [String] GELF json data
|
121
|
+
# @param host [String] source host of GELF data
|
122
|
+
# @return [LogStash::Event] new event with parsed json gelf, assigned source host and coerced timestamp
|
123
|
+
def self.new_event(json_gelf, host)
|
124
|
+
event = LogStash::Event.new(LogStash::Json.load(json_gelf))
|
125
|
+
|
126
|
+
event[SOURCE_HOST_FIELD] = host
|
127
|
+
|
128
|
+
if (gelf_timestamp = event[TIMESTAMP_GELF_FIELD]).is_a?(Numeric)
|
129
|
+
event.timestamp = self.coerce_timestamp(gelf_timestamp)
|
130
|
+
event.remove(TIMESTAMP_GELF_FIELD)
|
131
|
+
end
|
132
|
+
|
133
|
+
event
|
134
|
+
end
|
135
|
+
|
136
|
+
# transform a given timestamp value into a proper LogStash::Timestamp, preserving microsecond precision
|
137
|
+
# and work around a JRuby issue with Time.at loosing fractional part with BigDecimal.
|
138
|
+
# @param timestamp [Numeric] a Numeric (integer, float or bigdecimal) timestampo representation
|
139
|
+
# @return [LogStash::Timestamp] the proper LogStash::Timestamp representation
|
140
|
+
def self.coerce_timestamp(timestamp)
|
141
|
+
# bug in JRuby prevents correcly parsing a BigDecimal fractional part, see https://github.com/elastic/logstash/issues/4565
|
142
|
+
timestamp.is_a?(BigDecimal) ? LogStash::Timestamp.at(timestamp.to_i, timestamp.frac * 1000000) : LogStash::Timestamp.at(timestamp)
|
143
|
+
end
|
144
|
+
|
115
145
|
private
|
116
146
|
def remap_gelf(event)
|
117
|
-
if event["full_message"]
|
147
|
+
if event["full_message"] && !event["full_message"].empty?
|
118
148
|
event["message"] = event["full_message"].dup
|
119
149
|
event.remove("full_message")
|
120
150
|
if event["short_message"] == event["message"]
|
121
151
|
event.remove("short_message")
|
122
152
|
end
|
123
|
-
elsif event["short_message"]
|
153
|
+
elsif event["short_message"] && !event["short_message"].empty?
|
124
154
|
event["message"] = event["short_message"].dup
|
125
155
|
event.remove("short_message")
|
126
156
|
end
|
data/logstash-input-gelf.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-input-gelf'
|
4
|
-
s.version = '2.0.
|
4
|
+
s.version = '2.0.3'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "This input will read GELF messages as events over the network, making it a good choice if you already use Graylog2 today."
|
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/plugin install gemname. This gem is not a stand-alone program"
|
data/spec/inputs/gelf_spec.rb
CHANGED
@@ -66,6 +66,84 @@ describe LogStash::Inputs::Gelf do
|
|
66
66
|
|
67
67
|
events.each_with_index do |e, i|
|
68
68
|
insist { e["message"] } == messages[i]
|
69
|
+
insist { e["host"] } == Socket.gethostname
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context "timestamp coercion" do
|
74
|
+
# these test private methods, this is advisable for now until we roll out this coercion in the Timestamp class
|
75
|
+
# and remove this
|
76
|
+
|
77
|
+
context "integer numeric values" do
|
78
|
+
it "should coerce" do
|
79
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(946702800).to_iso8601).to eq("2000-01-01T05:00:00.000Z")
|
80
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(946702800).usec).to eq(0)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context "float numeric values" do
|
85
|
+
# using explicit and certainly useless to_f here just to leave no doubt about the numeric type involved
|
86
|
+
|
87
|
+
it "should coerce and preserve millisec precision in iso8601" do
|
88
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(946702800.1.to_f).to_iso8601).to eq("2000-01-01T05:00:00.100Z")
|
89
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(946702800.12.to_f).to_iso8601).to eq("2000-01-01T05:00:00.120Z")
|
90
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(946702800.123.to_f).to_iso8601).to eq("2000-01-01T05:00:00.123Z")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should coerce and preserve usec precision" do
|
94
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(946702800.1.to_f).usec).to eq(100000)
|
95
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(946702800.12.to_f).usec).to eq(120000)
|
96
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(946702800.123.to_f).usec).to eq(123000)
|
97
|
+
|
98
|
+
# since Java Timestamp in 2.3+ relies on JodaTime which supports only millisec precision
|
99
|
+
# the usec method will only be precise up to millisec.
|
100
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(946702800.1234.to_f).usec).to be_within(1000).of(123400)
|
101
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(946702800.12345.to_f).usec).to be_within(1000).of(123450)
|
102
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(946702800.123456.to_f).usec).to be_within(1000).of(123456)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context "BigDecimal numeric values" do
|
107
|
+
it "should coerce and preserve millisec precision in iso8601" do
|
108
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(BigDecimal.new("946702800.1")).to_iso8601).to eq("2000-01-01T05:00:00.100Z")
|
109
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(BigDecimal.new("946702800.12")).to_iso8601).to eq("2000-01-01T05:00:00.120Z")
|
110
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(BigDecimal.new("946702800.123")).to_iso8601).to eq("2000-01-01T05:00:00.123Z")
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should coerce and preserve usec precision" do
|
114
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(BigDecimal.new("946702800.1")).usec).to eq(100000)
|
115
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(BigDecimal.new("946702800.12")).usec).to eq(120000)
|
116
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(BigDecimal.new("946702800.123")).usec).to eq(123000)
|
117
|
+
|
118
|
+
# since Java Timestamp in 2.3+ relies on JodaTime which supports only millisec precision
|
119
|
+
# the usec method will only be precise up to millisec.
|
120
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(BigDecimal.new("946702800.1234")).usec).to be_within(1000).of(123400)
|
121
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(BigDecimal.new("946702800.12345")).usec).to be_within(1000).of(123450)
|
122
|
+
expect(LogStash::Inputs::Gelf.coerce_timestamp(BigDecimal.new("946702800.123456")).usec).to be_within(1000).of(123456)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
context "json timestamp coercion" do
|
128
|
+
# these test private methods, this is advisable for now until we roll out this coercion in the Timestamp class
|
129
|
+
# and remove this
|
130
|
+
|
131
|
+
it "should coerce integer numeric json timestamp input" do
|
132
|
+
event = LogStash::Inputs::Gelf.new_event("{\"timestamp\":946702800}", "dummy")
|
133
|
+
expect(event.timestamp.to_iso8601).to eq("2000-01-01T05:00:00.000Z")
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should coerce float numeric value and preserve milliseconds precision in iso8601" do
|
137
|
+
event = LogStash::Inputs::Gelf.new_event("{\"timestamp\":946702800.123}", "dummy")
|
138
|
+
expect(event.timestamp.to_iso8601).to eq("2000-01-01T05:00:00.123Z")
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should coerce float numeric value and preserve usec precision" do
|
142
|
+
# since Java Timestamp in 2.3+ relies on JodaTime which supports only millisec precision
|
143
|
+
# the usec method will only be precise up to millisec.
|
144
|
+
|
145
|
+
event = LogStash::Inputs::Gelf.new_event("{\"timestamp\":946702800.123456}", "dummy")
|
146
|
+
expect(event.timestamp.usec).to be_within(1000).of(123456)
|
69
147
|
end
|
70
148
|
end
|
71
149
|
end
|
metadata
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-input-gelf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
|
14
|
+
name: logstash-core
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
15
16
|
requirements:
|
16
17
|
- - '>='
|
17
18
|
- !ruby/object:Gem::Version
|
@@ -19,10 +20,7 @@ dependencies:
|
|
19
20
|
- - <
|
20
21
|
- !ruby/object:Gem::Version
|
21
22
|
version: 3.0.0
|
22
|
-
|
23
|
-
prerelease: false
|
24
|
-
type: :runtime
|
25
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirement: !ruby/object:Gem::Requirement
|
26
24
|
requirements:
|
27
25
|
- - '>='
|
28
26
|
- !ruby/object:Gem::Version
|
@@ -30,90 +28,92 @@ dependencies:
|
|
30
28
|
- - <
|
31
29
|
- !ruby/object:Gem::Version
|
32
30
|
version: 3.0.0
|
31
|
+
prerelease: false
|
32
|
+
type: :runtime
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
+
name: gelfd
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - '='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 0.2.0
|
34
40
|
requirement: !ruby/object:Gem::Requirement
|
35
41
|
requirements:
|
36
42
|
- - '='
|
37
43
|
- !ruby/object:Gem::Version
|
38
44
|
version: 0.2.0
|
39
|
-
name: gelfd
|
40
45
|
prerelease: false
|
41
46
|
type: :runtime
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: logstash-codec-plain
|
42
49
|
version_requirements: !ruby/object:Gem::Requirement
|
43
50
|
requirements:
|
44
|
-
- - '
|
51
|
+
- - '>='
|
45
52
|
- !ruby/object:Gem::Version
|
46
|
-
version: 0
|
47
|
-
- !ruby/object:Gem::Dependency
|
53
|
+
version: '0'
|
48
54
|
requirement: !ruby/object:Gem::Requirement
|
49
55
|
requirements:
|
50
56
|
- - '>='
|
51
57
|
- !ruby/object:Gem::Version
|
52
58
|
version: '0'
|
53
|
-
name: logstash-codec-plain
|
54
59
|
prerelease: false
|
55
60
|
type: :runtime
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: stud
|
56
63
|
version_requirements: !ruby/object:Gem::Requirement
|
57
64
|
requirements:
|
58
|
-
- -
|
65
|
+
- - ~>
|
59
66
|
- !ruby/object:Gem::Version
|
60
|
-
version:
|
61
|
-
- !ruby/object:Gem::Dependency
|
67
|
+
version: 0.0.22
|
62
68
|
requirement: !ruby/object:Gem::Requirement
|
63
69
|
requirements:
|
64
70
|
- - ~>
|
65
71
|
- !ruby/object:Gem::Version
|
66
72
|
version: 0.0.22
|
67
|
-
name: stud
|
68
73
|
prerelease: false
|
69
74
|
type: :runtime
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: logstash-devutils
|
70
77
|
version_requirements: !ruby/object:Gem::Requirement
|
71
78
|
requirements:
|
72
|
-
- -
|
79
|
+
- - '>='
|
73
80
|
- !ruby/object:Gem::Version
|
74
|
-
version: 0
|
75
|
-
- !ruby/object:Gem::Dependency
|
81
|
+
version: '0'
|
76
82
|
requirement: !ruby/object:Gem::Requirement
|
77
83
|
requirements:
|
78
84
|
- - '>='
|
79
85
|
- !ruby/object:Gem::Version
|
80
86
|
version: '0'
|
81
|
-
name: logstash-devutils
|
82
87
|
prerelease: false
|
83
88
|
type: :development
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: gelf
|
84
91
|
version_requirements: !ruby/object:Gem::Requirement
|
85
92
|
requirements:
|
86
|
-
- - '
|
93
|
+
- - '='
|
87
94
|
- !ruby/object:Gem::Version
|
88
|
-
version:
|
89
|
-
- !ruby/object:Gem::Dependency
|
95
|
+
version: 1.3.2
|
90
96
|
requirement: !ruby/object:Gem::Requirement
|
91
97
|
requirements:
|
92
98
|
- - '='
|
93
99
|
- !ruby/object:Gem::Version
|
94
100
|
version: 1.3.2
|
95
|
-
name: gelf
|
96
101
|
prerelease: false
|
97
102
|
type: :development
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: flores
|
98
105
|
version_requirements: !ruby/object:Gem::Requirement
|
99
106
|
requirements:
|
100
|
-
- - '
|
107
|
+
- - '>='
|
101
108
|
- !ruby/object:Gem::Version
|
102
|
-
version:
|
103
|
-
- !ruby/object:Gem::Dependency
|
109
|
+
version: '0'
|
104
110
|
requirement: !ruby/object:Gem::Requirement
|
105
111
|
requirements:
|
106
112
|
- - '>='
|
107
113
|
- !ruby/object:Gem::Version
|
108
114
|
version: '0'
|
109
|
-
name: flores
|
110
115
|
prerelease: false
|
111
116
|
type: :development
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
113
|
-
requirements:
|
114
|
-
- - '>='
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: '0'
|
117
117
|
description: This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program
|
118
118
|
email: info@elastic.co
|
119
119
|
executables: []
|