logstash-core 6.0.0.alpha1-java → 6.0.0.alpha2-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/logstash-core/logstash-core.jar +0 -0
- data/lib/logstash-core/version.rb +1 -1
- data/lib/logstash/agent.rb +81 -45
- data/lib/logstash/api/commands/hot_threads_reporter.rb +3 -3
- data/lib/logstash/api/commands/node.rb +13 -6
- data/lib/logstash/api/commands/stats.rb +18 -6
- data/lib/logstash/api/modules/node.rb +7 -0
- data/lib/logstash/api/modules/node_stats.rb +12 -5
- data/lib/logstash/bootstrap_check/default_config.rb +3 -7
- data/lib/logstash/compiler.rb +33 -15
- data/lib/logstash/compiler/lscl.rb +16 -8
- data/lib/logstash/config/mixin.rb +5 -42
- data/lib/logstash/config/pipeline_config.rb +1 -1
- data/lib/logstash/config/source/local.rb +28 -13
- data/lib/logstash/config/source/multi_local.rb +72 -0
- data/lib/logstash/config/source_loader.rb +1 -2
- data/lib/logstash/environment.rb +12 -3
- data/lib/logstash/execution_context.rb +7 -3
- data/lib/logstash/inputs/base.rb +2 -0
- data/lib/logstash/instrument/metric_type.rb +0 -2
- data/lib/logstash/instrument/periodic_poller/jvm.rb +5 -5
- data/lib/logstash/instrument/periodic_poller/pq.rb +1 -1
- data/lib/logstash/outputs/base.rb +2 -0
- data/lib/logstash/pipeline.rb +31 -14
- data/lib/logstash/pipeline_action/create.rb +1 -2
- data/lib/logstash/pipeline_action/reload.rb +2 -1
- data/lib/logstash/pipeline_settings.rb +50 -0
- data/lib/logstash/plugin.rb +1 -0
- data/lib/logstash/runner.rb +7 -5
- data/lib/logstash/settings.rb +11 -3
- data/lib/logstash/shutdown_watcher.rb +26 -0
- data/lib/logstash/state_resolver.rb +1 -3
- data/lib/logstash/util/dead_letter_queue_manager.rb +61 -0
- data/lib/logstash/util/environment_variables.rb +43 -0
- data/lib/logstash/util/thread_dump.rb +3 -1
- data/lib/logstash/version.rb +1 -1
- data/locales/en.yml +4 -0
- data/logstash-core.gemspec +4 -1
- data/spec/logstash/agent/converge_spec.rb +36 -35
- data/spec/logstash/agent_spec.rb +48 -177
- data/spec/{api/lib/commands/stats.rb → logstash/api/commands/stats_spec.rb} +7 -2
- data/spec/{api/lib → logstash/api}/errors_spec.rb +1 -1
- data/spec/{api/lib/api → logstash/api/modules}/logging_spec.rb +1 -10
- data/spec/{api/lib/api → logstash/api/modules}/node_plugins_spec.rb +1 -2
- data/spec/{api/lib/api → logstash/api/modules}/node_spec.rb +9 -8
- data/spec/{api/lib/api → logstash/api/modules}/node_stats_spec.rb +11 -9
- data/spec/{api/lib/api → logstash/api/modules}/plugins_spec.rb +4 -3
- data/spec/{api/lib/api → logstash/api/modules}/root_spec.rb +2 -2
- data/spec/{api/lib → logstash/api}/rack_app_spec.rb +0 -0
- data/spec/logstash/compiler/compiler_spec.rb +72 -9
- data/spec/logstash/config/source/local_spec.rb +20 -4
- data/spec/logstash/config/source/multi_local_spec.rb +113 -0
- data/spec/logstash/execution_context_spec.rb +14 -4
- data/spec/logstash/inputs/base_spec.rb +1 -1
- data/spec/logstash/instrument/wrapped_write_client_spec.rb +34 -19
- data/spec/logstash/output_delegator_spec.rb +1 -1
- data/spec/logstash/outputs/base_spec.rb +1 -1
- data/spec/logstash/pipeline_action/reload_spec.rb +1 -1
- data/spec/logstash/pipeline_action/stop_spec.rb +1 -1
- data/spec/logstash/pipeline_dlq_commit_spec.rb +107 -0
- data/spec/logstash/pipeline_pq_file_spec.rb +3 -1
- data/spec/logstash/pipeline_reporter_spec.rb +2 -1
- data/spec/logstash/pipeline_spec.rb +54 -43
- data/spec/logstash/runner_spec.rb +27 -36
- data/spec/logstash/settings/array_coercible_spec.rb +65 -0
- data/spec/logstash/settings_spec.rb +91 -0
- data/spec/logstash/shutdown_watcher_spec.rb +10 -16
- data/spec/logstash/state_resolver_spec.rb +6 -4
- data/spec/support/helpers.rb +16 -3
- data/spec/support/shared_contexts.rb +26 -2
- metadata +42 -39
- data/lib/logstash/instrument/metric_type/mean.rb +0 -33
- data/spec/api/lib/api/support/resource_dsl_methods.rb +0 -87
- data/spec/api/spec_helper.rb +0 -106
data/lib/logstash/compiler.rb
CHANGED
@@ -1,38 +1,56 @@
|
|
1
1
|
require 'logstash/util/loggable'
|
2
2
|
require 'logstash/compiler/lscl/lscl_grammar'
|
3
3
|
|
4
|
-
java_import org.logstash.config.ir.
|
4
|
+
java_import org.logstash.config.ir.PipelineIR
|
5
5
|
java_import org.logstash.config.ir.graph.Graph;
|
6
6
|
java_import org.logstash.config.ir.graph.PluginVertex;
|
7
7
|
|
8
8
|
module LogStash; class Compiler
|
9
9
|
include ::LogStash::Util::Loggable
|
10
10
|
|
11
|
-
def self.
|
12
|
-
graph_sections =
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
)
|
11
|
+
def self.compile_sources(*sources_with_metadata)
|
12
|
+
graph_sections = sources_with_metadata.map do |swm|
|
13
|
+
self.compile_graph(swm)
|
14
|
+
end
|
15
|
+
|
16
|
+
input_graph = org.logstash.config.ir.graph.Graph.combine(*graph_sections.map {|s| s[:input] }).graph
|
17
|
+
output_graph = org.logstash.config.ir.graph.Graph.combine(*graph_sections.map {|s| s[:output] }).graph
|
18
|
+
|
19
|
+
filter_graph = graph_sections.reduce(nil) do |acc, s|
|
20
|
+
filter_section = s[:filter]
|
21
|
+
|
22
|
+
if acc.nil?
|
23
|
+
filter_section
|
24
|
+
else
|
25
|
+
acc.chain(filter_section)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
original_source = sources_with_metadata.map(&:text).join("\n")
|
30
|
+
|
31
|
+
org.logstash.config.ir.PipelineIR.new(input_graph, filter_graph, output_graph, original_source)
|
18
32
|
end
|
19
33
|
|
20
|
-
def self.compile_ast(
|
34
|
+
def self.compile_ast(source_with_metadata)
|
35
|
+
if !source_with_metadata.is_a?(org.logstash.common.SourceWithMetadata)
|
36
|
+
raise ArgumentError, "Expected 'org.logstash.common.SourceWithMetadata', got #{source_with_metadata.class}"
|
37
|
+
end
|
38
|
+
|
21
39
|
grammar = LogStashCompilerLSCLGrammarParser.new
|
22
|
-
config = grammar.parse(
|
40
|
+
config = grammar.parse(source_with_metadata.text)
|
23
41
|
|
24
42
|
if config.nil?
|
25
43
|
raise ConfigurationError, grammar.failure_reason
|
26
44
|
end
|
27
45
|
|
28
|
-
config
|
46
|
+
config.compile(source_with_metadata)
|
29
47
|
end
|
30
48
|
|
31
|
-
def self.compile_imperative(
|
32
|
-
compile_ast(
|
49
|
+
def self.compile_imperative(source_with_metadata)
|
50
|
+
compile_ast(source_with_metadata)
|
33
51
|
end
|
34
52
|
|
35
|
-
def self.compile_graph(
|
36
|
-
Hash[compile_imperative(
|
53
|
+
def self.compile_graph(source_with_metadata)
|
54
|
+
Hash[compile_imperative(source_with_metadata).map {|section,icompiled| [section, icompiled.toGraph]}]
|
37
55
|
end
|
38
56
|
end; end
|
@@ -10,15 +10,23 @@ module LogStashCompilerLSCLGrammar; module LogStash; module Compiler; module LSC
|
|
10
10
|
module Helpers
|
11
11
|
def source_meta
|
12
12
|
line, column = line_and_column
|
13
|
-
org.logstash.common.SourceWithMetadata.new(
|
13
|
+
org.logstash.common.SourceWithMetadata.new(base_protocol, base_id, line, column, self.text_value)
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
17
|
-
set_meta(:
|
16
|
+
def base_source_with_metadata=(value)
|
17
|
+
set_meta(:base_source_with_metadata, value)
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
21
|
-
get_meta(:
|
20
|
+
def base_source_with_metadata
|
21
|
+
get_meta(:base_source_with_metadata)
|
22
|
+
end
|
23
|
+
|
24
|
+
def base_protocol
|
25
|
+
self.base_source_with_metadata.protocol
|
26
|
+
end
|
27
|
+
|
28
|
+
def base_id
|
29
|
+
self.base_source_with_metadata.id
|
22
30
|
end
|
23
31
|
|
24
32
|
def compose(*statements)
|
@@ -39,7 +47,7 @@ module LogStashCompilerLSCLGrammar; module LogStash; module Compiler; module LSC
|
|
39
47
|
end
|
40
48
|
|
41
49
|
def empty_source_meta()
|
42
|
-
org.logstash.common.SourceWithMetadata.new()
|
50
|
+
org.logstash.common.SourceWithMetadata.new(base_protocol, base_id, nil)
|
43
51
|
end
|
44
52
|
|
45
53
|
def jdsl
|
@@ -70,9 +78,9 @@ module LogStashCompilerLSCLGrammar; module LogStash; module Compiler; module LSC
|
|
70
78
|
class Config < Node
|
71
79
|
include Helpers
|
72
80
|
|
73
|
-
def compile(
|
81
|
+
def compile(base_source_with_metadata=nil)
|
74
82
|
# There is no way to move vars across nodes in treetop :(
|
75
|
-
self.
|
83
|
+
self.base_source_with_metadata = base_source_with_metadata
|
76
84
|
|
77
85
|
sections = recursive_select(PluginSection)
|
78
86
|
|
@@ -33,37 +33,21 @@ LogStash::Environment.load_locale!
|
|
33
33
|
# }
|
34
34
|
#
|
35
35
|
module LogStash::Config::Mixin
|
36
|
+
|
37
|
+
include LogStash::Util::EnvironmentVariables
|
38
|
+
|
36
39
|
attr_accessor :config
|
37
40
|
attr_accessor :original_params
|
38
41
|
|
39
42
|
PLUGIN_VERSION_1_0_0 = LogStash::Util::PluginVersion.new(1, 0, 0)
|
40
43
|
PLUGIN_VERSION_0_9_0 = LogStash::Util::PluginVersion.new(0, 9, 0)
|
41
|
-
|
42
|
-
ENV_PLACEHOLDER_REGEX = /\$\{(?<name>\w+)(\:(?<default>[^}]*))?\}/
|
43
|
-
|
44
|
+
|
44
45
|
# This method is called when someone does 'include LogStash::Config'
|
45
46
|
def self.included(base)
|
46
47
|
# Add the DSL methods to the 'base' given.
|
47
48
|
base.extend(LogStash::Config::Mixin::DSL)
|
48
49
|
end
|
49
|
-
|
50
|
-
# Recursive method to replace environment variable references in parameters
|
51
|
-
def deep_replace(value)
|
52
|
-
if (value.is_a?(Hash))
|
53
|
-
value.each do |valueHashKey, valueHashValue|
|
54
|
-
value[valueHashKey.to_s] = deep_replace(valueHashValue)
|
55
|
-
end
|
56
|
-
else
|
57
|
-
if (value.is_a?(Array))
|
58
|
-
value.each_index do | valueArrayIndex|
|
59
|
-
value[valueArrayIndex] = deep_replace(value[valueArrayIndex])
|
60
|
-
end
|
61
|
-
else
|
62
|
-
return replace_env_placeholders(value)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
50
|
+
|
67
51
|
def config_init(params)
|
68
52
|
# Validation will modify the values inside params if necessary.
|
69
53
|
# For example: converting a string to a number, etc.
|
@@ -158,27 +142,6 @@ module LogStash::Config::Mixin
|
|
158
142
|
@config = params
|
159
143
|
end # def config_init
|
160
144
|
|
161
|
-
# Replace all environment variable references in 'value' param by environment variable value and return updated value
|
162
|
-
# Process following patterns : $VAR, ${VAR}, ${VAR:defaultValue}
|
163
|
-
def replace_env_placeholders(value)
|
164
|
-
return value unless value.is_a?(String)
|
165
|
-
|
166
|
-
value.gsub(ENV_PLACEHOLDER_REGEX) do |placeholder|
|
167
|
-
# Note: Ruby docs claim[1] Regexp.last_match is thread-local and scoped to
|
168
|
-
# the call, so this should be thread-safe.
|
169
|
-
#
|
170
|
-
# [1] http://ruby-doc.org/core-2.1.1/Regexp.html#method-c-last_match
|
171
|
-
name = Regexp.last_match(:name)
|
172
|
-
default = Regexp.last_match(:default)
|
173
|
-
|
174
|
-
replacement = ENV.fetch(name, default)
|
175
|
-
if replacement.nil?
|
176
|
-
raise LogStash::ConfigurationError, "Cannot evaluate `#{placeholder}`. Environment variable `#{name}` is not set and there is no default value given."
|
177
|
-
end
|
178
|
-
replacement
|
179
|
-
end
|
180
|
-
end # def replace_env_placeholders
|
181
|
-
|
182
145
|
module DSL
|
183
146
|
attr_accessor :flags
|
184
147
|
|
@@ -30,7 +30,7 @@ module LogStash module Config
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def ==(other)
|
33
|
-
config_hash == other.config_hash && pipeline_id == other.pipeline_id
|
33
|
+
config_hash == other.config_hash && pipeline_id == other.pipeline_id && settings == other.settings
|
34
34
|
end
|
35
35
|
|
36
36
|
def display_debug_information
|
@@ -37,7 +37,11 @@ module LogStash module Config module Source
|
|
37
37
|
config_parts = []
|
38
38
|
encoding_issue_files = []
|
39
39
|
|
40
|
-
|
40
|
+
if logger.debug?
|
41
|
+
logger.debug("Skipping the following files while reading config since they don't match the specified glob pattern", :files => get_unmatched_files)
|
42
|
+
end
|
43
|
+
|
44
|
+
get_matched_files.each do |file|
|
41
45
|
next unless ::File.file?(file) # skip directory
|
42
46
|
|
43
47
|
logger.debug("Reading config file", :config_file => file)
|
@@ -78,7 +82,7 @@ module LogStash module Config module Source
|
|
78
82
|
::File.expand_path(path)
|
79
83
|
end
|
80
84
|
|
81
|
-
def
|
85
|
+
def get_matched_files
|
82
86
|
Dir.glob(path).sort
|
83
87
|
end
|
84
88
|
|
@@ -90,6 +94,13 @@ module LogStash module Config module Source
|
|
90
94
|
end
|
91
95
|
end
|
92
96
|
|
97
|
+
def get_unmatched_files
|
98
|
+
# transform "/var/lib/*.conf" => /var/lib/*
|
99
|
+
t = ::File.split(@path)
|
100
|
+
all_files = Dir.glob(::File.join(t.first, "*")).sort
|
101
|
+
all_files - get_matched_files
|
102
|
+
end
|
103
|
+
|
93
104
|
def valid_encoding?(content)
|
94
105
|
content.ascii_only? && content.valid_encoding?
|
95
106
|
end
|
@@ -132,24 +143,28 @@ module LogStash module Config module Source
|
|
132
143
|
OUTPUT_BLOCK_RE = /output *{/
|
133
144
|
|
134
145
|
def pipeline_configs
|
135
|
-
config_parts = []
|
136
146
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
else
|
142
|
-
local_config_parts = []
|
147
|
+
if config_path? && config_string?
|
148
|
+
raise ConfigurationError.new("Settings 'config.string' and 'path.config' can't be used simultaneously.")
|
149
|
+
elsif !config_path? && !config_string?
|
150
|
+
raise ConfigurationError.new("Either 'config.string' or 'path.config' must be set.")
|
143
151
|
end
|
144
152
|
|
145
|
-
config_parts
|
153
|
+
config_parts = if config_string?
|
154
|
+
ConfigStringLoader.read(config_string)
|
155
|
+
elsif local_config?
|
156
|
+
ConfigPathLoader.read(config_path)
|
157
|
+
elsif remote_config?
|
158
|
+
ConfigRemoteLoader.read(config_path)
|
159
|
+
else
|
160
|
+
[]
|
161
|
+
end
|
146
162
|
|
147
163
|
return if config_parts.empty?
|
148
|
-
return if config_string? && config_string.strip.empty? && local_config? && local_config_parts.empty?
|
149
164
|
|
150
|
-
add_missing_default_inputs_or_outputs(config_parts)
|
165
|
+
add_missing_default_inputs_or_outputs(config_parts) if config_string?
|
151
166
|
|
152
|
-
[PipelineConfig.new(self.class,
|
167
|
+
[PipelineConfig.new(self.class, @settings.get("pipeline.id").to_sym, config_parts, @settings)]
|
153
168
|
end
|
154
169
|
|
155
170
|
def match?
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/config/source/local"
|
3
|
+
require "logstash/util/loggable"
|
4
|
+
require "logstash/pipeline_settings"
|
5
|
+
|
6
|
+
module LogStash module Config module Source
|
7
|
+
class MultiLocal < Local
|
8
|
+
include LogStash::Util::Loggable
|
9
|
+
|
10
|
+
def initialize(settings)
|
11
|
+
@original_settings = settings
|
12
|
+
super(settings)
|
13
|
+
end
|
14
|
+
|
15
|
+
def pipeline_configs
|
16
|
+
pipelines = retrieve_yaml_pipelines()
|
17
|
+
pipelines_settings = pipelines.map do |pipeline_settings|
|
18
|
+
::LogStash::PipelineSettings.from_settings(@original_settings.clone).merge(pipeline_settings)
|
19
|
+
end
|
20
|
+
detect_duplicate_pipelines(pipelines_settings)
|
21
|
+
pipelines_settings.map do |pipeline_settings|
|
22
|
+
@settings = pipeline_settings
|
23
|
+
# this relies on instance variable @settings and the parent class' pipeline_configs
|
24
|
+
# method. The alternative is to refactor most of the Local source methods to accept
|
25
|
+
# a settings object instead of relying on @settings.
|
26
|
+
super # create a PipelineConfig object based on @settings
|
27
|
+
end.flatten
|
28
|
+
end
|
29
|
+
|
30
|
+
def match?
|
31
|
+
uses_config_string = @original_settings.get_setting("config.string").set?
|
32
|
+
uses_path_config = @original_settings.get_setting("path.config").set?
|
33
|
+
return true if !uses_config_string && !uses_path_config
|
34
|
+
if uses_path_config
|
35
|
+
logger.warn("Ignoring the 'pipelines.yml' file because 'path.config' (-f) is being used.")
|
36
|
+
elsif uses_config_string
|
37
|
+
logger.warn("Ignoring the 'pipelines.yml' file because 'config.string' (-e) is being used.")
|
38
|
+
end
|
39
|
+
false
|
40
|
+
end
|
41
|
+
|
42
|
+
def retrieve_yaml_pipelines
|
43
|
+
result = read_pipelines_from_yaml(pipelines_yaml_location)
|
44
|
+
case result
|
45
|
+
when Array
|
46
|
+
result
|
47
|
+
when false
|
48
|
+
raise ConfigurationError.new("Pipelines YAML file is empty. Path: #{pipelines_yaml_location}")
|
49
|
+
else
|
50
|
+
raise ConfigurationError.new("Pipelines YAML file must contain an array of pipeline configs. Found \"#{result.class}\" in #{pipelines_yaml_location}")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def read_pipelines_from_yaml(yaml_location)
|
55
|
+
logger.debug("Reading pipeline configurations from YAML", :location => pipelines_yaml_location)
|
56
|
+
::YAML.load(IO.read(yaml_location))
|
57
|
+
rescue => e
|
58
|
+
raise ConfigurationError.new("Failed to read pipelines yaml file. Location: #{yaml_location}, Exception: #{e.inspect}")
|
59
|
+
end
|
60
|
+
|
61
|
+
def pipelines_yaml_location
|
62
|
+
::File.join(@original_settings.get("path.settings"), "pipelines.yml")
|
63
|
+
end
|
64
|
+
|
65
|
+
def detect_duplicate_pipelines(pipelines)
|
66
|
+
duplicate_ids = pipelines.group_by {|pipeline| pipeline.get("pipeline.id") }.select {|k, v| v.size > 1 }.map {|k, v| k}
|
67
|
+
if duplicate_ids.any?
|
68
|
+
raise ConfigurationError.new("Pipelines YAML file contains duplicate pipeline ids: #{duplicate_ids.inspect}. Location: #{pipelines_yaml_location}")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end end end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "logstash/config/source/local"
|
3
|
+
require "logstash/config/source/multi_local"
|
3
4
|
require "logstash/errors"
|
4
5
|
require "thread"
|
5
6
|
require "set"
|
@@ -120,6 +121,4 @@ module LogStash module Config
|
|
120
121
|
.select { |group, pipeline_configs| pipeline_configs.size > 1 }
|
121
122
|
end
|
122
123
|
end
|
123
|
-
|
124
|
-
SOURCE_LOADER = SourceLoader.new
|
125
124
|
end end
|
data/lib/logstash/environment.rb
CHANGED
@@ -50,6 +50,7 @@ module LogStash
|
|
50
50
|
Setting::Numeric.new("queue.checkpoint.acks", 1024), # 0 is unlimited
|
51
51
|
Setting::Numeric.new("queue.checkpoint.writes", 1024), # 0 is unlimited
|
52
52
|
Setting::Numeric.new("queue.checkpoint.interval", 1000), # 0 is no time-based checkpointing
|
53
|
+
Setting::Boolean.new("dead_letter_queue.enable", false),
|
53
54
|
Setting::TimeValue.new("slowlog.threshold.warn", "-1"),
|
54
55
|
Setting::TimeValue.new("slowlog.threshold.info", "-1"),
|
55
56
|
Setting::TimeValue.new("slowlog.threshold.debug", "-1"),
|
@@ -59,13 +60,21 @@ module LogStash
|
|
59
60
|
# Compute the default queue path based on `path.data`
|
60
61
|
default_queue_file_path = ::File.join(SETTINGS.get("path.data"), "queue")
|
61
62
|
SETTINGS.register Setting::WritableDirectory.new("path.queue", default_queue_file_path)
|
62
|
-
|
63
|
+
# Compute the default dead_letter_queue path based on `path.data`
|
64
|
+
default_dlq_file_path = ::File.join(SETTINGS.get("path.data"), "dead_letter_queue")
|
65
|
+
SETTINGS.register Setting::WritableDirectory.new("path.dead_letter_queue", default_dlq_file_path)
|
66
|
+
|
63
67
|
SETTINGS.on_post_process do |settings|
|
64
68
|
# If the data path is overridden but the queue path isn't recompute the queue path
|
65
69
|
# We need to do this at this stage because of the weird execution order
|
66
70
|
# our monkey-patched Clamp follows
|
67
|
-
if settings.set?("path.data")
|
68
|
-
|
71
|
+
if settings.set?("path.data")
|
72
|
+
if !settings.set?("path.queue")
|
73
|
+
settings.set_value("path.queue", ::File.join(settings.get("path.data"), "queue"))
|
74
|
+
end
|
75
|
+
if !settings.set?("path.dead_letter_queue")
|
76
|
+
settings.set_value("path.dead_letter_queue", ::File.join(settings.get("path.data"), "dead_letter_queue"))
|
77
|
+
end
|
69
78
|
end
|
70
79
|
end
|
71
80
|
|
@@ -1,13 +1,17 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require "logstash/util/dead_letter_queue_manager"
|
2
3
|
module LogStash
|
3
4
|
class ExecutionContext
|
4
|
-
attr_reader :pipeline, :agent
|
5
|
+
attr_reader :pipeline, :agent, :dlq_writer
|
5
6
|
|
6
|
-
def initialize(pipeline, agent)
|
7
|
+
def initialize(pipeline, agent, plugin_id, plugin_type, dlq_writer)
|
7
8
|
@pipeline = pipeline
|
8
9
|
@agent = agent
|
10
|
+
@plugin_id = plugin_id
|
11
|
+
@plugin_type = plugin_type
|
12
|
+
@dlq_writer = LogStash::Util::PluginDeadLetterQueueWriter.new(dlq_writer, @plugin_id, @plugin_type)
|
9
13
|
end
|
10
|
-
|
14
|
+
|
11
15
|
def pipeline_id
|
12
16
|
@pipeline.pipeline_id
|
13
17
|
end
|
data/lib/logstash/inputs/base.rb
CHANGED
@@ -105,6 +105,8 @@ class LogStash::Inputs::Base < LogStash::Plugin
|
|
105
105
|
super
|
106
106
|
# There is no easy way to propage an instance variable into the codec, because the codec
|
107
107
|
# are created at the class level
|
108
|
+
# TODO(talevy): Codecs should have their own execution_context, for now they will inherit their
|
109
|
+
# parent plugin's
|
108
110
|
@codec.execution_context = context
|
109
111
|
context
|
110
112
|
end
|
@@ -1,13 +1,11 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "logstash/instrument/metric_type/counter"
|
3
|
-
require "logstash/instrument/metric_type/mean"
|
4
3
|
require "logstash/instrument/metric_type/gauge"
|
5
4
|
|
6
5
|
module LogStash module Instrument
|
7
6
|
module MetricType
|
8
7
|
METRIC_TYPE_LIST = {
|
9
8
|
:counter => LogStash::Instrument::MetricType::Counter,
|
10
|
-
:mean => LogStash::Instrument::MetricType::Mean,
|
11
9
|
:gauge => LogStash::Instrument::MetricType::Gauge
|
12
10
|
}.freeze
|
13
11
|
|
@@ -2,18 +2,19 @@
|
|
2
2
|
require "logstash/instrument/periodic_poller/base"
|
3
3
|
require "logstash/instrument/periodic_poller/load_average"
|
4
4
|
require "logstash/environment"
|
5
|
-
require "jrmonitor"
|
6
5
|
require "set"
|
7
6
|
|
7
|
+
java_import 'com.sun.management.UnixOperatingSystemMXBean'
|
8
8
|
java_import 'java.lang.management.ManagementFactory'
|
9
9
|
java_import 'java.lang.management.OperatingSystemMXBean'
|
10
10
|
java_import 'java.lang.management.GarbageCollectorMXBean'
|
11
11
|
java_import 'java.lang.management.RuntimeMXBean'
|
12
|
-
java_import 'com.sun.management.UnixOperatingSystemMXBean'
|
13
12
|
java_import 'javax.management.MBeanServer'
|
14
13
|
java_import 'javax.management.ObjectName'
|
15
14
|
java_import 'javax.management.AttributeList'
|
16
15
|
java_import 'javax.naming.directory.Attribute'
|
16
|
+
java_import 'org.logstash.instrument.reports.MemoryReport'
|
17
|
+
java_import 'org.logstash.instrument.reports.ProcessReport'
|
17
18
|
|
18
19
|
|
19
20
|
module LogStash module Instrument module PeriodicPoller
|
@@ -50,7 +51,7 @@ module LogStash module Instrument module PeriodicPoller
|
|
50
51
|
end
|
51
52
|
|
52
53
|
def collect
|
53
|
-
raw =
|
54
|
+
raw = MemoryReport.generate
|
54
55
|
collect_jvm_metrics(raw)
|
55
56
|
collect_pools_metrics(raw)
|
56
57
|
collect_threads_metrics
|
@@ -81,11 +82,10 @@ module LogStash module Instrument module PeriodicPoller
|
|
81
82
|
end
|
82
83
|
|
83
84
|
def collect_process_metrics
|
84
|
-
process_metrics =
|
85
|
+
process_metrics = ProcessReport.generate
|
85
86
|
|
86
87
|
path = [:jvm, :process]
|
87
88
|
|
88
|
-
|
89
89
|
open_fds = process_metrics["open_file_descriptors"]
|
90
90
|
if @peak_open_fds.nil? || open_fds > @peak_open_fds
|
91
91
|
@peak_open_fds = open_fds
|