logstash-output-sumologic 1.2.2 → 1.4.0
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 +23 -1
- data/CONTRIBUTING.md +75 -0
- data/README.md +3 -2
- data/lib/logstash/outputs/sumologic/batch.rb +13 -0
- data/lib/logstash/outputs/sumologic/common.rb +30 -3
- data/lib/logstash/outputs/sumologic/compressor.rb +3 -3
- data/lib/logstash/outputs/sumologic/header_builder.rb +19 -33
- data/lib/logstash/outputs/sumologic/message_queue.rb +23 -15
- data/lib/logstash/outputs/sumologic/monitor.rb +11 -6
- data/lib/logstash/outputs/sumologic/payload_builder.rb +3 -4
- data/lib/logstash/outputs/sumologic/piler.rb +35 -37
- data/lib/logstash/outputs/sumologic/sender.rb +31 -29
- data/lib/logstash/outputs/sumologic/statistics.rb +7 -31
- data/lib/logstash/outputs/sumologic.rb +10 -17
- data/logstash-output-sumologic.gemspec +3 -3
- data/spec/outputs/sumologic/header_builder_spec.rb +134 -1
- data/spec/outputs/sumologic/message_queue_spec.rb +13 -11
- data/spec/outputs/sumologic/piler_spec.rb +67 -102
- data/spec/outputs/sumologic_spec.rb +10 -0
- metadata +16 -9
- data/DEVELOPER.md +0 -39
@@ -1,9 +1,13 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "logstash/devutils/rspec/spec_helper"
|
3
3
|
require "logstash/outputs/sumologic"
|
4
|
+
include LogStash::Outputs
|
4
5
|
|
5
|
-
describe
|
6
|
+
describe SumoLogic::Piler do
|
6
7
|
|
8
|
+
event = LogStash::Event.new("foo" => "bar", "message" => "This is a log line")
|
9
|
+
event_10 = LogStash::Event.new("foo" => "bar", "message" => "1234567890")
|
10
|
+
|
7
11
|
before :each do
|
8
12
|
piler.start()
|
9
13
|
end
|
@@ -15,9 +19,9 @@ describe LogStash::Outputs::SumoLogic::Piler do
|
|
15
19
|
|
16
20
|
context "working in pile mode if interval > 0 && pile_max > 0" do
|
17
21
|
let(:config) { {"queue_max" => 10, "interval" => 10, "pile_max" => 100 } }
|
18
|
-
let(:stats) {
|
19
|
-
let(:queue) {
|
20
|
-
let(:piler) {
|
22
|
+
let(:stats) { SumoLogic::Statistics.new }
|
23
|
+
let(:queue) { SumoLogic::MessageQueue.new(stats, config) }
|
24
|
+
let(:piler) { SumoLogic::Piler.new(queue, stats, config) }
|
21
25
|
specify {
|
22
26
|
expect(piler.is_pile).to be true
|
23
27
|
}
|
@@ -25,9 +29,9 @@ describe LogStash::Outputs::SumoLogic::Piler do
|
|
25
29
|
|
26
30
|
context "working in non-pile mode if interval <= 0" do
|
27
31
|
let(:config) { {"queue_max" => 10, "interval" => 0, "pile_max" => 100 } }
|
28
|
-
let(:stats) {
|
29
|
-
let(:queue) {
|
30
|
-
let(:piler) {
|
32
|
+
let(:stats) { SumoLogic::Statistics.new }
|
33
|
+
let(:queue) { SumoLogic::MessageQueue.new(stats, config) }
|
34
|
+
let(:piler) { SumoLogic::Piler.new(queue, stats, config) }
|
31
35
|
specify {
|
32
36
|
expect(piler.is_pile).to be false
|
33
37
|
}
|
@@ -35,152 +39,113 @@ describe LogStash::Outputs::SumoLogic::Piler do
|
|
35
39
|
|
36
40
|
context "working in non-pile mode if pile_max <= 0" do
|
37
41
|
let(:config) { {"queue_max" => 10, "interval" => 10, "pile_max" => 0 } }
|
38
|
-
let(:stats) {
|
39
|
-
let(:queue) {
|
40
|
-
let(:piler) {
|
42
|
+
let(:stats) { SumoLogic::Statistics.new }
|
43
|
+
let(:queue) { SumoLogic::MessageQueue.new(stats, config) }
|
44
|
+
let(:piler) { SumoLogic::Piler.new(queue, stats, config) }
|
41
45
|
specify {
|
42
46
|
expect(piler.is_pile).to be false
|
43
47
|
}
|
44
48
|
end # context
|
45
49
|
|
46
50
|
context "in non-pile mode" do
|
47
|
-
|
48
|
-
let(:
|
49
|
-
let(:
|
50
|
-
let(:
|
51
|
-
let(:piler) { LogStash::Outputs::SumoLogic::Piler.new(queue, stats, config) }
|
51
|
+
let(:config) { {"queue_max" => 10, "interval" => 0, "pile_max" => 100, "format" => "%{message}" } }
|
52
|
+
let(:stats) { SumoLogic::Statistics.new }
|
53
|
+
let(:queue) { SumoLogic::MessageQueue.new(stats, config) }
|
54
|
+
let(:piler) { SumoLogic::Piler.new(queue, stats, config) }
|
52
55
|
|
53
56
|
it "enque immediately after input" do
|
54
|
-
expect(stats.
|
55
|
-
expect(
|
56
|
-
piler.input(
|
57
|
-
expect(stats.
|
58
|
-
expect(stats.
|
59
|
-
expect(
|
57
|
+
expect(stats.total_enque_times.value).to be 0
|
58
|
+
expect(queue.size).to be 0
|
59
|
+
piler.input(event)
|
60
|
+
expect(stats.total_enque_times.value).to be 1
|
61
|
+
expect(stats.total_enque_bytes.value).to be 18
|
62
|
+
expect(queue.size).to be 1
|
63
|
+
expect(queue.bytesize).to be 18
|
60
64
|
end
|
61
65
|
|
62
66
|
it "deque correctly" do
|
63
|
-
|
64
|
-
expect(
|
65
|
-
|
66
|
-
expect(
|
67
|
-
expect(stats.current_queue_items.value).to be 1
|
68
|
-
expect(stats.current_queue_bytes.value).to be 18
|
69
|
-
expect(stats.total_deque_times.value).to be 0
|
70
|
-
expect(queue.deq()).to eq "This is a log line"
|
71
|
-
expect(stats.current_queue_items.value).to be 0
|
72
|
-
expect(stats.current_queue_bytes.value).to be 0
|
67
|
+
piler.input(event)
|
68
|
+
expect(queue.deq().payload).to eq "This is a log line"
|
69
|
+
expect(queue.size).to be 0
|
70
|
+
expect(queue.bytesize).to be 0
|
73
71
|
expect(stats.total_deque_times.value).to be 1
|
72
|
+
expect(stats.total_deque_bytes.value).to be 18
|
74
73
|
end
|
75
74
|
|
76
75
|
end # context
|
77
76
|
|
78
77
|
context "in pile mode" do
|
79
78
|
|
80
|
-
let(:config) { {"queue_max" => 10, "interval" => 5, "pile_max" => 25 } }
|
81
|
-
let(:stats) {
|
82
|
-
let(:queue) {
|
83
|
-
let(:piler) {
|
84
|
-
|
85
|
-
it "wait in pile before size reach pile_max" do
|
86
|
-
expect(stats.current_pile_items.value).to be 0
|
87
|
-
expect(stats.current_pile_bytes.value).to be 0
|
88
|
-
expect(stats.current_queue_items.value).to be 0
|
89
|
-
piler.input("1234567890")
|
90
|
-
expect(stats.current_pile_items.value).to be 1
|
91
|
-
expect(stats.current_pile_bytes.value).to be 10
|
92
|
-
expect(stats.current_queue_items.value).to be 0
|
93
|
-
piler.input("1234567890")
|
94
|
-
expect(stats.current_pile_items.value).to be 2
|
95
|
-
expect(stats.current_pile_bytes.value).to be 20
|
96
|
-
expect(stats.current_queue_items.value).to be 0
|
97
|
-
end
|
79
|
+
let(:config) { {"queue_max" => 10, "interval" => 5, "pile_max" => 25, "format" => "%{message}" } }
|
80
|
+
let(:stats) { SumoLogic::Statistics.new }
|
81
|
+
let(:queue) { SumoLogic::MessageQueue.new(stats, config) }
|
82
|
+
let(:piler) { SumoLogic::Piler.new(queue, stats, config) }
|
98
83
|
|
99
84
|
it "enqueue content from pile when reach pile_max" do
|
100
|
-
expect(
|
101
|
-
|
102
|
-
expect(
|
103
|
-
piler.input(
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
expect(stats.current_pile_items.value).to be 1
|
108
|
-
expect(stats.current_pile_bytes.value).to be 10
|
109
|
-
expect(stats.current_queue_items.value).to be 1
|
110
|
-
expect(stats.current_queue_bytes.value).to be 21
|
85
|
+
expect(queue.size).to be 0
|
86
|
+
piler.input(event_10)
|
87
|
+
expect(queue.size).to be 0
|
88
|
+
piler.input(event_10)
|
89
|
+
expect(queue.size).to be 0
|
90
|
+
piler.input(event_10)
|
91
|
+
expect(queue.size).to be 1
|
111
92
|
end
|
112
93
|
|
113
94
|
it "enqueue content from pile when reach interval" do
|
114
|
-
expect(
|
115
|
-
|
116
|
-
|
117
|
-
piler.input(
|
118
|
-
|
119
|
-
|
120
|
-
expect(stats.current_pile_items.value).to be 0
|
121
|
-
expect(stats.current_pile_bytes.value).to be 0
|
122
|
-
expect(stats.current_queue_items.value).to be 1
|
123
|
-
expect(stats.current_queue_bytes.value).to be 21
|
95
|
+
expect(queue.size).to be 0
|
96
|
+
piler.input(event_10)
|
97
|
+
expect(queue.size).to be 0
|
98
|
+
piler.input(event_10)
|
99
|
+
sleep(10)
|
100
|
+
expect(queue.size).to be 1
|
124
101
|
end
|
125
102
|
|
126
103
|
end # context
|
127
104
|
|
128
105
|
context "pile to message queue" do
|
129
106
|
|
130
|
-
let(:config) { {"queue_max" => 5, "interval" =>
|
131
|
-
let(:stats) {
|
132
|
-
let(:queue) {
|
133
|
-
let(:piler) {
|
134
|
-
|
135
|
-
it "enqueue payloads from pile before reach queue_max" do
|
136
|
-
expect(stats.current_queue_items.value).to be 0
|
137
|
-
piler.input("1234567890")
|
138
|
-
expect(stats.current_queue_items.value).to be 0
|
139
|
-
expect(stats.current_queue_bytes.value).to be 0
|
140
|
-
piler.input("2234567890")
|
141
|
-
expect(stats.current_queue_items.value).to be 1
|
142
|
-
expect(stats.current_queue_bytes.value).to be 10
|
143
|
-
piler.input("3234567890")
|
144
|
-
expect(stats.current_queue_items.value).to be 2
|
145
|
-
expect(stats.current_queue_bytes.value).to be 20
|
146
|
-
end
|
107
|
+
let(:config) { {"queue_max" => 5, "interval" => 3, "pile_max" => 5, "format" => "%{message}"} }
|
108
|
+
let(:stats) { SumoLogic::Statistics.new }
|
109
|
+
let(:queue) { SumoLogic::MessageQueue.new(stats, config) }
|
110
|
+
let(:piler) { SumoLogic::Piler.new(queue, stats, config) }
|
147
111
|
|
148
112
|
it "block input thread if queue is full" do
|
149
113
|
input_t = Thread.new {
|
150
|
-
for i in 0..
|
151
|
-
piler.input(
|
114
|
+
for i in 0..10 do
|
115
|
+
piler.input(event_10)
|
152
116
|
end
|
153
117
|
}
|
154
118
|
sleep(3)
|
155
|
-
expect(
|
156
|
-
expect(
|
157
|
-
queue.drain()
|
119
|
+
expect(queue.size).to be 5
|
120
|
+
expect(queue.bytesize).to be 50
|
158
121
|
piler.stop()
|
159
|
-
|
160
|
-
|
161
|
-
expect(stats.total_deque_bytes.value).to be 50
|
122
|
+
queue.drain()
|
123
|
+
input_t.kill()
|
162
124
|
end
|
163
125
|
|
164
126
|
it "resume input thread if queue is drained" do
|
165
127
|
input_t = Thread.new {
|
166
|
-
for i in 0..
|
167
|
-
piler.input(
|
128
|
+
for i in 0..10 do
|
129
|
+
piler.input(event_10)
|
168
130
|
end
|
169
131
|
}
|
170
|
-
sleep(
|
132
|
+
sleep(5)
|
171
133
|
expect(stats.total_deque_times.value).to be 0
|
134
|
+
expect(queue.size).to be 5
|
172
135
|
expect(stats.total_enque_times.value).to be 5
|
173
136
|
queue.deq()
|
174
|
-
sleep(
|
137
|
+
sleep(3)
|
175
138
|
expect(stats.total_deque_times.value).to be 1
|
139
|
+
expect(queue.size).to be 5
|
176
140
|
expect(stats.total_enque_times.value).to be 6
|
177
141
|
queue.deq()
|
178
|
-
sleep(
|
142
|
+
sleep(3)
|
179
143
|
expect(stats.total_deque_times.value).to be 2
|
144
|
+
expect(queue.size).to be 5
|
180
145
|
expect(stats.total_enque_times.value).to be 7
|
181
|
-
queue.drain()
|
182
146
|
piler.stop()
|
183
|
-
|
147
|
+
queue.drain()
|
148
|
+
input_t.kill()
|
184
149
|
end
|
185
150
|
|
186
151
|
end # context
|
@@ -13,6 +13,16 @@ describe LogStash::Outputs::SumoLogic, :unless => (ENV["sumo_url"].to_s.empty?)
|
|
13
13
|
plugin.close()
|
14
14
|
end
|
15
15
|
|
16
|
+
context "default configuration" do
|
17
|
+
let(:plugin) {
|
18
|
+
LogStash::Outputs::SumoLogic.new("url" => ENV["sumo_url"])
|
19
|
+
}
|
20
|
+
|
21
|
+
it "cookies is by default disabled" do
|
22
|
+
expect(plugin.cookies).to be false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
16
26
|
context "no pile" do
|
17
27
|
context "single sender" do
|
18
28
|
context "send log in json" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-sumologic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sumo Logic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: manticore
|
@@ -51,27 +51,33 @@ dependencies:
|
|
51
51
|
- !ruby/object:Gem::Version
|
52
52
|
version: '2.99'
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
|
-
name: logstash-
|
54
|
+
name: logstash-mixin-http_client
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
56
56
|
requirements:
|
57
57
|
- - ">="
|
58
58
|
- !ruby/object:Gem::Version
|
59
|
-
version: '
|
59
|
+
version: '6'
|
60
|
+
- - "<"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '8'
|
60
63
|
type: :runtime
|
61
64
|
prerelease: false
|
62
65
|
version_requirements: !ruby/object:Gem::Requirement
|
63
66
|
requirements:
|
64
67
|
- - ">="
|
65
68
|
- !ruby/object:Gem::Version
|
66
|
-
version: '
|
69
|
+
version: '6'
|
70
|
+
- - "<"
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '8'
|
67
73
|
- !ruby/object:Gem::Dependency
|
68
|
-
name: logstash-
|
74
|
+
name: logstash-codec-plain
|
69
75
|
requirement: !ruby/object:Gem::Requirement
|
70
76
|
requirements:
|
71
77
|
- - ">="
|
72
78
|
- !ruby/object:Gem::Version
|
73
79
|
version: '0'
|
74
|
-
type: :
|
80
|
+
type: :development
|
75
81
|
prerelease: false
|
76
82
|
version_requirements: !ruby/object:Gem::Requirement
|
77
83
|
requirements:
|
@@ -101,11 +107,12 @@ extensions: []
|
|
101
107
|
extra_rdoc_files: []
|
102
108
|
files:
|
103
109
|
- CHANGELOG.md
|
104
|
-
-
|
110
|
+
- CONTRIBUTING.md
|
105
111
|
- Gemfile
|
106
112
|
- LICENSE
|
107
113
|
- README.md
|
108
114
|
- lib/logstash/outputs/sumologic.rb
|
115
|
+
- lib/logstash/outputs/sumologic/batch.rb
|
109
116
|
- lib/logstash/outputs/sumologic/common.rb
|
110
117
|
- lib/logstash/outputs/sumologic/compressor.rb
|
111
118
|
- lib/logstash/outputs/sumologic/header_builder.rb
|
@@ -145,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
152
|
- !ruby/object:Gem::Version
|
146
153
|
version: '0'
|
147
154
|
requirements: []
|
148
|
-
rubygems_version: 3.
|
155
|
+
rubygems_version: 3.1.2
|
149
156
|
signing_key:
|
150
157
|
specification_version: 4
|
151
158
|
summary: Deliever the log to Sumo Logic cloud service.
|
data/DEVELOPER.md
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
# Development Guide
|
2
|
-
|
3
|
-
Logstash output plugin for delivering log to Sumo Logic cloud service through HTTP source.
|
4
|
-
|
5
|
-
## How to build .gem file from repository
|
6
|
-
|
7
|
-
Open logstash-output-sumologic.gemspec and make any necessary configuration changes.
|
8
|
-
In your local Git clone, run:
|
9
|
-
|
10
|
-
```bash
|
11
|
-
gem build logstash-output-sumologic.gemspec
|
12
|
-
```
|
13
|
-
|
14
|
-
You will get a .gem file in the same directory as `logstash-output-sumologic-x.y.z.gem`
|
15
|
-
Remove old version of plugin (optional):
|
16
|
-
|
17
|
-
```bash
|
18
|
-
bin/logstash-plugin remove logstash-output-sumologic
|
19
|
-
```
|
20
|
-
|
21
|
-
And then install the plugin locally:
|
22
|
-
|
23
|
-
```bash
|
24
|
-
bin/logstash-plugin install <full path of .gem>
|
25
|
-
```
|
26
|
-
|
27
|
-
## How to run test with rspec
|
28
|
-
|
29
|
-
The test requires JRuby to run. So you need to install [JRuby](http://jruby.org/), [bundle](https://bundler.io/bundle_install.html) and [RVM](https://rvm.io/) (for switching between JRuby and Ruby) first.
|
30
|
-
And then run:
|
31
|
-
|
32
|
-
```bash
|
33
|
-
rvm use jruby
|
34
|
-
bundle install
|
35
|
-
export sumo_url=https://events.sumologic.net/receiver/v1/http/XXXXXXXXXX
|
36
|
-
rspec spec/
|
37
|
-
```
|
38
|
-
|
39
|
-
The project is integrated to the Travis CI now. Make sure [all test passed](https://travis-ci.org/SumoLogic/logstash-output-sumologic) before creating PR
|