logstash-core 2.4.1-java → 5.0.0.alpha1-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 +124 -411
- data/lib/logstash/api/init.ru +31 -0
- data/lib/logstash/api/lib/app.rb +40 -0
- data/lib/logstash/api/lib/app/command.rb +29 -0
- data/lib/logstash/api/lib/app/command_factory.rb +29 -0
- data/lib/logstash/api/lib/app/commands/stats/events_command.rb +13 -0
- data/lib/logstash/api/lib/app/commands/stats/hotthreads_command.rb +120 -0
- data/lib/logstash/api/lib/app/commands/stats/memory_command.rb +25 -0
- data/lib/logstash/api/lib/app/commands/system/basicinfo_command.rb +15 -0
- data/lib/logstash/api/lib/app/commands/system/plugins_command.rb +28 -0
- data/lib/logstash/api/lib/app/modules/node.rb +25 -0
- data/lib/logstash/api/lib/app/modules/node_stats.rb +51 -0
- data/lib/logstash/api/lib/app/modules/plugins.rb +15 -0
- data/lib/logstash/api/lib/app/modules/stats.rb +21 -0
- data/lib/logstash/api/lib/app/root.rb +13 -0
- data/lib/logstash/api/lib/app/service.rb +61 -0
- data/lib/logstash/api/lib/app/stats.rb +56 -0
- data/lib/logstash/api/lib/helpers/app_helpers.rb +23 -0
- data/lib/logstash/codecs/base.rb +1 -29
- data/lib/logstash/config/config_ast.rb +18 -31
- data/lib/logstash/config/loader.rb +3 -5
- data/lib/logstash/config/mixin.rb +25 -64
- data/lib/logstash/filter_delegator.rb +65 -0
- data/lib/logstash/inputs/base.rb +1 -1
- data/lib/logstash/inputs/metrics.rb +47 -0
- data/lib/logstash/instrument/collector.rb +109 -0
- data/lib/logstash/instrument/metric.rb +102 -0
- data/lib/logstash/instrument/metric_store.rb +228 -0
- data/lib/logstash/instrument/metric_type.rb +24 -0
- data/lib/logstash/instrument/metric_type/base.rb +35 -0
- data/lib/logstash/instrument/metric_type/counter.rb +29 -0
- data/lib/logstash/instrument/metric_type/gauge.rb +22 -0
- data/lib/logstash/instrument/metric_type/mean.rb +33 -0
- data/lib/logstash/instrument/namespaced_metric.rb +54 -0
- data/lib/logstash/instrument/null_metric.rb +4 -3
- data/lib/logstash/instrument/periodic_poller/base.rb +57 -0
- data/lib/logstash/instrument/periodic_poller/jvm.rb +92 -0
- data/lib/logstash/instrument/periodic_poller/os.rb +13 -0
- data/lib/logstash/instrument/periodic_poller/periodic_poller_observer.rb +19 -0
- data/lib/logstash/instrument/periodic_pollers.rb +26 -0
- data/lib/logstash/instrument/snapshot.rb +16 -0
- data/lib/logstash/json.rb +2 -3
- data/lib/logstash/namespace.rb +1 -0
- data/lib/logstash/output_delegator.rb +16 -3
- data/lib/logstash/outputs/base.rb +1 -32
- data/lib/logstash/pipeline.rb +67 -8
- data/lib/logstash/plugin.rb +57 -19
- data/lib/logstash/runner.rb +348 -84
- data/lib/logstash/util.rb +9 -0
- data/lib/logstash/util/duration_formatter.rb +15 -0
- data/lib/logstash/util/java_version.rb +2 -4
- data/lib/logstash/util/loggable.rb +29 -0
- data/lib/logstash/version.rb +1 -1
- data/lib/logstash/webserver.rb +98 -0
- data/locales/en.yml +42 -24
- data/logstash-core.gemspec +9 -6
- data/spec/api/lib/api/node_spec.rb +64 -0
- data/spec/api/lib/api/node_stats_spec.rb +68 -0
- data/spec/api/lib/api/plugins_spec.rb +57 -0
- data/spec/api/lib/api/root_spec.rb +20 -0
- data/spec/api/lib/api/stats_spec.rb +19 -0
- data/spec/api/lib/commands/events_spec.rb +17 -0
- data/spec/api/lib/commands/jvm_spec.rb +45 -0
- data/spec/api/spec_helper.rb +128 -0
- data/spec/logstash/agent_spec.rb +62 -169
- data/spec/logstash/config/config_ast_spec.rb +2 -47
- data/spec/logstash/config/mixin_spec.rb +0 -157
- data/spec/logstash/filter_delegator_spec.rb +143 -0
- data/spec/logstash/inputs/metrics_spec.rb +52 -0
- data/spec/logstash/instrument/collector_spec.rb +49 -0
- data/spec/logstash/instrument/metric_spec.rb +110 -0
- data/spec/logstash/instrument/metric_store_spec.rb +163 -0
- data/spec/logstash/instrument/metric_type/counter_spec.rb +40 -0
- data/spec/logstash/instrument/metric_type/gauge_spec.rb +40 -0
- data/spec/logstash/instrument/namespaced_metric_spec.rb +25 -0
- data/spec/logstash/instrument/null_metric_spec.rb +9 -51
- data/spec/logstash/json_spec.rb +14 -0
- data/spec/logstash/output_delegator_spec.rb +6 -3
- data/spec/logstash/outputs/base_spec.rb +0 -107
- data/spec/logstash/pipeline_spec.rb +204 -33
- data/spec/logstash/plugin_spec.rb +80 -15
- data/spec/logstash/runner_spec.rb +134 -38
- data/spec/logstash/shutdown_watcher_spec.rb +0 -1
- data/spec/logstash/util/duration_formatter_spec.rb +11 -0
- data/spec/logstash/util/java_version_spec.rb +10 -2
- data/spec/logstash/util_spec.rb +28 -0
- data/spec/support/matchers.rb +30 -0
- metadata +154 -20
- data/lib/logstash/logging/json.rb +0 -21
- data/lib/logstash/special_agent.rb +0 -8
- data/lib/logstash/util/safe_uri.rb +0 -50
- data/spec/logstash/codecs/base_spec.rb +0 -74
- data/spec/static/i18n_spec.rb +0 -25
@@ -0,0 +1,61 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/instrument/collector"
|
3
|
+
require "logstash/util/loggable"
|
4
|
+
|
5
|
+
class LogStash::Api::Service
|
6
|
+
|
7
|
+
include Singleton
|
8
|
+
include LogStash::Util::Loggable
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@snapshot_rotation_mutex = Mutex.new
|
12
|
+
@snapshot = nil
|
13
|
+
logger.debug("[api-service] start") if logger.debug?
|
14
|
+
LogStash::Instrument::Collector.instance.add_observer(self)
|
15
|
+
end
|
16
|
+
|
17
|
+
def stop
|
18
|
+
logger.debug("[api-service] stop") if logger.debug?
|
19
|
+
LogStash::Instrument::Collector.instance.delete_observer(self)
|
20
|
+
end
|
21
|
+
|
22
|
+
def agent
|
23
|
+
LogStash::Instrument::Collector.instance.agent
|
24
|
+
end
|
25
|
+
|
26
|
+
def started?
|
27
|
+
!@snapshot.nil? && has_counters?
|
28
|
+
end
|
29
|
+
|
30
|
+
def update(snapshot)
|
31
|
+
logger.debug("[api-service] snapshot received", :snapshot => snapshot) if logger.debug?
|
32
|
+
if @snapshot_rotation_mutex.try_lock
|
33
|
+
@snapshot = snapshot
|
34
|
+
@snapshot_rotation_mutex.unlock
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def get(key)
|
39
|
+
metric_store = @snapshot.metric_store
|
40
|
+
if key == :jvm_memory_stats
|
41
|
+
data = metric_store.get_with_path("jvm/memory")[:jvm][:memory]
|
42
|
+
else
|
43
|
+
data = metric_store.get_with_path("stats/events")
|
44
|
+
end
|
45
|
+
LogStash::Json.dump(data)
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def has_counters?
|
51
|
+
(["LogStash::Instrument::MetricType::Counter", "LogStash::Instrument::MetricType::Gauge"] - metric_types).empty?
|
52
|
+
end
|
53
|
+
|
54
|
+
def metric_types
|
55
|
+
types = []
|
56
|
+
@snapshot_rotation_mutex.synchronize do
|
57
|
+
types = @snapshot.metric_store.all.map { |t| t.class.to_s }
|
58
|
+
end
|
59
|
+
return types
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "app"
|
3
|
+
require "app/stats/events_command"
|
4
|
+
require "app/stats/hotthreads_command"
|
5
|
+
|
6
|
+
module LogStash::Api
|
7
|
+
class Stats < BaseApp
|
8
|
+
|
9
|
+
helpers AppHelpers
|
10
|
+
|
11
|
+
|
12
|
+
# Global _stats resource where all information is
|
13
|
+
# retrieved and show
|
14
|
+
get "/" do
|
15
|
+
events_command = factory.build(:events_command)
|
16
|
+
memory_command = factory.build(:memory_command)
|
17
|
+
payload = {
|
18
|
+
:events => events_command.run,
|
19
|
+
:jvm => { :memory => memory_command.run }
|
20
|
+
}
|
21
|
+
respond_with payload
|
22
|
+
end
|
23
|
+
|
24
|
+
# Show all events stats information
|
25
|
+
# (for ingested, emitted, dropped)
|
26
|
+
# - #events since startup
|
27
|
+
# - #data (bytes) since startup
|
28
|
+
# - events/s
|
29
|
+
# - bytes/s
|
30
|
+
# - dropped events/s
|
31
|
+
# - events in the pipeline
|
32
|
+
get "/events" do
|
33
|
+
command = factory.build(:events_command)
|
34
|
+
respond_with({ :events => command.run })
|
35
|
+
end
|
36
|
+
|
37
|
+
# return hot threads information
|
38
|
+
get "/jvm/hot_threads" do
|
39
|
+
top_threads_count = params["threads"] || 3
|
40
|
+
ignore_idle_threads = params["ignore_idle_threads"] || true
|
41
|
+
options = {
|
42
|
+
:threads => top_threads_count.to_i,
|
43
|
+
:ignore_idle_threads => as_boolean(ignore_idle_threads)
|
44
|
+
}
|
45
|
+
command = factory.build(:hot_threads_command)
|
46
|
+
respond_with(command.run(options), :string)
|
47
|
+
end
|
48
|
+
|
49
|
+
# return hot threads information
|
50
|
+
get "/jvm/memory" do
|
51
|
+
command = factory.build(:memory_command)
|
52
|
+
respond_with({ :memory => command.run })
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/json"
|
3
|
+
|
4
|
+
module LogStash::Api::AppHelpers
|
5
|
+
|
6
|
+
def respond_with(data, options={})
|
7
|
+
as = options.fetch(:as, :json)
|
8
|
+
pretty = params.has_key?("pretty")
|
9
|
+
if as == :json
|
10
|
+
content_type "application/json"
|
11
|
+
LogStash::Json.dump(data, {:pretty => pretty})
|
12
|
+
else
|
13
|
+
content_type "text/plain"
|
14
|
+
data.to_s
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def as_boolean(string)
|
19
|
+
return true if string == true || string =~ (/(true|t|yes|y|1)$/i)
|
20
|
+
return false if string == false || string.blank? || string =~ (/(false|f|no|n|0)$/i)
|
21
|
+
raise ArgumentError.new("invalid value for Boolean: \"#{string}\"")
|
22
|
+
end
|
23
|
+
end
|
data/lib/logstash/codecs/base.rb
CHANGED
@@ -13,7 +13,6 @@ module LogStash::Codecs; class Base < LogStash::Plugin
|
|
13
13
|
super
|
14
14
|
config_init(@params)
|
15
15
|
register if respond_to?(:register)
|
16
|
-
setup_multi_encode!
|
17
16
|
end
|
18
17
|
|
19
18
|
public
|
@@ -24,37 +23,10 @@ module LogStash::Codecs; class Base < LogStash::Plugin
|
|
24
23
|
alias_method :<<, :decode
|
25
24
|
|
26
25
|
public
|
27
|
-
# DEPRECATED: Prefer defining encode_sync or multi_encode
|
28
26
|
def encode(event)
|
29
|
-
|
30
|
-
encoded.each {|event,data| @on_event.call(event,data) }
|
27
|
+
raise "#{self.class}#encode must be overidden"
|
31
28
|
end # def encode
|
32
29
|
|
33
|
-
public
|
34
|
-
# Relies on the codec being synchronous (which they all are!)
|
35
|
-
# We need a better long term design here, but this is an improvement
|
36
|
-
# over the current API for shared plugins
|
37
|
-
# It is best if the codec implements this directly
|
38
|
-
def multi_encode(events)
|
39
|
-
if @has_encode_sync
|
40
|
-
events.map {|event| [event, self.encode_sync(event)]}
|
41
|
-
else
|
42
|
-
batch = Thread.current[:logstash_output_codec_batch] ||= []
|
43
|
-
batch.clear
|
44
|
-
|
45
|
-
events.each {|event| self.encode(event) }
|
46
|
-
batch
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def setup_multi_encode!
|
51
|
-
@has_encode_sync = self.methods.include?(:encode_sync)
|
52
|
-
|
53
|
-
on_event do |event, data|
|
54
|
-
Thread.current[:logstash_output_codec_batch] << [event, data]
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
30
|
public
|
59
31
|
def close; end;
|
60
32
|
|
@@ -76,14 +76,6 @@ module LogStash; module Config; module AST
|
|
76
76
|
@defered_conditionals_index = val
|
77
77
|
end
|
78
78
|
|
79
|
-
def self.plugin_instance_index
|
80
|
-
@plugin_instance_index
|
81
|
-
end
|
82
|
-
|
83
|
-
def self.plugin_instance_index=(val)
|
84
|
-
@plugin_instance_index = val
|
85
|
-
end
|
86
|
-
|
87
79
|
class Node < Treetop::Runtime::SyntaxNode
|
88
80
|
def text_value_for_comments
|
89
81
|
text_value.gsub(/[\r\n]/, " ")
|
@@ -94,7 +86,6 @@ module LogStash; module Config; module AST
|
|
94
86
|
def compile
|
95
87
|
LogStash::Config::AST.defered_conditionals = []
|
96
88
|
LogStash::Config::AST.defered_conditionals_index = 0
|
97
|
-
LogStash::Config::AST.plugin_instance_index = 0
|
98
89
|
code = []
|
99
90
|
|
100
91
|
code << <<-CODE
|
@@ -103,7 +94,6 @@ module LogStash; module Config; module AST
|
|
103
94
|
@outputs = []
|
104
95
|
@periodic_flushers = []
|
105
96
|
@shutdown_flushers = []
|
106
|
-
@generated_objects = {}
|
107
97
|
CODE
|
108
98
|
|
109
99
|
sections = recursive_select(LogStash::Config::AST::PluginSection)
|
@@ -147,9 +137,7 @@ module LogStash; module Config; module AST
|
|
147
137
|
class PluginSection < Node
|
148
138
|
# Global plugin numbering for the janky instance variable naming we use
|
149
139
|
# like @filter_<name>_1
|
150
|
-
|
151
|
-
super(*args)
|
152
|
-
end
|
140
|
+
@@i = 0
|
153
141
|
|
154
142
|
# Generate ruby code to initialize all the plugins.
|
155
143
|
def compile_initializer
|
@@ -159,31 +147,31 @@ module LogStash; module Config; module AST
|
|
159
147
|
|
160
148
|
|
161
149
|
code << <<-CODE
|
162
|
-
|
163
|
-
@#{plugin.plugin_type}s <<
|
150
|
+
#{name} = #{plugin.compile_initializer}
|
151
|
+
@#{plugin.plugin_type}s << #{name}
|
164
152
|
CODE
|
165
153
|
|
166
154
|
# The flush method for this filter.
|
167
155
|
if plugin.plugin_type == "filter"
|
168
156
|
|
169
157
|
code << <<-CODE
|
170
|
-
|
171
|
-
@logger.debug? && @logger.debug(\"Flushing\", :plugin =>
|
158
|
+
#{name}_flush = lambda do |options, &block|
|
159
|
+
@logger.debug? && @logger.debug(\"Flushing\", :plugin => #{name})
|
172
160
|
|
173
|
-
events =
|
161
|
+
events = #{name}.flush(options)
|
174
162
|
|
175
163
|
return if events.nil? || events.empty?
|
176
164
|
|
177
|
-
@logger.debug? && @logger.debug(\"Flushing\", :plugin =>
|
165
|
+
@logger.debug? && @logger.debug(\"Flushing\", :plugin => #{name}, :events => events)
|
178
166
|
|
179
167
|
#{plugin.compile_starting_here.gsub(/^/, " ")}
|
180
168
|
|
181
169
|
events.each{|e| block.call(e)}
|
182
170
|
end
|
183
171
|
|
184
|
-
if
|
185
|
-
@periodic_flushers <<
|
186
|
-
@shutdown_flushers <<
|
172
|
+
if #{name}.respond_to?(:flush)
|
173
|
+
@periodic_flushers << #{name}_flush if #{name}.periodic_flush
|
174
|
+
@shutdown_flushers << #{name}_flush
|
187
175
|
end
|
188
176
|
CODE
|
189
177
|
|
@@ -204,10 +192,9 @@ module LogStash; module Config; module AST
|
|
204
192
|
|
205
193
|
plugins.each do |plugin|
|
206
194
|
# Unique number for every plugin.
|
207
|
-
|
195
|
+
@@i += 1
|
208
196
|
# store things as ivars, like @filter_grok_3
|
209
|
-
var =
|
210
|
-
# puts("var=#{var.inspect}")
|
197
|
+
var = "@#{plugin.plugin_type}_#{plugin.plugin_name}_#{@@i}"
|
211
198
|
@variables[plugin] = var
|
212
199
|
end
|
213
200
|
return @variables
|
@@ -249,13 +236,13 @@ module LogStash; module Config; module AST
|
|
249
236
|
def compile
|
250
237
|
case plugin_type
|
251
238
|
when "input"
|
252
|
-
return "start_input(
|
239
|
+
return "start_input(#{variable_name})"
|
253
240
|
when "filter"
|
254
241
|
return <<-CODE
|
255
|
-
events =
|
242
|
+
events = #{variable_name}.multi_filter(events)
|
256
243
|
CODE
|
257
244
|
when "output"
|
258
|
-
return "targeted_outputs <<
|
245
|
+
return "targeted_outputs << #{variable_name}\n"
|
259
246
|
when "codec"
|
260
247
|
settings = attributes.recursive_select(Attribute).collect(&:compile).reject(&:empty?)
|
261
248
|
attributes_code = "LogStash::Util.hash_merge_many(#{settings.map { |c| "{ #{c} }" }.join(", ")})"
|
@@ -357,7 +344,7 @@ module LogStash; module Config; module AST
|
|
357
344
|
|
358
345
|
if duplicate_values.size > 0
|
359
346
|
raise ConfigurationError.new(
|
360
|
-
I18n.t("logstash.
|
347
|
+
I18n.t("logstash.runner.configuration.invalid_plugin_settings_duplicate_keys",
|
361
348
|
:keys => duplicate_values.join(', '),
|
362
349
|
:line => input.line_of(interval.first),
|
363
350
|
:column => input.column_of(interval.first),
|
@@ -404,7 +391,7 @@ module LogStash; module Config; module AST
|
|
404
391
|
if type == "filter"
|
405
392
|
i = LogStash::Config::AST.defered_conditionals_index += 1
|
406
393
|
source = <<-CODE
|
407
|
-
|
394
|
+
define_singleton_method :cond_func_#{i} do |input_events|
|
408
395
|
result = []
|
409
396
|
input_events.each do |event|
|
410
397
|
events = [event]
|
@@ -418,7 +405,7 @@ module LogStash; module Config; module AST
|
|
418
405
|
LogStash::Config::AST.defered_conditionals << source
|
419
406
|
|
420
407
|
<<-CODE
|
421
|
-
events =
|
408
|
+
events = cond_func_#{i}(events)
|
422
409
|
CODE
|
423
410
|
else # Output
|
424
411
|
<<-CODE
|
@@ -1,8 +1,6 @@
|
|
1
1
|
require "logstash/config/defaults"
|
2
2
|
|
3
3
|
module LogStash; module Config; class Loader
|
4
|
-
attr_accessor :debug_config
|
5
|
-
|
6
4
|
def initialize(logger, debug_config=false)
|
7
5
|
@logger = logger
|
8
6
|
@debug_config = debug_config
|
@@ -40,7 +38,7 @@ module LogStash; module Config; class Loader
|
|
40
38
|
when "file" then
|
41
39
|
local_config(uri.path)
|
42
40
|
else
|
43
|
-
fail(I18n.t("logstash.
|
41
|
+
fail(I18n.t("logstash.runner.configuration.scheme-not-supported", :path => path))
|
44
42
|
end
|
45
43
|
rescue URI::InvalidURIError
|
46
44
|
# fallback for windows.
|
@@ -55,7 +53,7 @@ module LogStash; module Config; class Loader
|
|
55
53
|
path = ::File.join(path, "*") if ::File.directory?(path)
|
56
54
|
|
57
55
|
if Dir.glob(path).length == 0
|
58
|
-
fail(I18n.t("logstash.
|
56
|
+
fail(I18n.t("logstash.runner.configuration.file-not-found", :path => path))
|
59
57
|
end
|
60
58
|
|
61
59
|
config = ""
|
@@ -91,7 +89,7 @@ module LogStash; module Config; class Loader
|
|
91
89
|
begin
|
92
90
|
Net::HTTP.get(uri) + "\n"
|
93
91
|
rescue Exception => e
|
94
|
-
fail(I18n.t("logstash.
|
92
|
+
fail(I18n.t("logstash.runner.configuration.fetch-failed", :path => uri.to_s, :message => e.message))
|
95
93
|
end
|
96
94
|
end
|
97
95
|
end end end
|
@@ -3,7 +3,6 @@ require "logstash/namespace"
|
|
3
3
|
require "logstash/config/registry"
|
4
4
|
require "logstash/logging"
|
5
5
|
require "logstash/util/password"
|
6
|
-
require "logstash/util/safe_uri"
|
7
6
|
require "logstash/version"
|
8
7
|
require "logstash/environment"
|
9
8
|
require "logstash/util/plugin_version"
|
@@ -133,7 +132,7 @@ module LogStash::Config::Mixin
|
|
133
132
|
|
134
133
|
if !self.class.validate(params)
|
135
134
|
raise LogStash::ConfigurationError,
|
136
|
-
I18n.t("logstash.
|
135
|
+
I18n.t("logstash.runner.configuration.invalid_plugin_settings")
|
137
136
|
end
|
138
137
|
|
139
138
|
# We remove any config options marked as obsolete,
|
@@ -334,89 +333,58 @@ module LogStash::Config::Mixin
|
|
334
333
|
return true
|
335
334
|
end # def validate_check_invalid_parameter_names
|
336
335
|
|
337
|
-
def validate_check_required_parameter(config_key, config_opts, k, v)
|
338
|
-
if config_key.is_a?(Regexp)
|
339
|
-
(k =~ config_key && v)
|
340
|
-
elsif config_key.is_a?(String)
|
341
|
-
k && v
|
342
|
-
end
|
343
|
-
end
|
344
|
-
|
345
336
|
def validate_check_required_parameter_names(params)
|
346
337
|
is_valid = true
|
347
338
|
|
348
339
|
@config.each do |config_key, config|
|
349
340
|
next unless config[:required]
|
350
341
|
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
end
|
356
|
-
|
357
|
-
if value.nil? || (config[:list] && Array(value).empty?)
|
358
|
-
@logger.error(I18n.t("logstash.agent.configuration.setting_missing",
|
359
|
-
:setting => config_key, :plugin => @plugin_name,
|
360
|
-
:type => @plugin_type))
|
361
|
-
is_valid = false
|
342
|
+
if config_key.is_a?(Regexp)
|
343
|
+
next if params.keys.select { |k| k =~ config_key }.length > 0
|
344
|
+
elsif config_key.is_a?(String)
|
345
|
+
next if params.keys.member?(config_key)
|
362
346
|
end
|
347
|
+
@logger.error(I18n.t("logstash.runner.configuration.setting_missing",
|
348
|
+
:setting => config_key, :plugin => @plugin_name,
|
349
|
+
:type => @plugin_type))
|
350
|
+
is_valid = false
|
363
351
|
end
|
364
352
|
|
365
353
|
return is_valid
|
366
354
|
end
|
367
355
|
|
368
|
-
def process_parameter_value(value, config_settings)
|
369
|
-
config_val = config_settings[:validate]
|
370
|
-
|
371
|
-
if config_settings[:list]
|
372
|
-
value = Array(value) # coerce scalars to lists
|
373
|
-
# Empty lists are converted to nils
|
374
|
-
return true, nil if value.empty?
|
375
|
-
|
376
|
-
validated_items = value.map {|v| validate_value(v, config_val)}
|
377
|
-
is_valid = validated_items.all? {|sr| sr[0] }
|
378
|
-
processed_value = validated_items.map {|sr| sr[1]}
|
379
|
-
else
|
380
|
-
is_valid, processed_value = validate_value(value, config_val)
|
381
|
-
end
|
382
|
-
|
383
|
-
return [is_valid, processed_value]
|
384
|
-
end
|
385
|
-
|
386
356
|
def validate_check_parameter_values(params)
|
387
357
|
# Filter out parametrs that match regexp keys.
|
388
358
|
# These are defined in plugins like this:
|
389
359
|
# config /foo.*/ => ...
|
390
|
-
|
360
|
+
is_valid = true
|
391
361
|
|
392
362
|
params.each do |key, value|
|
393
363
|
@config.keys.each do |config_key|
|
394
364
|
next unless (config_key.is_a?(Regexp) && key =~ config_key) \
|
395
365
|
|| (config_key.is_a?(String) && key == config_key)
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
if is_valid
|
402
|
-
# Accept coerced value if valid
|
366
|
+
config_val = @config[config_key][:validate]
|
367
|
+
#puts " Key matches."
|
368
|
+
success, result = validate_value(value, config_val)
|
369
|
+
if success
|
370
|
+
# Accept coerced value if success
|
403
371
|
# Used for converting values in the config to proper objects.
|
404
|
-
params[key] =
|
372
|
+
params[key] = result if !result.nil?
|
405
373
|
else
|
406
|
-
@logger.error(I18n.t("logstash.
|
374
|
+
@logger.error(I18n.t("logstash.runner.configuration.setting_invalid",
|
407
375
|
:plugin => @plugin_name, :type => @plugin_type,
|
408
376
|
:setting => key, :value => value.inspect,
|
409
|
-
:value_type =>
|
410
|
-
:note =>
|
377
|
+
:value_type => config_val,
|
378
|
+
:note => result))
|
411
379
|
end
|
412
|
-
|
413
|
-
|
380
|
+
#puts "Result: #{key} / #{result.inspect} / #{success}"
|
381
|
+
is_valid &&= success
|
414
382
|
|
415
383
|
break # done with this param key
|
416
384
|
end # config.each
|
417
385
|
end # params.each
|
418
386
|
|
419
|
-
return
|
387
|
+
return is_valid
|
420
388
|
end # def validate_check_parameter_values
|
421
389
|
|
422
390
|
def validator_find(key)
|
@@ -437,7 +405,7 @@ module LogStash::Config::Mixin
|
|
437
405
|
result = nil
|
438
406
|
|
439
407
|
if validator.nil?
|
440
|
-
return true
|
408
|
+
return true
|
441
409
|
elsif validator.is_a?(Array)
|
442
410
|
value = [*value]
|
443
411
|
if value.size > 1
|
@@ -551,12 +519,6 @@ module LogStash::Config::Mixin
|
|
551
519
|
end
|
552
520
|
|
553
521
|
result = value.first.is_a?(::LogStash::Util::Password) ? value.first : ::LogStash::Util::Password.new(value.first)
|
554
|
-
when :uri
|
555
|
-
if value.size > 1
|
556
|
-
return false, "Expected uri (one value), got #{value.size} values?"
|
557
|
-
end
|
558
|
-
|
559
|
-
result = value.first.is_a?(::LogStash::Util::SafeURI) ? value.first : ::LogStash::Util::SafeURI.new(value.first)
|
560
522
|
when :path
|
561
523
|
if value.size > 1 # Only 1 value wanted
|
562
524
|
return false, "Expected path (one value), got #{value.size} values?"
|
@@ -592,9 +554,8 @@ module LogStash::Config::Mixin
|
|
592
554
|
|
593
555
|
def secure_params!(params)
|
594
556
|
params.each do |key, value|
|
595
|
-
if
|
596
|
-
|
597
|
-
params[key] = processed_value
|
557
|
+
if @config[key][:validate] == :password && !value.is_a?(::LogStash::Util::Password)
|
558
|
+
params[key] = ::LogStash::Util::Password.new(value)
|
598
559
|
end
|
599
560
|
end
|
600
561
|
end
|