Miles to go ...

Arun Gupta is a GlassFish Evangelist focusing on Web Tier at Sun. He was the spec lead for APIs in the Java platform, committer in multiple Open Source projects, participated in standard bodies and contributed to Java EE and SE releases.
« Gmail.com - Temporar... | Main | TOTD #64: OpenSolari... »

http://blogs.sun.com/arungupta/date/20090109 Friday January 09, 2009

TOTD #63: jmx4r gem - How to manage/monitor your Rails/Merb applications on JRuby/GlassFish ?


TOTD #61 and TOTD #62 shows how to use JMX APIs to locally/remotely manage/monitor your Rails/Merb applications. This Tip Of The Day extends TOTD #62 and shows how remote management can be done using jmx4r gem.

This gem provides a clean mapping between JMX APIs and Ruby. It allows to write pure Ruby code to manage/monitor any Rails application. As a result it removes all dependency on the Java code used in TOTD #62.

Lets first install the gem!

~ >gem install jmx4r
JRuby limited openssl loaded. gem install jruby-openssl for full support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
Successfully installed jmx4r-0.0.6
1 gem installed
Installing ri documentation for jmx4r-0.0.6...
Installing RDoc documentation for jmx4r-0.0.6...

Here is the equivalent Ruby code to flush the class cache (as in TOTD #62):

require 'rubygems'
require 'jmx4r'

JMX::MBean.establish_connection :host => "129.145.133.163", :port => 8686

beans = JMX::MBean.find_all_by_name "org.jruby:*"
beans.each { |bean|
  service = bean.object_name["service"]
  case service
  when "ClassCache"
    @cc_mbean = bean
  when "Config"
    @c_mbean = bean
  end
}

# clear the cache if it's full
if @cc_mbean.full
  printf "JIT Max: %d, JIT Threshold: %d, Class load count: %d\n", @c_mbean.jit_max,
    @c_mbean.jit_threshold, @cc_mbean.class_load_count
    @cc_mbean.flush
else
  puts "Class Cache is not full"
  printf "Loaded: %d, Reused: %d, Live: %d\n", @cc_mbean.class_load_count,
    @cc_mbean.class_reuse_count, @cc_mbean.live_class_count
end

As with all Ruby code, really clean and simple!

The key parts of the code are highlighted in bold. "JMX::MBean.establish_connection" establishes a connection with a JMX agent running on a remote machine identified by the IP address and port number specified. "JMX::MBean.find_all_by_name" queries the agent for all the MBeans in "org.jruby" domain. And then the code is self explanatory.

Just dump this code in a file and run it as:

jruby main.rb

to see the output similar to:

Class Cache is not full
Loaded: 76, Reused: 0, Live: 76

Make sure Rails/Merb application is running after setting JAVA_OPTS as described in TOTD #62. For this blog, the JMX agent/Rails application ran on a Mac and the JMX client on a Solaris box.

The jmxr examples provides some more ways to use the gem.

There is also jmx gem that provides similar functionality. It even allows to create MBeans and provides a simple server where they can be registered. Tom's blog provide more details on usage and there is even a sample included.

Subsequent blogs in this series will discuss:
  • How to remotely manage your Rails/Merb applications using JMX API ?
  • How to publish your own metrics that can be managed using JMX API ?
  • How to use jmx gem to manage/monitor ?
  • How to use VisualVM to get more information about the underlying VM ?
  • How to use NewRelic/FiveRuns to manage/monitor an application ?
Please leave suggestions on other TOTD (Tip Of The Day) that you'd like to see. A complete archive of all tips is available here.

Technorati: totd glassfish jruby rubyonrails merb jmx jmx4r manage monitor

del.icio.us | furl | simpy | slashdot | technorati | digg |
|
Comments:

I prefer local management, I always build my systems without remote management. A security issue, otherwise. :( :)

Posted by Mark on January 10, 2009 at 05:20 PM PST #

[Trackback] Here is a blog entry that was sitting in my Drafts folder for a long time (just because I didn't realize :). Anyway, it shows how to install Open Solaris 2008/11 on Virtual Box. The original install was done using...

Posted by Arun Gupta's Blog on January 13, 2009 at 10:56 AM PST #

Nice, thanks Arun.

I'm still trying to figure out self-management on Glassfish (i.e. installing your own MBeans to fire off when values go outside thresholds). That would avoid the massive pains involved in getting JMX through a firewall.

I'm sure that should be doable with JRuby too, but think that'd be trying to run before I can walk :)

Posted by Dick Davies on January 19, 2009 at 04:18 AM PST #

thank u arun gupta

Posted by sinema izle on March 10, 2009 at 02:04 PM PDT #

Post a Comment:
  • HTML Syntax: NOT allowed
« Gmail.com - Temporar... | Main | TOTD #64: OpenSolari... »

Valid HTML! Valid CSS!

This is a personal weblog, I do not speak for my employer.