logstash-core 2.4.1-java → 5.0.0.alpha1-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of logstash-core might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/logstash-core/version.rb +1 -1
- data/lib/logstash/agent.rb +124 -411
- data/lib/logstash/api/init.ru +31 -0
- data/lib/logstash/api/lib/app.rb +40 -0
- data/lib/logstash/api/lib/app/command.rb +29 -0
- data/lib/logstash/api/lib/app/command_factory.rb +29 -0
- data/lib/logstash/api/lib/app/commands/stats/events_command.rb +13 -0
- data/lib/logstash/api/lib/app/commands/stats/hotthreads_command.rb +120 -0
- data/lib/logstash/api/lib/app/commands/stats/memory_command.rb +25 -0
- data/lib/logstash/api/lib/app/commands/system/basicinfo_command.rb +15 -0
- data/lib/logstash/api/lib/app/commands/system/plugins_command.rb +28 -0
- data/lib/logstash/api/lib/app/modules/node.rb +25 -0
- data/lib/logstash/api/lib/app/modules/node_stats.rb +51 -0
- data/lib/logstash/api/lib/app/modules/plugins.rb +15 -0
- data/lib/logstash/api/lib/app/modules/stats.rb +21 -0
- data/lib/logstash/api/lib/app/root.rb +13 -0
- data/lib/logstash/api/lib/app/service.rb +61 -0
- data/lib/logstash/api/lib/app/stats.rb +56 -0
- data/lib/logstash/api/lib/helpers/app_helpers.rb +23 -0
- data/lib/logstash/codecs/base.rb +1 -29
- data/lib/logstash/config/config_ast.rb +18 -31
- data/lib/logstash/config/loader.rb +3 -5
- data/lib/logstash/config/mixin.rb +25 -64
- data/lib/logstash/filter_delegator.rb +65 -0
- data/lib/logstash/inputs/base.rb +1 -1
- data/lib/logstash/inputs/metrics.rb +47 -0
- data/lib/logstash/instrument/collector.rb +109 -0
- data/lib/logstash/instrument/metric.rb +102 -0
- data/lib/logstash/instrument/metric_store.rb +228 -0
- data/lib/logstash/instrument/metric_type.rb +24 -0
- data/lib/logstash/instrument/metric_type/base.rb +35 -0
- data/lib/logstash/instrument/metric_type/counter.rb +29 -0
- data/lib/logstash/instrument/metric_type/gauge.rb +22 -0
- data/lib/logstash/instrument/metric_type/mean.rb +33 -0
- data/lib/logstash/instrument/namespaced_metric.rb +54 -0
- data/lib/logstash/instrument/null_metric.rb +4 -3
- data/lib/logstash/instrument/periodic_poller/base.rb +57 -0
- data/lib/logstash/instrument/periodic_poller/jvm.rb +92 -0
- data/lib/logstash/instrument/periodic_poller/os.rb +13 -0
- data/lib/logstash/instrument/periodic_poller/periodic_poller_observer.rb +19 -0
- data/lib/logstash/instrument/periodic_pollers.rb +26 -0
- data/lib/logstash/instrument/snapshot.rb +16 -0
- data/lib/logstash/json.rb +2 -3
- data/lib/logstash/namespace.rb +1 -0
- data/lib/logstash/output_delegator.rb +16 -3
- data/lib/logstash/outputs/base.rb +1 -32
- data/lib/logstash/pipeline.rb +67 -8
- data/lib/logstash/plugin.rb +57 -19
- data/lib/logstash/runner.rb +348 -84
- data/lib/logstash/util.rb +9 -0
- data/lib/logstash/util/duration_formatter.rb +15 -0
- data/lib/logstash/util/java_version.rb +2 -4
- data/lib/logstash/util/loggable.rb +29 -0
- data/lib/logstash/version.rb +1 -1
- data/lib/logstash/webserver.rb +98 -0
- data/locales/en.yml +42 -24
- data/logstash-core.gemspec +9 -6
- data/spec/api/lib/api/node_spec.rb +64 -0
- data/spec/api/lib/api/node_stats_spec.rb +68 -0
- data/spec/api/lib/api/plugins_spec.rb +57 -0
- data/spec/api/lib/api/root_spec.rb +20 -0
- data/spec/api/lib/api/stats_spec.rb +19 -0
- data/spec/api/lib/commands/events_spec.rb +17 -0
- data/spec/api/lib/commands/jvm_spec.rb +45 -0
- data/spec/api/spec_helper.rb +128 -0
- data/spec/logstash/agent_spec.rb +62 -169
- data/spec/logstash/config/config_ast_spec.rb +2 -47
- data/spec/logstash/config/mixin_spec.rb +0 -157
- data/spec/logstash/filter_delegator_spec.rb +143 -0
- data/spec/logstash/inputs/metrics_spec.rb +52 -0
- data/spec/logstash/instrument/collector_spec.rb +49 -0
- data/spec/logstash/instrument/metric_spec.rb +110 -0
- data/spec/logstash/instrument/metric_store_spec.rb +163 -0
- data/spec/logstash/instrument/metric_type/counter_spec.rb +40 -0
- data/spec/logstash/instrument/metric_type/gauge_spec.rb +40 -0
- data/spec/logstash/instrument/namespaced_metric_spec.rb +25 -0
- data/spec/logstash/instrument/null_metric_spec.rb +9 -51
- data/spec/logstash/json_spec.rb +14 -0
- data/spec/logstash/output_delegator_spec.rb +6 -3
- data/spec/logstash/outputs/base_spec.rb +0 -107
- data/spec/logstash/pipeline_spec.rb +204 -33
- data/spec/logstash/plugin_spec.rb +80 -15
- data/spec/logstash/runner_spec.rb +134 -38
- data/spec/logstash/shutdown_watcher_spec.rb +0 -1
- data/spec/logstash/util/duration_formatter_spec.rb +11 -0
- data/spec/logstash/util/java_version_spec.rb +10 -2
- data/spec/logstash/util_spec.rb +28 -0
- data/spec/support/matchers.rb +30 -0
- metadata +154 -20
- data/lib/logstash/logging/json.rb +0 -21
- data/lib/logstash/special_agent.rb +0 -8
- data/lib/logstash/util/safe_uri.rb +0 -50
- data/spec/logstash/codecs/base_spec.rb +0 -74
- data/spec/static/i18n_spec.rb +0 -25
@@ -0,0 +1,31 @@
|
|
1
|
+
ROOT = File.expand_path(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift File.join(ROOT, 'lib')
|
3
|
+
Dir.glob('lib/**').each{ |d| $LOAD_PATH.unshift(File.join(ROOT, d)) }
|
4
|
+
|
5
|
+
require 'sinatra'
|
6
|
+
require 'app/root'
|
7
|
+
require 'app/modules/stats'
|
8
|
+
require 'app/modules/node'
|
9
|
+
require 'app/modules/node_stats'
|
10
|
+
require 'app/modules/plugins'
|
11
|
+
|
12
|
+
env = ENV["RACK_ENV"].to_sym
|
13
|
+
set :environment, env
|
14
|
+
|
15
|
+
set :service, LogStash::Api::Service.instance
|
16
|
+
|
17
|
+
configure do
|
18
|
+
enable :logging
|
19
|
+
end
|
20
|
+
run LogStash::Api::Root
|
21
|
+
|
22
|
+
namespaces = { "/_node" => LogStash::Api::Node,
|
23
|
+
"/_node/stats" => LogStash::Api::NodeStats,
|
24
|
+
"/_stats" => LogStash::Api::Stats,
|
25
|
+
"/_plugins" => LogStash::Api::Plugins }
|
26
|
+
|
27
|
+
namespaces.each_pair do |namespace, app|
|
28
|
+
map(namespace) do
|
29
|
+
run app
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "cabin"
|
3
|
+
require "logstash/json"
|
4
|
+
require "helpers/app_helpers"
|
5
|
+
require "app/service"
|
6
|
+
require "app/command_factory"
|
7
|
+
require "logstash/util/loggable"
|
8
|
+
|
9
|
+
module LogStash::Api
|
10
|
+
class BaseApp < ::Sinatra::Application
|
11
|
+
|
12
|
+
attr_reader :factory
|
13
|
+
|
14
|
+
if settings.environment != :production
|
15
|
+
set :raise_errors, true
|
16
|
+
set :show_exceptions, :after_handler
|
17
|
+
end
|
18
|
+
|
19
|
+
include LogStash::Util::Loggable
|
20
|
+
|
21
|
+
helpers AppHelpers
|
22
|
+
|
23
|
+
def initialize(app=nil)
|
24
|
+
super(app)
|
25
|
+
@factory = CommandFactory.new(settings.service)
|
26
|
+
end
|
27
|
+
|
28
|
+
not_found do
|
29
|
+
status 404
|
30
|
+
as = params.has_key?("human") ? :string : :json
|
31
|
+
text = as == :string ? "" : {}
|
32
|
+
respond_with(text, :as => as)
|
33
|
+
end
|
34
|
+
|
35
|
+
error do
|
36
|
+
logger.error(env['sinatra.error'].message, :url => request.url, :ip => request.ip, :params => request.params)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "app/service"
|
3
|
+
|
4
|
+
module LogStash::Api
|
5
|
+
class Command
|
6
|
+
|
7
|
+
attr_reader :service
|
8
|
+
|
9
|
+
def initialize(service = LogStash::Api::Service.instance)
|
10
|
+
@service = service
|
11
|
+
end
|
12
|
+
|
13
|
+
def run
|
14
|
+
raise "Not implemented"
|
15
|
+
end
|
16
|
+
|
17
|
+
def hostname
|
18
|
+
service.agent.node_name
|
19
|
+
end
|
20
|
+
|
21
|
+
def uptime
|
22
|
+
service.agent.uptime
|
23
|
+
end
|
24
|
+
|
25
|
+
def started_at
|
26
|
+
(LogStash::Agent::STARTED_AT.to_f * 1000.0).to_i
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "app/service"
|
3
|
+
require "app/commands/system/basicinfo_command"
|
4
|
+
require "app/commands/stats/events_command"
|
5
|
+
require "app/commands/stats/hotthreads_command"
|
6
|
+
require "app/commands/stats/memory_command"
|
7
|
+
require "app/commands/system/plugins_command"
|
8
|
+
|
9
|
+
module LogStash::Api
|
10
|
+
class CommandFactory
|
11
|
+
|
12
|
+
attr_reader :factory, :service
|
13
|
+
|
14
|
+
def initialize(service)
|
15
|
+
@service = service
|
16
|
+
@factory = {}.merge(
|
17
|
+
:system_basic_info => SystemBasicInfoCommand,
|
18
|
+
:events_command => StatsEventsCommand,
|
19
|
+
:hot_threads_command => HotThreadsCommand,
|
20
|
+
:memory_command => JvmMemoryCommand,
|
21
|
+
:plugins_command => PluginsCommand
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def build(klass)
|
26
|
+
factory[klass].new(service)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "app/command"
|
3
|
+
|
4
|
+
class LogStash::Api::StatsEventsCommand < LogStash::Api::Command
|
5
|
+
|
6
|
+
def run
|
7
|
+
#return whatever is comming out of the snapshot event, this obvoiusly
|
8
|
+
#need to be tailored to the right metrics for this command.
|
9
|
+
stats = LogStash::Json.load(service.get(:events_stats))
|
10
|
+
stats["stats"]["events"]
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "app/command"
|
3
|
+
require 'monitoring'
|
4
|
+
require "socket"
|
5
|
+
|
6
|
+
class LogStash::Api::HotThreadsCommand < LogStash::Api::Command
|
7
|
+
|
8
|
+
STACK_TRACES_SIZE_DEFAULT = 10.freeze
|
9
|
+
|
10
|
+
def run(options={})
|
11
|
+
filter = { :stacktrace_size => options.fetch(:stacktrace_size, STACK_TRACES_SIZE_DEFAULT) }
|
12
|
+
hash = JRMonitor.threads.generate(filter)
|
13
|
+
ThreadDump.new(hash, self, options)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
class ThreadDump
|
19
|
+
|
20
|
+
SKIPPED_THREADS = [ "Finalizer", "Reference Handler", "Signal Dispatcher" ].freeze
|
21
|
+
THREADS_COUNT_DEFAULT = 3.freeze
|
22
|
+
IGNORE_IDLE_THREADS_DEFAULT = true.freeze
|
23
|
+
|
24
|
+
attr_reader :top_count, :ignore, :dump
|
25
|
+
|
26
|
+
def initialize(dump, cmd, options={})
|
27
|
+
@dump = dump
|
28
|
+
@options = options
|
29
|
+
@top_count = options.fetch(:threads, THREADS_COUNT_DEFAULT)
|
30
|
+
@ignore = options.fetch(:ignore_idle_threads, IGNORE_IDLE_THREADS_DEFAULT)
|
31
|
+
@cmd = cmd
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_s
|
35
|
+
hash = to_hash
|
36
|
+
report = "#{I18n.t("logstash.web_api.hot_threads.title", :hostname => hash[:hostname], :time => hash[:time], :top_count => top_count )} \n"
|
37
|
+
hash[:threads].each do |thread|
|
38
|
+
thread_report = ""
|
39
|
+
thread_report = "\t #{I18n.t("logstash.web_api.hot_threads.thread_title", :percent_of_cpu_time => thread[:percent_of_cpu_time], :thread_state => thread[:state], :thread_name => thread[:name])} \n"
|
40
|
+
thread_report = "\t #{thread[:percent_of_cpu_time]} % of of cpu usage by #{thread[:state]} thread named '#{thread[:name]}'\n"
|
41
|
+
thread_report << "\t\t #{thread[:path]}\n" if thread[:path]
|
42
|
+
thread[:traces].split("\n").each do |trace|
|
43
|
+
thread_report << "#{trace}\n"
|
44
|
+
end
|
45
|
+
report << thread_report
|
46
|
+
end
|
47
|
+
report
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_hash
|
51
|
+
hash = { :hostname => hostname, :time => Time.now.iso8601, :busiest_threads => top_count, :threads => [] }
|
52
|
+
each do |thread_name, _hash|
|
53
|
+
thread_name, thread_path = _hash["thread.name"].split(": ")
|
54
|
+
thread = { :name => thread_name,
|
55
|
+
:percent_of_cpu_time => cpu_time_as_percent(_hash),
|
56
|
+
:state => _hash["thread.state"]
|
57
|
+
}
|
58
|
+
thread[:path] = thread_path if thread_path
|
59
|
+
traces = ""
|
60
|
+
_hash["thread.stacktrace"].each do |trace|
|
61
|
+
traces << "\t\t#{trace}\n"
|
62
|
+
end
|
63
|
+
thread[:traces] = traces unless traces.empty?
|
64
|
+
hash[:threads] << thread
|
65
|
+
end
|
66
|
+
hash
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def each(&block)
|
72
|
+
i=0
|
73
|
+
dump.each_pair do |thread_name, _hash|
|
74
|
+
break if i >= top_count
|
75
|
+
if ignore
|
76
|
+
next if idle_thread?(thread_name, _hash)
|
77
|
+
end
|
78
|
+
block.call(thread_name, _hash)
|
79
|
+
i += 1
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def idle_thread?(thread_name, data)
|
84
|
+
idle = false
|
85
|
+
if SKIPPED_THREADS.include?(thread_name)
|
86
|
+
# these are likely JVM dependent
|
87
|
+
idle = true
|
88
|
+
elsif thread_name.match(/Ruby-\d+-JIT-\d+/)
|
89
|
+
# This are internal JRuby JIT threads,
|
90
|
+
# see java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor for details.
|
91
|
+
idle = true
|
92
|
+
elsif thread_name.match(/pool-\d+-thread-\d+/)
|
93
|
+
# This are threads used by the internal JRuby implementation to dispatch
|
94
|
+
# calls and tasks, see prg.jruby.internal.runtime.methods.DynamicMethod.call
|
95
|
+
idle = true
|
96
|
+
else
|
97
|
+
data["thread.stacktrace"].each do |trace|
|
98
|
+
if trace.start_with?("java.util.concurrent.ThreadPoolExecutor.getTask")
|
99
|
+
idle = true
|
100
|
+
break
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
idle
|
105
|
+
end
|
106
|
+
|
107
|
+
def hostname
|
108
|
+
@cmd.hostname
|
109
|
+
end
|
110
|
+
|
111
|
+
def cpu_time_as_percent(hash)
|
112
|
+
(((cpu_time(hash) / @cmd.uptime * 1.0)*10000).to_i)/100.0
|
113
|
+
end
|
114
|
+
|
115
|
+
def cpu_time(hash)
|
116
|
+
hash["cpu.time"] / 1000000.0
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "app/command"
|
3
|
+
require 'monitoring'
|
4
|
+
|
5
|
+
class LogStash::Api::JvmMemoryCommand < LogStash::Api::Command
|
6
|
+
|
7
|
+
def run
|
8
|
+
memory = LogStash::Json.load(service.get(:jvm_memory_stats))
|
9
|
+
{
|
10
|
+
:heap_used_in_bytes => memory["heap"]["used_in_bytes"],
|
11
|
+
:heap_used_percent => memory["heap"]["used_percent"],
|
12
|
+
:heap_committed_in_bytes => memory["heap"]["committed_in_bytes"],
|
13
|
+
:heap_max_in_bytes => memory["heap"]["max_in_bytes"],
|
14
|
+
:heap_used_in_bytes => memory["heap"]["used_in_bytes"],
|
15
|
+
:non_heap_used_in_bytes => memory["non_heap"]["used_in_bytes"],
|
16
|
+
:non_heap_committed_in_bytes => memory["non_heap"]["committed_in_bytes"],
|
17
|
+
:pools => memory["pools"].inject({}) do |acc, (type, hash)|
|
18
|
+
hash.delete("committed_in_bytes")
|
19
|
+
acc[type] = hash
|
20
|
+
acc
|
21
|
+
end
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "app/command"
|
3
|
+
require "logstash/util/duration_formatter"
|
4
|
+
|
5
|
+
class LogStash::Api::SystemBasicInfoCommand < LogStash::Api::Command
|
6
|
+
|
7
|
+
def run
|
8
|
+
{
|
9
|
+
"hostname" => hostname,
|
10
|
+
"version" => {
|
11
|
+
"number" => LOGSTASH_VERSION
|
12
|
+
}
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "app/command"
|
3
|
+
|
4
|
+
class LogStash::Api::PluginsCommand < LogStash::Api::Command
|
5
|
+
|
6
|
+
def run
|
7
|
+
{ :total => plugins.count, :plugins => plugins }
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def plugins
|
13
|
+
@plugins ||= find_plugins_gem_specs.map do |spec|
|
14
|
+
{ :name => spec.name, :version => spec.version.to_s }
|
15
|
+
end.sort_by do |spec|
|
16
|
+
spec[:name]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def find_plugins_gem_specs
|
21
|
+
@specs ||= Gem::Specification.find_all.select{|spec| logstash_plugin_gem_spec?(spec)}
|
22
|
+
end
|
23
|
+
|
24
|
+
def logstash_plugin_gem_spec?(spec)
|
25
|
+
spec.metadata && spec.metadata["logstash_plugin"] == "true"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "app"
|
3
|
+
|
4
|
+
module LogStash::Api
|
5
|
+
class Node < BaseApp
|
6
|
+
|
7
|
+
helpers AppHelpers
|
8
|
+
|
9
|
+
# return hot threads information
|
10
|
+
get "/hot_threads" do
|
11
|
+
ignore_idle_threads = params["ignore_idle_threads"] || true
|
12
|
+
|
13
|
+
options = {
|
14
|
+
:ignore_idle_threads => as_boolean(ignore_idle_threads),
|
15
|
+
:human => params.has_key?("human")
|
16
|
+
}
|
17
|
+
options[:threads] = params["threads"].to_i if params.has_key?("threads")
|
18
|
+
|
19
|
+
command = factory.build(:hot_threads_command)
|
20
|
+
as = options[:human] ? :string : :json
|
21
|
+
respond_with(command.run(options), {:as => as})
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "app"
|
3
|
+
|
4
|
+
module LogStash::Api
|
5
|
+
class NodeStats < BaseApp
|
6
|
+
|
7
|
+
helpers AppHelpers
|
8
|
+
|
9
|
+
|
10
|
+
# Global _stats resource where all information is
|
11
|
+
# retrieved and show
|
12
|
+
get "/" do
|
13
|
+
events_command = factory.build(:events_command)
|
14
|
+
payload = {
|
15
|
+
:events => events_command.run,
|
16
|
+
:jvm => jvm_payload
|
17
|
+
}
|
18
|
+
|
19
|
+
respond_with payload
|
20
|
+
end
|
21
|
+
|
22
|
+
# Show all events stats information
|
23
|
+
# (for ingested, emitted, dropped)
|
24
|
+
# - #events since startup
|
25
|
+
# - #data (bytes) since startup
|
26
|
+
# - events/s
|
27
|
+
# - bytes/s
|
28
|
+
# - dropped events/s
|
29
|
+
# - events in the pipeline
|
30
|
+
get "/events" do
|
31
|
+
command = factory.build(:events_command)
|
32
|
+
respond_with({ :events => command.run })
|
33
|
+
end
|
34
|
+
|
35
|
+
# return hot threads information
|
36
|
+
get "/jvm" do
|
37
|
+
respond_with jvm_payload
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def jvm_payload
|
43
|
+
command = factory.build(:memory_command)
|
44
|
+
{
|
45
|
+
:timestamp => command.started_at,
|
46
|
+
:uptime_in_millis => command.uptime,
|
47
|
+
:mem => command.run
|
48
|
+
}
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "app"
|
3
|
+
|
4
|
+
module LogStash::Api
|
5
|
+
class Stats < BaseApp
|
6
|
+
|
7
|
+
helpers AppHelpers
|
8
|
+
|
9
|
+
# return hot threads information
|
10
|
+
get "/jvm" do
|
11
|
+
command = factory.build(:memory_command)
|
12
|
+
jvm_payload = {
|
13
|
+
:timestamp => command.started_at,
|
14
|
+
:uptime_in_millis => command.uptime,
|
15
|
+
:mem => command.run
|
16
|
+
}
|
17
|
+
respond_with({:jvm => jvm_payload})
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|