logstash-core 5.3.3-java → 5.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.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/gemspec_jars.rb +2 -0
  3. data/lib/logstash-core/logstash-core.jar +0 -0
  4. data/lib/logstash-core/version.rb +1 -1
  5. data/lib/logstash-core_jars.rb +4 -0
  6. data/lib/logstash/agent.rb +15 -6
  7. data/lib/logstash/api/modules/base.rb +1 -1
  8. data/lib/logstash/api/rack_app.rb +1 -1
  9. data/lib/logstash/config/config_ast.rb +13 -13
  10. data/lib/logstash/config/mixin.rb +33 -28
  11. data/lib/logstash/environment.rb +11 -0
  12. data/lib/logstash/event.rb +56 -0
  13. data/lib/logstash/event_dispatcher.rb +2 -2
  14. data/lib/logstash/execution_context.rb +10 -0
  15. data/lib/logstash/filter_delegator.rb +3 -2
  16. data/lib/logstash/inputs/base.rb +15 -1
  17. data/lib/logstash/instrument/collector.rb +1 -1
  18. data/lib/logstash/instrument/metric.rb +4 -2
  19. data/lib/logstash/instrument/metric_store.rb +9 -5
  20. data/lib/logstash/instrument/null_metric.rb +1 -0
  21. data/lib/logstash/instrument/periodic_poller/cgroup.rb +3 -3
  22. data/lib/logstash/instrument/periodic_poller/jvm.rb +11 -8
  23. data/lib/logstash/instrument/periodic_poller/load_average.rb +4 -2
  24. data/lib/logstash/instrument/wrapped_write_client.rb +59 -0
  25. data/lib/logstash/java_integration.rb +2 -2
  26. data/lib/logstash/output_delegator.rb +2 -2
  27. data/lib/logstash/output_delegator_strategies/legacy.rb +5 -2
  28. data/lib/logstash/output_delegator_strategies/shared.rb +2 -1
  29. data/lib/logstash/output_delegator_strategies/single.rb +2 -1
  30. data/lib/logstash/outputs/base.rb +8 -0
  31. data/lib/logstash/patches/cabin.rb +1 -1
  32. data/lib/logstash/patches/stronger_openssl_defaults.rb +1 -1
  33. data/lib/logstash/pipeline.rb +47 -19
  34. data/lib/logstash/plugin.rb +3 -1
  35. data/lib/logstash/plugins/hooks_registry.rb +6 -6
  36. data/lib/logstash/plugins/registry.rb +2 -2
  37. data/lib/logstash/queue_factory.rb +7 -5
  38. data/lib/logstash/runner.rb +15 -1
  39. data/lib/logstash/settings.rb +14 -2
  40. data/lib/logstash/string_interpolation.rb +18 -0
  41. data/lib/logstash/timestamp.rb +27 -0
  42. data/lib/logstash/util.rb +1 -1
  43. data/lib/logstash/util/prctl.rb +1 -1
  44. data/lib/logstash/util/retryable.rb +1 -1
  45. data/lib/logstash/util/wrapped_acked_queue.rb +53 -22
  46. data/lib/logstash/util/wrapped_synchronous_queue.rb +51 -33
  47. data/lib/logstash/version.rb +1 -1
  48. data/locales/en.yml +4 -2
  49. data/logstash-core.gemspec +0 -3
  50. data/spec/api/lib/api/node_stats_spec.rb +2 -1
  51. data/spec/api/spec_helper.rb +1 -1
  52. data/spec/logstash/acked_queue_concurrent_stress_spec.rb +291 -0
  53. data/spec/logstash/agent_spec.rb +24 -0
  54. data/spec/logstash/config/mixin_spec.rb +11 -2
  55. data/spec/logstash/event_dispatcher_spec.rb +8 -1
  56. data/spec/logstash/event_spec.rb +346 -0
  57. data/spec/logstash/execution_context_spec.rb +13 -0
  58. data/spec/logstash/filter_delegator_spec.rb +4 -2
  59. data/spec/logstash/inputs/base_spec.rb +41 -0
  60. data/spec/logstash/instrument/metric_spec.rb +2 -1
  61. data/spec/logstash/instrument/metric_store_spec.rb +14 -0
  62. data/spec/logstash/instrument/namespaced_metric_spec.rb +2 -1
  63. data/spec/logstash/instrument/periodic_poller/cgroup_spec.rb +1 -1
  64. data/spec/logstash/instrument/periodic_poller/jvm_spec.rb +35 -0
  65. data/spec/logstash/instrument/periodic_poller/load_average_spec.rb +1 -5
  66. data/spec/logstash/instrument/wrapped_write_client_spec.rb +113 -0
  67. data/spec/logstash/json_spec.rb +1 -1
  68. data/spec/logstash/legacy_ruby_event_spec.rb +636 -0
  69. data/spec/logstash/legacy_ruby_timestamp_spec.rb +170 -0
  70. data/spec/logstash/output_delegator_spec.rb +6 -3
  71. data/spec/logstash/outputs/base_spec.rb +23 -0
  72. data/spec/logstash/pipeline_pq_file_spec.rb +18 -8
  73. data/spec/logstash/pipeline_spec.rb +41 -5
  74. data/spec/logstash/plugin_spec.rb +15 -3
  75. data/spec/logstash/plugins/hooks_registry_spec.rb +2 -2
  76. data/spec/logstash/runner_spec.rb +33 -2
  77. data/spec/logstash/settings/port_range_spec.rb +1 -1
  78. data/spec/logstash/settings_spec.rb +21 -0
  79. data/spec/logstash/timestamp_spec.rb +29 -0
  80. data/spec/logstash/util/accessors_spec.rb +179 -0
  81. data/spec/logstash/util/wrapped_synchronous_queue_spec.rb +4 -11
  82. data/spec/logstash/util_spec.rb +1 -1
  83. data/spec/logstash/webserver_spec.rb +1 -1
  84. data/spec/support/mocks_classes.rb +65 -53
  85. metadata +25 -30
@@ -56,7 +56,7 @@ describe LogStash::Setting::PortRange do
56
56
  end
57
57
  end
58
58
 
59
- context "when the value is an unkown type" do
59
+ context "when the value is an unknown type" do
60
60
  subject { LogStash::Setting::PortRange.new("mynewtest", 0.1) }
61
61
 
62
62
 
@@ -87,6 +87,27 @@ describe LogStash::Settings do
87
87
  end
88
88
  end
89
89
  end
90
+
91
+ describe "post_process" do
92
+ subject(:settings) { described_class.new }
93
+
94
+ before do
95
+ settings.on_post_process do
96
+ settings.set("baz", "bot")
97
+ end
98
+ settings.register(LogStash::Setting::String.new("foo", "bar"))
99
+ settings.register(LogStash::Setting::String.new("baz", "somedefault"))
100
+ settings.post_process
101
+ end
102
+
103
+ it "should run the post process callbacks" do
104
+ expect(settings.get("baz")).to eq("bot")
105
+ end
106
+
107
+ it "should preserve original settings" do
108
+ expect(settings.get("foo")).to eq("bar")
109
+ end
110
+ end
90
111
 
91
112
  context "transient settings" do
92
113
  subject do
@@ -0,0 +1,29 @@
1
+ # encoding: utf-8
2
+
3
+ require "spec_helper"
4
+ require "logstash/timestamp"
5
+
6
+ describe LogStash::Timestamp do
7
+ context "constructors" do
8
+ it "should work" do
9
+ t = LogStash::Timestamp.new
10
+ expect(t.time.to_i).to be_within(1).of Time.now.to_i
11
+
12
+ t = LogStash::Timestamp.now
13
+ expect(t.time.to_i).to be_within(1).of Time.now.to_i
14
+
15
+ now = Time.now.utc
16
+ t = LogStash::Timestamp.new(now)
17
+ expect(t.time).to eq(now)
18
+
19
+ t = LogStash::Timestamp.at(now.to_i)
20
+ expect(t.time.to_i).to eq(now.to_i)
21
+ end
22
+
23
+ it "should raise exception on invalid format" do
24
+ expect{LogStash::Timestamp.new("foobar")}.to raise_error
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,179 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+
4
+ # this is to skip specs when running agains an alternate logstash-core-event implementation
5
+ # that does not define the Accessors class. For example, in logstash-core-event-java
6
+ # the Accessors class does not exists in the Ruby namespace.
7
+ class_exists = begin
8
+ require "logstash/util/accessors"
9
+ true
10
+ rescue LoadError
11
+ false
12
+ end
13
+
14
+ describe "LogStash::Util::Accessors", :if => class_exists do
15
+
16
+ context "using simple field" do
17
+
18
+ it "should get value of word key" do
19
+ str = "hello"
20
+ data = { "hello" => "world" }
21
+ accessors = LogStash::Util::Accessors.new(data)
22
+ expect(accessors.get(str)).to eq(data[str])
23
+ end
24
+
25
+ it "should get value of key with spaces" do
26
+ str = "hel lo"
27
+ data = { "hel lo" => "world" }
28
+ accessors = LogStash::Util::Accessors.new(data)
29
+ expect(accessors.get(str)).to eq(data[str])
30
+ end
31
+
32
+ it "should get value of numeric key string" do
33
+ str = "1"
34
+ data = { "1" => "world" }
35
+ accessors = LogStash::Util::Accessors.new(data)
36
+ expect(accessors.get(str)).to eq(data[str])
37
+ end
38
+
39
+ it "should handle delete" do
40
+ str = "simple"
41
+ data = { "simple" => "things" }
42
+ accessors = LogStash::Util::Accessors.new(data)
43
+ expect(accessors.del(str)).to eq("things")
44
+ expect(data).to be_empty
45
+ end
46
+
47
+ it "should handle delete on non-existent field" do
48
+ str = "[foo][bar]"
49
+ data = { "hello" => "world" }
50
+ accessors = LogStash::Util::Accessors.new(data)
51
+ expect(accessors.del(str)).to be_nil
52
+ expect(data).not_to be_empty
53
+ # assert no side effects
54
+ expect(accessors.get("foo")).to be_nil
55
+ expect(accessors.get("hello")).to eq("world")
56
+ end
57
+
58
+ it "should set string value" do
59
+ str = "simple"
60
+ data = {}
61
+ accessors = LogStash::Util::Accessors.new(data)
62
+ expect(accessors.set(str, "things")).to eq("things")
63
+ expect(data).to eq({ "simple" => "things" })
64
+ end
65
+
66
+ it "should set array value" do
67
+ str = "simple"
68
+ data = {}
69
+ accessors = LogStash::Util::Accessors.new(data)
70
+ expect(accessors.set(str, ["foo", "bar"])).to eq(["foo", "bar"])
71
+ expect(data).to eq({ "simple" => ["foo", "bar"]})
72
+ end
73
+ end
74
+
75
+ context "using field path" do
76
+
77
+ it "should get shallow string value of word key" do
78
+ str = "[hello]"
79
+ data = { "hello" => "world" }
80
+ accessors = LogStash::Util::Accessors.new(data)
81
+ expect(accessors.get(str)).to eq("world")
82
+ end
83
+
84
+ it "should get shallow string value of key with spaces" do
85
+ str = "[hel lo]"
86
+ data = { "hel lo" => "world" }
87
+ accessors = LogStash::Util::Accessors.new(data)
88
+ expect(accessors.get(str)).to eq("world")
89
+ end
90
+
91
+ it "should get shallow string value of numeric key string" do
92
+ str = "[1]"
93
+ data = { "1" => "world" }
94
+ accessors = LogStash::Util::Accessors.new(data)
95
+ expect(accessors.get(str)).to eq("world")
96
+ end
97
+
98
+ it "should get deep string value" do
99
+ str = "[hello][world]"
100
+ data = { "hello" => { "world" => "foo", "bar" => "baz" } }
101
+ accessors = LogStash::Util::Accessors.new(data)
102
+ expect(accessors.get(str)).to eq(data["hello"]["world"])
103
+ end
104
+
105
+ it "should return nil when getting a non-existant field (with no side-effects on original data)" do
106
+ str = "[hello][world]"
107
+ data = {}
108
+ accessors = LogStash::Util::Accessors.new(data)
109
+ expect(accessors.get(str)).to be_nil
110
+ expect(data).to be_empty
111
+ expect(accessors.set(str, "foo")).to eq("foo")
112
+ expect(data).to eq({ "hello" => {"world" => "foo"} })
113
+ end
114
+
115
+ it "should handle delete" do
116
+ str = "[hello][world]"
117
+ data = { "hello" => { "world" => "foo", "bar" => "baz" } }
118
+ accessors = LogStash::Util::Accessors.new(data)
119
+ expect(accessors.del(str)).to eq("foo")
120
+
121
+ # Make sure the "world" key is removed.
122
+ expect(data["hello"]).to eq({ "bar" => "baz" })
123
+ end
124
+
125
+ it "should set shallow string value" do
126
+ str = "[hello]"
127
+ data = {}
128
+ accessors = LogStash::Util::Accessors.new(data)
129
+ expect(accessors.set(str, "foo")).to eq("foo")
130
+ expect(data).to eq({ "hello" => "foo" })
131
+ end
132
+
133
+ it "should set deep string value" do
134
+ str = "[hello][world]"
135
+ data = {}
136
+ accessors = LogStash::Util::Accessors.new(data)
137
+ expect(accessors.set(str, "foo")).to eq("foo")
138
+ expect(data).to eq({ "hello" => { "world" => "foo" } })
139
+ end
140
+
141
+ it "should set deep array value" do
142
+ str = "[hello][world]"
143
+ data = {}
144
+ accessors = LogStash::Util::Accessors.new(data)
145
+ expect(accessors.set(str, ["foo", "bar"])).to eq(["foo", "bar"])
146
+ expect(data).to eq({ "hello" => { "world" => ["foo", "bar"] } })
147
+ end
148
+
149
+ it "should set element within array value" do
150
+ str = "[hello][0]"
151
+ data = {"hello" => ["foo", "bar"]}
152
+ accessors = LogStash::Util::Accessors.new(data)
153
+ expect(accessors.set(str, "world") ).to eq("world")
154
+ expect(data).to eq({"hello" => ["world", "bar"]})
155
+ end
156
+
157
+ it "should retrieve array item" do
158
+ data = { "hello" => { "world" => ["a", "b"], "bar" => "baz" } }
159
+ accessors = LogStash::Util::Accessors.new(data)
160
+ expect(accessors.get("[hello][world][0]")).to eq(data["hello"]["world"][0])
161
+ expect(accessors.get("[hello][world][1]")).to eq(data["hello"]["world"][1])
162
+ end
163
+
164
+ it "should retrieve array item containing hash" do
165
+ data = { "hello" => { "world" => [ { "a" => 123 }, { "b" => 345 } ], "bar" => "baz" } }
166
+ accessors = LogStash::Util::Accessors.new(data)
167
+ expect(accessors.get("[hello][world][0][a]")).to eq(data["hello"]["world"][0]["a"])
168
+ expect(accessors.get("[hello][world][1][b]")).to eq(data["hello"]["world"][1]["b"])
169
+ end
170
+
171
+ it "should handle delete of array element" do
172
+ str = "[geocoords][0]"
173
+ data = { "geocoords" => [4, 2] }
174
+ accessors = LogStash::Util::Accessors.new(data)
175
+ expect(accessors.del(str)).to eq(4)
176
+ expect(data).to eq({ "geocoords" => [2] })
177
+ end
178
+ end
179
+ end
@@ -60,13 +60,10 @@ describe LogStash::Util::WrappedSynchronousQueue do
60
60
 
61
61
  context "when the queue is empty" do
62
62
  it "doesnt record the `duration_in_millis`" do
63
- batch = read_client.take_batch
63
+ batch = read_client.read_batch
64
64
  read_client.close_batch(batch)
65
65
  store = collector.snapshot_metric.metric_store
66
66
 
67
- expect(store.get_shallow(:events, :in).value).to eq(0)
68
- expect(store.get_shallow(:events, :in)).to be_kind_of(LogStash::Instrument::MetricType::Counter)
69
-
70
67
  expect(store.get_shallow(:events, :out).value).to eq(0)
71
68
  expect(store.get_shallow(:events, :out)).to be_kind_of(LogStash::Instrument::MetricType::Counter)
72
69
 
@@ -76,9 +73,6 @@ describe LogStash::Util::WrappedSynchronousQueue do
76
73
  expect(store.get_shallow(:events, :duration_in_millis).value).to eq(0)
77
74
  expect(store.get_shallow(:events, :duration_in_millis)).to be_kind_of(LogStash::Instrument::MetricType::Counter)
78
75
 
79
- expect(store.get_shallow(:pipeline, :in).value).to eq(0)
80
- expect(store.get_shallow(:pipeline, :in)).to be_kind_of(LogStash::Instrument::MetricType::Counter)
81
-
82
76
  expect(store.get_shallow(:pipeline, :duration_in_millis).value).to eq(0)
83
77
  expect(store.get_shallow(:pipeline, :duration_in_millis)).to be_kind_of(LogStash::Instrument::MetricType::Counter)
84
78
 
@@ -95,7 +89,8 @@ describe LogStash::Util::WrappedSynchronousQueue do
95
89
  batch = write_client.get_new_batch
96
90
  5.times {|i| batch.push("value-#{i}")}
97
91
  write_client.push_batch(batch)
98
- read_batch = read_client.take_batch
92
+
93
+ read_batch = read_client.read_batch
99
94
  sleep(0.1) # simulate some work for the `duration_in_millis`
100
95
  # TODO: this interaction should be cleaned in an upcoming PR,
101
96
  # This is what the current pipeline does.
@@ -104,11 +99,9 @@ describe LogStash::Util::WrappedSynchronousQueue do
104
99
  read_client.close_batch(read_batch)
105
100
  store = collector.snapshot_metric.metric_store
106
101
 
107
- expect(store.get_shallow(:events, :in).value).to eq(5)
108
102
  expect(store.get_shallow(:events, :out).value).to eq(5)
109
103
  expect(store.get_shallow(:events, :filtered).value).to eq(5)
110
104
  expect(store.get_shallow(:events, :duration_in_millis).value).to be > 0
111
- expect(store.get_shallow(:pipeline, :in).value).to eq(5)
112
105
  expect(store.get_shallow(:pipeline, :duration_in_millis).value).to be > 0
113
106
  expect(store.get_shallow(:pipeline, :out).value).to eq(5)
114
107
  expect(store.get_shallow(:pipeline, :filtered).value).to eq(5)
@@ -126,7 +119,7 @@ describe LogStash::Util::WrappedSynchronousQueue do
126
119
  batch = write_client.get_new_batch
127
120
  5.times {|i| batch.push(LogStash::Event.new({"message" => "value-#{i}"}))}
128
121
  write_client.push_batch(batch)
129
- read_batch = read_client.take_batch
122
+ read_batch = read_client.read_batch
130
123
  expect(read_batch.size).to eq(5)
131
124
  i = 0
132
125
  read_batch.each do |data|
@@ -37,7 +37,7 @@ describe LogStash::Util do
37
37
  expect(LogStash::Util.stringify_symbols([1, :a])).to eq([1, "a"])
38
38
  end
39
39
 
40
- it "should convert innner array symbol values to strings" do
40
+ it "should convert inner array symbol values to strings" do
41
41
  expect(LogStash::Util.stringify_symbols({:a => [1, :b]})).to eq({"a" => [1, "b"]})
42
42
  expect(LogStash::Util.stringify_symbols([:a, [1, :b]])).to eq(["a", [1, "b"]])
43
43
  end
@@ -139,7 +139,7 @@ describe LogStash::IOWrappedLogger do
139
139
  expect(logger).to have_received(:debug).with(message)
140
140
  end
141
141
 
142
- it "reponds to <<" do
142
+ it "responds to <<" do
143
143
  subject << message
144
144
  expect(logger).to have_received(:debug).with(message)
145
145
  end
@@ -1,79 +1,91 @@
1
1
  # encoding: utf-8
2
2
  require "logstash/outputs/base"
3
+ require "logstash/inputs/base"
3
4
  require "thread"
4
5
 
5
- module LogStash module Outputs
6
- class DummyOutput < LogStash::Outputs::Base
7
- config_name "dummyoutput"
8
- milestone 2
6
+ module LogStash
7
+ module Inputs
8
+ class DummyInput < LogStash::Inputs::Base
9
+ config_name "dummyinput"
9
10
 
10
- attr_reader :num_closes, :events
11
-
12
- def initialize(params={})
13
- super
14
- @num_closes = 0
15
- @events = []
11
+ def run(queue)
12
+ # noop
13
+ end
16
14
  end
15
+ end
16
+ module Outputs
17
+ class DummyOutput < LogStash::Outputs::Base
18
+ config_name "dummyoutput"
19
+ milestone 2
17
20
 
18
- def register
19
- end
21
+ attr_reader :num_closes, :events
20
22
 
21
- def receive(event)
22
- @events << event
23
- end
23
+ def initialize(params={})
24
+ super
25
+ @num_closes = 0
26
+ @events = []
27
+ end
24
28
 
25
- def close
26
- @num_closes += 1
29
+ def register
30
+ end
31
+
32
+ def receive(event)
33
+ @events << event
34
+ end
35
+
36
+ def close
37
+ @num_closes += 1
38
+ end
27
39
  end
28
- end
29
40
 
30
- class DummyOutputWithEventsArray < LogStash::Outputs::Base
31
- config_name "dummyoutput2"
32
- milestone 2
41
+ class DummyOutputWithEventsArray < LogStash::Outputs::Base
42
+ config_name "dummyoutput2"
43
+ milestone 2
33
44
 
34
- attr_reader :events
45
+ attr_reader :events
35
46
 
36
- def initialize(params={})
37
- super
38
- @events = []
39
- end
47
+ def initialize(params={})
48
+ super
49
+ @events = []
50
+ end
40
51
 
41
- def register
42
- end
52
+ def register
53
+ end
43
54
 
44
- def receive(event)
45
- @events << event
46
- end
55
+ def receive(event)
56
+ @events << event
57
+ end
47
58
 
48
- def close
59
+ def close
60
+ end
49
61
  end
50
- end
51
62
 
52
- class DroppingDummyOutput < LogStash::Outputs::Base
53
- config_name "droppingdummyoutput"
54
- milestone 2
63
+ class DroppingDummyOutput < LogStash::Outputs::Base
64
+ config_name "droppingdummyoutput"
65
+ milestone 2
55
66
 
56
- attr_reader :num_closes
67
+ attr_reader :num_closes
57
68
 
58
- def initialize(params={})
59
- super
60
- @num_closes = 0
61
- @events_received = Concurrent::AtomicFixnum.new(0)
62
- end
69
+ def initialize(params={})
70
+ super
71
+ @num_closes = 0
72
+ @events_received = Concurrent::AtomicFixnum.new(0)
73
+ end
63
74
 
64
- def register
65
- end
75
+ def register
76
+ end
66
77
 
67
- def receive(event)
68
- @events_received.increment
69
- end
78
+ def receive(event)
79
+ @events_received.increment
80
+ end
70
81
 
71
- def events_received
72
- @events_received.value
73
- end
82
+ def events_received
83
+ @events_received.value
84
+ end
74
85
 
75
- def close
76
- @num_closes = 1
86
+ def close
87
+ @num_closes = 1
88
+ end
77
89
  end
78
90
  end
79
- end end
91
+ end