logstash-core 5.0.0.alpha4.snapshot2-java → 5.0.0.alpha4.snapshot3-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/api/commands/stats.rb +97 -1
- data/lib/logstash/api/modules/node_stats.rb +8 -0
- data/lib/logstash/config/mixin.rb +1 -1
- data/lib/logstash/environment.rb +1 -0
- data/lib/logstash/filter_delegator.rb +3 -0
- data/lib/logstash/instrument/metric.rb +2 -2
- data/lib/logstash/instrument/namespaced_metric.rb +1 -1
- data/lib/logstash/output_delegator.rb +5 -0
- data/lib/logstash/version.rb +1 -1
- data/lib/logstash/webserver.rb +3 -0
- data/logstash-core.gemspec +1 -1
- data/spec/logstash/filter_delegator_spec.rb +18 -3
- data/spec/logstash/instrument/metric_spec.rb +4 -4
- data/spec/logstash/instrument/namespaced_metric_spec.rb +7 -0
- data/spec/logstash/output_delegator_spec.rb +1 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c90549a9a03e8d32ee0eb8146780ad53609abc84
|
4
|
+
data.tar.gz: 14e872af82cfa7cb8dbfc1b5bbce6e8fcd4e8031
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c666d73e6f87dd8de677888232066d807a2878105a40c023ad0a9d9f221eb9fea16ddf8694a3cd692c816ae92537c23a034e54162c71505990b53ba7a710b7d8
|
7
|
+
data.tar.gz: 45d360a8b9896e2ff744d0e84efce8126c33d5c4c6ce1d71a8fdbf89a61ee6940a2a80843cb7613d3eaa8baab677bf7c717009ac93a7c55b559678c840cc37f1
|
@@ -33,6 +33,11 @@ module LogStash
|
|
33
33
|
)
|
34
34
|
end
|
35
35
|
|
36
|
+
def pipeline
|
37
|
+
stats = service.get_shallow(:stats, :pipelines)
|
38
|
+
PluginsStats.report(stats)
|
39
|
+
end
|
40
|
+
|
36
41
|
def memory
|
37
42
|
memory = service.get_shallow(:jvm, :memory)
|
38
43
|
{
|
@@ -49,7 +54,98 @@ module LogStash
|
|
49
54
|
acc
|
50
55
|
end
|
51
56
|
}
|
52
|
-
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def hot_threads(options={})
|
60
|
+
HotThreadsReport.new(self, options)
|
61
|
+
end
|
62
|
+
|
63
|
+
class HotThreadsReport
|
64
|
+
HOT_THREADS_STACK_TRACES_SIZE_DEFAULT = 10.freeze
|
65
|
+
|
66
|
+
def initialize(cmd, options)
|
67
|
+
@cmd = cmd
|
68
|
+
filter = { :stacktrace_size => options.fetch(:stacktrace_size, HOT_THREADS_STACK_TRACES_SIZE_DEFAULT) }
|
69
|
+
jr_dump = JRMonitor.threads.generate(filter)
|
70
|
+
@thread_dump = ::LogStash::Util::ThreadDump.new(options.merge(:dump => jr_dump))
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_s
|
74
|
+
hash = to_hash
|
75
|
+
report = "#{I18n.t("logstash.web_api.hot_threads.title", :hostname => hash[:hostname], :time => hash[:time], :top_count => @thread_dump.top_count )} \n"
|
76
|
+
report << '=' * 80
|
77
|
+
report << "\n"
|
78
|
+
hash[:threads].each do |thread|
|
79
|
+
thread_report = ""
|
80
|
+
thread_report = "#{I18n.t("logstash.web_api.
|
81
|
+
hot_threads.thread_title", :percent_of_cpu_time => thread[:percent_of_cpu_time], :thread_state => thread[:state], :thread_name => thread[:name])} \n"
|
82
|
+
thread_report = "#{thread[:percent_of_cpu_time]} % of of cpu usage by #{thread[:state]} thread named '#{thread[:name]}'\n"
|
83
|
+
thread_report << "#{thread[:path]}\n" if thread[:path]
|
84
|
+
thread[:traces].each do |trace|
|
85
|
+
thread_report << "\t#{trace}\n"
|
86
|
+
end
|
87
|
+
report << thread_report
|
88
|
+
report << '-' * 80
|
89
|
+
report << "\n"
|
90
|
+
end
|
91
|
+
report
|
92
|
+
end
|
93
|
+
|
94
|
+
def to_hash
|
95
|
+
hash = { :hostname => @cmd.hostname, :time => Time.now.iso8601, :busiest_threads => @thread_dump.top_count, :threads => [] }
|
96
|
+
@thread_dump.each do |thread_name, _hash|
|
97
|
+
thread_name, thread_path = _hash["thread.name"].split(": ")
|
98
|
+
thread = { :name => thread_name,
|
99
|
+
:percent_of_cpu_time => cpu_time_as_percent(_hash),
|
100
|
+
:state => _hash["thread.state"]
|
101
|
+
}
|
102
|
+
thread[:path] = thread_path if thread_path
|
103
|
+
traces = []
|
104
|
+
_hash["thread.stacktrace"].each do |trace|
|
105
|
+
traces << trace
|
106
|
+
end
|
107
|
+
thread[:traces] = traces unless traces.empty?
|
108
|
+
hash[:threads] << thread
|
109
|
+
end
|
110
|
+
hash
|
111
|
+
end
|
112
|
+
|
113
|
+
def cpu_time_as_percent(hash)
|
114
|
+
(((cpu_time(hash) / @cmd.uptime * 1.0)*10000).to_i)/100.0
|
115
|
+
end
|
116
|
+
|
117
|
+
def cpu_time(hash)
|
118
|
+
hash["cpu.time"] / 1000000.0
|
119
|
+
end
|
120
|
+
end # class HotThreadsReport
|
121
|
+
|
122
|
+
module PluginsStats
|
123
|
+
module_function
|
124
|
+
|
125
|
+
def plugin_stats(stats, plugin_type)
|
126
|
+
# Turn the `plugins` stats hash into an array of [ {}, {}, ... ]
|
127
|
+
# This is to produce an array of data points, one point for each
|
128
|
+
# plugin instance.
|
129
|
+
return [] unless stats[:plugins].include?(plugin_type)
|
130
|
+
stats[:plugins][plugin_type].collect do |id, data|
|
131
|
+
{ :id => id }.merge(data)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def report(stats)
|
136
|
+
# Only one pipeline right now.
|
137
|
+
stats = stats[:main]
|
138
|
+
|
139
|
+
{
|
140
|
+
:events => stats[:events],
|
141
|
+
:pipeline => {
|
142
|
+
:inputs => plugin_stats(stats, :inputs),
|
143
|
+
:filters => plugin_stats(stats, :filters),
|
144
|
+
:outputs => plugin_stats(stats, :outputs)
|
145
|
+
}
|
146
|
+
}
|
147
|
+
end
|
148
|
+
end # module PluginsStats
|
53
149
|
end
|
54
150
|
end
|
55
151
|
end
|
@@ -50,6 +50,10 @@ module LogStash
|
|
50
50
|
respond_with :mem => mem_payload
|
51
51
|
end
|
52
52
|
|
53
|
+
get "/pipeline" do
|
54
|
+
respond_with :pipeline => pipeline_payload
|
55
|
+
end
|
56
|
+
|
53
57
|
private
|
54
58
|
|
55
59
|
def events_payload
|
@@ -67,6 +71,10 @@ module LogStash
|
|
67
71
|
def mem_payload
|
68
72
|
@stats.memory
|
69
73
|
end
|
74
|
+
|
75
|
+
def pipeline_payload
|
76
|
+
@stats.pipeline
|
77
|
+
end
|
70
78
|
end
|
71
79
|
end
|
72
80
|
end
|
data/lib/logstash/environment.rb
CHANGED
@@ -25,6 +25,7 @@ module LogStash
|
|
25
25
|
@filter.metric = metric
|
26
26
|
|
27
27
|
@metric_events = namespaced_metric.namespace(:events)
|
28
|
+
namespaced_metric.gauge(:name, config_name)
|
28
29
|
|
29
30
|
# Not all the filters will do bufferings
|
30
31
|
define_flush_method if @filter.respond_to?(:flush)
|
@@ -37,7 +38,9 @@ module LogStash
|
|
37
38
|
def multi_filter(events)
|
38
39
|
@metric_events.increment(:in, events.size)
|
39
40
|
|
41
|
+
clock = @metric_events.time(:duration_in_millis)
|
40
42
|
new_events = @filter.multi_filter(events)
|
43
|
+
clock.stop
|
41
44
|
|
42
45
|
# There is no garantee in the context of filter
|
43
46
|
# that EVENTS_INT == EVENTS_OUT, see the aggregates and
|
@@ -46,7 +46,7 @@ module LogStash module Instrument
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def report_time(namespace, key, duration)
|
49
|
-
collector.push(namespace, key, :
|
49
|
+
collector.push(namespace, key, :counter, :increment, duration)
|
50
50
|
end
|
51
51
|
|
52
52
|
# This method return a metric instance tied to a specific namespace
|
@@ -81,7 +81,7 @@ module LogStash module Instrument
|
|
81
81
|
#
|
82
82
|
# @see LogStash::Instrument::Metric#time
|
83
83
|
class TimedExecution
|
84
|
-
MILLISECONDS =
|
84
|
+
MILLISECONDS = 1_000.0.freeze
|
85
85
|
|
86
86
|
def initialize(metric, namespace, key)
|
87
87
|
@metric = metric
|
@@ -28,6 +28,7 @@ module LogStash class OutputDelegator
|
|
28
28
|
# Scope the metrics to the plugin
|
29
29
|
namespaced_metric = metric.namespace(output.plugin_unique_name.to_sym)
|
30
30
|
@metric_events = namespaced_metric.namespace(:events)
|
31
|
+
namespaced_metric.gauge(:name, config_name)
|
31
32
|
|
32
33
|
@events_received = Concurrent::AtomicFixnum.new(0)
|
33
34
|
end
|
@@ -129,7 +130,9 @@ module LogStash class OutputDelegator
|
|
129
130
|
@events_received.increment(events.length)
|
130
131
|
@metric_events.increment(:in, events.length)
|
131
132
|
|
133
|
+
clock = @metric_events.time(:duration_in_millis)
|
132
134
|
@threadsafe_worker.multi_receive(events)
|
135
|
+
clock.stop
|
133
136
|
@metric_events.increment(:out, events.length)
|
134
137
|
end
|
135
138
|
|
@@ -139,7 +142,9 @@ module LogStash class OutputDelegator
|
|
139
142
|
|
140
143
|
worker = @worker_queue.pop
|
141
144
|
begin
|
145
|
+
clock = @metric_events.time(:duration_in_millis)
|
142
146
|
worker.multi_receive(events)
|
147
|
+
clock.stop
|
143
148
|
@metric_events.increment(:out, events.length)
|
144
149
|
ensure
|
145
150
|
@worker_queue.push(worker)
|
data/lib/logstash/version.rb
CHANGED
data/lib/logstash/webserver.rb
CHANGED
@@ -43,6 +43,9 @@ module LogStash
|
|
43
43
|
@server.add_tcp_listener(http_host, http_port)
|
44
44
|
|
45
45
|
@server.run.join
|
46
|
+
rescue Errno::EADDRINUSE
|
47
|
+
message = "Logstash tried to bind to port #{@http_port}, but the port is already in use. You can specify a new port by launching logtash with the --http-port option."
|
48
|
+
raise Errno::EADDRINUSE.new(message)
|
46
49
|
end
|
47
50
|
|
48
51
|
def log(str)
|
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.alpha4.
|
20
|
+
gem.add_runtime_dependency "logstash-core-event-java", "5.0.0.alpha4.snapshot3"
|
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)
|
@@ -67,15 +67,22 @@ describe LogStash::FilterDelegator do
|
|
67
67
|
end
|
68
68
|
|
69
69
|
context "when the filter buffer events" do
|
70
|
-
|
70
|
+
before do
|
71
|
+
allow(metric).to receive(:increment).with(anything, anything)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "has incremented :in" do
|
71
75
|
expect(metric).to receive(:increment).with(:in, events.size)
|
72
|
-
|
76
|
+
subject.multi_filter(events)
|
77
|
+
end
|
73
78
|
|
79
|
+
it "has not incremented :out" do
|
80
|
+
expect(metric).not_to receive(:increment).with(:out, anything)
|
74
81
|
subject.multi_filter(events)
|
75
82
|
end
|
76
83
|
end
|
77
84
|
|
78
|
-
context "when the
|
85
|
+
context "when the filter create more events" do
|
79
86
|
let(:plugin_klass) do
|
80
87
|
Class.new(LogStash::Filters::Base) do
|
81
88
|
config_name "super_plugin"
|
@@ -91,6 +98,10 @@ describe LogStash::FilterDelegator do
|
|
91
98
|
end
|
92
99
|
end
|
93
100
|
|
101
|
+
before do
|
102
|
+
allow(metric).to receive(:increment).with(anything, anything)
|
103
|
+
end
|
104
|
+
|
94
105
|
it "increments the in/out of the metric" do
|
95
106
|
expect(metric).to receive(:increment).with(:in, events.size)
|
96
107
|
expect(metric).to receive(:increment).with(:out, events.size * 2)
|
@@ -112,6 +123,10 @@ describe LogStash::FilterDelegator do
|
|
112
123
|
end
|
113
124
|
end
|
114
125
|
|
126
|
+
before do
|
127
|
+
allow(metric).to receive(:increment).with(anything, anything)
|
128
|
+
end
|
129
|
+
|
115
130
|
it "doesnt define a flush method" do
|
116
131
|
expect(subject.respond_to?(:flush)).to be_falsey
|
117
132
|
end
|
@@ -67,15 +67,15 @@ describe LogStash::Instrument::Metric do
|
|
67
67
|
|
68
68
|
context "#time" do
|
69
69
|
let(:sleep_time) { 2 }
|
70
|
-
let(:sleep_time_ms) { sleep_time *
|
70
|
+
let(:sleep_time_ms) { sleep_time * 1_000 }
|
71
71
|
|
72
72
|
it "records the duration" do
|
73
73
|
subject.time(:root, :duration_ms) { sleep(sleep_time) }
|
74
74
|
|
75
|
-
expect(collector.last).to be_within(sleep_time_ms).of(sleep_time_ms +
|
75
|
+
expect(collector.last).to be_within(sleep_time_ms).of(sleep_time_ms + 5)
|
76
76
|
expect(collector[0]).to match(:root)
|
77
77
|
expect(collector[1]).to be(:duration_ms)
|
78
|
-
expect(collector[2]).to be(:
|
78
|
+
expect(collector[2]).to be(:counter)
|
79
79
|
end
|
80
80
|
|
81
81
|
it "returns the value of the executed block" do
|
@@ -90,7 +90,7 @@ describe LogStash::Instrument::Metric do
|
|
90
90
|
expect(collector.last).to be_within(sleep_time_ms).of(sleep_time_ms + 0.1)
|
91
91
|
expect(collector[0]).to match(:root)
|
92
92
|
expect(collector[1]).to be(:duration_ms)
|
93
|
-
expect(collector[2]).to be(:
|
93
|
+
expect(collector[2]).to be(:counter)
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
@@ -22,4 +22,11 @@ describe LogStash::Instrument::NamespacedMetric do
|
|
22
22
|
it "returns the value of the block" do
|
23
23
|
expect(subject.time(:duration_ms) { "hello" }).to eq("hello")
|
24
24
|
end
|
25
|
+
|
26
|
+
it "its doesnt change the original `namespace` when creating a subnamespace" do
|
27
|
+
new_namespace = subject.namespace(:wally)
|
28
|
+
|
29
|
+
expect(subject.namespace_name).to eq([namespace])
|
30
|
+
expect(new_namespace.namespace_name).to eq([:stats, :wally])
|
31
|
+
end
|
25
32
|
end
|
@@ -19,6 +19,7 @@ describe LogStash::OutputDelegator do
|
|
19
19
|
allow(out_klass).to receive(:threadsafe?).and_return(false)
|
20
20
|
allow(out_klass).to receive(:workers_not_supported?).and_return(false)
|
21
21
|
allow(out_klass).to receive(:name).and_return("example")
|
22
|
+
allow(out_klass).to receive(:config_name)
|
22
23
|
allow(out_inst).to receive(:register)
|
23
24
|
allow(out_inst).to receive(:multi_receive)
|
24
25
|
allow(out_inst).to receive(:metric=).with(any_args)
|
metadata
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.0.alpha4.
|
4
|
+
version: 5.0.0.alpha4.snapshot3
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-17 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.alpha4.
|
18
|
+
version: 5.0.0.alpha4.snapshot3
|
19
19
|
name: logstash-core-event-java
|
20
20
|
prerelease: false
|
21
21
|
type: :runtime
|
@@ -23,7 +23,7 @@ dependencies:
|
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 5.0.0.alpha4.
|
26
|
+
version: 5.0.0.alpha4.snapshot3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
29
29
|
requirements:
|