Все зависит от того, что вы хотите, и почему вы спрашиваете, может быть применим немного больше контекста: хотите ли вы отслеживать процесс Clojure или вы хотите контролировать процесс Clojure? В каком из этих двух процессов у вас есть авторский контроль?
JMX-клиент
clojure.java.jmx
является клиентская библиотека для вызова функций Java JMX из Clojure, либо локально, либо по проводам (JMX над RMI). Это в основном альтернатива программирования GUI, например, JVisualVM/JMC.
сервер JMX
За RMI
Хотя вы всегда можете использовать JMX звонки внутри самого процесса Java, чтобы иметь возможность контролировать процесс Java/Clojure удаленно, вы по-прежнему необходимо включить параметры -Dcom.sun.management.jmxremote
. Это заставляет процесс действовать как сервер для запросов JMX по RMI-соединению.
Над HTTP
В качестве альтернативы RMI служит JMX через интерфейс REST с помощью jolokia. RMI, как известно, трудно управлять границами сетевой инфраструктуры, такими как брандмауэры, и защищать через аутентификацию и авторизацию.
Управление JMX over REST намного проще в управлении (исключение прокси-сервера для URL-адресов JMX). Аутентификация и авторизация также могут быть выполнены в вашем текущем веб-стеке.
Однако для этих вызовов REST нет клиента Clojure, но должно быть легко зеркалировать API clojure.java.jmx и генерировать HTTP-запросы.
Разоблачение JMX бобы
Если у вас есть приложение Clojure, которые необходимо подвергать приложений конкретные показатели, которые могут быть считаны через JMX, вам нужно превратить его в JMX MBean. Вы можете обернуть любую карту clojure map в bean-компоненте, и любые обновления этого ref можно увидеть через запрос JMX.
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
Убедитесь, что карта ссылок имеет ключи строка/символ и «примитивные» значения Java, или вы можете получить исключение для чтения на стороне клиента.
Данные этого компонента затем могут запрашиваться через JMX при условии, что вы установили способ подключения к процессу.
Спасибо, я посмотрю на jolokia. Мой вариант использования - интеграция данных, поэтому он должен вести себя точно так же, как 'jmxremote'. (Не знаю вообще с MBeans, RMI, если честно). Считаете ли вы, что это возможно из Clojure? – nha
Их шаги интеграции включают в себя соединитель JMX: http://docs.datadoghq.com/integrations/java/#installation Да, у них есть агент для основных показателей (память, диск, процессор). И да, идея состоит в том, чтобы настроить агента, контролирующего файлы журнала приложений (не проблема, которую я реконструирую) и в то же время с метрикой JMX (мой вопрос прямо сейчас). – nha
Хотя теперь, когда я думаю об этом, я мог бы просто периодически записывать метрики jmx с помощью Clojure? – nha