trinidad_jmx_remote_extension 0.1.0
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.
- data/.gitignore +9 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +87 -0
- data/Rakefile +32 -0
- data/lib/catalina-jmx-remote.jar +0 -0
- data/lib/trinidad_jmx_remote_extension.rb +28 -0
- data/lib/trinidad_jmx_remote_extension/version.rb +7 -0
- data/test/test_helper.rb +13 -0
- data/test/trinidad.yml +9 -0
- data/test/trinidad_jmx_remote_extension_test.rb +37 -0
- data/trinidad_jmx_remote_extension.gemspec +29 -0
- metadata +99 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2012 kares
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# Trinidad JMX Remote Extension
|
2
|
+
|
3
|
+
This extension allows you to enable remote JMX (Java Management Extensions)
|
4
|
+
monitoring capabilities for [Trinidad](https://github.com/trinidad/trinidad/).
|
5
|
+
|
6
|
+
The extension sets up a Tomcat lifecycle listener which fixes the ports used by
|
7
|
+
JMX/RMI to static ones (known ahead of time) thus making things much simpler if
|
8
|
+
you need to connect [JConsole](http://bit.ly/jconsole) or any similar tool to a
|
9
|
+
remote Trinidad instance running behind a firewall.
|
10
|
+
|
11
|
+
Please note that only the ports are configured via the listener, the remainder
|
12
|
+
of the configuration is via the standard system properties for configuring JMX.
|
13
|
+
|
14
|
+
## Install
|
15
|
+
|
16
|
+
Along with Trinidad in your application's *Gemfile*:
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
group :server do
|
20
|
+
platform :jruby do
|
21
|
+
gem 'trinidad', :require => false
|
22
|
+
gem 'trinidad_jmx_remote_extension', :require => false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
```
|
26
|
+
|
27
|
+
And then execute:
|
28
|
+
|
29
|
+
$ bundle
|
30
|
+
|
31
|
+
Or install it yourself as:
|
32
|
+
|
33
|
+
$ gem install trinidad_jmx_remote_extension
|
34
|
+
|
35
|
+
## Setup
|
36
|
+
|
37
|
+
Like all extensions it is setup in the configuration file e.g. *trinidad.yml* :
|
38
|
+
|
39
|
+
```yaml
|
40
|
+
---
|
41
|
+
# ...
|
42
|
+
extensions:
|
43
|
+
jmx_remote:
|
44
|
+
useLocalPorts: true # bind to localhost than setup a ssh tunnel
|
45
|
+
# assuming you'll setup the tunnel you shall remember these ports :
|
46
|
+
rmiRegistryPortPlatform: 9993
|
47
|
+
rmiServerPortPlatform: 9994
|
48
|
+
```
|
49
|
+
|
50
|
+
Now your server should be setup, do not forget to restart Trinidad ... You might
|
51
|
+
want to disable JMX authentication (at first) and set the RMI hostname e.g. by :
|
52
|
+
|
53
|
+
$ jruby -J-Dcom.sun.management.jmxremote.ssl=false -J-D-Dcom.sun.management.jmxremote.authenticate=false -J-Djava.rmi.server.hostname=<trinidad-host-name> -S trinidad -e production
|
54
|
+
|
55
|
+
Next you will need to make sure you can SSH into the remote machine locally.
|
56
|
+
|
57
|
+
### Local Setup
|
58
|
+
|
59
|
+
SSH tunnel (those ports) into the machine where Trinidad is running :
|
60
|
+
|
61
|
+
$ ssh -N -L9993:localhost:9993 -L9994:localhost:9994 user@remotehost
|
62
|
+
|
63
|
+
Download the *catalina-jmx-remote.jar* into your current working directory :
|
64
|
+
|
65
|
+
$ wget http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.30/bin/extras/catalina-jmx-remote.jar
|
66
|
+
|
67
|
+
You shall use the same *catalina-jmx-remote.jar* locally as the extension is
|
68
|
+
using on the remote Trinidad machine, this guide reflects the .jar distributed
|
69
|
+
with the latest version of the gem. When in doubt simply `gem install` the same
|
70
|
+
version locally and copy the .jar from the unpacked gem e.g. using :
|
71
|
+
|
72
|
+
$ jruby -rubygems -e "require 'trinidad_jmx_remote_extension'; puts Trinidad::Extensions::JmxRemote::JAR_PATH"
|
73
|
+
|
74
|
+
Now open `jconsole`, assuming your JMX connection string looks like this :
|
75
|
+
**service:jmx:rmi://localhost:9994/jndi/rmi://localhost:9993/jmxrmi**
|
76
|
+
|
77
|
+
$ jconsole -debug -J"-Djava.class.path=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/jconsole.jar:catalina-jmx-remote.jar" service:jmx:rmi://localhost:9994/jndi/rmi://localhost:9993/jmxrmi
|
78
|
+
|
79
|
+
This is assuming a standard JDK installation (non Apple Java) ...
|
80
|
+
|
81
|
+
For more details, this guide has been inspired by the following excellent post :
|
82
|
+
http://danielkunnath.com/post/9969130766/dancing-with-jmx-jconsole-tomcat-6-ssh
|
83
|
+
|
84
|
+
## Copyright
|
85
|
+
|
86
|
+
Copyright (c) 2012 [Karol Bucek](https://github.com/kares).
|
87
|
+
See LICENSE (http://en.wikipedia.org/wiki/MIT_License) for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require "bundler/gem_tasks"
|
3
|
+
|
4
|
+
jar_path = 'lib/catalina-jmx-remote.jar'
|
5
|
+
|
6
|
+
desc "update (bundled) catalina-jmx-remote.jar"
|
7
|
+
task :update_jar, :version do |_, args| # e.g. `rake update_jar[7.0.30]`
|
8
|
+
require 'open-uri'; require 'fileutils'
|
9
|
+
uri_start = 'http://archive.apache.org/dist/tomcat/tomcat-7/'
|
10
|
+
uri_end = '/bin/extras/catalina-jmx-remote.jar'
|
11
|
+
jar_file = open(uri = "#{uri_start}v#{args[:version]}#{uri_end}",'rb')
|
12
|
+
Rake::Task['remove_jar'].invoke
|
13
|
+
File.open(jar_path, 'wb') { |file| file.write jar_file.read }
|
14
|
+
# and update README section to match the same .jar :
|
15
|
+
readme = File.expand_path('README.md', File.dirname(__FILE__))
|
16
|
+
old_uri = /#{Regexp.escape(uri_start)}v.*?#{Regexp.escape(uri_end)}/
|
17
|
+
lines = IO.readlines(readme).map { |line| line.gsub(old_uri, uri) }
|
18
|
+
File.open(readme, 'w') { |file| file.write(lines.join) }
|
19
|
+
end
|
20
|
+
|
21
|
+
task :remove_jar do
|
22
|
+
File.delete jar_path if File.exist? jar_path
|
23
|
+
end
|
24
|
+
|
25
|
+
require 'rake/testtask'
|
26
|
+
Rake::TestTask.new do |t|
|
27
|
+
t.libs << "test"
|
28
|
+
t.test_files = FileList['test/*test.rb']
|
29
|
+
t.verbose = true
|
30
|
+
end
|
31
|
+
|
32
|
+
task :default => :test
|
Binary file
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'trinidad'
|
2
|
+
require "trinidad_jmx_remote_extension/version"
|
3
|
+
|
4
|
+
module Trinidad
|
5
|
+
module Extensions
|
6
|
+
module JmxRemote
|
7
|
+
unless const_defined?(:JAR_PATH)
|
8
|
+
JAR_PATH = File.expand_path('catalina-jmx-remote.jar', File.dirname(__FILE__))
|
9
|
+
end
|
10
|
+
end
|
11
|
+
class JmxRemoteServerExtension < ServerExtension
|
12
|
+
|
13
|
+
def configure(tomcat)
|
14
|
+
load JmxRemote::JAR_PATH
|
15
|
+
listener = Java::OrgApacheCatalinaMbeans::JmxRemoteLifecycleListener.new
|
16
|
+
options.each do |key, value| # e.g. useLocalPorts: true
|
17
|
+
if listener.respond_to? method = "set#{key.to_s.upcase}"
|
18
|
+
listener.send(method, value)
|
19
|
+
elsif listener.respond_to? method = "#{key}="
|
20
|
+
listener.send(method, value)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
tomcat.server.add_lifecycle_listener listener
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/test/test_helper.rb
ADDED
data/test/trinidad.yml
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.expand_path('test_helper', File.dirname(__FILE__))
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Trinidad
|
5
|
+
module Extensions
|
6
|
+
class JmxRemoteServerExtensionTest < Test::Unit::TestCase
|
7
|
+
|
8
|
+
test "loads jar and configures listener" do
|
9
|
+
config = File.expand_path('trinidad.yml', File.dirname(__FILE__))
|
10
|
+
options = YAML.load( File.read(config) )
|
11
|
+
config = Trinidad.configure!(options)
|
12
|
+
Trinidad::Extensions.configure_server_extensions(config[:extensions], tomcat)
|
13
|
+
|
14
|
+
begin
|
15
|
+
Java::OrgApacheCatalinaMbeans::JmxRemoteLifecycleListener
|
16
|
+
rescue NameError => e
|
17
|
+
flunk "failed loading classes from catalina-jmx-remote.jar #{e.inspect}"
|
18
|
+
end
|
19
|
+
|
20
|
+
listeners = tomcat.server.find_lifecycle_listeners
|
21
|
+
assert listeners.size > 0
|
22
|
+
assert_kind_of org.apache.catalina.mbeans.JmxRemoteLifecycleListener, listeners[0]
|
23
|
+
assert_true listeners[0].use_local_ports?
|
24
|
+
|
25
|
+
assert_equal 9993, listeners[0].rmi_registry_port_platform
|
26
|
+
assert_equal 9994, listeners[0].rmi_server_port_platform
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def tomcat
|
32
|
+
@tomcat ||= org.apache.catalina.startup.Tomcat.new
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "trinidad_jmx_remote_extension/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.name = "trinidad_jmx_remote_extension"
|
7
|
+
gem.version = Trinidad::Extensions::JmxRemote::VERSION
|
8
|
+
|
9
|
+
gem.description = %q{JMX Remote Extension for Trinidad}
|
10
|
+
gem.summary = %q{The extension sets up a Tomcat lifecycle listener
|
11
|
+
which fixes the port used by JMX/RMI to static ones known ahead of time thus
|
12
|
+
making things much simpler if you need to connect JConsole or similar to a
|
13
|
+
remote Trinidad instance running behind a firewall (e.g. via SSH).}
|
14
|
+
|
15
|
+
gem.authors = ["Karol Bucek"]
|
16
|
+
gem.email = ["self@kares.org"]
|
17
|
+
gem.homepage = 'http://github.com/kares/trinidad_jmx_remote_extension'
|
18
|
+
|
19
|
+
gem.files = `git ls-files`.split("\n")
|
20
|
+
gem.test_files = `git ls-files -- {test}/*`.split("\n")
|
21
|
+
|
22
|
+
gem.rdoc_options = ["--charset=UTF-8"]
|
23
|
+
gem.extra_rdoc_files = %w[ README.md LICENSE ]
|
24
|
+
|
25
|
+
gem.require_paths = ["lib"]
|
26
|
+
gem.add_dependency('trinidad', '>= 1.3.5')
|
27
|
+
gem.add_development_dependency('rake')
|
28
|
+
gem.add_development_dependency('test-unit', '>= 2.4')
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: trinidad_jmx_remote_extension
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Karol Bucek
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2012-10-09 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: trinidad
|
17
|
+
prerelease: false
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 1.3.5
|
24
|
+
type: :runtime
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rake
|
28
|
+
prerelease: false
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: "0"
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: test-unit
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "2.4"
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id003
|
48
|
+
description: JMX Remote Extension for Trinidad
|
49
|
+
email:
|
50
|
+
- self@kares.org
|
51
|
+
executables: []
|
52
|
+
|
53
|
+
extensions: []
|
54
|
+
|
55
|
+
extra_rdoc_files:
|
56
|
+
- README.md
|
57
|
+
- LICENSE
|
58
|
+
files:
|
59
|
+
- .gitignore
|
60
|
+
- Gemfile
|
61
|
+
- LICENSE
|
62
|
+
- README.md
|
63
|
+
- Rakefile
|
64
|
+
- lib/catalina-jmx-remote.jar
|
65
|
+
- lib/trinidad_jmx_remote_extension.rb
|
66
|
+
- lib/trinidad_jmx_remote_extension/version.rb
|
67
|
+
- test/test_helper.rb
|
68
|
+
- test/trinidad.yml
|
69
|
+
- test/trinidad_jmx_remote_extension_test.rb
|
70
|
+
- trinidad_jmx_remote_extension.gemspec
|
71
|
+
homepage: http://github.com/kares/trinidad_jmx_remote_extension
|
72
|
+
licenses: []
|
73
|
+
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options:
|
76
|
+
- --charset=UTF-8
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: "0"
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: "0"
|
91
|
+
requirements: []
|
92
|
+
|
93
|
+
rubyforge_project:
|
94
|
+
rubygems_version: 1.8.15
|
95
|
+
signing_key:
|
96
|
+
specification_version: 3
|
97
|
+
summary: The extension sets up a Tomcat lifecycle listener which fixes the port used by JMX/RMI to static ones known ahead of time thus making things much simpler if you need to connect JConsole or similar to a remote Trinidad instance running behind a firewall (e.g. via SSH).
|
98
|
+
test_files: []
|
99
|
+
|