logstash-core 1.5.0.rc2.snapshot-java → 1.5.0.rc3-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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9d71faa6ec440c5cb9057a50d51147d590b25984
4
- data.tar.gz: 52f21ca86f005baa4e5eb3c3886040e1657fc9a2
3
+ metadata.gz: 33f2eca5fac0bd51fb51dcaa864f11e5dad12614
4
+ data.tar.gz: e16ce45358620cd81a1044b42f31744ac4106274
5
5
  SHA512:
6
- metadata.gz: 2202931d2edce9a77cb4a8b9f84a36c1b9ff1a9c38a1cf319ab8f3b48b65eb59654e4841c17ef7f062ba92f4b0b9ab082d227702118b51f94b513b1d45f3a20d
7
- data.tar.gz: e0fa89dfd73c248c93999986ca023716a24ea62670fa2781e58b6d7d2edde5f2f280319aac23ea48ac83cffab289b4031b7443d0e795bb1c9567495d53d3b078
6
+ metadata.gz: 6fed2572b9d8d055330b405efe6524c9a9cbc228b946bca904ec9967206d6c7753e8f6a08ac8a3b3cfce6ef1cb36c62a9d6d876ab551ba5b711b018343e5a96c
7
+ data.tar.gz: 88c502df536ec73769152280fac1172737db4c7b49bc1c081b2ed821b3f2b185472adf8185095d876e95e26f6108c13e6a8ad5df0f42bd3d8f3b3a970c34d729
@@ -172,7 +172,6 @@ class LogStash::Agent < Clamp::Command
172
172
 
173
173
  if RUBY_PLATFORM == "java"
174
174
  show_version_java
175
- show_version_elasticsearch
176
175
  end
177
176
 
178
177
  if [:debug].include?(verbosity?) || debug?
@@ -190,13 +189,6 @@ class LogStash::Agent < Clamp::Command
190
189
  puts RUBY_DESCRIPTION
191
190
  end # def show_version_ruby
192
191
 
193
- def show_version_elasticsearch
194
- LogStash::Environment.load_elasticsearch_jars!
195
-
196
- $stdout.write("Elasticsearch: ");
197
- org.elasticsearch.Version::main([])
198
- end # def show_version_elasticsearch
199
-
200
192
  def show_version_java
201
193
  properties = java.lang.System.getProperties
202
194
  puts "java #{properties["java.version"]} (#{properties["java.vendor"]})"
@@ -1,28 +1,55 @@
1
- require "bundler"
2
- require "bundler/cli"
3
-
4
- module Bundler
5
- # Patch bundler to write a .lock file specific to the version of ruby.
6
- # This keeps MRI/JRuby/RBX from conflicting over the Gemfile.lock updates
7
- module SharedHelpers
8
- def default_lockfile
9
- ruby = "#{LogStash::Environment.ruby_engine}-#{LogStash::Environment.ruby_abi_version}"
10
- Pathname.new("#{default_gemfile}.#{ruby}.lock")
11
- end
12
- end
13
-
14
- # Add the Bundler.reset! method which has been added in master but is not in 1.7.9.
15
- class << self
16
- unless self.method_defined?("reset!")
17
- def reset!
18
- @definition = nil
19
- end
20
- end
21
- end
22
- end
1
+ require "logstash/environment"
23
2
 
24
3
  module LogStash
25
4
  module Bundler
5
+ # Take a gem package and extract it to a specific target
6
+ # @param [String] Gem file, this must be a path
7
+ # @param [String, String] Return a Gem::Package and the installed path
8
+ def self.unpack(file, path)
9
+ require "rubygems/package"
10
+ require "securerandom"
11
+
12
+ # We are creating a random directory per extract,
13
+ # if we dont do this bundler will not trigger download of the dependencies.
14
+ # Use case is:
15
+ # - User build his own gem with a fix
16
+ # - User doesnt increment the version
17
+ # - User install the same version but different code or dependencies multiple times..
18
+ basename = ::File.basename(file, '.gem')
19
+ unique = SecureRandom.hex(4)
20
+ target_path = ::File.expand_path(::File.join(path, unique, basename))
21
+
22
+ package = ::Gem::Package.new(file)
23
+ package.extract_files(target_path)
24
+
25
+ return [package, target_path]
26
+ end
27
+
28
+ def self.setup!(options = {})
29
+ options = {:without => [:development]}.merge(options)
30
+ options[:without] = Array(options[:without])
31
+
32
+ # make sure we use our own installed bundler
33
+ require "logstash/patches/rubygems" # patch rubygems before clear_paths
34
+ ::Gem.clear_paths
35
+ ::Gem.paths = ENV['GEM_HOME'] = ENV['GEM_PATH'] = LogStash::Environment.logstash_gem_home
36
+
37
+ # set BUNDLE_GEMFILE ENV before requiring bundler to avoid bundler recurse and load unrelated Gemfile(s)
38
+ ENV["BUNDLE_GEMFILE"] = LogStash::Environment::GEMFILE_PATH
39
+
40
+ require "bundler"
41
+ require "logstash/bundler"
42
+ require "logstash/patches/bundler"
43
+
44
+ ::Bundler.settings[:path] = LogStash::Environment::BUNDLE_DIR
45
+ ::Bundler.settings[:without] = options[:without].join(":")
46
+ # in the context of Bundler.setup it looks like this is useless here because Gemfile path can only be specified using
47
+ # the ENV, see https://github.com/bundler/bundler/blob/v1.8.3/lib/bundler/shared_helpers.rb#L103
48
+ ::Bundler.settings[:gemfile] = LogStash::Environment::GEMFILE_PATH
49
+
50
+ ::Bundler.reset!
51
+ ::Bundler.setup
52
+ end
26
53
 
27
54
  # capture any $stdout from the passed block. also trap any exception in that block, in which case the trapped exception will be returned
28
55
  # @param [Proc] the code block to execute
@@ -51,7 +78,22 @@ module LogStash
51
78
  options[:without] = Array(options[:without])
52
79
  options[:update] = Array(options[:update]) if options[:update]
53
80
 
54
- ENV["GEM_PATH"] = LogStash::Environment.logstash_gem_home
81
+ # make sure we use our own installed bundler
82
+ require "logstash/patches/rubygems" # patch rubygems before clear_paths
83
+ ::Gem.clear_paths
84
+ ::Gem.paths = ENV['GEM_HOME'] = ENV['GEM_PATH'] = LogStash::Environment.logstash_gem_home
85
+
86
+ # set BUNDLE_GEMFILE ENV before requiring bundler to avoid bundler recurse and load unrelated Gemfile(s).
87
+ # in the context of calling Bundler::CLI this is not really required since Bundler::CLI will look at
88
+ # Bundler.settings[:gemfile] unlike Bundler.setup. For the sake of consistency and defensive/future proofing, let's keep it here.
89
+ ENV["BUNDLE_GEMFILE"] = LogStash::Environment::GEMFILE_PATH
90
+
91
+ require "bundler"
92
+ require "bundler/cli"
93
+ require "logstash/patches/bundler"
94
+
95
+ # force Rubygems sources to our Gemfile sources
96
+ ::Gem.sources = options[:rubygems_source] if options[:rubygems_source]
55
97
 
56
98
  ::Bundler.settings[:path] = LogStash::Environment::BUNDLE_DIR
57
99
  ::Bundler.settings[:gemfile] = LogStash::Environment::GEMFILE_PATH
@@ -60,7 +102,7 @@ module LogStash
60
102
  try = 0
61
103
 
62
104
  # capture_stdout also traps any raised exception and pass them back as the function return [output, exception]
63
- capture_stdout do
105
+ output, exception = capture_stdout do
64
106
  loop do
65
107
  begin
66
108
  ::Bundler.reset!
@@ -81,11 +123,15 @@ module LogStash
81
123
 
82
124
  try += 1
83
125
  $stderr.puts("Error #{e.class}, retrying #{try}/#{options[:max_tries]}")
84
- $stderr.puts(e.message) if ENV["DEBUG"]
126
+ $stderr.puts(e.message)
85
127
  sleep(0.5)
86
128
  end
87
129
  end
88
130
  end
131
+
132
+ raise exception if exception
133
+
134
+ return output
89
135
  end
90
136
 
91
137
  # build Bundler::CLI.start arguments array from the given options hash
@@ -107,4 +153,4 @@ module LogStash
107
153
  arguments.flatten
108
154
  end
109
155
  end
110
- end
156
+ end
@@ -1,7 +1,9 @@
1
1
  # encoding: utf-8
2
2
  require 'logstash/errors'
3
3
  require "treetop"
4
+
4
5
  class Treetop::Runtime::SyntaxNode
6
+
5
7
  def compile
6
8
  return "" if elements.nil?
7
9
  return elements.collect(&:compile).reject(&:empty?).join("")
@@ -55,11 +57,31 @@ class Treetop::Runtime::SyntaxNode
55
57
  end
56
58
  end
57
59
 
60
+
58
61
  module LogStash; module Config; module AST
62
+
63
+ def self.defered_conditionals=(val)
64
+ @defered_conditionals = val
65
+ end
66
+
67
+ def self.defered_conditionals
68
+ @defered_conditionals
69
+ end
70
+
71
+ def self.defered_conditionals_index
72
+ @defered_conditionals_index
73
+ end
74
+
75
+ def self.defered_conditionals_index=(val)
76
+ @defered_conditionals_index = val
77
+ end
78
+
59
79
  class Node < Treetop::Runtime::SyntaxNode; end
60
80
 
61
81
  class Config < Node
62
82
  def compile
83
+ LogStash::Config::AST.defered_conditionals = []
84
+ LogStash::Config::AST.defered_conditionals_index = 0
63
85
  code = []
64
86
 
65
87
  code << <<-CODE
@@ -81,20 +103,22 @@ module LogStash; module Config; module AST
81
103
  ["filter", "output"].each do |type|
82
104
  # defines @filter_func and @output_func
83
105
 
84
- definitions << "@#{type}_func = lambda do |event, &block|"
85
- definitions << " events = [event]"
106
+ definitions << "def #{type}_func(event)"
107
+ definitions << " events = [event]" if type == "filter"
86
108
  definitions << " @logger.debug? && @logger.debug(\"#{type} received\", :event => event.to_hash)"
109
+
87
110
  sections.select { |s| s.plugin_type.text_value == type }.each do |s|
88
111
  definitions << s.compile.split("\n", -1).map { |e| " #{e}" }
89
112
  end
90
113
 
91
- if type == "filter"
92
- definitions << " events.flatten.each{|e| block.call(e) }"
93
- end
114
+ definitions << " events" if type == "filter"
94
115
  definitions << "end"
95
116
  end
96
117
 
97
118
  code += definitions.join("\n").split("\n", -1).collect { |l| " #{l}" }
119
+
120
+ code += LogStash::Config::AST.defered_conditionals
121
+
98
122
  return code.join("\n")
99
123
  end
100
124
  end
@@ -125,20 +149,15 @@ module LogStash; module Config; module AST
125
149
  #{name}_flush = lambda do |options, &block|
126
150
  @logger.debug? && @logger.debug(\"Flushing\", :plugin => #{name})
127
151
 
128
- flushed_events = #{name}.flush(options)
152
+ events = #{name}.flush(options)
129
153
 
130
- return if flushed_events.nil? || flushed_events.empty?
154
+ return if events.nil? || events.empty?
131
155
 
132
- flushed_events.each do |event|
133
- @logger.debug? && @logger.debug(\"Flushing\", :plugin => #{name}, :event => event)
156
+ @logger.debug? && @logger.debug(\"Flushing\", :plugin => #{name}, :events => events)
134
157
 
135
- events = [event]
136
- #{plugin.compile_starting_here.gsub(/^/, " ")}
137
-
138
- block.call(event)
139
- events.flatten.each{|e| block.call(e) if e != event}
140
- end
158
+ #{plugin.compile_starting_here.gsub(/^/, " ")}
141
159
 
160
+ events.each{|e| block.call(e)}
142
161
  end
143
162
 
144
163
  if #{name}.respond_to?(:flush)
@@ -211,13 +230,7 @@ module LogStash; module Config; module AST
211
230
  return "start_input(#{variable_name})"
212
231
  when "filter"
213
232
  return <<-CODE
214
- events = events.flat_map do |event|
215
- next [] if event.cancelled?
216
-
217
- new_events = []
218
- #{variable_name}.filter(event){|new_event| new_events << new_event}
219
- event.cancelled? ? new_events : new_events.unshift(event)
220
- end
233
+ #{variable_name}.filter(event) {|new_event| events << new_event }
221
234
  CODE
222
235
  when "output"
223
236
  return "#{variable_name}.handle(event)\n"
@@ -287,7 +300,7 @@ module LogStash; module Config; module AST
287
300
 
288
301
  module Unicode
289
302
  def self.wrap(text)
290
- return "(" + text.inspect + ".force_encoding(Encoding::UTF_8)" + ")"
303
+ return "(" + text.force_encoding(Encoding::UTF_8).inspect + ")"
291
304
  end
292
305
  end
293
306
 
@@ -364,18 +377,38 @@ module LogStash; module Config; module AST
364
377
  # at the end, events is returned to handle the case where no branch match and no branch code is executed
365
378
  # so we must make sure to return the current event.
366
379
 
367
- return <<-CODE
368
- events = events.flat_map do |event|
369
- events = [event]
380
+ type = recursive_select_parent(PluginSection).first.plugin_type.text_value
381
+
382
+ if type == "filter"
383
+ i = LogStash::Config::AST.defered_conditionals_index += 1
384
+ source = <<-CODE
385
+ def cond_func_#{i}(input_events)
386
+ result = []
387
+ input_events.each do |event|
388
+ events = [event]
389
+ #{super}
390
+ end
391
+ result += events
392
+ end
393
+ result
394
+ end
395
+ CODE
396
+ LogStash::Config::AST.defered_conditionals << source
397
+
398
+ <<-CODE
399
+ events = cond_func_#{i}(events)
400
+ CODE
401
+ else
402
+ <<-CODE
370
403
  #{super}
371
404
  end
372
- events
373
- end
374
- CODE
405
+ CODE
406
+ end
375
407
  end
376
408
  end
377
409
 
378
410
  class BranchEntry < Node; end
411
+
379
412
  class If < BranchEntry
380
413
  def compile
381
414
  children = recursive_inject { |e| e.is_a?(Branch) || e.is_a?(Plugin) }
@@ -472,7 +472,7 @@ module LogStash::Config::Mixin
472
472
  bytes = Integer(value.first) rescue nil
473
473
  result = bytes || Filesize.from(value.first).to_i
474
474
  rescue ArgumentError
475
- return false, "Unparseable filesize: #{value.first}. possible units (KiB, MiB, ...) e.g. '10 KiB'. doc reference: http://www.elasticsearch.org/guide/en/logstash/current/_logstash_config_language.html#bytes"
475
+ return false, "Unparseable filesize: #{value.first}. possible units (KiB, MiB, ...) e.g. '10 KiB'. doc reference: http://www.elastic.co/guide/en/logstash/current/configuration.html#bytes"
476
476
  end
477
477
  else
478
478
  return false, "Unknown validator symbol #{validator}"
@@ -1,75 +1,19 @@
1
1
  require "logstash/errors"
2
- require 'logstash/version'
3
-
4
- # monkey patch RubyGems to silence ffi warnings:
5
- #
6
- # WARN: Unresolved specs during Gem::Specification.reset:
7
- # ffi (>= 0)
8
- # WARN: Clearing out unresolved specs.
9
- # Please report a bug if this causes problems.
10
- #
11
- # see https://github.com/elasticsearch/logstash/issues/2556 and https://github.com/rubygems/rubygems/issues/1070
12
- #
13
- # this code is from Rubygems v2.1.9 in JRuby 1.7.17. Per tickets this issue should be solved at JRuby >= 1.7.20.
14
-
15
- # this method implementation works for Rubygems version 2.1.0 and up, verified up to 2.4.6
16
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new("2.1.0") && Gem::Version.new(Gem::VERSION) < Gem::Version.new("2.5.0")
17
- class Gem::Specification
18
- def self.reset
19
- @@dirs = nil
20
- Gem.pre_reset_hooks.each { |hook| hook.call }
21
- @@all = nil
22
- @@stubs = nil
23
- _clear_load_cache
24
- unresolved = unresolved_deps
25
- unless unresolved.empty?
26
- unless (unresolved.size == 1 && unresolved["ffi"])
27
- w = "W" + "ARN"
28
- warn "#{w}: Unresolved specs during Gem::Specification.reset:"
29
- unresolved.values.each do |dep|
30
- warn " #{dep}"
31
- end
32
- warn "#{w}: Clearing out unresolved specs."
33
- warn "Please report a bug if this causes problems."
34
- end
35
- unresolved.clear
36
- end
37
- Gem.post_reset_hooks.each { |hook| hook.call }
38
- end
39
- end
40
- end
2
+ require "logstash/version"
41
3
 
42
4
  module LogStash
43
5
  module Environment
44
6
  extend self
45
7
 
46
8
  LOGSTASH_HOME = ::File.expand_path(::File.join(::File.dirname(__FILE__), "..", ".."))
47
- JAR_DIR = ::File.join(LOGSTASH_HOME, "vendor", "jar")
48
- ELASTICSEARCH_DIR = ::File.join(LOGSTASH_HOME, "vendor", "elasticsearch")
49
9
  BUNDLE_DIR = ::File.join(LOGSTASH_HOME, "vendor", "bundle")
50
10
  GEMFILE_PATH = ::File.join(LOGSTASH_HOME, "Gemfile")
51
11
  BUNDLE_CONFIG_PATH = ::File.join(LOGSTASH_HOME, ".bundle", "config")
52
12
  BOOTSTRAP_GEM_PATH = ::File.join(LOGSTASH_HOME, 'build', 'bootstrap')
13
+ LOCAL_GEM_PATH = ::File.join(LOGSTASH_HOME, 'vendor', 'local_gems')
53
14
 
54
15
  LOGSTASH_ENV = (ENV["LS_ENV"] || 'production').to_s.freeze
55
16
 
56
- # loads currently embedded elasticsearch jars
57
- # @raise LogStash::EnvironmentError if not running under JRuby or if no jar files are found
58
- def load_elasticsearch_jars!
59
- raise(LogStash::EnvironmentError, "JRuby is required") unless jruby?
60
-
61
- require "java"
62
- jars_path = ::File.join(ELASTICSEARCH_DIR, "**", "*.jar")
63
- jar_files = Dir.glob(jars_path)
64
-
65
- raise(LogStash::EnvironmentError, "Could not find Elasticsearch jar files under #{ELASTICSEARCH_DIR}") if jar_files.empty?
66
-
67
- jar_files.each do |jar|
68
- loaded = require jar
69
- puts("Loaded #{jar}") if $DEBUG && loaded
70
- end
71
- end
72
-
73
17
  def logstash_gem_home
74
18
  ::File.join(BUNDLE_DIR, ruby_engine, gem_ruby_version)
75
19
  end
@@ -90,27 +34,41 @@ module LogStash
90
34
  env.downcase == "test"
91
35
  end
92
36
 
93
- def bundler_setup!(options = {})
94
- options = {:without => [:development]}.merge(options)
95
- options[:without] = Array(options[:without])
96
- # make sure we use our own nicely installed bundler and not a rogue, bad, mean, ugly, stupid other bundler. bad bundler, bad bad bundler go away.
97
- ::Gem.clear_paths
98
- ::Gem.paths = ENV['GEM_HOME'] = ENV['GEM_PATH'] = logstash_gem_home
37
+ def runtime_jars_root(dir_name, package)
38
+ ::File.join(dir_name, package, "runtime-jars")
39
+ end
40
+
41
+ def test_jars_root(dir_name, package)
42
+ ::File.join(dir_name, package, "test-jars")
43
+ end
44
+
45
+ def load_runtime_jars!(dir_name="vendor", package="jar-dependencies")
46
+ load_jars!(::File.join(runtime_jars_root(dir_name, package), "*.jar"))
47
+ end
99
48
 
100
- # set BUNDLE_GEMFILE ENV before requiring bundler to avoid bundler recurse and load unrelated Gemfile(s)
101
- ENV["BUNDLE_GEMFILE"] = LogStash::Environment::GEMFILE_PATH
49
+ def load_test_jars!(dir_name="vendor", package="jar-dependencies")
50
+ load_jars!(::File.join(test_jars_root(dir_name, package), "*.jar"))
51
+ end
102
52
 
103
- require "bundler"
104
- require "logstash/bundler"
53
+ def load_jars!(pattern)
54
+ raise(LogStash::EnvironmentError, I18n.t("logstash.environment.jruby-required")) unless LogStash::Environment.jruby?
105
55
 
106
- ::Bundler.settings[:path] = LogStash::Environment::BUNDLE_DIR
107
- ::Bundler.settings[:without] = options[:without].join(":")
108
- # in the context of Bundler.setup it looks like this is useless here because Gemfile path can only be specified using
109
- # the ENV, see https://github.com/bundler/bundler/blob/v1.8.3/lib/bundler/shared_helpers.rb#L103
110
- ::Bundler.settings[:gemfile] = LogStash::Environment::GEMFILE_PATH
56
+ jar_files = find_jars(pattern)
57
+ require_jars! jar_files
58
+ end
111
59
 
112
- ::Bundler.reset!
113
- ::Bundler.setup
60
+ def find_jars(pattern)
61
+ require 'java'
62
+ jar_files = Dir.glob(pattern)
63
+ raise(LogStash::EnvironmentError, I18n.t("logstash.environment.missing-jars", :pattern => pattern)) if jar_files.empty?
64
+ jar_files
65
+ end
66
+
67
+ def require_jars!(files)
68
+ files.each do |jar_file|
69
+ loaded = require jar_file
70
+ puts("Loaded #{jar_file}") if $DEBUG && loaded
71
+ end
114
72
  end
115
73
 
116
74
  def ruby_bin