logstash-core 5.0.0.alpha1.snapshot1-java → 5.0.0.alpha1.snapshot2-java
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of logstash-core might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/logstash-core/version.rb +1 -1
- data/lib/logstash/agent.rb +1 -1
- data/lib/logstash/config/config_ast.rb +1 -1
- data/lib/logstash/config/loader.rb +10 -5
- data/lib/logstash/config/mixin.rb +37 -14
- data/lib/logstash/instrument/periodic_poller/base.rb +2 -2
- data/lib/logstash/output_delegator.rb +1 -1
- data/lib/logstash/pipeline.rb +22 -11
- data/lib/logstash/runner.rb +22 -7
- data/lib/logstash/version.rb +1 -1
- data/locales/en.yml +10 -0
- data/logstash-core.gemspec +2 -2
- data/spec/logstash/agent_spec.rb +39 -0
- data/spec/logstash/config/config_ast_spec.rb +33 -0
- data/spec/logstash/config/mixin_spec.rb +9 -1
- data/spec/logstash/pipeline_spec.rb +19 -0
- data/spec/logstash/runner_spec.rb +51 -0
- metadata +40 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1897b709706618fc25d95076f5260446a6552313
|
4
|
+
data.tar.gz: ef6d4c66c9f72d39a3bcca7bad86ce1b493b1933
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96edfe806e2fe9c0848cbfe10b3aeb780dc67c63e007792126bd6e0f166ece56ed79caab924d4cdbaaeae561400414d3efb7ae56a48378c9a179144f14c642a0
|
7
|
+
data.tar.gz: c8b0b175e21c70203a2978b2c5b1973633694b42c09fb0e72784e1827ad25aee4c245656770f54e060db98190630605e171a130faa3f1b92870c21bfd0046cdf
|
data/lib/logstash/agent.rb
CHANGED
@@ -37,7 +37,7 @@ class LogStash::Agent
|
|
37
37
|
@web_api_http_host = params[:web_api_http_host]
|
38
38
|
@web_api_http_port = params[:web_api_http_port]
|
39
39
|
|
40
|
-
@config_loader = LogStash::Config::Loader.new(@logger)
|
40
|
+
@config_loader = LogStash::Config::Loader.new(@logger, params[:debug_config])
|
41
41
|
@reload_interval = params[:reload_interval] || 3 # seconds
|
42
42
|
@upgrade_mutex = Mutex.new
|
43
43
|
|
@@ -391,7 +391,7 @@ module LogStash; module Config; module AST
|
|
391
391
|
if type == "filter"
|
392
392
|
i = LogStash::Config::AST.defered_conditionals_index += 1
|
393
393
|
source = <<-CODE
|
394
|
-
|
394
|
+
define_singleton_method :cond_func_#{i} do |input_events|
|
395
395
|
result = []
|
396
396
|
input_events.each do |event|
|
397
397
|
events = [event]
|
@@ -1,8 +1,9 @@
|
|
1
1
|
require "logstash/config/defaults"
|
2
2
|
|
3
3
|
module LogStash; module Config; class Loader
|
4
|
-
def initialize(logger)
|
4
|
+
def initialize(logger, debug_config=false)
|
5
5
|
@logger = logger
|
6
|
+
@debug_config = debug_config
|
6
7
|
end
|
7
8
|
|
8
9
|
def format_config(config_path, config_string)
|
@@ -69,14 +70,18 @@ module LogStash; module Config; class Loader
|
|
69
70
|
encoding_issue_files << file
|
70
71
|
end
|
71
72
|
config << cfg + "\n"
|
72
|
-
|
73
|
-
|
73
|
+
if @debug_config
|
74
|
+
@logger.debug? && @logger.debug("\nThe following is the content of a file", :config_file => file.to_s)
|
75
|
+
@logger.debug? && @logger.debug("\n" + cfg + "\n\n")
|
76
|
+
end
|
74
77
|
end
|
75
78
|
if encoding_issue_files.any?
|
76
79
|
fail("The following config files contains non-ascii characters but are not UTF-8 encoded #{encoding_issue_files}")
|
77
80
|
end
|
78
|
-
|
79
|
-
|
81
|
+
if @debug_config
|
82
|
+
@logger.debug? && @logger.debug("\nThe following is the merged configuration")
|
83
|
+
@logger.debug? && @logger.debug("\n" + config + "\n\n")
|
84
|
+
end
|
80
85
|
return config
|
81
86
|
end # def load_config
|
82
87
|
|
@@ -38,7 +38,8 @@ module LogStash::Config::Mixin
|
|
38
38
|
PLUGIN_VERSION_1_0_0 = LogStash::Util::PluginVersion.new(1, 0, 0)
|
39
39
|
PLUGIN_VERSION_0_9_0 = LogStash::Util::PluginVersion.new(0, 9, 0)
|
40
40
|
|
41
|
-
|
41
|
+
ALLOW_ENV_FLAG = "__ALLOW_ENV__"
|
42
|
+
ENV_PLACEHOLDER_REGEX = /\$\{(?<name>\w+)(\:(?<default>[^}]*))?\}/
|
42
43
|
|
43
44
|
# This method is called when someone does 'include LogStash::Config'
|
44
45
|
def self.included(base)
|
@@ -47,13 +48,21 @@ module LogStash::Config::Mixin
|
|
47
48
|
end
|
48
49
|
|
49
50
|
def config_init(params)
|
51
|
+
# HACK(talevy): https://github.com/elastic/logstash/issues/4958
|
52
|
+
# Currently, the regular plugins params argument is hijacked
|
53
|
+
# to pass along the `allow_env` configuration variable. This was done as to
|
54
|
+
# not change the method signature of Plugin. This also makes it difficul to
|
55
|
+
# reason about at the same time. ALLOW_ENV_FLAG is a special param that users
|
56
|
+
# are now forbidden to set in their configuration definitions.
|
57
|
+
allow_env = params.delete(LogStash::Config::Mixin::ALLOW_ENV_FLAG) { false }
|
58
|
+
|
50
59
|
# Validation will modify the values inside params if necessary.
|
51
60
|
# For example: converting a string to a number, etc.
|
52
61
|
|
53
62
|
# Keep a copy of the original config params so that we can later
|
54
63
|
# differentiate between explicit configuration and implicit (default)
|
55
64
|
# configuration.
|
56
|
-
|
65
|
+
original_params = params.clone
|
57
66
|
|
58
67
|
# store the plugin type, turns LogStash::Inputs::Base into 'input'
|
59
68
|
@plugin_type = self.class.ancestors.find { |a| a.name =~ /::Base$/ }.config_name
|
@@ -102,22 +111,25 @@ module LogStash::Config::Mixin
|
|
102
111
|
end
|
103
112
|
|
104
113
|
# Resolve environment variables references
|
105
|
-
|
106
|
-
|
107
|
-
value.
|
108
|
-
value
|
109
|
-
|
110
|
-
else
|
111
|
-
if (value.is_a?(Array))
|
112
|
-
value.each_index do |valueArrayIndex|
|
113
|
-
value[valueArrayIndex] = replace_env_placeholders(value[valueArrayIndex])
|
114
|
+
if allow_env
|
115
|
+
params.each do |name, value|
|
116
|
+
if (value.is_a?(Hash))
|
117
|
+
value.each do |valueHashKey, valueHashValue|
|
118
|
+
value[valueHashKey.to_s] = replace_env_placeholders(valueHashValue)
|
114
119
|
end
|
115
120
|
else
|
116
|
-
|
121
|
+
if (value.is_a?(Array))
|
122
|
+
value.each_index do |valueArrayIndex|
|
123
|
+
value[valueArrayIndex] = replace_env_placeholders(value[valueArrayIndex])
|
124
|
+
end
|
125
|
+
else
|
126
|
+
params[name.to_s] = replace_env_placeholders(value)
|
127
|
+
end
|
117
128
|
end
|
118
129
|
end
|
119
130
|
end
|
120
131
|
|
132
|
+
|
121
133
|
if !self.class.validate(params)
|
122
134
|
raise LogStash::ConfigurationError,
|
123
135
|
I18n.t("logstash.runner.configuration.invalid_plugin_settings")
|
@@ -142,6 +154,11 @@ module LogStash::Config::Mixin
|
|
142
154
|
instance_variable_set("@#{key}", value)
|
143
155
|
end
|
144
156
|
|
157
|
+
# now that we know the parameters are valid, we can obfuscate the original copy
|
158
|
+
# of the parameters before storing them as an instance variable
|
159
|
+
self.class.secure_params!(original_params)
|
160
|
+
@original_params = original_params
|
161
|
+
|
145
162
|
@config = params
|
146
163
|
end # def config_init
|
147
164
|
|
@@ -149,7 +166,6 @@ module LogStash::Config::Mixin
|
|
149
166
|
# Process following patterns : $VAR, ${VAR}, ${VAR:defaultValue}
|
150
167
|
def replace_env_placeholders(value)
|
151
168
|
return value unless value.is_a?(String)
|
152
|
-
#raise ArgumentError, "Cannot replace ENV placeholders on non-strings. Got #{value.class}" if !value.is_a?(String)
|
153
169
|
|
154
170
|
value.gsub(ENV_PLACEHOLDER_REGEX) do |placeholder|
|
155
171
|
# Note: Ruby docs claim[1] Regexp.last_match is thread-local and scoped to
|
@@ -163,7 +179,6 @@ module LogStash::Config::Mixin
|
|
163
179
|
if replacement.nil?
|
164
180
|
raise LogStash::ConfigurationError, "Cannot evaluate `#{placeholder}`. Environment variable `#{name}` is not set and there is no default value given."
|
165
181
|
end
|
166
|
-
@logger.info? && @logger.info("Evaluating environment variable placeholder", :placeholder => placeholder, :replacement => replacement)
|
167
182
|
replacement
|
168
183
|
end
|
169
184
|
end # def replace_env_placeholders
|
@@ -537,6 +552,14 @@ module LogStash::Config::Mixin
|
|
537
552
|
return true, result
|
538
553
|
end # def validate_value
|
539
554
|
|
555
|
+
def secure_params!(params)
|
556
|
+
params.each do |key, value|
|
557
|
+
if @config[key][:validate] == :password && !value.is_a?(::LogStash::Util::Password)
|
558
|
+
params[key] = ::LogStash::Util::Password.new(value)
|
559
|
+
end
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
540
563
|
def hash_or_array(value)
|
541
564
|
if !value.is_a?(Hash)
|
542
565
|
value = [*value] # coerce scalar to array if necessary
|
@@ -34,14 +34,14 @@ module LogStash module Instrument module PeriodicPoller
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def start
|
37
|
-
logger.debug("PeriodicPoller: Starting",
|
37
|
+
logger.debug("PeriodicPoller: Starting",
|
38
38
|
:polling_interval => @options[:polling_interval],
|
39
39
|
:polling_timeout => @options[:polling_timeout]) if logger.debug?
|
40
40
|
@task.execute
|
41
41
|
end
|
42
42
|
|
43
43
|
def stop
|
44
|
-
logger.debug("PeriodicPoller: Stopping"
|
44
|
+
logger.debug("PeriodicPoller: Stopping")
|
45
45
|
@task.shutdown
|
46
46
|
end
|
47
47
|
|
data/lib/logstash/pipeline.rb
CHANGED
@@ -44,7 +44,9 @@ module LogStash; class Pipeline
|
|
44
44
|
:pipeline_batch_size => 125,
|
45
45
|
:pipeline_batch_delay => 5, # in milliseconds
|
46
46
|
:flush_interval => 5, # in seconds
|
47
|
-
:flush_timeout_interval => 60 # in seconds
|
47
|
+
:flush_timeout_interval => 60, # in seconds
|
48
|
+
:debug_config => false,
|
49
|
+
:allow_env => false
|
48
50
|
}
|
49
51
|
MAX_INFLIGHT_WARN_THRESHOLD = 10_000
|
50
52
|
|
@@ -52,15 +54,6 @@ module LogStash; class Pipeline
|
|
52
54
|
"LogStash::Inputs::Stdin"
|
53
55
|
]
|
54
56
|
|
55
|
-
def self.validate_config(config_str, settings = {})
|
56
|
-
begin
|
57
|
-
# There should be a better way to test this
|
58
|
-
self.new(config_str, settings)
|
59
|
-
rescue => e
|
60
|
-
e.message
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
57
|
def initialize(config_str, settings = {})
|
65
58
|
@config_str = config_str
|
66
59
|
@original_settings = settings
|
@@ -69,6 +62,7 @@ module LogStash; class Pipeline
|
|
69
62
|
@settings = DEFAULT_SETTINGS.clone
|
70
63
|
settings.each {|setting, value| configure(setting, value) }
|
71
64
|
@reporter = LogStash::PipelineReporter.new(@logger, self)
|
65
|
+
@allow_env = settings[:allow_env]
|
72
66
|
|
73
67
|
@inputs = nil
|
74
68
|
@filters = nil
|
@@ -99,7 +93,10 @@ module LogStash; class Pipeline
|
|
99
93
|
|
100
94
|
# The config code is hard to represent as a log message...
|
101
95
|
# So just print it.
|
102
|
-
|
96
|
+
|
97
|
+
if @settings[:debug_config] && logger.debug?
|
98
|
+
logger.debug("Compiled pipeline code", :code => code)
|
99
|
+
end
|
103
100
|
|
104
101
|
begin
|
105
102
|
eval(code)
|
@@ -456,6 +453,7 @@ module LogStash; class Pipeline
|
|
456
453
|
|
457
454
|
def plugin(plugin_type, name, *args)
|
458
455
|
args << {} if args.empty?
|
456
|
+
args.first.merge!(LogStash::Config::Mixin::ALLOW_ENV_FLAG => @allow_env)
|
459
457
|
|
460
458
|
pipeline_scoped_metric = metric.namespace([:stats, :pipelines, pipeline_id.to_s.to_sym, :plugins])
|
461
459
|
|
@@ -555,4 +553,17 @@ module LogStash; class Pipeline
|
|
555
553
|
end
|
556
554
|
end
|
557
555
|
|
556
|
+
# Sometimes we log stuff that will dump the pipeline which may contain
|
557
|
+
# sensitive information (like the raw syntax tree which can contain passwords)
|
558
|
+
# We want to hide most of what's in here
|
559
|
+
def inspect
|
560
|
+
{
|
561
|
+
:pipeline_id => @pipeline_id,
|
562
|
+
:settings => @settings.inspect,
|
563
|
+
:ready => @ready,
|
564
|
+
:running => @running,
|
565
|
+
:flushing => @flushing
|
566
|
+
}
|
567
|
+
end
|
568
|
+
|
558
569
|
end end
|
data/lib/logstash/runner.rb
CHANGED
@@ -53,6 +53,10 @@ class LogStash::Runner < Clamp::Command
|
|
53
53
|
option "--verbose", :flag, I18n.t("logstash.runner.flag.verbose")
|
54
54
|
option "--debug", :flag, I18n.t("logstash.runner.flag.debug")
|
55
55
|
|
56
|
+
option ["--debug-config"], :flag,
|
57
|
+
I18n.t("logstash.runner.flag.debug_config"),
|
58
|
+
:attribute_name => :debug_config, :default => false
|
59
|
+
|
56
60
|
option ["-V", "--version"], :flag,
|
57
61
|
I18n.t("logstash.runner.flag.version")
|
58
62
|
|
@@ -94,6 +98,10 @@ class LogStash::Runner < Clamp::Command
|
|
94
98
|
I18n.t("logstash.web_api.flag.http_port"),
|
95
99
|
:attribute_name => :web_api_http_port, :default => 9600
|
96
100
|
|
101
|
+
option ["--allow-env"], :flag,
|
102
|
+
I18n.t("logstash.runner.flag.allow-env"),
|
103
|
+
:attribute_name => :allow_env, :default => false
|
104
|
+
|
97
105
|
def pipeline_workers=(pipeline_workers_value)
|
98
106
|
@pipeline_settings[:pipeline_workers] = validate_positive_integer(pipeline_workers_value)
|
99
107
|
end
|
@@ -166,14 +174,14 @@ class LogStash::Runner < Clamp::Command
|
|
166
174
|
end
|
167
175
|
|
168
176
|
if config_test?
|
169
|
-
config_loader = LogStash::Config::Loader.new(@logger,
|
177
|
+
config_loader = LogStash::Config::Loader.new(@logger, @debug_config)
|
170
178
|
config_str = config_loader.format_config(config_path, config_string)
|
171
|
-
|
172
|
-
|
179
|
+
begin
|
180
|
+
LogStash::Pipeline.new(config_str)
|
173
181
|
@logger.terminal "Configuration OK"
|
174
182
|
return 0
|
175
|
-
|
176
|
-
@logger.fatal I18n.t("logstash.
|
183
|
+
rescue => e
|
184
|
+
@logger.fatal I18n.t("logstash.runner.invalid-configuration", :error => e.message)
|
177
185
|
return 1
|
178
186
|
end
|
179
187
|
end
|
@@ -184,12 +192,15 @@ class LogStash::Runner < Clamp::Command
|
|
184
192
|
:collect_metric => true,
|
185
193
|
:debug => debug?,
|
186
194
|
:node_name => node_name,
|
195
|
+
:debug_config => debug_config?,
|
187
196
|
:web_api_http_host => @web_api_http_host,
|
188
197
|
:web_api_http_port => @web_api_http_port)
|
189
198
|
|
190
199
|
@agent.register_pipeline("main", @pipeline_settings.merge({
|
191
200
|
:config_string => config_string,
|
192
|
-
:config_path => config_path
|
201
|
+
:config_path => config_path,
|
202
|
+
:debug_config => debug_config?,
|
203
|
+
:allow_env => allow_env?
|
193
204
|
}))
|
194
205
|
|
195
206
|
# enable sigint/sigterm before starting the agent
|
@@ -213,7 +224,7 @@ class LogStash::Runner < Clamp::Command
|
|
213
224
|
show_short_help
|
214
225
|
return 1
|
215
226
|
rescue => e
|
216
|
-
@logger.fatal
|
227
|
+
@logger.fatal(I18n.t("oops"), :error => e, :backtrace => e.backtrace)
|
217
228
|
return 1
|
218
229
|
ensure
|
219
230
|
Stud::untrap("INT", sigint_id) unless sigint_id.nil?
|
@@ -318,6 +329,10 @@ class LogStash::Runner < Clamp::Command
|
|
318
329
|
@logger.subscribe(STDOUT)
|
319
330
|
end
|
320
331
|
|
332
|
+
if debug_config? && @logger.level != :debug
|
333
|
+
@logger.warn("--debug-config was specified, but log level was not set to --debug! No config info will be logged.")
|
334
|
+
end
|
335
|
+
|
321
336
|
# TODO(sissel): redirect stdout/stderr to the log as well
|
322
337
|
# http://jira.codehaus.org/browse/JRUBY-7003
|
323
338
|
end # def configure_logging
|
data/lib/logstash/version.rb
CHANGED
data/locales/en.yml
CHANGED
@@ -91,6 +91,8 @@ en:
|
|
91
91
|
bin/logstash -i SHELL [--quiet|verbose|debug]
|
92
92
|
bin/logstash -V [--verbose|debug]
|
93
93
|
bin/logstash --help
|
94
|
+
invalid-configuration: >-
|
95
|
+
The given configuration is invalid. Reason: %{error}
|
94
96
|
missing-configuration: >-
|
95
97
|
No configuration file was specified. Perhaps you forgot to provide
|
96
98
|
the '-f yourlogstash.conf' flag?
|
@@ -180,6 +182,10 @@ en:
|
|
180
182
|
the empty string for the '-e' flag.
|
181
183
|
configtest: |+
|
182
184
|
Check configuration for valid syntax and then exit.
|
185
|
+
allow-env: |+
|
186
|
+
EXPERIMENTAL. Enables templating of environment variable
|
187
|
+
values. Instances of "${VAR}" in strings will be replaced
|
188
|
+
with the respective environment variable value named "VAR".
|
183
189
|
pipeline-workers: |+
|
184
190
|
Sets the number of pipeline workers to run.
|
185
191
|
pipeline-batch-size: |+
|
@@ -237,3 +243,7 @@ en:
|
|
237
243
|
it will default to the current hostname.
|
238
244
|
agent: |+
|
239
245
|
Specify an alternate agent plugin name.
|
246
|
+
debug_config: |+
|
247
|
+
Print the compiled config ruby code out as a debug log (you must also have --debug enabled).
|
248
|
+
WARNING: This will include any 'password' options passed to plugin configs as plaintext, and may result
|
249
|
+
in plaintext passwords appearing in your logs!
|
data/logstash-core.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.require_paths = ["lib"]
|
18
18
|
gem.version = LOGSTASH_CORE_VERSION.gsub(/-/, '.')
|
19
19
|
|
20
|
-
gem.add_runtime_dependency "logstash-core-event-java", "~> 5.0.0.alpha1.
|
20
|
+
gem.add_runtime_dependency "logstash-core-event-java", "~> 5.0.0.alpha1.snapshot2"
|
21
21
|
|
22
22
|
gem.add_runtime_dependency "cabin", "~> 0.8.0" #(Apache 2.0 license)
|
23
23
|
gem.add_runtime_dependency "pry", "~> 0.10.1" #(Ruby license)
|
@@ -30,7 +30,7 @@ Gem::Specification.new do |gem|
|
|
30
30
|
gem.add_runtime_dependency 'puma', '~> 2.16', '>= 2.16.0'
|
31
31
|
gem.add_runtime_dependency "jruby-openssl", "0.9.13" # Required to support TLSv1.2
|
32
32
|
gem.add_runtime_dependency "chronic_duration", "0.10.6"
|
33
|
-
gem.add_runtime_dependency "jruby-monitoring", '~> 0.1'
|
33
|
+
gem.add_runtime_dependency "jruby-monitoring", '~> 0.3.1'
|
34
34
|
|
35
35
|
# TODO(sissel): Treetop 1.5.x doesn't seem to work well, but I haven't
|
36
36
|
# investigated what the cause might be. -Jordan
|
data/spec/logstash/agent_spec.rb
CHANGED
@@ -191,6 +191,45 @@ describe LogStash::Agent do
|
|
191
191
|
end
|
192
192
|
end
|
193
193
|
|
194
|
+
describe "Environment Variables In Configs" do
|
195
|
+
let(:agent_args) { {
|
196
|
+
:logger => logger,
|
197
|
+
:auto_reload => false,
|
198
|
+
:reload_interval => 0.01
|
199
|
+
} }
|
200
|
+
let(:pipeline_id) { "main" }
|
201
|
+
let(:pipeline_config) { "input { generator { message => '${FOO}-bar' } } filter { } output { }" }
|
202
|
+
let(:pipeline_settings) { {
|
203
|
+
:config_string => pipeline_config,
|
204
|
+
} }
|
205
|
+
|
206
|
+
context "when allow_env is false" do
|
207
|
+
it "does not interpolate environment variables" do
|
208
|
+
expect(subject).to receive(:fetch_config).and_return(pipeline_config)
|
209
|
+
subject.register_pipeline(pipeline_id, pipeline_settings)
|
210
|
+
expect(subject.pipelines[pipeline_id].inputs.first.message).to eq("${FOO}-bar")
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
context "when allow_env is true" do
|
215
|
+
before :each do
|
216
|
+
@foo_content = ENV["FOO"]
|
217
|
+
ENV["FOO"] = "foo"
|
218
|
+
pipeline_settings.merge!(:allow_env => true)
|
219
|
+
end
|
220
|
+
|
221
|
+
after :each do
|
222
|
+
ENV["FOO"] = @foo_content
|
223
|
+
end
|
224
|
+
|
225
|
+
it "doesn't upgrade the state" do
|
226
|
+
expect(subject).to receive(:fetch_config).and_return(pipeline_config)
|
227
|
+
subject.register_pipeline(pipeline_id, pipeline_settings)
|
228
|
+
expect(subject.pipelines[pipeline_id].inputs.first.message).to eq("foo-bar")
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
194
233
|
describe "#upgrade_pipeline" do
|
195
234
|
let(:pipeline_id) { "main" }
|
196
235
|
let(:pipeline_config) { "input { } filter { } output { }" }
|
@@ -143,4 +143,37 @@ describe LogStashConfigParser do
|
|
143
143
|
end
|
144
144
|
end
|
145
145
|
end
|
146
|
+
|
147
|
+
context "when creating two instances of the same configuration" do
|
148
|
+
|
149
|
+
let(:config_string) {
|
150
|
+
"input { generator { } }
|
151
|
+
filter {
|
152
|
+
if [type] == 'test' { filter1 { } }
|
153
|
+
}
|
154
|
+
output {
|
155
|
+
output1 { }
|
156
|
+
}"
|
157
|
+
}
|
158
|
+
|
159
|
+
let(:pipeline_klass) do
|
160
|
+
Class.new do
|
161
|
+
def initialize(config)
|
162
|
+
grammar = LogStashConfigParser.new
|
163
|
+
@config = grammar.parse(config)
|
164
|
+
@code = @config.compile
|
165
|
+
eval(@code)
|
166
|
+
end
|
167
|
+
def plugin(*args);end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
describe "generated conditional functionals" do
|
172
|
+
it "should be defined at instance level" do
|
173
|
+
instance_1 = pipeline_klass.new(config_string)
|
174
|
+
instance_2 = pipeline_klass.new(config_string)
|
175
|
+
expect(instance_1.method(:cond_func_1).owner).to_not be(instance_2.method(:cond_func_1).owner)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
146
179
|
end
|
@@ -96,6 +96,10 @@ describe LogStash::Config::Mixin do
|
|
96
96
|
clone = subject.class.new(subject.params)
|
97
97
|
expect(clone.password.value).to(be == secret)
|
98
98
|
end
|
99
|
+
|
100
|
+
it "should obfuscate original_params" do
|
101
|
+
expect(subject.original_params['password']).to(be_a(LogStash::Util::Password))
|
102
|
+
end
|
99
103
|
end
|
100
104
|
|
101
105
|
describe "obsolete settings" do
|
@@ -161,6 +165,10 @@ describe LogStash::Config::Mixin do
|
|
161
165
|
config :oneNumber, :validate => :number
|
162
166
|
config :oneArray, :validate => :array
|
163
167
|
config :oneHash, :validate => :hash
|
168
|
+
|
169
|
+
def initialize(params)
|
170
|
+
super(params.merge(LogStash::Config::Mixin::ALLOW_ENV_FLAG => true))
|
171
|
+
end
|
164
172
|
end
|
165
173
|
end
|
166
174
|
|
@@ -213,7 +221,7 @@ describe LogStash::Config::Mixin do
|
|
213
221
|
"oneString" => "${FunString:foo}",
|
214
222
|
"oneBoolean" => "${FunBool:false}",
|
215
223
|
"oneArray" => [ "first array value", "${FunString:foo}" ],
|
216
|
-
"oneHash" => { "key1" => "${FunString:foo}", "key2" => "$FunString is ${FunBool}", "key3" => "${FunBool:false} or ${funbool:false}" }
|
224
|
+
"oneHash" => { "key1" => "${FunString:foo}", "key2" => "${FunString} is ${FunBool}", "key3" => "${FunBool:false} or ${funbool:false}" }
|
217
225
|
)
|
218
226
|
end
|
219
227
|
|
@@ -137,6 +137,25 @@ describe LogStash::Pipeline do
|
|
137
137
|
eos
|
138
138
|
}
|
139
139
|
|
140
|
+
describe "debug compiled" do
|
141
|
+
let(:logger) { double("pipeline logger").as_null_object }
|
142
|
+
|
143
|
+
before do
|
144
|
+
expect(Cabin::Channel).to receive(:get).with(LogStash).and_return(logger).at_least(:once)
|
145
|
+
allow(logger).to receive(:debug?).and_return(true)
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should not receive a debug message with the compiled code" do
|
149
|
+
expect(logger).not_to receive(:debug).with(/Compiled pipeline/, anything)
|
150
|
+
pipeline = TestPipeline.new(test_config_with_filters)
|
151
|
+
end
|
152
|
+
|
153
|
+
it "should print the compiled code if debug_config is set to true" do
|
154
|
+
expect(logger).to receive(:debug).with(/Compiled pipeline/, anything)
|
155
|
+
pipeline = TestPipeline.new(test_config_with_filters, :debug_config => true)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
140
159
|
context "when there is no command line -w N set" do
|
141
160
|
it "starts one filter thread" do
|
142
161
|
msg = "Defaulting pipeline worker threads to 1 because there are some filters that might not work with multiple worker threads"
|
@@ -16,6 +16,7 @@ describe LogStash::Runner do
|
|
16
16
|
|
17
17
|
before :each do
|
18
18
|
allow(Cabin::Channel).to receive(:get).with(LogStash).and_return(channel)
|
19
|
+
allow(channel).to receive(:subscribe).with(any_args)
|
19
20
|
end
|
20
21
|
|
21
22
|
describe "argument parsing" do
|
@@ -95,6 +96,26 @@ describe LogStash::Runner do
|
|
95
96
|
end
|
96
97
|
end
|
97
98
|
|
99
|
+
describe "--config-test" do
|
100
|
+
subject { LogStash::Runner.new("") }
|
101
|
+
let(:args) { ["-t", "-e", pipeline_string] }
|
102
|
+
|
103
|
+
context "with a good configuration" do
|
104
|
+
let(:pipeline_string) { "input { } filter { } output { }" }
|
105
|
+
it "should exit successfuly" do
|
106
|
+
expect(channel).to receive(:terminal)
|
107
|
+
expect(subject.run(args)).to eq(0)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
context "with a bad configuration" do
|
112
|
+
let(:pipeline_string) { "rlwekjhrewlqrkjh" }
|
113
|
+
it "should fail by returning a bad exit code" do
|
114
|
+
expect(channel).to receive(:fatal)
|
115
|
+
expect(subject.run(args)).to eq(1)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
98
119
|
describe "pipeline settings" do
|
99
120
|
let(:pipeline_string) { "input { stdin {} } output { stdout {} }" }
|
100
121
|
let(:main_pipeline_settings) { { :pipeline_id => "main" } }
|
@@ -125,5 +146,35 @@ describe LogStash::Runner do
|
|
125
146
|
subject.run("bin/logstash", args)
|
126
147
|
end
|
127
148
|
end
|
149
|
+
|
150
|
+
describe "debug_config" do
|
151
|
+
it "should set 'debug_config' to false by default" do
|
152
|
+
expect(LogStash::Config::Loader).to receive(:new).with(anything, false).and_call_original
|
153
|
+
expect(LogStash::Pipeline).to receive(:new).with(pipeline_string, hash_including(:debug_config => false)).and_return(pipeline)
|
154
|
+
args = ["--debug", "-e", pipeline_string]
|
155
|
+
subject.run("bin/logstash", args)
|
156
|
+
end
|
157
|
+
|
158
|
+
it "should allow overriding debug_config" do
|
159
|
+
expect(LogStash::Config::Loader).to receive(:new).with(anything, true).and_call_original
|
160
|
+
expect(LogStash::Pipeline).to receive(:new).with(pipeline_string, hash_including(:debug_config => true)).and_return(pipeline)
|
161
|
+
args = ["--debug", "--debug-config", "-e", pipeline_string]
|
162
|
+
subject.run("bin/logstash", args)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
context "when configuring environment variable support" do
|
167
|
+
it "should set 'allow_env' to false by default" do
|
168
|
+
args = ["-e", pipeline_string]
|
169
|
+
expect(LogStash::Pipeline).to receive(:new).with(pipeline_string, hash_including(:allow_env => false)).and_return(pipeline)
|
170
|
+
subject.run("bin/logstash", args)
|
171
|
+
end
|
172
|
+
|
173
|
+
it "should support templating environment variables" do
|
174
|
+
args = ["-e", pipeline_string, "--allow-env"]
|
175
|
+
expect(LogStash::Pipeline).to receive(:new).with(pipeline_string, hash_including(:allow_env => true)).and_return(pipeline)
|
176
|
+
subject.run("bin/logstash", args)
|
177
|
+
end
|
178
|
+
end
|
128
179
|
end
|
129
180
|
end
|
metadata
CHANGED
@@ -1,33 +1,33 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.0.alpha1.
|
4
|
+
version: 5.0.0.alpha1.snapshot2
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|
15
15
|
requirements:
|
16
|
-
- - ~>
|
16
|
+
- - "~>"
|
17
17
|
- !ruby/object:Gem::Version
|
18
|
-
version: 5.0.0.alpha1.
|
18
|
+
version: 5.0.0.alpha1.snapshot2
|
19
19
|
name: logstash-core-event-java
|
20
20
|
prerelease: false
|
21
21
|
type: :runtime
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 5.0.0.alpha1.
|
26
|
+
version: 5.0.0.alpha1.snapshot2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
29
29
|
requirements:
|
30
|
-
- - ~>
|
30
|
+
- - "~>"
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 0.8.0
|
33
33
|
name: cabin
|
@@ -35,13 +35,13 @@ dependencies:
|
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.8.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
|
-
- - ~>
|
44
|
+
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
46
|
version: 0.10.1
|
47
47
|
name: pry
|
@@ -49,13 +49,13 @@ dependencies:
|
|
49
49
|
type: :runtime
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.10.1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
requirement: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
|
-
- - ~>
|
58
|
+
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
60
|
version: 0.0.19
|
61
61
|
name: stud
|
@@ -63,13 +63,13 @@ dependencies:
|
|
63
63
|
type: :runtime
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - ~>
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 0.0.19
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
|
-
- - ~>
|
72
|
+
- - "~>"
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: 0.6.5
|
75
75
|
name: clamp
|
@@ -77,7 +77,7 @@ dependencies:
|
|
77
77
|
type: :runtime
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - ~>
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 0.6.5
|
83
83
|
- !ruby/object:Gem::Dependency
|
@@ -97,7 +97,7 @@ dependencies:
|
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
requirement: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
|
-
- - ~>
|
100
|
+
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: 0.8.3
|
103
103
|
name: gems
|
@@ -105,7 +105,7 @@ dependencies:
|
|
105
105
|
type: :runtime
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - ~>
|
108
|
+
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 0.8.3
|
111
111
|
- !ruby/object:Gem::Dependency
|
@@ -125,10 +125,10 @@ dependencies:
|
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
requirement: !ruby/object:Gem::Requirement
|
127
127
|
requirements:
|
128
|
-
- - ~>
|
128
|
+
- - "~>"
|
129
129
|
- !ruby/object:Gem::Version
|
130
130
|
version: '1.4'
|
131
|
-
- -
|
131
|
+
- - ">="
|
132
132
|
- !ruby/object:Gem::Version
|
133
133
|
version: 1.4.6
|
134
134
|
name: sinatra
|
@@ -136,19 +136,19 @@ dependencies:
|
|
136
136
|
type: :runtime
|
137
137
|
version_requirements: !ruby/object:Gem::Requirement
|
138
138
|
requirements:
|
139
|
-
- - ~>
|
139
|
+
- - "~>"
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: '1.4'
|
142
|
-
- -
|
142
|
+
- - ">="
|
143
143
|
- !ruby/object:Gem::Version
|
144
144
|
version: 1.4.6
|
145
145
|
- !ruby/object:Gem::Dependency
|
146
146
|
requirement: !ruby/object:Gem::Requirement
|
147
147
|
requirements:
|
148
|
-
- - ~>
|
148
|
+
- - "~>"
|
149
149
|
- !ruby/object:Gem::Version
|
150
150
|
version: '2.16'
|
151
|
-
- -
|
151
|
+
- - ">="
|
152
152
|
- !ruby/object:Gem::Version
|
153
153
|
version: 2.16.0
|
154
154
|
name: puma
|
@@ -156,10 +156,10 @@ dependencies:
|
|
156
156
|
type: :runtime
|
157
157
|
version_requirements: !ruby/object:Gem::Requirement
|
158
158
|
requirements:
|
159
|
-
- - ~>
|
159
|
+
- - "~>"
|
160
160
|
- !ruby/object:Gem::Version
|
161
161
|
version: '2.16'
|
162
|
-
- -
|
162
|
+
- - ">="
|
163
163
|
- !ruby/object:Gem::Version
|
164
164
|
version: 2.16.0
|
165
165
|
- !ruby/object:Gem::Dependency
|
@@ -193,21 +193,21 @@ dependencies:
|
|
193
193
|
- !ruby/object:Gem::Dependency
|
194
194
|
requirement: !ruby/object:Gem::Requirement
|
195
195
|
requirements:
|
196
|
-
- - ~>
|
196
|
+
- - "~>"
|
197
197
|
- !ruby/object:Gem::Version
|
198
|
-
version:
|
198
|
+
version: 0.3.1
|
199
199
|
name: jruby-monitoring
|
200
200
|
prerelease: false
|
201
201
|
type: :runtime
|
202
202
|
version_requirements: !ruby/object:Gem::Requirement
|
203
203
|
requirements:
|
204
|
-
- - ~>
|
204
|
+
- - "~>"
|
205
205
|
- !ruby/object:Gem::Version
|
206
|
-
version:
|
206
|
+
version: 0.3.1
|
207
207
|
- !ruby/object:Gem::Dependency
|
208
208
|
requirement: !ruby/object:Gem::Requirement
|
209
209
|
requirements:
|
210
|
-
- - <
|
210
|
+
- - "<"
|
211
211
|
- !ruby/object:Gem::Version
|
212
212
|
version: 1.5.0
|
213
213
|
name: treetop
|
@@ -215,7 +215,7 @@ dependencies:
|
|
215
215
|
type: :runtime
|
216
216
|
version_requirements: !ruby/object:Gem::Requirement
|
217
217
|
requirements:
|
218
|
-
- - <
|
218
|
+
- - "<"
|
219
219
|
- !ruby/object:Gem::Version
|
220
220
|
version: 1.5.0
|
221
221
|
- !ruby/object:Gem::Dependency
|
@@ -235,7 +235,7 @@ dependencies:
|
|
235
235
|
- !ruby/object:Gem::Dependency
|
236
236
|
requirement: !ruby/object:Gem::Requirement
|
237
237
|
requirements:
|
238
|
-
- - ~>
|
238
|
+
- - "~>"
|
239
239
|
- !ruby/object:Gem::Version
|
240
240
|
version: 0.5.4
|
241
241
|
name: minitar
|
@@ -243,13 +243,13 @@ dependencies:
|
|
243
243
|
type: :runtime
|
244
244
|
version_requirements: !ruby/object:Gem::Requirement
|
245
245
|
requirements:
|
246
|
-
- - ~>
|
246
|
+
- - "~>"
|
247
247
|
- !ruby/object:Gem::Version
|
248
248
|
version: 0.5.4
|
249
249
|
- !ruby/object:Gem::Dependency
|
250
250
|
requirement: !ruby/object:Gem::Requirement
|
251
251
|
requirements:
|
252
|
-
- - ~>
|
252
|
+
- - "~>"
|
253
253
|
- !ruby/object:Gem::Version
|
254
254
|
version: 1.1.7
|
255
255
|
name: rubyzip
|
@@ -257,13 +257,13 @@ dependencies:
|
|
257
257
|
type: :runtime
|
258
258
|
version_requirements: !ruby/object:Gem::Requirement
|
259
259
|
requirements:
|
260
|
-
- - ~>
|
260
|
+
- - "~>"
|
261
261
|
- !ruby/object:Gem::Version
|
262
262
|
version: 1.1.7
|
263
263
|
- !ruby/object:Gem::Dependency
|
264
264
|
requirement: !ruby/object:Gem::Requirement
|
265
265
|
requirements:
|
266
|
-
- - ~>
|
266
|
+
- - "~>"
|
267
267
|
- !ruby/object:Gem::Version
|
268
268
|
version: 0.3.5
|
269
269
|
name: thread_safe
|
@@ -271,13 +271,13 @@ dependencies:
|
|
271
271
|
type: :runtime
|
272
272
|
version_requirements: !ruby/object:Gem::Requirement
|
273
273
|
requirements:
|
274
|
-
- - ~>
|
274
|
+
- - "~>"
|
275
275
|
- !ruby/object:Gem::Version
|
276
276
|
version: 0.3.5
|
277
277
|
- !ruby/object:Gem::Dependency
|
278
278
|
requirement: !ruby/object:Gem::Requirement
|
279
279
|
requirements:
|
280
|
-
- - ~>
|
280
|
+
- - "~>"
|
281
281
|
- !ruby/object:Gem::Version
|
282
282
|
version: 0.3.7
|
283
283
|
name: jrjackson
|
@@ -285,7 +285,7 @@ dependencies:
|
|
285
285
|
type: :runtime
|
286
286
|
version_requirements: !ruby/object:Gem::Requirement
|
287
287
|
requirements:
|
288
|
-
- - ~>
|
288
|
+
- - "~>"
|
289
289
|
- !ruby/object:Gem::Version
|
290
290
|
version: 0.3.7
|
291
291
|
description: The core components of logstash, the scalable log and event management tool
|
@@ -445,12 +445,12 @@ require_paths:
|
|
445
445
|
- lib
|
446
446
|
required_ruby_version: !ruby/object:Gem::Requirement
|
447
447
|
requirements:
|
448
|
-
- -
|
448
|
+
- - ">="
|
449
449
|
- !ruby/object:Gem::Version
|
450
450
|
version: '0'
|
451
451
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
452
452
|
requirements:
|
453
|
-
- -
|
453
|
+
- - ">"
|
454
454
|
- !ruby/object:Gem::Version
|
455
455
|
version: 1.3.1
|
456
456
|
requirements: []
|