logstash-input-jmx 0.1.4 → 0.1.5
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.
- checksums.yaml +4 -4
- data/lib/logstash/inputs/jmx.rb +55 -73
- data/logstash-input-jmx.gemspec +2 -1
- data/spec/inputs/jmx_spec.rb +81 -0
- metadata +24 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7086a6d48c28232b76bc569a275c3bb32a09c08e
|
4
|
+
data.tar.gz: b84125c9b177064bc94aa5b1379089fd3c931296
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db45a1f480c834c8b1d12e2648cf61b9d33eb6670abd356d966adf4406a7db7f1190a9b2d7098adfad75046d2fdd0961c07d6fad3ca128840228677739007f5a
|
7
|
+
data.tar.gz: b0d578838b8d9da72a0e6fe3e5e3c1815ee7faa4d2952688a217878f9e98dfddffd2fbf6e7115fa39baad7518caf0aee6d5ac55b86aeab9b906d7202fd7d1242
|
data/lib/logstash/inputs/jmx.rb
CHANGED
@@ -106,73 +106,55 @@ class LogStash::Inputs::Jmx < LogStash::Inputs::Base
|
|
106
106
|
# Indicate number of thread launched to retrieve metrics
|
107
107
|
config :nb_thread, :validate => :number, :default => 4
|
108
108
|
|
109
|
-
#
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
end
|
116
|
-
|
109
|
+
#Error messages
|
110
|
+
MISSING_CONFIG_PARAMETER = "Missing parameter '%s'."
|
111
|
+
BAD_TYPE_CONFIG_PARAMETER = "Bad type for parameter '%{param}', expecting '%{expected}', found '%{actual}'."
|
112
|
+
MISSING_QUERY_PARAMETER = "Missing parameter '%s' in queries[%d]."
|
113
|
+
BAD_TYPE_QUERY = "Bad type for queries[%{index}], expecting '%{expected}', found '%{actual}'."
|
114
|
+
BAD_TYPE_QUERY_PARAMETER = "Bad type for parameter '%{param}' in queries[%{index}], expecting '%{expected}', found '%{actual}'."
|
117
115
|
# Verify that all required parameter are present in the conf_hash
|
118
|
-
|
119
|
-
def
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
if conf_hash.has_key?(param)
|
125
|
-
unless conf_hash[param].instance_of?(parameter[param])
|
126
|
-
@logger.error("Bad syntax for conf file #{file_conf}. Bad types for parameter #{param}, expecting #{parameter[param]}, found #{conf_hash[param].class}.")
|
127
|
-
return false
|
128
|
-
end
|
129
|
-
else
|
130
|
-
@logger.error("Bad syntax for conf file #{file_conf}. Missing parameter #{param}.")
|
131
|
-
return false
|
132
|
-
end
|
116
|
+
public
|
117
|
+
def validate_configuration(conf_hash)
|
118
|
+
validation_errors = []
|
119
|
+
#Check required parameters in configuration
|
120
|
+
["host", "port","queries"].each do |param|
|
121
|
+
validation_errors << MISSING_CONFIG_PARAMETER % param unless conf_hash.has_key?(param)
|
133
122
|
end
|
134
123
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
unless conf_hash[param].instance_of?(parameter[param])
|
140
|
-
@logger.error("Bad syntax for conf file #{file_conf}. Bad types for parameter #{param}, expecting #{parameter[param]}, found #{conf_hash[param].class}.")
|
141
|
-
return false
|
142
|
-
end
|
124
|
+
#Validate parameters type in configuration
|
125
|
+
{"host" => String, "port" => Fixnum, "alias" => String }.each do |param, expected_type|
|
126
|
+
if conf_hash.has_key?(param) && !conf_hash[param].instance_of?(expected_type)
|
127
|
+
validation_errors << BAD_TYPE_CONFIG_PARAMETER % { :param => param, :expected => expected_type, :actual => conf_hash[param].class }
|
143
128
|
end
|
144
129
|
end
|
145
130
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
unless query
|
152
|
-
|
153
|
-
|
131
|
+
if conf_hash.has_key?("queries")
|
132
|
+
if !conf_hash["queries"].respond_to?(:each)
|
133
|
+
validation_errors << BAD_TYPE_CONFIG_PARAMETER % { :param => 'queries', :expected => Enumerable, :actual => conf_hash['queries'].class }
|
134
|
+
else
|
135
|
+
conf_hash['queries'].each_with_index do |query,index|
|
136
|
+
unless query.respond_to?(:[]) && query.respond_to?(:has_key?)
|
137
|
+
validation_errors << BAD_TYPE_QUERY % {:index => index, :expected => Hash, :actual => query.class}
|
138
|
+
next
|
139
|
+
end
|
140
|
+
#Check required parameters in each query
|
141
|
+
["object_name"].each do |param|
|
142
|
+
validation_errors << MISSING_QUERY_PARAMETER % [param,index] unless query.has_key?(param)
|
143
|
+
end
|
144
|
+
#Validate parameters type in each query
|
145
|
+
{"object_name" => String, "object_alias" => String }.each do |param, expected_type|
|
146
|
+
if query.has_key?(param) && !query[param].instance_of?(expected_type)
|
147
|
+
validation_errors << BAD_TYPE_QUERY_PARAMETER % { :param => param, :index => index, :expected => expected_type, :actual => query[param].class }
|
148
|
+
end
|
154
149
|
end
|
155
|
-
else
|
156
|
-
@logger.error("Bad syntax for conf file #{file_conf} in query #{query}. Missing parameter #{param}.")
|
157
|
-
return false
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
161
150
|
|
162
|
-
|
163
|
-
|
164
|
-
parameter.each_key do |param|
|
165
|
-
conf_hash['queries'].each do |query|
|
166
|
-
if query.has_key?(param)
|
167
|
-
unless query[param].instance_of?(parameter[param])
|
168
|
-
@logger.error("Bad syntax for conf file #{file_conf} in query #{query}. Bad types for parameter #{param}, expecting #{parameter[param]}, found #{conf_hash[param].class}.")
|
169
|
-
return false
|
151
|
+
if query.has_key?("attributes") && !query["attributes"].respond_to?(:each)
|
152
|
+
validation_errors << BAD_TYPE_QUERY_PARAMETER % { :param => 'attributes', :index => index, :expected => Enumerable, :actual => query['attributes'].class }
|
170
153
|
end
|
171
154
|
end
|
172
155
|
end
|
173
156
|
end
|
174
|
-
|
175
|
-
true
|
157
|
+
return validation_errors
|
176
158
|
end
|
177
159
|
|
178
160
|
private
|
@@ -215,8 +197,6 @@ class LogStash::Inputs::Jmx < LogStash::Inputs::Base
|
|
215
197
|
# Thread function to retrieve metrics from JMX
|
216
198
|
private
|
217
199
|
def thread_jmx(queue_conf,queue)
|
218
|
-
require 'jmx4r'
|
219
|
-
|
220
200
|
while true
|
221
201
|
begin
|
222
202
|
@logger.debug('Wait config to retrieve from queue conf')
|
@@ -317,43 +297,45 @@ class LogStash::Inputs::Jmx < LogStash::Inputs::Base
|
|
317
297
|
|
318
298
|
public
|
319
299
|
def register
|
320
|
-
|
300
|
+
require 'thread'
|
301
|
+
require 'jmx4r'
|
321
302
|
|
322
|
-
@logger.info(
|
303
|
+
@logger.info("Create queue dispatching JMX requests to threads")
|
323
304
|
@queue_conf = Queue.new
|
324
305
|
|
325
|
-
@logger.info(
|
306
|
+
@logger.info("Compile regexp for group alias object replacement")
|
326
307
|
@regexp_group_alias_object = Regexp.new('(?:\${(.*?)})+')
|
327
308
|
end
|
328
309
|
|
329
310
|
public
|
330
311
|
def run(queue)
|
331
|
-
require 'thread'
|
332
|
-
|
333
312
|
begin
|
334
313
|
threads = []
|
335
|
-
@logger.info("
|
314
|
+
@logger.info("Initialize #{@nb_thread} threads for JMX metrics collection")
|
336
315
|
@nb_thread.times do
|
337
316
|
threads << Thread.new { thread_jmx(@queue_conf,queue) }
|
338
317
|
end
|
339
318
|
|
340
319
|
while true
|
341
|
-
@logger.info("
|
320
|
+
@logger.info("Loading configuration files in path", :path => @path)
|
342
321
|
Dir.foreach(@path) do |item|
|
322
|
+
next if item == '.' or item == '..'
|
343
323
|
begin
|
344
|
-
next if item == '.' or item == '..'
|
345
324
|
file_conf = File.join(@path, item)
|
346
|
-
@logger.debug("
|
347
|
-
|
348
|
-
|
349
|
-
|
325
|
+
@logger.debug? && @logger.debug("Loading configuration from file", :file => file_conf)
|
326
|
+
config_string = File.read(file_conf)
|
327
|
+
conf_hash = LogStash::Json.load(config_string)
|
328
|
+
validation_errors = validate_configuration(conf_hash)
|
329
|
+
if validation_errors.empty?
|
330
|
+
@logger.debug? && @logger.debug("Add configuration to the queue", :config => conf_hash)
|
350
331
|
@queue_conf << conf_hash
|
332
|
+
else
|
333
|
+
@logger.warn("Issue with configuration file", :file => file_conf,
|
334
|
+
:validation_errors => validation_errors)
|
351
335
|
end
|
352
336
|
rescue Exception => ex
|
353
|
-
@logger.warn("Issue
|
354
|
-
|
355
|
-
@logger.warn(ex.backtrace.join("\n"))
|
356
|
-
next
|
337
|
+
@logger.warn("Issue loading configuration from file", :file => file_conf,
|
338
|
+
:exception => ex.message, :backtrace => ex.backtrace)
|
357
339
|
end
|
358
340
|
end
|
359
341
|
@logger.debug('Wait until the queue conf is empty')
|
data/logstash-input-jmx.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-input-jmx'
|
4
|
-
s.version = '0.1.
|
4
|
+
s.version = '0.1.5'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "Retrieve metrics from jmx."
|
7
7
|
s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
|
@@ -25,5 +25,6 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_runtime_dependency 'jmx4r'
|
26
26
|
|
27
27
|
s.add_development_dependency 'logstash-devutils'
|
28
|
+
s.add_development_dependency 'logstash-codec-plain'
|
28
29
|
end
|
29
30
|
|
data/spec/inputs/jmx_spec.rb
CHANGED
@@ -1 +1,82 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require "logstash/devutils/rspec/spec_helper"
|
3
|
+
require "logstash/inputs/jmx"
|
4
|
+
require "logstash/codecs/plain"
|
5
|
+
require 'stud/temporary'
|
6
|
+
|
7
|
+
describe LogStash::Inputs::Jmx do
|
8
|
+
|
9
|
+
let(:jmx_config_path) { Stud::Temporary.directory }
|
10
|
+
after(:each) do
|
11
|
+
FileUtils.remove_dir(jmx_config_path)
|
12
|
+
end
|
13
|
+
|
14
|
+
subject { LogStash::Inputs::Jmx.new("path" => jmx_config_path)}
|
15
|
+
|
16
|
+
context "#validate_configuration(conf_hash)" do
|
17
|
+
#Reference to error messages
|
18
|
+
MISSING_CONFIG_PARAMETER = LogStash::Inputs::Jmx::MISSING_CONFIG_PARAMETER
|
19
|
+
BAD_TYPE_CONFIG_PARAMETER = LogStash::Inputs::Jmx::BAD_TYPE_CONFIG_PARAMETER
|
20
|
+
BAD_TYPE_QUERY = LogStash::Inputs::Jmx::BAD_TYPE_QUERY
|
21
|
+
MISSING_QUERY_PARAMETER = LogStash::Inputs::Jmx::MISSING_QUERY_PARAMETER
|
22
|
+
BAD_TYPE_QUERY_PARAMETER = LogStash::Inputs::Jmx::BAD_TYPE_QUERY_PARAMETER
|
23
|
+
|
24
|
+
let(:minimal_config) { {"host"=>"localhost","port"=>1234,"queries" => [] } }
|
25
|
+
|
26
|
+
context "global configuration" do
|
27
|
+
it "return [] for valid configuration" do
|
28
|
+
#Minimal configuration
|
29
|
+
expect(subject.validate_configuration(minimal_config)).to eq([])
|
30
|
+
# Re-test with java objects from JrJackson serialization
|
31
|
+
if LogStash::Environment.jruby?
|
32
|
+
require "java"
|
33
|
+
expect(subject.validate_configuration({"host"=>"localhost","port"=>1234,"queries" => java.util.ArrayList.new})).to eq([])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
it "return error message for missing mandatory parameters" do
|
38
|
+
expect(subject.validate_configuration({})).to eq([MISSING_CONFIG_PARAMETER % "host", MISSING_CONFIG_PARAMETER % "port", MISSING_CONFIG_PARAMETER % "queries"])
|
39
|
+
end
|
40
|
+
|
41
|
+
it "return error message for invalid parameters type" do
|
42
|
+
expect(subject.validate_configuration({"host"=>1234,"port"=>1234,"queries" => []})).to eq([BAD_TYPE_CONFIG_PARAMETER % {:param => "host", :expected => String, :actual => Fixnum}])
|
43
|
+
expect(subject.validate_configuration({"host"=>"localhost","port"=>"1234","queries" => []})).to eq([BAD_TYPE_CONFIG_PARAMETER % {:param => "port", :expected => Fixnum, :actual => String}])
|
44
|
+
expect(subject.validate_configuration({"host"=>"localhost","port"=>1234,"queries" => "my_query"})).to eq([BAD_TYPE_CONFIG_PARAMETER % {:param => "queries", :expected => Enumerable, :actual => String}])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "query objects in configuration" do
|
49
|
+
it "return [] for valid query message" do
|
50
|
+
#Minimal query object
|
51
|
+
minimal_config["queries"] = [{"object_name" => "minimal"}]
|
52
|
+
expect(subject.validate_configuration(minimal_config)).to eq([])
|
53
|
+
#Full query object
|
54
|
+
minimal_config["queries"] = [{
|
55
|
+
"object_name" => "java.lang:type=Runtime",
|
56
|
+
"attributes" => [ "Uptime", "StartTime" ],
|
57
|
+
"object_alias" => "Runtime"}]
|
58
|
+
expect(subject.validate_configuration(minimal_config)).to eq([])
|
59
|
+
end
|
60
|
+
it "return error message for invalid query object type" do
|
61
|
+
minimal_config["queries"] = [ "1234" ]
|
62
|
+
expect(subject.validate_configuration(minimal_config)).to eq([BAD_TYPE_QUERY % { :index => 0, :expected => Hash, :actual => String }])
|
63
|
+
end
|
64
|
+
|
65
|
+
it "return error message for missing mandatory query parameter" do
|
66
|
+
minimal_config["queries"] = [ {} ]
|
67
|
+
expect(subject.validate_configuration(minimal_config)).to eq([MISSING_QUERY_PARAMETER % ["object_name",0] ])
|
68
|
+
end
|
69
|
+
|
70
|
+
it "return error message for invalid query parameters type" do
|
71
|
+
minimal_config["queries"] = [ { "object_name" => 1234} ]
|
72
|
+
expect(subject.validate_configuration(minimal_config)).to eq([BAD_TYPE_QUERY_PARAMETER % {:param => "object_name", :index => 0, :expected => String, :actual => Fixnum} ])
|
73
|
+
|
74
|
+
minimal_config["queries"] = [ { "object_name" => "1234", "object_alias" => 1234} ]
|
75
|
+
expect(subject.validate_configuration(minimal_config)).to eq([BAD_TYPE_QUERY_PARAMETER % {:param => "object_alias", :index => 0, :expected => String, :actual => Fixnum} ])
|
76
|
+
|
77
|
+
minimal_config["queries"] = [ { "object_name" => "1234", "attributes" => 1234} ]
|
78
|
+
expect(subject.validate_configuration(minimal_config)).to eq([BAD_TYPE_QUERY_PARAMETER % {:param => "attributes", :index => 0, :expected => Enumerable, :actual => Fixnum} ])
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
metadata
CHANGED
@@ -1,17 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-input-jmx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elastic
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
|
14
|
+
name: logstash-core
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
15
16
|
requirements:
|
16
17
|
- - '>='
|
17
18
|
- !ruby/object:Gem::Version
|
@@ -19,10 +20,7 @@ dependencies:
|
|
19
20
|
- - <
|
20
21
|
- !ruby/object:Gem::Version
|
21
22
|
version: 2.0.0
|
22
|
-
|
23
|
-
prerelease: false
|
24
|
-
type: :runtime
|
25
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirement: !ruby/object:Gem::Requirement
|
26
24
|
requirements:
|
27
25
|
- - '>='
|
28
26
|
- !ruby/object:Gem::Version
|
@@ -30,34 +28,50 @@ dependencies:
|
|
30
28
|
- - <
|
31
29
|
- !ruby/object:Gem::Version
|
32
30
|
version: 2.0.0
|
31
|
+
prerelease: false
|
32
|
+
type: :runtime
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
+
name: jmx4r
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
34
40
|
requirement: !ruby/object:Gem::Requirement
|
35
41
|
requirements:
|
36
42
|
- - '>='
|
37
43
|
- !ruby/object:Gem::Version
|
38
44
|
version: '0'
|
39
|
-
name: jmx4r
|
40
45
|
prerelease: false
|
41
46
|
type: :runtime
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: logstash-devutils
|
42
49
|
version_requirements: !ruby/object:Gem::Requirement
|
43
50
|
requirements:
|
44
51
|
- - '>='
|
45
52
|
- !ruby/object:Gem::Version
|
46
53
|
version: '0'
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
54
|
requirement: !ruby/object:Gem::Requirement
|
49
55
|
requirements:
|
50
56
|
- - '>='
|
51
57
|
- !ruby/object:Gem::Version
|
52
58
|
version: '0'
|
53
|
-
name: logstash-devutils
|
54
59
|
prerelease: false
|
55
60
|
type: :development
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: logstash-codec-plain
|
56
63
|
version_requirements: !ruby/object:Gem::Requirement
|
57
64
|
requirements:
|
58
65
|
- - '>='
|
59
66
|
- !ruby/object:Gem::Version
|
60
67
|
version: '0'
|
68
|
+
requirement: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - '>='
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '0'
|
73
|
+
prerelease: false
|
74
|
+
type: :development
|
61
75
|
description: This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program
|
62
76
|
email: info@elastic.co
|
63
77
|
executables: []
|