jmx4r——JMX 的 Ruby 之路

  • Werner Schuster
  • 宋玮

2007 年 6 月 30 日

话题:JavaRubyDevOps语言 & 开发

运行在一个如 Java 这样的成熟平台上的好处之一是可用性,比如有监控这样的成熟特性。JRuby 核心团队成员 Ola Bini,发现这对监控 JRuby 应用的内存行为是有用的

只需在 Java 6 上运行 JRuby,你就可免费获得它。本质上你可以把它连上任何 Java 进程。远程也可以。并且获取这类信息。你的 Ruby 能做这事吗?
他用来监控 JVM 进程的工具是JConsole,该工具从 Java 5 开始就自带了。现在有另一种访问 JMX 信息的方法了:Jeff Mesniljmx4r ,它允许从 JRuby 代码中访问 JMX MBeans。下面是一个简单的例子:
require 'java'

require 'jmx4r'

memory = JMX::MBean.find_by_name "java.lang:type=Memory"

memory.verbose = true

memory.gc
这是用默认连接参数连接到 localhost 上 MBean 服务器,你还可以使用自定义的 JMX Service URL。

Jmx4r 使用 RubyMetaprogramming技术从 JMX 客户端代码中删除了样板文件。这允许以 Ruby 的方式访问 JMX MBean 的操作和属性。

在例子中,memory.verbose 是一个属性,通常必须使用 verbose JMX 方法调用来设置。Jmx4r 在代表 memory MBean 的类中设置访问器(accessor)。关于该 MBean 的信息被获取,而且define_method被用来为每个属性创建必要的方法。

method_missing帮助支持操作,当方法调用没有找到对应的方法定义时,该方法被调用。例子中,memory.gc 是一个对 Memory Mebean 操作的调用,用来运行垃圾回收器(Garbage Collector)——但是该方法并没有在 memory 对象所属类中定义。取而代之,method_missing 方法被调用,确定是否有该方法名的操作,接着利用 JMX API 调用该操作。

像 jmx4r 这样的类库的最大优势是,可以与 JRuby 交互式 shell(如 jirb)一起工作。这就允许开发者或 JRuby savy admin 去访问一个(或多个)MBean 服务器,而保留该语言的所有强大能力。这对还没有自动化的批量工作处理是有用的。另一个来自 jmx4r 网站的例子如下:

logging = JMX::MBean.find_by_name "java.util.logging:type=Logging"

logging.logger_names.each do |logger_name|

 logging.set_logger_level logger_name, "INFO"

end



该例查询所有 logger 并一举改变了它们的 log 级别。在一个图形化工具中,需要对每个 logger 点击数下才能达到同样效果。更不用说,一旦该代码被编写并证明可用,可以保存到脚本中并重复使用。另一个好处是 JRuby 进程通过联系其 MBean 服务器具有监控其自己 JVM 的能力。

最近新增的特性是提供认证支持。下面是使用样例:



JMX::MBean.establish_connection :host => "localhost", 

 :username => "jeff", :password => "secret"

查看英文原文:JMX the Ruby way with jmx4r

JavaRubyDevOps语言 & 开发