logstash-core 5.0.0.alpha1.snapshot2-java → 5.0.0.alpha2-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 +10 -0
- data/lib/logstash/codecs/base.rb +5 -0
- data/lib/logstash/config/mixin.rb +6 -1
- data/lib/logstash/filters/base.rb +4 -0
- data/lib/logstash/inputs/base.rb +5 -0
- data/lib/logstash/instrument/metric_store.rb +14 -8
- data/lib/logstash/outputs/base.rb +4 -0
- data/lib/logstash/plugin.rb +12 -12
- data/lib/logstash/plugins/registry.rb +83 -0
- data/lib/logstash/version.rb +1 -1
- data/logstash-core.gemspec +2 -2
- data/spec/logstash/agent_spec.rb +71 -8
- data/spec/logstash/pipeline_spec.rb +1 -24
- data/spec/logstash/plugin_spec.rb +13 -0
- data/spec/logstash/plugins/registry_spec.rb +57 -0
- data/spec/static/i18n_spec.rb +25 -0
- data/spec/support/mocks_classes.rb +26 -0
- metadata +48 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a4717bd46d5d6a4e8d9bd8be9be28f001084d89
|
4
|
+
data.tar.gz: bfc0707c41178176db21e5ace27a5c38382b63cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7bec4929afafd898bdff9949fc9d2ec60fb6dd83986f72501132f0c7466de6b13424fbcea03cb818dcca340282ca2f148a5078160205160f4037413a17435fb0
|
7
|
+
data.tar.gz: a6594f0732aa6efc4213757382d776ae544e7006d0ecca46cb3db9c4b7e26daa136495aa40cfaca10a07904a703edb8203ff1cb9de469cf5d371709611b873b3
|
data/lib/logstash/agent.rb
CHANGED
@@ -211,6 +211,12 @@ class LogStash::Agent
|
|
211
211
|
return unless pipeline.is_a?(LogStash::Pipeline)
|
212
212
|
return if pipeline.ready?
|
213
213
|
@logger.info("starting pipeline", :id => id)
|
214
|
+
|
215
|
+
# Reset the current collected stats,
|
216
|
+
# starting a pipeline with a new configuration should be the same as restarting
|
217
|
+
# logstash.
|
218
|
+
reset_collector
|
219
|
+
|
214
220
|
Thread.new do
|
215
221
|
LogStash::Util.set_thread_name("pipeline.#{id}")
|
216
222
|
begin
|
@@ -252,4 +258,8 @@ class LogStash::Agent
|
|
252
258
|
def clean_state?
|
253
259
|
@pipelines.empty?
|
254
260
|
end
|
261
|
+
|
262
|
+
def reset_collector
|
263
|
+
LogStash::Instrument::Collector.instance.clear
|
264
|
+
end
|
255
265
|
end # class LogStash::Agent
|
data/lib/logstash/codecs/base.rb
CHANGED
@@ -7,8 +7,13 @@ require "logstash/logging"
|
|
7
7
|
# This is the base class for logstash codecs.
|
8
8
|
module LogStash::Codecs; class Base < LogStash::Plugin
|
9
9
|
include LogStash::Config::Mixin
|
10
|
+
|
10
11
|
config_name "codec"
|
11
12
|
|
13
|
+
def self.plugin_type
|
14
|
+
"codec"
|
15
|
+
end
|
16
|
+
|
12
17
|
def initialize(params={})
|
13
18
|
super
|
14
19
|
config_init(@params)
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "logstash/namespace"
|
3
3
|
require "logstash/config/registry"
|
4
|
+
require "logstash/plugins/registry"
|
4
5
|
require "logstash/logging"
|
5
6
|
require "logstash/util/password"
|
6
7
|
require "logstash/version"
|
@@ -85,7 +86,7 @@ module LogStash::Config::Mixin
|
|
85
86
|
extra = opts[:obsolete].is_a?(String) ? opts[:obsolete] : ""
|
86
87
|
extra.gsub!("%PLUGIN%", self.class.config_name)
|
87
88
|
raise LogStash::ConfigurationError,
|
88
|
-
I18n.t("logstash.
|
89
|
+
I18n.t("logstash.runner.configuration.obsolete", :name => name,
|
89
90
|
:plugin => self.class.config_name, :extra => extra)
|
90
91
|
end
|
91
92
|
end
|
@@ -191,8 +192,12 @@ module LogStash::Config::Mixin
|
|
191
192
|
def config_name(name = nil)
|
192
193
|
@config_name = name if !name.nil?
|
193
194
|
LogStash::Config::Registry.registry[@config_name] = self
|
195
|
+
if self.respond_to?("plugin_type")
|
196
|
+
declare_plugin(self.plugin_type, @config_name)
|
197
|
+
end
|
194
198
|
return @config_name
|
195
199
|
end
|
200
|
+
alias_method :config_plugin, :config_name
|
196
201
|
|
197
202
|
# Deprecated: Declare the version of the plugin
|
198
203
|
# inside the gemspec.
|
data/lib/logstash/inputs/base.rb
CHANGED
@@ -10,6 +10,7 @@ require "logstash/util/decorators"
|
|
10
10
|
# This is the base class for Logstash inputs.
|
11
11
|
class LogStash::Inputs::Base < LogStash::Plugin
|
12
12
|
include LogStash::Config::Mixin
|
13
|
+
|
13
14
|
config_name "input"
|
14
15
|
|
15
16
|
# Add a `type` field to all events handled by this input.
|
@@ -48,6 +49,10 @@ class LogStash::Inputs::Base < LogStash::Plugin
|
|
48
49
|
attr_accessor :params
|
49
50
|
attr_accessor :threadable
|
50
51
|
|
52
|
+
def self.plugin_type
|
53
|
+
"input"
|
54
|
+
end
|
55
|
+
|
51
56
|
public
|
52
57
|
def initialize(params={})
|
53
58
|
super
|
@@ -2,6 +2,7 @@
|
|
2
2
|
require "concurrent"
|
3
3
|
require "logstash/event"
|
4
4
|
require "logstash/instrument/metric_type"
|
5
|
+
require "thread"
|
5
6
|
|
6
7
|
module LogStash module Instrument
|
7
8
|
# The Metric store the data structure that make sure the data is
|
@@ -25,6 +26,12 @@ module LogStash module Instrument
|
|
25
26
|
# This hash has only one dimension
|
26
27
|
# and allow fast retrieval of the metrics
|
27
28
|
@fast_lookup = Concurrent::Map.new
|
29
|
+
|
30
|
+
# This Mutex block the critical section for the
|
31
|
+
# structured hash, it block the zone when we first insert a metric
|
32
|
+
# in the structured hash or when we query it for search or to make
|
33
|
+
# the result available in the API.
|
34
|
+
@structured_lookup_mutex = Mutex.new
|
28
35
|
end
|
29
36
|
|
30
37
|
# This method use the namespace and key to search the corresponding value of
|
@@ -46,16 +53,13 @@ module LogStash module Instrument
|
|
46
53
|
# BUT. If the value is not present in the `@fast_lookup` the value will be inserted and
|
47
54
|
# `#puf_if_absent` will return nil. With this returned value of nil we assume that we don't
|
48
55
|
# have it in the `@metric_store` for structured search so we add it there too.
|
49
|
-
#
|
50
|
-
# The problem with only using the `@metric_store` directly all the time would require us
|
51
|
-
# to use the mutex around the structure since its a multi-level hash, without that it wont
|
52
|
-
# return a consistent value of the metric and this would slow down the code and would
|
53
|
-
# complixity the code.
|
54
56
|
if found_value = @fast_lookup.put_if_absent([namespaces, key], provided_value)
|
55
57
|
return found_value
|
56
58
|
else
|
57
|
-
|
58
|
-
|
59
|
+
@structured_lookup_mutex.synchronize do
|
60
|
+
# If we cannot find the value this mean we need to save it in the store.
|
61
|
+
fetch_or_store_namespaces(namespaces).fetch_or_store(key, provided_value)
|
62
|
+
end
|
59
63
|
return provided_value
|
60
64
|
end
|
61
65
|
end
|
@@ -89,7 +93,9 @@ module LogStash module Instrument
|
|
89
93
|
key_paths.map(&:to_sym)
|
90
94
|
new_hash = Hash.new
|
91
95
|
|
92
|
-
|
96
|
+
@structured_lookup_mutex.synchronize do
|
97
|
+
get_recursively(key_paths, @store, new_hash)
|
98
|
+
end
|
93
99
|
|
94
100
|
new_hash
|
95
101
|
end
|
data/lib/logstash/plugin.rb
CHANGED
@@ -6,6 +6,7 @@ require "logstash/instrument/null_metric"
|
|
6
6
|
require "cabin"
|
7
7
|
require "concurrent"
|
8
8
|
require "securerandom"
|
9
|
+
require "logstash/plugins/registry"
|
9
10
|
|
10
11
|
class LogStash::Plugin
|
11
12
|
attr_accessor :params
|
@@ -117,23 +118,21 @@ class LogStash::Plugin
|
|
117
118
|
# Look up a plugin by type and name.
|
118
119
|
def self.lookup(type, name)
|
119
120
|
path = "logstash/#{type}s/#{name}"
|
120
|
-
|
121
|
-
|
122
|
-
begin
|
123
|
-
return namespace_lookup(type, name)
|
124
|
-
rescue NameError
|
125
|
-
logger.debug("Plugin not defined in namespace, checking for plugin file", :type => type, :name => name, :path => path)
|
121
|
+
LogStash::Registry.instance.lookup(type ,name) do |plugin_klass, plugin_name|
|
122
|
+
is_a_plugin?(plugin_klass, plugin_name)
|
126
123
|
end
|
127
|
-
|
128
|
-
# try to load the plugin file. ex.: lookup("filter", "grok") will require logstash/filters/grok
|
129
|
-
require(path)
|
130
|
-
|
131
|
-
# check again if plugin is now defined in namespace after the require
|
132
|
-
namespace_lookup(type, name)
|
133
124
|
rescue LoadError, NameError => e
|
125
|
+
logger.debug("Problems loading the plugin with", :type => type, :name => name, :path => path)
|
134
126
|
raise(LogStash::PluginLoadingError, I18n.t("logstash.pipeline.plugin-loading-error", :type => type, :name => name, :path => path, :error => e.to_s))
|
135
127
|
end
|
136
128
|
|
129
|
+
public
|
130
|
+
def self.declare_plugin(type, name)
|
131
|
+
path = "logstash/#{type}s/#{name}"
|
132
|
+
registry = LogStash::Registry.instance
|
133
|
+
registry.register(path, self)
|
134
|
+
end
|
135
|
+
|
137
136
|
private
|
138
137
|
# lookup a plugin by type and name in the existing LogStash module namespace
|
139
138
|
# ex.: namespace_lookup("filter", "grok") looks for LogStash::Filters::Grok
|
@@ -165,4 +164,5 @@ class LogStash::Plugin
|
|
165
164
|
def self.logger
|
166
165
|
@logger ||= Cabin::Channel.get(LogStash)
|
167
166
|
end
|
167
|
+
|
168
168
|
end # class LogStash::Plugin
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'singleton'
|
3
|
+
require "rubygems/package"
|
4
|
+
|
5
|
+
module LogStash
|
6
|
+
class Registry
|
7
|
+
|
8
|
+
##
|
9
|
+
# Placeholder class for registered plugins
|
10
|
+
##
|
11
|
+
class Plugin
|
12
|
+
attr_reader :type, :name
|
13
|
+
|
14
|
+
def initialize(type, name)
|
15
|
+
@type = type
|
16
|
+
@name = name
|
17
|
+
end
|
18
|
+
|
19
|
+
def path
|
20
|
+
"logstash/#{type}s/#{name}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def cannonic_gem_name
|
24
|
+
"logstash-#{type}-#{name}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def installed?
|
28
|
+
find_plugin_spec(cannonic_gem_name).any?
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def find_plugin_spec(name)
|
34
|
+
specs = ::Gem::Specification.find_all_by_name(name)
|
35
|
+
specs.select{|spec| logstash_plugin_spec?(spec)}
|
36
|
+
end
|
37
|
+
|
38
|
+
def logstash_plugin_spec?(spec)
|
39
|
+
spec.metadata && spec.metadata["logstash_plugin"] == "true"
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
include Singleton
|
45
|
+
|
46
|
+
def initialize
|
47
|
+
@registry = {}
|
48
|
+
@logger = Cabin::Channel.get(LogStash)
|
49
|
+
end
|
50
|
+
|
51
|
+
def lookup(type, plugin_name, &block)
|
52
|
+
|
53
|
+
plugin = Plugin.new(type, plugin_name)
|
54
|
+
|
55
|
+
if plugin.installed?
|
56
|
+
return @registry[plugin.path] if registered?(plugin.path)
|
57
|
+
require plugin.path
|
58
|
+
klass = @registry[plugin.path]
|
59
|
+
if block_given? # if provided pass a block to do validation
|
60
|
+
raise LoadError unless block.call(klass, plugin_name)
|
61
|
+
end
|
62
|
+
return klass
|
63
|
+
else
|
64
|
+
# The plugin was defined directly in the code, so there is no need to use the
|
65
|
+
# require way of loading classes
|
66
|
+
return @registry[plugin.path] if registered?(plugin.path)
|
67
|
+
raise LoadError
|
68
|
+
end
|
69
|
+
rescue => e
|
70
|
+
@logger.debug("Problems loading a plugin with", :type => type, :name => plugin, :path => plugin.path, :error => e) if @logger.debug?
|
71
|
+
raise LoadError, "Problems loading the requested plugin named #{plugin_name} of type #{type}."
|
72
|
+
end
|
73
|
+
|
74
|
+
def register(path, klass)
|
75
|
+
@registry[path] = klass
|
76
|
+
end
|
77
|
+
|
78
|
+
def registered?(path)
|
79
|
+
@registry.has_key?(path)
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
data/lib/logstash/version.rb
CHANGED
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.
|
20
|
+
gem.add_runtime_dependency "logstash-core-event-java", "~> 5.0.0.alpha2"
|
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)
|
@@ -28,7 +28,7 @@ Gem::Specification.new do |gem|
|
|
28
28
|
gem.add_runtime_dependency "concurrent-ruby", "1.0.0"
|
29
29
|
gem.add_runtime_dependency "sinatra", '~> 1.4', '>= 1.4.6'
|
30
30
|
gem.add_runtime_dependency 'puma', '~> 2.16', '>= 2.16.0'
|
31
|
-
gem.add_runtime_dependency "jruby-openssl", "0.9.
|
31
|
+
gem.add_runtime_dependency "jruby-openssl", "0.9.16" # >= 0.9.13 Required to support TLSv1.2
|
32
32
|
gem.add_runtime_dependency "chronic_duration", "0.10.6"
|
33
33
|
gem.add_runtime_dependency "jruby-monitoring", '~> 0.3.1'
|
34
34
|
|
data/spec/logstash/agent_spec.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require
|
3
|
-
require
|
2
|
+
require "spec_helper"
|
3
|
+
require "stud/temporary"
|
4
|
+
require "logstash/inputs/generator"
|
5
|
+
require_relative "../support/mocks_classes"
|
4
6
|
|
5
7
|
describe LogStash::Agent do
|
6
8
|
|
@@ -80,7 +82,7 @@ describe LogStash::Agent do
|
|
80
82
|
context "with a config that contains reload incompatible plugins" do
|
81
83
|
let(:second_pipeline_config) { "input { stdin {} } filter { } output { }" }
|
82
84
|
|
83
|
-
it "does not
|
85
|
+
it "does not upgrade the new config" do
|
84
86
|
t = Thread.new { subject.execute }
|
85
87
|
sleep 0.01 until subject.running_pipelines? && subject.pipelines.values.first.ready?
|
86
88
|
expect(subject).to_not receive(:upgrade_pipeline)
|
@@ -95,10 +97,10 @@ describe LogStash::Agent do
|
|
95
97
|
context "with a config that does not contain reload incompatible plugins" do
|
96
98
|
let(:second_pipeline_config) { "input { generator { } } filter { } output { }" }
|
97
99
|
|
98
|
-
it "does
|
100
|
+
it "does upgrade the new config" do
|
99
101
|
t = Thread.new { subject.execute }
|
100
102
|
sleep 0.01 until subject.running_pipelines? && subject.pipelines.values.first.ready?
|
101
|
-
expect(subject).to receive(:upgrade_pipeline)
|
103
|
+
expect(subject).to receive(:upgrade_pipeline).once.and_call_original
|
102
104
|
File.open(config_file, "w") { |f| f.puts second_pipeline_config }
|
103
105
|
subject.send(:reload_state!)
|
104
106
|
sleep 0.1
|
@@ -134,7 +136,7 @@ describe LogStash::Agent do
|
|
134
136
|
context "with a config that contains reload incompatible plugins" do
|
135
137
|
let(:second_pipeline_config) { "input { stdin {} } filter { } output { }" }
|
136
138
|
|
137
|
-
it "does not
|
139
|
+
it "does not upgrade the new config" do
|
138
140
|
t = Thread.new { subject.execute }
|
139
141
|
sleep 0.01 until subject.running_pipelines? && subject.pipelines.values.first.ready?
|
140
142
|
expect(subject).to_not receive(:upgrade_pipeline)
|
@@ -148,10 +150,10 @@ describe LogStash::Agent do
|
|
148
150
|
context "with a config that does not contain reload incompatible plugins" do
|
149
151
|
let(:second_pipeline_config) { "input { generator { } } filter { } output { }" }
|
150
152
|
|
151
|
-
it "does
|
153
|
+
it "does upgrade the new config" do
|
152
154
|
t = Thread.new { subject.execute }
|
153
155
|
sleep 0.01 until subject.running_pipelines? && subject.pipelines.values.first.ready?
|
154
|
-
expect(subject).to receive(:upgrade_pipeline).
|
156
|
+
expect(subject).to receive(:upgrade_pipeline).once.and_call_original
|
155
157
|
File.open(config_file, "w") { |f| f.puts second_pipeline_config }
|
156
158
|
sleep 0.1
|
157
159
|
Stud.stop!(t)
|
@@ -313,4 +315,65 @@ describe LogStash::Agent do
|
|
313
315
|
expect(subject.uptime).to be >= 0
|
314
316
|
end
|
315
317
|
end
|
318
|
+
|
319
|
+
context "metrics after config reloading" do
|
320
|
+
let(:dummy_output) { DummyOutput.new }
|
321
|
+
let(:config) { "input { generator { } } output { dummyoutput { } }" }
|
322
|
+
let(:new_config_generator_counter) { 50 }
|
323
|
+
let(:new_config) { "input { generator { count => #{new_config_generator_counter} } } output { dummyoutput {} }" }
|
324
|
+
let(:config_path) do
|
325
|
+
f = Stud::Temporary.file
|
326
|
+
f.write(config)
|
327
|
+
f.close
|
328
|
+
f.path
|
329
|
+
end
|
330
|
+
let(:interval) { 0.2 }
|
331
|
+
let(:pipeline_settings) { { :pipeline_workers => 4,
|
332
|
+
:config_path => config_path } }
|
333
|
+
|
334
|
+
let(:agent_args) do
|
335
|
+
super.merge({ :auto_reload => true,
|
336
|
+
:reload_interval => interval,
|
337
|
+
:collect_metric => true })
|
338
|
+
end
|
339
|
+
|
340
|
+
before :each do
|
341
|
+
allow(DummyOutput).to receive(:new).at_least(:once).with(anything).and_return(dummy_output)
|
342
|
+
allow(LogStash::Plugin).to receive(:lookup).with("input", "generator").and_return(LogStash::Inputs::Generator)
|
343
|
+
allow(LogStash::Plugin).to receive(:lookup).with("codec", "plain").and_return(LogStash::Codecs::Plain)
|
344
|
+
allow(LogStash::Plugin).to receive(:lookup).with("output", "dummyoutput").and_return(DummyOutput)
|
345
|
+
|
346
|
+
@t = Thread.new do
|
347
|
+
subject.register_pipeline("main", pipeline_settings)
|
348
|
+
subject.execute
|
349
|
+
end
|
350
|
+
|
351
|
+
sleep(2)
|
352
|
+
end
|
353
|
+
|
354
|
+
after :each do
|
355
|
+
Stud.stop!(@t)
|
356
|
+
@t.join
|
357
|
+
end
|
358
|
+
|
359
|
+
it "resets the metric collector" do
|
360
|
+
# We know that the store has more events coming in.
|
361
|
+
sleep(0.01) while dummy_output.events.size < new_config_generator_counter
|
362
|
+
snapshot = LogStash::Instrument::Collector.instance.snapshot_metric
|
363
|
+
expect(snapshot.metric_store.get_with_path("/stats/events")[:stats][:events][:in].value).to be > new_config_generator_counter
|
364
|
+
|
365
|
+
# update the configuration and give some time to logstash to pick it up and do the work
|
366
|
+
IO.write(config_path, new_config)
|
367
|
+
|
368
|
+
sleep(interval * 3) # Give time to reload the config
|
369
|
+
|
370
|
+
# Since there is multiple threads involved with the configuration reload,
|
371
|
+
# It can take some time to the stats be visible in the store but it will
|
372
|
+
# be eventually consistent.
|
373
|
+
sleep(0.01) while dummy_output.events.size < new_config_generator_counter
|
374
|
+
|
375
|
+
value = LogStash::Instrument::Collector.instance.snapshot_metric.metric_store.get_with_path("/stats/events")[:stats][:events][:in].value
|
376
|
+
expect(value).to eq(new_config_generator_counter)
|
377
|
+
end
|
378
|
+
end
|
316
379
|
end
|
@@ -2,6 +2,7 @@
|
|
2
2
|
require "spec_helper"
|
3
3
|
require "logstash/inputs/generator"
|
4
4
|
require "logstash/filters/multiline"
|
5
|
+
require_relative "../support/mocks_classes"
|
5
6
|
|
6
7
|
class DummyInput < LogStash::Inputs::Base
|
7
8
|
config_name "dummyinput"
|
@@ -48,30 +49,6 @@ class DummyCodec < LogStash::Codecs::Base
|
|
48
49
|
end
|
49
50
|
end
|
50
51
|
|
51
|
-
class DummyOutput < LogStash::Outputs::Base
|
52
|
-
config_name "dummyoutput"
|
53
|
-
milestone 2
|
54
|
-
|
55
|
-
attr_reader :num_closes, :events
|
56
|
-
|
57
|
-
def initialize(params={})
|
58
|
-
super
|
59
|
-
@num_closes = 0
|
60
|
-
@events = []
|
61
|
-
end
|
62
|
-
|
63
|
-
def register
|
64
|
-
end
|
65
|
-
|
66
|
-
def receive(event)
|
67
|
-
@events << event
|
68
|
-
end
|
69
|
-
|
70
|
-
def close
|
71
|
-
@num_closes = 1
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
52
|
class DummyOutputMore < DummyOutput
|
76
53
|
config_name "dummyoutputmore"
|
77
54
|
end
|
@@ -34,6 +34,19 @@ describe LogStash::Plugin do
|
|
34
34
|
expect(LogStash::Plugin.lookup("filter", "lady_gaga")).to eq(LogStash::Filters::LadyGaga)
|
35
35
|
end
|
36
36
|
|
37
|
+
describe "plugin signup in the registry" do
|
38
|
+
|
39
|
+
let(:registry) { LogStash::Registry.instance }
|
40
|
+
|
41
|
+
it "should be present in the registry" do
|
42
|
+
class LogStash::Filters::MyPlugin < LogStash::Filters::Base
|
43
|
+
config_name "my_plugin"
|
44
|
+
end
|
45
|
+
path = "logstash/filters/my_plugin"
|
46
|
+
expect(registry.registered?(path)).to eq(true)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
37
50
|
describe "#inspect" do
|
38
51
|
class LogStash::Filters::MyTestFilter < LogStash::Filters::Base
|
39
52
|
config_name "param1"
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
require "logstash/plugins/registry"
|
4
|
+
require "logstash/inputs/base"
|
5
|
+
|
6
|
+
# use a dummy NOOP input to test plugin registry
|
7
|
+
class LogStash::Inputs::Dummy < LogStash::Inputs::Base
|
8
|
+
config_name "dummy"
|
9
|
+
|
10
|
+
def register; end
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
describe LogStash::Registry do
|
15
|
+
|
16
|
+
let(:registry) { described_class.instance }
|
17
|
+
|
18
|
+
context "when loading installed plugins" do
|
19
|
+
|
20
|
+
let(:plugin) { double("plugin") }
|
21
|
+
|
22
|
+
it "should return the expected class" do
|
23
|
+
klass = registry.lookup("input", "stdin")
|
24
|
+
expect(klass).to eq(LogStash::Inputs::Stdin)
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should raise an error if can not find the plugin class" do
|
28
|
+
expect(LogStash::Registry::Plugin).to receive(:new).with("input", "elastic").and_return(plugin)
|
29
|
+
expect(plugin).to receive(:path).and_return("logstash/input/elastic").twice
|
30
|
+
expect(plugin).to receive(:installed?).and_return(true)
|
31
|
+
expect { registry.lookup("input", "elastic") }.to raise_error(LoadError)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should load from registry is already load" do
|
35
|
+
registry.lookup("input", "stdin")
|
36
|
+
expect(registry).to receive(:registered?).and_return(true).once
|
37
|
+
registry.lookup("input", "stdin")
|
38
|
+
internal_registry = registry.instance_variable_get("@registry")
|
39
|
+
expect(internal_registry).to include("logstash/inputs/stdin" => LogStash::Inputs::Stdin)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when loading code defined plugins" do
|
44
|
+
it "should return the expected class" do
|
45
|
+
klass = registry.lookup("input", "dummy")
|
46
|
+
expect(klass).to eq(LogStash::Inputs::Dummy)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "when plugin is not installed and not defined" do
|
51
|
+
it "should raise an error" do
|
52
|
+
expect { registry.lookup("input", "elastic") }.to raise_error(LoadError)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
require "i18n"
|
4
|
+
|
5
|
+
I18N_T_REGEX = Regexp.new('I18n.t.+?"(.+?)"')
|
6
|
+
|
7
|
+
describe I18n do
|
8
|
+
context "when using en.yml" do
|
9
|
+
glob_path = File.join(LogStash::Environment::LOGSTASH_HOME, "logstash-*", "lib", "**", "*.rb")
|
10
|
+
|
11
|
+
Dir.glob(glob_path).each do |file_name|
|
12
|
+
|
13
|
+
context "in file \"#{file_name}\"" do
|
14
|
+
File.foreach(file_name) do |line|
|
15
|
+
next unless (match = line.match(I18N_T_REGEX))
|
16
|
+
line = $INPUT_LINE_NUMBER
|
17
|
+
key = match[1]
|
18
|
+
it "in line #{line} the \"#{key}\" key should exist" do
|
19
|
+
expect(I18n.exists?(key)).to be_truthy
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/outputs/base"
|
3
|
+
|
4
|
+
class DummyOutput < LogStash::Outputs::Base
|
5
|
+
config_name "dummyoutput"
|
6
|
+
milestone 2
|
7
|
+
|
8
|
+
attr_reader :num_closes, :events
|
9
|
+
|
10
|
+
def initialize(params={})
|
11
|
+
super
|
12
|
+
@num_closes = 0
|
13
|
+
@events = []
|
14
|
+
end
|
15
|
+
|
16
|
+
def register
|
17
|
+
end
|
18
|
+
|
19
|
+
def receive(event)
|
20
|
+
@events << event
|
21
|
+
end
|
22
|
+
|
23
|
+
def close
|
24
|
+
@num_closes = 1
|
25
|
+
end
|
26
|
+
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.
|
4
|
+
version: 5.0.0.alpha2
|
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-05-02 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.
|
18
|
+
version: 5.0.0.alpha2
|
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.
|
26
|
+
version: 5.0.0.alpha2
|
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
|
@@ -167,7 +167,7 @@ dependencies:
|
|
167
167
|
requirements:
|
168
168
|
- - '='
|
169
169
|
- !ruby/object:Gem::Version
|
170
|
-
version: 0.9.
|
170
|
+
version: 0.9.16
|
171
171
|
name: jruby-openssl
|
172
172
|
prerelease: false
|
173
173
|
type: :runtime
|
@@ -175,7 +175,7 @@ dependencies:
|
|
175
175
|
requirements:
|
176
176
|
- - '='
|
177
177
|
- !ruby/object:Gem::Version
|
178
|
-
version: 0.9.
|
178
|
+
version: 0.9.16
|
179
179
|
- !ruby/object:Gem::Dependency
|
180
180
|
requirement: !ruby/object:Gem::Requirement
|
181
181
|
requirements:
|
@@ -193,7 +193,7 @@ 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
198
|
version: 0.3.1
|
199
199
|
name: jruby-monitoring
|
@@ -201,13 +201,13 @@ dependencies:
|
|
201
201
|
type: :runtime
|
202
202
|
version_requirements: !ruby/object:Gem::Requirement
|
203
203
|
requirements:
|
204
|
-
- -
|
204
|
+
- - ~>
|
205
205
|
- !ruby/object:Gem::Version
|
206
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
|
@@ -363,6 +363,7 @@ files:
|
|
363
363
|
- lib/logstash/pipeline.rb
|
364
364
|
- lib/logstash/pipeline_reporter.rb
|
365
365
|
- lib/logstash/plugin.rb
|
366
|
+
- lib/logstash/plugins/registry.rb
|
366
367
|
- lib/logstash/program.rb
|
367
368
|
- lib/logstash/runner.rb
|
368
369
|
- lib/logstash/shutdown_watcher.rb
|
@@ -422,6 +423,7 @@ files:
|
|
422
423
|
- spec/logstash/pipeline_reporter_spec.rb
|
423
424
|
- spec/logstash/pipeline_spec.rb
|
424
425
|
- spec/logstash/plugin_spec.rb
|
426
|
+
- spec/logstash/plugins/registry_spec.rb
|
425
427
|
- spec/logstash/runner_spec.rb
|
426
428
|
- spec/logstash/shutdown_watcher_spec.rb
|
427
429
|
- spec/logstash/util/buftok_spec.rb
|
@@ -434,7 +436,9 @@ files:
|
|
434
436
|
- spec/logstash/util/worker_threads_default_printer_spec.rb
|
435
437
|
- spec/logstash/util/wrapped_synchronous_queue_spec.rb
|
436
438
|
- spec/logstash/util_spec.rb
|
439
|
+
- spec/static/i18n_spec.rb
|
437
440
|
- spec/support/matchers.rb
|
441
|
+
- spec/support/mocks_classes.rb
|
438
442
|
homepage: http://www.elastic.co/guide/en/logstash/current/index.html
|
439
443
|
licenses:
|
440
444
|
- Apache License (2.0)
|
@@ -445,17 +449,17 @@ require_paths:
|
|
445
449
|
- lib
|
446
450
|
required_ruby_version: !ruby/object:Gem::Requirement
|
447
451
|
requirements:
|
448
|
-
- -
|
452
|
+
- - '>='
|
449
453
|
- !ruby/object:Gem::Version
|
450
454
|
version: '0'
|
451
455
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
452
456
|
requirements:
|
453
|
-
- -
|
457
|
+
- - '>'
|
454
458
|
- !ruby/object:Gem::Version
|
455
459
|
version: 1.3.1
|
456
460
|
requirements: []
|
457
461
|
rubyforge_project:
|
458
|
-
rubygems_version: 2.4.
|
462
|
+
rubygems_version: 2.4.5
|
459
463
|
signing_key:
|
460
464
|
specification_version: 4
|
461
465
|
summary: logstash-core - The core components of logstash
|
@@ -495,6 +499,7 @@ test_files:
|
|
495
499
|
- spec/logstash/pipeline_reporter_spec.rb
|
496
500
|
- spec/logstash/pipeline_spec.rb
|
497
501
|
- spec/logstash/plugin_spec.rb
|
502
|
+
- spec/logstash/plugins/registry_spec.rb
|
498
503
|
- spec/logstash/runner_spec.rb
|
499
504
|
- spec/logstash/shutdown_watcher_spec.rb
|
500
505
|
- spec/logstash/util/buftok_spec.rb
|
@@ -507,4 +512,6 @@ test_files:
|
|
507
512
|
- spec/logstash/util/worker_threads_default_printer_spec.rb
|
508
513
|
- spec/logstash/util/wrapped_synchronous_queue_spec.rb
|
509
514
|
- spec/logstash/util_spec.rb
|
515
|
+
- spec/static/i18n_spec.rb
|
510
516
|
- spec/support/matchers.rb
|
517
|
+
- spec/support/mocks_classes.rb
|