logstash-core 5.0.0.alpha4.snapshot1-java → 5.0.0.alpha4.snapshot2-java
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of logstash-core might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/logstash-core/version.rb +1 -1
- data/lib/logstash/agent.rb +31 -36
- data/lib/logstash/api/command_factory.rb +3 -1
- data/lib/logstash/api/commands/base.rb +4 -0
- data/lib/logstash/api/commands/node.rb +116 -0
- data/lib/logstash/api/commands/stats.rb +28 -77
- data/lib/logstash/api/modules/base.rb +2 -2
- data/lib/logstash/api/modules/node.rb +23 -6
- data/lib/logstash/api/modules/node_stats.rb +15 -1
- data/lib/logstash/api/rack_app.rb +9 -6
- data/lib/logstash/api/service.rb +8 -47
- data/lib/logstash/config/config_ast.rb +11 -3
- data/lib/logstash/config/mixin.rb +60 -22
- data/lib/logstash/inputs/metrics.rb +2 -2
- data/lib/logstash/instrument/collector.rb +5 -6
- data/lib/logstash/instrument/metric.rb +1 -1
- data/lib/logstash/instrument/metric_store.rb +54 -0
- data/lib/logstash/pipeline.rb +10 -4
- data/lib/logstash/runner.rb +2 -2
- data/lib/logstash/util/safe_uri.rb +48 -0
- data/lib/logstash/version.rb +1 -1
- data/lib/logstash/webserver.rb +8 -7
- data/logstash-core.gemspec +1 -1
- data/spec/api/lib/api/node_plugins_spec.rb +32 -0
- data/spec/api/lib/api/node_spec.rb +41 -7
- data/spec/api/lib/api/node_stats_spec.rb +31 -6
- data/spec/api/lib/api/plugins_spec.rb +1 -7
- data/spec/api/lib/api/root_spec.rb +2 -7
- data/spec/api/lib/api/support/resource_dsl_methods.rb +14 -7
- data/spec/api/spec_helper.rb +24 -50
- data/spec/logstash/agent_spec.rb +36 -13
- data/spec/logstash/config/config_ast_spec.rb +43 -0
- data/spec/logstash/config/mixin_spec.rb +138 -0
- data/spec/logstash/inputs/metrics_spec.rb +10 -11
- data/spec/logstash/instrument/collector_spec.rb +1 -1
- data/spec/logstash/instrument/metric_store_spec.rb +61 -0
- data/spec/logstash/instrument/periodic_poller/jvm_spec.rb +6 -3
- data/spec/logstash/pipeline_spec.rb +9 -9
- data/spec/support/mocks_classes.rb +2 -1
- metadata +39 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd0ebd412460fd45c6abdef1ae4a21b75f24b6c5
|
4
|
+
data.tar.gz: 4addbb53a17c98501b27f8f8fa33f8475a44bca4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b602623cc49f59c90e0af86c1d43e90e2b611aef12e44d5590a8536c3efd0cf06deab5644f49477fdcc2a4d7615340bef5e4fcac613ddfff9e6e792594511958
|
7
|
+
data.tar.gz: 7dcc49def008f07dae78a07e78c6ba8fa7e2942e30341637aa873068bf71cbc3ccb82557299b915e79934f523eb469d98a4dfaaeb39abcffe715efe66057bfe3
|
data/lib/logstash/agent.rb
CHANGED
@@ -45,15 +45,15 @@ class LogStash::Agent
|
|
45
45
|
@upgrade_mutex = Mutex.new
|
46
46
|
|
47
47
|
@collect_metric = setting("metric.collect")
|
48
|
-
|
49
|
-
|
48
|
+
|
49
|
+
# Create the collectors and configured it with the library
|
50
|
+
configure_metrics_collectors
|
50
51
|
end
|
51
52
|
|
52
53
|
def execute
|
53
54
|
@thread = Thread.current # this var is implicilty used by Stud.stop?
|
54
55
|
@logger.info("starting agent")
|
55
56
|
|
56
|
-
start_background_services
|
57
57
|
start_pipelines
|
58
58
|
start_webserver
|
59
59
|
|
@@ -112,8 +112,13 @@ class LogStash::Agent
|
|
112
112
|
((Time.now.to_f - STARTED_AT.to_f) * 1000.0).to_i
|
113
113
|
end
|
114
114
|
|
115
|
+
def stop_collecting_metrics
|
116
|
+
@collector.stop
|
117
|
+
@periodic_pollers.stop
|
118
|
+
end
|
119
|
+
|
115
120
|
def shutdown
|
116
|
-
|
121
|
+
stop_collecting_metrics
|
117
122
|
stop_webserver
|
118
123
|
shutdown_pipelines
|
119
124
|
end
|
@@ -131,7 +136,7 @@ class LogStash::Agent
|
|
131
136
|
private
|
132
137
|
def start_webserver
|
133
138
|
options = {:http_host => @http_host, :http_port => @http_port, :http_environment => @http_environment }
|
134
|
-
@webserver = LogStash::WebServer.new(@logger, options)
|
139
|
+
@webserver = LogStash::WebServer.new(@logger, self, options)
|
135
140
|
Thread.new(@webserver) do |webserver|
|
136
141
|
LogStash::Util.set_thread_name("Api Webserver")
|
137
142
|
webserver.run
|
@@ -142,28 +147,24 @@ class LogStash::Agent
|
|
142
147
|
@webserver.stop if @webserver
|
143
148
|
end
|
144
149
|
|
145
|
-
def
|
146
|
-
|
147
|
-
@logger.debug("Agent: Starting metric periodic pollers")
|
148
|
-
@periodic_pollers.start
|
149
|
-
end
|
150
|
-
end
|
150
|
+
def configure_metrics_collectors
|
151
|
+
@collector = LogStash::Instrument::Collector.new
|
151
152
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
153
|
+
@metric = if collect_metrics?
|
154
|
+
@logger.debug("Agent: Configuring metric collection")
|
155
|
+
LogStash::Instrument::Metric.new(@collector)
|
156
|
+
else
|
157
|
+
LogStash::Instrument::NullMetric.new
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
@periodic_pollers = LogStash::Instrument::PeriodicPollers.new(@metric)
|
162
|
+
@periodic_pollers.start
|
157
163
|
end
|
158
164
|
|
159
|
-
def
|
160
|
-
|
161
|
-
|
162
|
-
LogStash::Instrument::Collector.instance.agent = self
|
163
|
-
LogStash::Instrument::Metric.new
|
164
|
-
else
|
165
|
-
LogStash::Instrument::NullMetric.new
|
166
|
-
end
|
165
|
+
def reset_metrics_collectors
|
166
|
+
stop_collecting_metrics
|
167
|
+
configure_metrics_collectors
|
167
168
|
end
|
168
169
|
|
169
170
|
def collect_metrics?
|
@@ -171,7 +172,6 @@ class LogStash::Agent
|
|
171
172
|
end
|
172
173
|
|
173
174
|
def create_pipeline(settings, config=nil)
|
174
|
-
|
175
175
|
if config.nil?
|
176
176
|
begin
|
177
177
|
config = fetch_config(settings)
|
@@ -182,7 +182,7 @@ class LogStash::Agent
|
|
182
182
|
end
|
183
183
|
|
184
184
|
begin
|
185
|
-
LogStash::Pipeline.new(config, settings)
|
185
|
+
LogStash::Pipeline.new(config, settings, metric)
|
186
186
|
rescue => e
|
187
187
|
@logger.error("fetched an invalid config", :config => config, :reason => e.message)
|
188
188
|
return
|
@@ -204,6 +204,11 @@ class LogStash::Agent
|
|
204
204
|
return
|
205
205
|
end
|
206
206
|
|
207
|
+
# Reset the current collected stats,
|
208
|
+
# starting a pipeline with a new configuration should be the same as restarting
|
209
|
+
# logstash.
|
210
|
+
reset_metrics_collectors
|
211
|
+
|
207
212
|
new_pipeline = create_pipeline(old_pipeline.settings, new_config)
|
208
213
|
|
209
214
|
return if new_pipeline.nil?
|
@@ -225,12 +230,6 @@ class LogStash::Agent
|
|
225
230
|
return unless pipeline.is_a?(LogStash::Pipeline)
|
226
231
|
return if pipeline.ready?
|
227
232
|
@logger.info("starting pipeline", :id => id)
|
228
|
-
|
229
|
-
# Reset the current collected stats,
|
230
|
-
# starting a pipeline with a new configuration should be the same as restarting
|
231
|
-
# logstash.
|
232
|
-
reset_collector
|
233
|
-
|
234
233
|
Thread.new do
|
235
234
|
LogStash::Util.set_thread_name("pipeline.#{id}")
|
236
235
|
begin
|
@@ -273,10 +272,6 @@ class LogStash::Agent
|
|
273
272
|
@pipelines.empty?
|
274
273
|
end
|
275
274
|
|
276
|
-
def reset_collector
|
277
|
-
LogStash::Instrument::Collector.instance.clear
|
278
|
-
end
|
279
|
-
|
280
275
|
def setting(key)
|
281
276
|
@settings.get(key)
|
282
277
|
end
|
@@ -3,6 +3,7 @@ require "logstash/api/service"
|
|
3
3
|
require "logstash/api/commands/system/basicinfo_command"
|
4
4
|
require "logstash/api/commands/system/plugins_command"
|
5
5
|
require "logstash/api/commands/stats"
|
6
|
+
require "logstash/api/commands/node"
|
6
7
|
|
7
8
|
|
8
9
|
module LogStash
|
@@ -15,7 +16,8 @@ module LogStash
|
|
15
16
|
@factory = {
|
16
17
|
:system_basic_info => ::LogStash::Api::Commands::System::BasicInfo,
|
17
18
|
:plugins_command => ::LogStash::Api::Commands::System::Plugins,
|
18
|
-
:stats => ::LogStash::Api::Commands::Stats
|
19
|
+
:stats => ::LogStash::Api::Commands::Stats,
|
20
|
+
:node => ::LogStash::Api::Commands::Node
|
19
21
|
}
|
20
22
|
end
|
21
23
|
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require "logstash/api/commands/base"
|
2
|
+
|
3
|
+
module LogStash
|
4
|
+
module Api
|
5
|
+
module Commands
|
6
|
+
class Node < Commands::Base
|
7
|
+
def all
|
8
|
+
{
|
9
|
+
:pipeline => pipeline,
|
10
|
+
:os => os,
|
11
|
+
:jvm => jvm
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def pipeline
|
16
|
+
extract_metrics(
|
17
|
+
[:stats, :pipelines, :main, :config],
|
18
|
+
:workers, :batch_size, :batch_delay
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
def os
|
23
|
+
{
|
24
|
+
:name => java.lang.System.getProperty("os.name"),
|
25
|
+
:arch => java.lang.System.getProperty("os.arch"),
|
26
|
+
:version => java.lang.System.getProperty("os.version"),
|
27
|
+
:available_processors => java.lang.Runtime.getRuntime().availableProcessors()
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def jvm
|
32
|
+
memory_bean = ManagementFactory.getMemoryMXBean()
|
33
|
+
{
|
34
|
+
:pid => ManagementFactory.getRuntimeMXBean().getName().split("@").first.to_i,
|
35
|
+
:version => java.lang.System.getProperty("java.version"),
|
36
|
+
:vm_name => java.lang.System.getProperty("java.vm.name"),
|
37
|
+
:vm_version => java.lang.System.getProperty("java.version"),
|
38
|
+
:vm_vendor => java.lang.System.getProperty("java.vendor"),
|
39
|
+
:vm_name => java.lang.System.getProperty("java.vm.name"),
|
40
|
+
:start_time_in_millis => started_at,
|
41
|
+
:mem => {
|
42
|
+
:heap_init_in_bytes => (memory_bean.getHeapMemoryUsage().getInit() < 0 ? 0 : memory_bean.getHeapMemoryUsage().getInit()),
|
43
|
+
:heap_max_in_bytes => (memory_bean.getHeapMemoryUsage().getMax() < 0 ? 0 : memory_bean.getHeapMemoryUsage().getMax()),
|
44
|
+
:non_heap_init_in_bytes => (memory_bean.getNonHeapMemoryUsage().getInit() < 0 ? 0 : memory_bean.getNonHeapMemoryUsage().getInit()),
|
45
|
+
:non_heap_max_in_bytes => (memory_bean.getNonHeapMemoryUsage().getMax() < 0 ? 0 : memory_bean.getNonHeapMemoryUsage().getMax())
|
46
|
+
}
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def hot_threads(options={})
|
51
|
+
HotThreadsReport.new(self, options)
|
52
|
+
end
|
53
|
+
|
54
|
+
class HotThreadsReport
|
55
|
+
HOT_THREADS_STACK_TRACES_SIZE_DEFAULT = 10.freeze
|
56
|
+
|
57
|
+
def initialize(cmd, options)
|
58
|
+
@cmd = cmd
|
59
|
+
filter = { :stacktrace_size => options.fetch(:stacktrace_size, HOT_THREADS_STACK_TRACES_SIZE_DEFAULT) }
|
60
|
+
jr_dump = JRMonitor.threads.generate(filter)
|
61
|
+
@thread_dump = ::LogStash::Util::ThreadDump.new(options.merge(:dump => jr_dump))
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_s
|
65
|
+
hash = to_hash
|
66
|
+
report = "#{I18n.t("logstash.web_api.hot_threads.title", :hostname => hash[:hostname], :time => hash[:time], :top_count => @thread_dump.top_count )} \n"
|
67
|
+
report << '=' * 80
|
68
|
+
report << "\n"
|
69
|
+
hash[:threads].each do |thread|
|
70
|
+
thread_report = ""
|
71
|
+
thread_report = "#{I18n.t("logstash.web_api.
|
72
|
+
hot_threads.thread_title", :percent_of_cpu_time => thread[:percent_of_cpu_time], :thread_state => thread[:state], :thread_name => thread[:name])} \n"
|
73
|
+
thread_report = "#{thread[:percent_of_cpu_time]} % of of cpu usage by #{thread[:state]} thread named '#{thread[:name]}'\n"
|
74
|
+
thread_report << "#{thread[:path]}\n" if thread[:path]
|
75
|
+
thread[:traces].each do |trace|
|
76
|
+
thread_report << "\t#{trace}\n"
|
77
|
+
end
|
78
|
+
report << thread_report
|
79
|
+
report << '-' * 80
|
80
|
+
report << "\n"
|
81
|
+
end
|
82
|
+
report
|
83
|
+
end
|
84
|
+
|
85
|
+
def to_hash
|
86
|
+
hash = { :hostname => @cmd.hostname, :time => Time.now.iso8601, :busiest_threads => @thread_dump.top_count, :threads => [] }
|
87
|
+
@thread_dump.each do |thread_name, _hash|
|
88
|
+
thread_name, thread_path = _hash["thread.name"].split(": ")
|
89
|
+
thread = { :name => thread_name,
|
90
|
+
:percent_of_cpu_time => cpu_time_as_percent(_hash),
|
91
|
+
:state => _hash["thread.state"]
|
92
|
+
}
|
93
|
+
thread[:path] = thread_path if thread_path
|
94
|
+
traces = []
|
95
|
+
_hash["thread.stacktrace"].each do |trace|
|
96
|
+
traces << trace
|
97
|
+
end
|
98
|
+
thread[:traces] = traces unless traces.empty?
|
99
|
+
hash[:threads] << thread
|
100
|
+
end
|
101
|
+
hash
|
102
|
+
end
|
103
|
+
|
104
|
+
def cpu_time_as_percent(hash)
|
105
|
+
(((cpu_time(hash) / @cmd.uptime * 1.0)*10000).to_i)/100.0
|
106
|
+
end
|
107
|
+
|
108
|
+
def cpu_time(hash)
|
109
|
+
hash["cpu.time"] / 1000000.0
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -5,99 +5,50 @@ module LogStash
|
|
5
5
|
module Api
|
6
6
|
module Commands
|
7
7
|
class Stats < Commands::Base
|
8
|
-
|
9
8
|
def jvm
|
10
|
-
{
|
9
|
+
{
|
10
|
+
:threads => extract_metrics(
|
11
|
+
[:jvm, :threads],
|
12
|
+
:count,
|
13
|
+
:peak_count
|
14
|
+
)
|
15
|
+
}
|
11
16
|
end
|
12
17
|
|
13
18
|
def process
|
14
|
-
|
19
|
+
extract_metrics(
|
20
|
+
[:jvm, :process],
|
21
|
+
:open_file_descriptors,
|
22
|
+
:peak_open_file_descriptors,
|
23
|
+
:max_file_descriptors,
|
24
|
+
[:mem, [:total_virtual_in_bytes]],
|
25
|
+
[:cpu, [:total_in_millis, :percent]]
|
26
|
+
)
|
15
27
|
end
|
16
28
|
|
17
29
|
def events
|
18
|
-
|
30
|
+
extract_metrics(
|
31
|
+
[:stats, :events],
|
32
|
+
:in, :filtered, :out
|
33
|
+
)
|
19
34
|
end
|
20
35
|
|
21
36
|
def memory
|
22
|
-
memory =
|
37
|
+
memory = service.get_shallow(:jvm, :memory)
|
23
38
|
{
|
24
|
-
:heap_used_in_bytes => memory[
|
25
|
-
:heap_used_percent => memory[
|
26
|
-
:heap_committed_in_bytes => memory[
|
27
|
-
:heap_max_in_bytes => memory[
|
28
|
-
:heap_used_in_bytes => memory[
|
29
|
-
:non_heap_used_in_bytes => memory[
|
30
|
-
:non_heap_committed_in_bytes => memory[
|
31
|
-
:pools => memory[
|
39
|
+
:heap_used_in_bytes => memory[:heap][:used_in_bytes],
|
40
|
+
:heap_used_percent => memory[:heap][:used_percent],
|
41
|
+
:heap_committed_in_bytes => memory[:heap][:committed_in_bytes],
|
42
|
+
:heap_max_in_bytes => memory[:heap][:max_in_bytes],
|
43
|
+
:heap_used_in_bytes => memory[:heap][:used_in_bytes],
|
44
|
+
:non_heap_used_in_bytes => memory[:non_heap][:used_in_bytes],
|
45
|
+
:non_heap_committed_in_bytes => memory[:non_heap][:committed_in_bytes],
|
46
|
+
:pools => memory[:pools].inject({}) do |acc, (type, hash)|
|
32
47
|
hash.delete("committed_in_bytes")
|
33
48
|
acc[type] = hash
|
34
49
|
acc
|
35
50
|
end
|
36
51
|
}
|
37
|
-
end
|
38
|
-
|
39
|
-
def hot_threads(options={})
|
40
|
-
HotThreadsReport.new(self, options)
|
41
|
-
end
|
42
|
-
|
43
|
-
class HotThreadsReport
|
44
|
-
HOT_THREADS_STACK_TRACES_SIZE_DEFAULT = 10.freeze
|
45
|
-
|
46
|
-
def initialize(cmd, options)
|
47
|
-
@cmd = cmd
|
48
|
-
filter = { :stacktrace_size => options.fetch(:stacktrace_size, HOT_THREADS_STACK_TRACES_SIZE_DEFAULT) }
|
49
|
-
jr_dump = JRMonitor.threads.generate(filter)
|
50
|
-
@thread_dump = ::LogStash::Util::ThreadDump.new(options.merge(:dump => jr_dump))
|
51
|
-
end
|
52
|
-
|
53
|
-
def to_s
|
54
|
-
hash = to_hash
|
55
|
-
report = "#{I18n.t("logstash.web_api.hot_threads.title", :hostname => hash[:hostname], :time => hash[:time], :top_count => @thread_dump.top_count )} \n"
|
56
|
-
report << '=' * 80
|
57
|
-
report << "\n"
|
58
|
-
hash[:threads].each do |thread|
|
59
|
-
thread_report = ""
|
60
|
-
thread_report = "#{I18n.t("logstash.web_api.
|
61
|
-
hot_threads.thread_title", :percent_of_cpu_time => thread[:percent_of_cpu_time], :thread_state => thread[:state], :thread_name => thread[:name])} \n"
|
62
|
-
thread_report = "#{thread[:percent_of_cpu_time]} % of of cpu usage by #{thread[:state]} thread named '#{thread[:name]}'\n"
|
63
|
-
thread_report << "#{thread[:path]}\n" if thread[:path]
|
64
|
-
thread[:traces].each do |trace|
|
65
|
-
thread_report << "\t#{trace}\n"
|
66
|
-
end
|
67
|
-
report << thread_report
|
68
|
-
report << '-' * 80
|
69
|
-
report << "\n"
|
70
|
-
end
|
71
|
-
report
|
72
|
-
end
|
73
|
-
|
74
|
-
def to_hash
|
75
|
-
hash = { :hostname => @cmd.hostname, :time => Time.now.iso8601, :busiest_threads => @thread_dump.top_count, :threads => [] }
|
76
|
-
@thread_dump.each do |thread_name, _hash|
|
77
|
-
thread_name, thread_path = _hash["thread.name"].split(": ")
|
78
|
-
thread = { :name => thread_name,
|
79
|
-
:percent_of_cpu_time => cpu_time_as_percent(_hash),
|
80
|
-
:state => _hash["thread.state"]
|
81
|
-
}
|
82
|
-
thread[:path] = thread_path if thread_path
|
83
|
-
traces = []
|
84
|
-
_hash["thread.stacktrace"].each do |trace|
|
85
|
-
traces << trace
|
86
|
-
end
|
87
|
-
thread[:traces] = traces unless traces.empty?
|
88
|
-
hash[:threads] << thread
|
89
|
-
end
|
90
|
-
hash
|
91
|
-
end
|
92
|
-
|
93
|
-
def cpu_time_as_percent(hash)
|
94
|
-
(((cpu_time(hash) / @cmd.uptime * 1.0)*10000).to_i)/100.0
|
95
|
-
end
|
96
|
-
|
97
|
-
def cpu_time(hash)
|
98
|
-
hash["cpu.time"] / 1000000.0
|
99
|
-
end
|
100
|
-
|
101
52
|
end
|
102
53
|
end
|
103
54
|
end
|
@@ -21,9 +21,9 @@ module LogStash
|
|
21
21
|
|
22
22
|
helpers AppHelpers
|
23
23
|
|
24
|
-
def initialize(app=nil)
|
24
|
+
def initialize(app=nil, agent)
|
25
25
|
super(app)
|
26
|
-
@factory = ::LogStash::Api::CommandFactory.new(LogStash::Api::Service.
|
26
|
+
@factory = ::LogStash::Api::CommandFactory.new(LogStash::Api::Service.new(agent))
|
27
27
|
end
|
28
28
|
|
29
29
|
not_found do
|
@@ -5,7 +5,26 @@ module LogStash
|
|
5
5
|
module Api
|
6
6
|
module Modules
|
7
7
|
class Node < ::LogStash::Api::Modules::Base
|
8
|
-
|
8
|
+
def node
|
9
|
+
factory.build(:node)
|
10
|
+
end
|
11
|
+
|
12
|
+
get "/" do
|
13
|
+
respond_with node.all
|
14
|
+
end
|
15
|
+
|
16
|
+
get "/os" do
|
17
|
+
respond_with :os => node.os
|
18
|
+
end
|
19
|
+
|
20
|
+
get "/jvm" do
|
21
|
+
respond_with :jvm => node.jvm
|
22
|
+
end
|
23
|
+
|
24
|
+
get "/pipeline" do
|
25
|
+
respond_with :pipeline => node.pipeline
|
26
|
+
end
|
27
|
+
|
9
28
|
get "/hot_threads" do
|
10
29
|
ignore_idle_threads = params["ignore_idle_threads"] || true
|
11
30
|
|
@@ -15,11 +34,9 @@ module LogStash
|
|
15
34
|
}
|
16
35
|
options[:threads] = params["threads"].to_i if params.has_key?("threads")
|
17
36
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
22
|
-
|
37
|
+
as = options[:human] ? :string : :json
|
38
|
+
respond_with({:hot_threads => node.hot_threads(options)}, {:as => as})
|
39
|
+
end
|
23
40
|
end
|
24
41
|
end
|
25
42
|
end
|