logstash-core 6.0.0.alpha1-java → 6.0.0.alpha2-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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/lib/logstash-core/logstash-core.jar +0 -0
  3. data/lib/logstash-core/version.rb +1 -1
  4. data/lib/logstash/agent.rb +81 -45
  5. data/lib/logstash/api/commands/hot_threads_reporter.rb +3 -3
  6. data/lib/logstash/api/commands/node.rb +13 -6
  7. data/lib/logstash/api/commands/stats.rb +18 -6
  8. data/lib/logstash/api/modules/node.rb +7 -0
  9. data/lib/logstash/api/modules/node_stats.rb +12 -5
  10. data/lib/logstash/bootstrap_check/default_config.rb +3 -7
  11. data/lib/logstash/compiler.rb +33 -15
  12. data/lib/logstash/compiler/lscl.rb +16 -8
  13. data/lib/logstash/config/mixin.rb +5 -42
  14. data/lib/logstash/config/pipeline_config.rb +1 -1
  15. data/lib/logstash/config/source/local.rb +28 -13
  16. data/lib/logstash/config/source/multi_local.rb +72 -0
  17. data/lib/logstash/config/source_loader.rb +1 -2
  18. data/lib/logstash/environment.rb +12 -3
  19. data/lib/logstash/execution_context.rb +7 -3
  20. data/lib/logstash/inputs/base.rb +2 -0
  21. data/lib/logstash/instrument/metric_type.rb +0 -2
  22. data/lib/logstash/instrument/periodic_poller/jvm.rb +5 -5
  23. data/lib/logstash/instrument/periodic_poller/pq.rb +1 -1
  24. data/lib/logstash/outputs/base.rb +2 -0
  25. data/lib/logstash/pipeline.rb +31 -14
  26. data/lib/logstash/pipeline_action/create.rb +1 -2
  27. data/lib/logstash/pipeline_action/reload.rb +2 -1
  28. data/lib/logstash/pipeline_settings.rb +50 -0
  29. data/lib/logstash/plugin.rb +1 -0
  30. data/lib/logstash/runner.rb +7 -5
  31. data/lib/logstash/settings.rb +11 -3
  32. data/lib/logstash/shutdown_watcher.rb +26 -0
  33. data/lib/logstash/state_resolver.rb +1 -3
  34. data/lib/logstash/util/dead_letter_queue_manager.rb +61 -0
  35. data/lib/logstash/util/environment_variables.rb +43 -0
  36. data/lib/logstash/util/thread_dump.rb +3 -1
  37. data/lib/logstash/version.rb +1 -1
  38. data/locales/en.yml +4 -0
  39. data/logstash-core.gemspec +4 -1
  40. data/spec/logstash/agent/converge_spec.rb +36 -35
  41. data/spec/logstash/agent_spec.rb +48 -177
  42. data/spec/{api/lib/commands/stats.rb → logstash/api/commands/stats_spec.rb} +7 -2
  43. data/spec/{api/lib → logstash/api}/errors_spec.rb +1 -1
  44. data/spec/{api/lib/api → logstash/api/modules}/logging_spec.rb +1 -10
  45. data/spec/{api/lib/api → logstash/api/modules}/node_plugins_spec.rb +1 -2
  46. data/spec/{api/lib/api → logstash/api/modules}/node_spec.rb +9 -8
  47. data/spec/{api/lib/api → logstash/api/modules}/node_stats_spec.rb +11 -9
  48. data/spec/{api/lib/api → logstash/api/modules}/plugins_spec.rb +4 -3
  49. data/spec/{api/lib/api → logstash/api/modules}/root_spec.rb +2 -2
  50. data/spec/{api/lib → logstash/api}/rack_app_spec.rb +0 -0
  51. data/spec/logstash/compiler/compiler_spec.rb +72 -9
  52. data/spec/logstash/config/source/local_spec.rb +20 -4
  53. data/spec/logstash/config/source/multi_local_spec.rb +113 -0
  54. data/spec/logstash/execution_context_spec.rb +14 -4
  55. data/spec/logstash/inputs/base_spec.rb +1 -1
  56. data/spec/logstash/instrument/wrapped_write_client_spec.rb +34 -19
  57. data/spec/logstash/output_delegator_spec.rb +1 -1
  58. data/spec/logstash/outputs/base_spec.rb +1 -1
  59. data/spec/logstash/pipeline_action/reload_spec.rb +1 -1
  60. data/spec/logstash/pipeline_action/stop_spec.rb +1 -1
  61. data/spec/logstash/pipeline_dlq_commit_spec.rb +107 -0
  62. data/spec/logstash/pipeline_pq_file_spec.rb +3 -1
  63. data/spec/logstash/pipeline_reporter_spec.rb +2 -1
  64. data/spec/logstash/pipeline_spec.rb +54 -43
  65. data/spec/logstash/runner_spec.rb +27 -36
  66. data/spec/logstash/settings/array_coercible_spec.rb +65 -0
  67. data/spec/logstash/settings_spec.rb +91 -0
  68. data/spec/logstash/shutdown_watcher_spec.rb +10 -16
  69. data/spec/logstash/state_resolver_spec.rb +6 -4
  70. data/spec/support/helpers.rb +16 -3
  71. data/spec/support/shared_contexts.rb +26 -2
  72. metadata +42 -39
  73. data/lib/logstash/instrument/metric_type/mean.rb +0 -33
  74. data/spec/api/lib/api/support/resource_dsl_methods.rb +0 -87
  75. data/spec/api/spec_helper.rb +0 -106
@@ -1,10 +1,15 @@
1
1
  # encoding: utf-8
2
- require_relative "../../spec_helper"
2
+ require "spec_helper"
3
3
 
4
4
  describe LogStash::Api::Commands::Stats do
5
+ include_context "api setup"
5
6
 
6
7
  let(:report_method) { :run }
7
- subject(:report) { report_class.new.send(report_method) }
8
+ subject(:report) do
9
+ factory = ::LogStash::Api::CommandFactory.new(LogStash::Api::Service.new(@agent))
10
+
11
+ factory.build(:stats).send(report_method)
12
+ end
8
13
 
9
14
  let(:report_class) { described_class }
10
15
 
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- require_relative "../spec_helper"
2
+ require "spec_helper"
3
3
  require "logstash/api/errors"
4
4
 
5
5
  describe LogStash::Api::ApiError do
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- require_relative "../../spec_helper"
2
+ require "spec_helper"
3
3
  require "sinatra"
4
4
  require "logstash/api/modules/logging"
5
5
  require "logstash/json"
@@ -10,15 +10,6 @@ describe LogStash::Api::Modules::Logging do
10
10
  describe "#logging" do
11
11
 
12
12
  context "when setting a logger's log level" do
13
- before(:all) do
14
- @runner = LogStashRunner.new
15
- @runner.start
16
- end
17
-
18
- after(:all) do
19
- @runner.stop
20
- end
21
-
22
13
  it "should return a positive acknowledgement on success" do
23
14
  put '/', '{"logger.logstash": "ERROR"}'
24
15
  payload = LogStash::Json.load(last_response.body)
@@ -1,6 +1,5 @@
1
1
  # encoding: utf-8
2
- require_relative "../../../support/shared_examples"
3
- require_relative "../../spec_helper"
2
+ require "spec_helper"
4
3
  require "sinatra"
5
4
  require "logstash/api/modules/plugins"
6
5
  require "logstash/json"
@@ -1,6 +1,5 @@
1
1
  # encoding: utf-8
2
- require_relative "../../spec_helper"
3
- require_relative "../../../support/shared_examples"
2
+ require "spec_helper"
4
3
  require "sinatra"
5
4
  require "logstash/api/modules/node"
6
5
  require "logstash/json"
@@ -110,12 +109,14 @@ describe LogStash::Api::Modules::Node do
110
109
  extend ResourceDSLMethods
111
110
 
112
111
  root_structure = {
113
- "pipeline" => {
114
- "workers" => Numeric,
115
- "batch_size" => Numeric,
116
- "batch_delay" => Numeric,
117
- "config_reload_automatic" => Boolean,
118
- "config_reload_interval" => Numeric
112
+ "pipelines" => {
113
+ "main" => {
114
+ "workers" => Numeric,
115
+ "batch_size" => Numeric,
116
+ "batch_delay" => Numeric,
117
+ "config_reload_automatic" => Boolean,
118
+ "config_reload_interval" => Numeric
119
+ }
119
120
  },
120
121
  "os" => {
121
122
  "name" => String,
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- require_relative "../../spec_helper"
3
- require_relative "../../../support/shared_examples"
2
+ require "spec_helper"
3
+
4
4
  require "sinatra"
5
5
  require "logstash/api/modules/node_stats"
6
6
  require "logstash/json"
@@ -73,13 +73,15 @@ describe LogStash::Api::Modules::NodeStats do
73
73
  "load_average" => { "1m" => Numeric }
74
74
  }
75
75
  },
76
- "pipeline" => {
77
- "events" => {
78
- "duration_in_millis" => Numeric,
79
- "in" => Numeric,
80
- "filtered" => Numeric,
81
- "out" => Numeric,
82
- "queue_push_duration_in_millis" => Numeric
76
+ "pipelines" => {
77
+ "main" => {
78
+ "events" => {
79
+ "duration_in_millis" => Numeric,
80
+ "in" => Numeric,
81
+ "filtered" => Numeric,
82
+ "out" => Numeric,
83
+ "queue_push_duration_in_millis" => Numeric
84
+ }
83
85
  }
84
86
  },
85
87
  "reloads" => {
@@ -1,6 +1,5 @@
1
1
  # encoding: utf-8
2
- require_relative "../../spec_helper"
3
- require_relative "../../../support/shared_examples"
2
+ require "spec_helper"
4
3
  require "sinatra"
5
4
  require "logstash/api/modules/plugins"
6
5
  require "logstash/json"
@@ -40,7 +39,9 @@ describe LogStash::Api::Modules::Plugins do
40
39
 
41
40
  it "return a list of available plugins" do
42
41
  payload["plugins"].each do |plugin|
43
- expect(plugin).to be_available?
42
+ expect do
43
+ Gem::Specification.find_by_name(plugin["name"])
44
+ end.not_to raise_error
44
45
  end
45
46
  end
46
47
 
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
- require_relative "../../spec_helper"
3
- require_relative "../../../support/shared_examples"
2
+ require "spec_helper"
3
+
4
4
  require "sinatra"
5
5
  require "logstash/api/modules/root"
6
6
  require "logstash/json"
File without changes
@@ -8,15 +8,65 @@ describe LogStash::Compiler do
8
8
  Java::OrgLogstashConfigIr::DSL
9
9
  end
10
10
 
11
+ let(:source_protocol) { "test_proto" }
12
+
11
13
  # Static import of these useful enums
12
14
  INPUT = Java::OrgLogstashConfigIr::PluginDefinition::Type::INPUT
13
15
  FILTER = Java::OrgLogstashConfigIr::PluginDefinition::Type::FILTER
14
16
  OUTPUT = Java::OrgLogstashConfigIr::PluginDefinition::Type::OUTPUT
15
17
  CODEC = Java::OrgLogstashConfigIr::PluginDefinition::Type::OUTPUT
16
18
 
19
+ shared_examples_for("component source_with_metadata") do
20
+ it "should set the correct protocol" do
21
+ expect(component.source_with_metadata.protocol).to eq(source_protocol)
22
+ end
23
+
24
+ it "should set the id to the source id" do
25
+ expect(component.source_with_metadata.id).to eq(source_id)
26
+ end
27
+ end
28
+
17
29
  describe "compiling to Pipeline" do
18
- subject(:source_file) { "fake_sourcefile" }
19
- subject(:compiled) { described_class.compile_pipeline(source, source_file) }
30
+ subject(:source_id) { "fake_sourcefile" }
31
+ let(:source_with_metadata) { org.logstash.common.SourceWithMetadata.new(source_protocol, source_id, source) }
32
+ subject(:compiled) { described_class.compile_pipeline(source_with_metadata) }
33
+
34
+ describe "compiling multiple sources" do
35
+ let(:sources) do
36
+ [
37
+ "input { input_0 {} } filter { filter_0 {} } output { output_0 {} }",
38
+ "input { input_1 {} } filter { filter_1 {} } output { output_1 {} }"
39
+ ]
40
+ end
41
+ let(:sources_with_metadata) do
42
+ sources.map.with_index do |source, idx|
43
+ org.logstash.common.SourceWithMetadata.new("#{source_protocol}_#{idx}", "#{source_id}_#{idx}", source)
44
+ end
45
+ end
46
+
47
+ subject(:pipeline) { described_class.compile_sources(*sources_with_metadata) }
48
+
49
+ it "should compile cleanly" do
50
+ expect(pipeline).to be_a(org.logstash.config.ir.PipelineIR)
51
+ end
52
+
53
+ it "should provide the original source" do
54
+ expect(pipeline.original_source).to eq(sources.join("\n"))
55
+ end
56
+
57
+ describe "applying protocol and id metadata" do
58
+ it "should apply the correct source metadata to all components" do
59
+ pipeline.plugin_vertices.each do |pv|
60
+ name_idx = pv.plugin_definition.name.split("_").last
61
+ source_protocol_idx = pv.source_with_metadata.protocol.split("_").last
62
+ source_id_idx = pv.source_with_metadata.id.split("_").last
63
+
64
+ expect(name_idx).to eq(source_protocol_idx)
65
+ expect(name_idx).to eq(source_id_idx)
66
+ end
67
+ end
68
+ end
69
+ end
20
70
 
21
71
  describe "complex configs" do
22
72
  shared_examples_for "compilable LSCL files" do |path|
@@ -40,8 +90,9 @@ describe LogStash::Compiler do
40
90
  end
41
91
 
42
92
  describe "compiling imperative" do
43
- let(:source_file) { "fake_sourcefile" }
44
- subject(:compiled) { described_class.compile_imperative(source, source_file) }
93
+ let(:source_id) { "fake_sourcefile" }
94
+ let(:source_with_metadata) { org.logstash.common.SourceWithMetadata.new(source_protocol, source_id, source) }
95
+ subject(:compiled) { described_class.compile_imperative(source_with_metadata) }
45
96
 
46
97
  describe "an empty file" do
47
98
  let(:source) { "input {} output {}" }
@@ -63,7 +114,7 @@ describe LogStash::Compiler do
63
114
  let(:source) { "input { generator {} } output { }" }
64
115
 
65
116
  it "should attach correct source text for components" do
66
- expect(compiled[:input].get_meta.getText).to eql("generator {}")
117
+ expect(compiled[:input].source_with_metadata.getText).to eql("generator {}")
67
118
  end
68
119
  end
69
120
 
@@ -106,6 +157,10 @@ describe LogStash::Compiler do
106
157
  it "should contain the single input" do
107
158
  expect(input).to ir_eql(j.iPlugin(INPUT, "generator"))
108
159
  end
160
+
161
+ it_should_behave_like("component source_with_metadata") do
162
+ let(:component) { input }
163
+ end
109
164
  end
110
165
 
111
166
  describe "two inputs" do
@@ -190,12 +245,12 @@ describe LogStash::Compiler do
190
245
  end
191
246
 
192
247
  it "should attach source_with_metadata with correct info to the statements" do
193
- meta = compiled_section.statements.first.meta
248
+ meta = compiled_section.statements.first.source_with_metadata
194
249
  expect(meta.text).to eql("aplugin { count => 1 }")
195
250
  expect(meta.line).to eql(2)
196
251
  expect(meta.column).to eql(13)
197
- expect(meta.id).to eql(source_file)
198
- expect(compiled_section.statements.first.meta)
252
+ expect(meta.id).to eql(source_id)
253
+ expect(compiled_section.statements.first.source_with_metadata)
199
254
  expect(compiled_section)
200
255
  end
201
256
  end
@@ -559,9 +614,13 @@ describe LogStash::Compiler do
559
614
  describe "a single filter" do
560
615
  let(:source) { "input { } filter { grok {} } output { }" }
561
616
 
562
- it "should contain the single input" do
617
+ it "should contain the single filter" do
563
618
  expect(filter).to ir_eql(j.iPlugin(FILTER, "grok"))
564
619
  end
620
+
621
+ it_should_behave_like("component source_with_metadata") do
622
+ let(:component) { filter }
623
+ end
565
624
  end
566
625
 
567
626
  it_should_behave_like "complex grammar", :filter
@@ -576,6 +635,10 @@ describe LogStash::Compiler do
576
635
  it "should contain the single input" do
577
636
  expect(output).to ir_eql(j.iPlugin(OUTPUT, "stdout"))
578
637
  end
638
+
639
+ it_should_behave_like("component source_with_metadata") do
640
+ let(:component) { output }
641
+ end
579
642
  end
580
643
 
581
644
  it_should_behave_like "complex grammar", :output
@@ -292,8 +292,9 @@ describe LogStash::Config::Source::Local do
292
292
  )
293
293
  end
294
294
 
295
- it "returns a merged config" do
296
- expect(subject.pipeline_configs.first.config_string).to include(input_block, output_block, filter_block)
295
+ # this should be impossible as the bootstrap checks should catch this
296
+ it "raises an exception" do
297
+ expect { subject.pipeline_configs }.to raise_error
297
298
  end
298
299
  end
299
300
 
@@ -353,13 +354,28 @@ describe LogStash::Config::Source::Local do
353
354
  )
354
355
  end
355
356
 
356
- it "returns a merged config" do
357
- expect(subject.pipeline_configs.first.config_string).to include(input_block, filter_block)
357
+ it "raises an exception" do
358
+ expect { subject.pipeline_configs }.to raise_error
358
359
  end
359
360
  end
360
361
  end
361
362
 
362
363
  context "incomplete configuration" do
364
+ context "when using path.config" do
365
+ let(:config_string) { filter_block }
366
+ let(:config_path) do
367
+ file = Stud::Temporary.file
368
+ path = file.path
369
+ file.write(config_string)
370
+ path
371
+ end
372
+ let(:settings) { mock_settings( "path.config" => config_path) }
373
+
374
+ it "doesn't add anything" do
375
+ expect(subject.pipeline_configs.first.config_string).not_to include(LogStash::Config::Defaults.output, LogStash::Config::Defaults.input)
376
+ end
377
+ end
378
+
363
379
  context "when the input block is missing" do
364
380
  let(:settings) { mock_settings( "config.string" => "#{filter_block} #{output_block}") }
365
381
 
@@ -0,0 +1,113 @@
1
+ # encoding: utf-8
2
+ require "logstash/config/source/multi_local"
3
+ require "rspec/expectations"
4
+ require "stud/temporary"
5
+ require "fileutils"
6
+ require "pathname"
7
+ require_relative "../../../support/helpers"
8
+ require_relative "../../../support/matchers"
9
+ require "spec_helper"
10
+ require "webmock/rspec"
11
+
12
+ describe LogStash::Config::Source::MultiLocal do
13
+ subject { described_class.new(settings) }
14
+ let(:settings) { mock_settings({}) }
15
+ let(:pipelines_yaml_location) { "" }
16
+
17
+ before(:each) do
18
+ allow(subject).to receive(:pipelines_yaml_location).and_return(pipelines_yaml_location)
19
+ end
20
+
21
+ describe "#match?" do
22
+ context "when `config.string` is set" do
23
+ let(:settings) do
24
+ mock_settings("config.string" => "")
25
+ end
26
+ it "returns false" do
27
+ expect(subject.match?).to be_falsey
28
+ end
29
+ end
30
+
31
+ context "when `config.path` are set`" do
32
+ let(:config_file) { temporary_file("") }
33
+
34
+ let(:settings) do
35
+ mock_settings("path.config" => config_file)
36
+ end
37
+
38
+ it "returns false" do
39
+ expect(subject.match?).to be_falsey
40
+ end
41
+ end
42
+
43
+ context "when both `config.string` and `path.config` are set" do
44
+ let(:settings) do
45
+ mock_settings("config.string" => "", "path.config" => temporary_file(""))
46
+ end
47
+ it "returns false" do
48
+ expect(subject.match?).to be_falsey
49
+ end
50
+ end
51
+
52
+ context "when neither `config.path` nor `path.config` are set`" do
53
+ it "returns true" do
54
+ expect(subject.match?).to be_truthy
55
+ end
56
+ end
57
+ end
58
+ describe "#detect_duplicate_pipelines" do
59
+ let(:retrieved_pipelines) { [{}] }
60
+ let(:retrieved_pipelines_configs) { retrieved_pipelines.map {|h| mock_settings(h) } }
61
+ context "when there are duplicate pipeline ids" do
62
+ let(:retrieved_pipelines) do
63
+ [
64
+ {"pipeline.id" => "main", "config.string" => ""},
65
+ {"pipeline.id" => "main", "config.string" => ""},
66
+ ]
67
+ end
68
+ it "should raise a ConfigurationError" do
69
+ expect { subject.detect_duplicate_pipelines(retrieved_pipelines_configs) }.to raise_error(::LogStash::ConfigurationError)
70
+ end
71
+ end
72
+ context "when there are no duplicate pipeline ids" do
73
+ let(:retrieved_pipelines) do
74
+ [
75
+ {"pipeline.id" => "main", "config.string" => ""},
76
+ {"pipeline.id" => "backup", "config.string" => ""},
77
+ ]
78
+ end
79
+ it "should not raise an error" do
80
+ expect { subject.detect_duplicate_pipelines(retrieved_pipelines_configs) }.to_not raise_error
81
+ end
82
+ end
83
+ end
84
+
85
+ describe "#pipeline_configs" do
86
+ let(:retrieved_pipelines) do
87
+ [
88
+ { "pipeline.id" => "main", "config.string" => "" },
89
+ { "pipeline.id" => "backup", "config.string" => "" }
90
+ ]
91
+ end
92
+ before(:each) do
93
+ allow(subject).to receive(:retrieve_yaml_pipelines).and_return(retrieved_pipelines)
94
+ end
95
+
96
+ it "should return instances of PipelineConfig" do
97
+ configs = subject.pipeline_configs
98
+ expect(configs).to be_a(Array)
99
+ expect(subject.pipeline_configs.first).to be_a(::LogStash::Config::PipelineConfig)
100
+ expect(subject.pipeline_configs.last).to be_a(::LogStash::Config::PipelineConfig)
101
+ end
102
+
103
+ context "using non pipeline related settings" do
104
+ let(:retrieved_pipelines) do [
105
+ { "pipeline.id" => "main", "config.string" => "", "http.port" => 22222 },
106
+ ]
107
+ end
108
+ it "should raise and error" do
109
+ expect { subject.pipeline_configs }.to raise_error(ArgumentError)
110
+ end
111
+ end
112
+ end
113
+ end