logstash-output-lumberjack 1.0.1 → 1.0.2
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/lib/logstash/outputs/lumberjack.rb +49 -9
- data/logstash-output-lumberjack.gemspec +6 -2
- data/spec/outputs/lumberjack_spec.rb +75 -0
- metadata +60 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7de0e64427c75281d60a669c7374e8ba2e8d2c24
|
4
|
+
data.tar.gz: 34eb43c4342dc6c4f8dc1cb1e6d0f6c32243013f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c415eec32245cce31416af9c575c8612a06f8125c40c26c36db42d0e4b383291ad3f78693f41de22cde49d63e39d702491715eb12e1d19e0592924d4f47609b5
|
7
|
+
data.tar.gz: 7a20703d9e80df5d3cc847d269c0c45b7793f424dcaf5ff113f1a3362e52ffda109ca8e1ffb21f826ef3b6fcf71977c94948f5f27d23d3f4d9ae7270064c2857
|
@@ -1,5 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require "logstash/outputs/base"
|
3
|
+
require "stud/buffer"
|
4
|
+
require "thread"
|
5
|
+
|
2
6
|
class LogStash::Outputs::Lumberjack < LogStash::Outputs::Base
|
7
|
+
include Stud::Buffer
|
3
8
|
|
4
9
|
config_name "lumberjack"
|
5
10
|
|
@@ -13,22 +18,41 @@ class LogStash::Outputs::Lumberjack < LogStash::Outputs::Base
|
|
13
18
|
config :ssl_certificate, :validate => :path, :required => true
|
14
19
|
|
15
20
|
# window size
|
16
|
-
config :window_size, :validate => :number, :
|
21
|
+
config :window_size, :validate => :number, :deprecated => "Use `flush_size`", :require => false
|
22
|
+
|
23
|
+
# To make efficient calls to the lumberjack output we are buffering events locally.
|
24
|
+
# if the number of events exceed the number the declared `flush_size` we will
|
25
|
+
# send them to the logstash server.
|
26
|
+
config :flush_size, :validate => :number, :default => 1024
|
27
|
+
|
28
|
+
# The amount of time since last flush before a flush is forced.
|
29
|
+
#
|
30
|
+
# This setting helps ensure slow event rates don't get stuck in Logstash.
|
31
|
+
# For example, if your `flush_size` is 100, and you have received 10 events,
|
32
|
+
# and it has been more than `idle_flush_time` seconds since the last flush,
|
33
|
+
# Logstash will flush those 10 events automatically.
|
34
|
+
#
|
35
|
+
# This helps keep both fast and slow log streams moving along in
|
36
|
+
# near-real-time.
|
37
|
+
config :idle_flush_time, :validate => :number, :default => 1
|
38
|
+
|
39
|
+
RECONNECT_BACKOFF_SLEEP = 0.5
|
17
40
|
|
18
41
|
public
|
19
42
|
def register
|
20
43
|
require 'lumberjack/client'
|
44
|
+
|
45
|
+
buffer_initialize(
|
46
|
+
:max_items => max_items,
|
47
|
+
:max_interval => @idle_flush_time,
|
48
|
+
:logger => @logger
|
49
|
+
)
|
50
|
+
|
21
51
|
connect
|
22
52
|
|
23
53
|
@codec.on_event do |event, payload|
|
24
|
-
|
25
|
-
|
26
|
-
rescue Exception => e
|
27
|
-
@logger.error("Client write error, trying connect", :e => e, :backtrace => e.backtrace)
|
28
|
-
connect
|
29
|
-
retry
|
30
|
-
end # begin
|
31
|
-
end # @codec
|
54
|
+
buffer_receive({ "line" => payload })
|
55
|
+
end
|
32
56
|
end # def register
|
33
57
|
|
34
58
|
public
|
@@ -41,7 +65,23 @@ class LogStash::Outputs::Lumberjack < LogStash::Outputs::Base
|
|
41
65
|
@codec.encode(event)
|
42
66
|
end # def receive
|
43
67
|
|
68
|
+
def flush(events, teardown = false)
|
69
|
+
begin
|
70
|
+
@logger.info("Sending events to lumberjack", :size => events.size)
|
71
|
+
@client.write(events)
|
72
|
+
rescue Exception => e
|
73
|
+
@logger.error("Client write error, trying connect", :e => e, :backtrace => e.backtrace)
|
74
|
+
sleep(RECONNECT_BACKOFF_SLEEP)
|
75
|
+
connect
|
76
|
+
retry
|
77
|
+
end # begin
|
78
|
+
end
|
79
|
+
|
44
80
|
private
|
81
|
+
def max_items
|
82
|
+
@window_size || @flush_size
|
83
|
+
end
|
84
|
+
|
45
85
|
def connect
|
46
86
|
require 'resolv'
|
47
87
|
@logger.info("Connecting to lumberjack server.", :addresses => @hosts, :port => @port,
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-output-lumberjack'
|
4
|
-
s.version = '1.0.
|
4
|
+
s.version = '1.0.2'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "Send events using the lumberjack protocol"
|
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"
|
@@ -23,8 +23,12 @@ Gem::Specification.new do |s|
|
|
23
23
|
# Gem dependencies
|
24
24
|
s.add_runtime_dependency "logstash-core", '>= 1.4.0', '< 2.0.0'
|
25
25
|
|
26
|
-
s.add_runtime_dependency 'jls-lumberjack', ['>=0.0.
|
26
|
+
s.add_runtime_dependency 'jls-lumberjack', ['>=0.0.24']
|
27
|
+
s.add_runtime_dependency "stud"
|
27
28
|
|
28
29
|
s.add_development_dependency 'logstash-devutils'
|
30
|
+
s.add_development_dependency "logstash-output-lumberjack"
|
31
|
+
s.add_development_dependency "logstash-codec-plain"
|
32
|
+
s.add_development_dependency "flores"
|
29
33
|
end
|
30
34
|
|
@@ -1 +1,76 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/outputs/lumberjack"
|
3
|
+
require "logstash/event"
|
1
4
|
require "logstash/devutils/rspec/spec_helper"
|
5
|
+
require "lumberjack/server"
|
6
|
+
require "flores/pki"
|
7
|
+
require "stud/temporary"
|
8
|
+
require "fileutils"
|
9
|
+
|
10
|
+
describe "Sending events" do
|
11
|
+
let(:batch_size) { Flores::Random.integer(20..100) }
|
12
|
+
let(:batch_payload) do
|
13
|
+
batch_size.times.collect { |n| LogStash::Event.new({ "message" => "foobar #{n}" }) }
|
14
|
+
end
|
15
|
+
|
16
|
+
let(:number_of_crash) { Flores::Random.integer(1..10) }
|
17
|
+
let(:certificate) { Flores::PKI.generate }
|
18
|
+
let(:certificate_file_crt) { Stud::Temporary.pathname }
|
19
|
+
let(:certificate_file_key) { Stud::Temporary.pathname }
|
20
|
+
let(:port) { Flores::Random.integer(1024..65535) }
|
21
|
+
let(:host) { "127.0.0.1" }
|
22
|
+
let(:queue) { [] }
|
23
|
+
|
24
|
+
let(:client_options) {
|
25
|
+
{
|
26
|
+
"hosts" => [host],
|
27
|
+
"port" => port,
|
28
|
+
"ssl_certificate" => certificate_file_crt,
|
29
|
+
"flush_size" => batch_size
|
30
|
+
}
|
31
|
+
}
|
32
|
+
let(:output) { LogStash::Outputs::Lumberjack.new(client_options) }
|
33
|
+
|
34
|
+
context "when the server closes the connection" do
|
35
|
+
before do
|
36
|
+
File.open(certificate_file_crt, "a") { |f| f.write(certificate.first) }
|
37
|
+
File.open(certificate_file_key, "a") { |f| f.write(certificate.last) }
|
38
|
+
|
39
|
+
server = Lumberjack::Server.new(:port => port,
|
40
|
+
:address => host,
|
41
|
+
:ssl_certificate => certificate_file_crt,
|
42
|
+
:ssl_key => certificate_file_key)
|
43
|
+
|
44
|
+
crashed_count = 0
|
45
|
+
@server = Thread.new do
|
46
|
+
begin
|
47
|
+
server.run do |data|
|
48
|
+
if crashed_count < number_of_crash
|
49
|
+
crashed_count += 1
|
50
|
+
raise "crashed"
|
51
|
+
end
|
52
|
+
|
53
|
+
queue << data
|
54
|
+
end
|
55
|
+
rescue
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
output.register
|
60
|
+
end
|
61
|
+
|
62
|
+
after do
|
63
|
+
FileUtils.rm_rf(certificate_file_crt)
|
64
|
+
FileUtils.rm_rf(certificate_file_key)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "reconnects and resend the payload" do
|
68
|
+
# We guarantee at least once,
|
69
|
+
# duplicates can happen in this scenario.
|
70
|
+
batch_payload.each { |event| output.receive(event) }
|
71
|
+
|
72
|
+
try(10) { expect(queue.size).to be >= batch_size }
|
73
|
+
expect(queue.map { |e| e["line"] }).to include(*batch_payload.map(&:to_s))
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-lumberjack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-08-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logstash-core
|
@@ -36,12 +36,26 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - '>='
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: 0.0.
|
39
|
+
version: 0.0.24
|
40
40
|
requirement: !ruby/object:Gem::Requirement
|
41
41
|
requirements:
|
42
42
|
- - '>='
|
43
43
|
- !ruby/object:Gem::Version
|
44
|
-
version: 0.0.
|
44
|
+
version: 0.0.24
|
45
|
+
prerelease: false
|
46
|
+
type: :runtime
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: stud
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
45
59
|
prerelease: false
|
46
60
|
type: :runtime
|
47
61
|
- !ruby/object:Gem::Dependency
|
@@ -58,6 +72,48 @@ dependencies:
|
|
58
72
|
version: '0'
|
59
73
|
prerelease: false
|
60
74
|
type: :development
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: logstash-output-lumberjack
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
prerelease: false
|
88
|
+
type: :development
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: logstash-codec-plain
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
prerelease: false
|
102
|
+
type: :development
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: flores
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
requirement: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - '>='
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
prerelease: false
|
116
|
+
type: :development
|
61
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
|
62
118
|
email: info@elastic.co
|
63
119
|
executables: []
|