将clojure / java.jmx暴露给监控工具

时间:2016-11-30 13:35:21

标签: java clojure jmx

https://github.com/clojure/java.jmx是否等同于使用JVM启动选项(如-Dcom.sun.management.jmxremote ...)?

我们是否可以在生产中为其他(非clojure)监控工具公开JMX端口?

或者只是clojure-to-clojure?

目标是在Clojure中执行此操作,而不是依赖系统启动脚本来执行此操作,这使得在我的情况下更容易配置/测试。

1 个答案:

答案 0 :(得分:2)

这一切都取决于你想要什么以及为什么要问,更多的上下文可能适用:你想从Clojure流程监控,还是想监控Clojure流程?您有哪两个进程可以控制作者?

JMX客户端

clojure.java.jmx是一个客户端库,可以在本地或通过线路(JMX over RMI)从Clojure调用Java JMX函数。它基本上是GUI的编程替代品,如JVisualVM / JMC。

JMX服务器

通过RMI

虽然您始终可以在Java进程本身内使用JMX调用,但为了能够远程监视Java / Clojure进程,您仍需要包含-Dcom.sun.management.jmxremote参数。这使得该进程充当通过RMI连接的JMX请求的服务器。

通过HTTP

RMI的替代方案是通过jolokia通过REST接口为JMX提供服务。众所周知,RMI很难通过防火墙等网络基础设施边界进行管理,并通过身份验证和授权来保护。

基于REST的JMX更易于管理(JMX URL的反向代理排除)。身份验证和授权也可以在当前的Web堆栈中完成。

虽然这些REST调用没有Clojure客户端,但是应该很容易镜像clojure.java.jmx API并让它生成HTTP请求。

公开JMX bean

如果您有一个需要公开可通过JMX读取的特定于应用程序的指标的Clojure应用程序,则需要将其转换为JMX MBean。您可以将任何clojure map ref包装在bean中,并且可以通过JMX请求查看对该ref的任何更新。

clojure.java.jmx也可以提供帮助。

(def my-statistics
  (ref {:current-sessions 0}))

(jmx/register-mbean
  (jmx/create-bean my-statistics)
  "my.namespace:name=Sessions")

(defn login
  [user]
  ;(do-login user)
  (dosync (alter my-statistics update :current-sessions inc)))

(login "foo")

;just as an example to show you can read the bean through JMX 
(jmx/attribute-names "my.namespace:name=Sessions")
 => (:current-sessions)

(jmx/read "my.namespace:name=Sessions" :current-sessions)   
=> 1

确保ref map具有字符串/符号键和Java'原始'值,或者您可能在客户端获得读取异常。

如果您已设置连接到流程的方法,则可以通过JMX请求来自此bean的数据。