Monitorowania JMX można użyć do kontrolowania liczników JMX aplikacji Java.
W Zabbix 1.8, jeżeli chcemy monitorować liczniki JMX aplikacji Java, najlepszym rozwiązaniem było użycie Zapcat JMX Zabbix Bridge. Należało wtedy albo zmodyfikować kody aplikacji tak, by używały pliku JAR Zapcat JAR i programowo wywoływały agenta Zabbix, albo zainstalować gotowy plugin Zapcat do aplikacji, które go obsługiwały (np. Jetty lub Tomcat).
W Zabbix 2.0 dodano własne wsparcie dla monitorowania JMX, dzięki nowemu demonowi Zabbix o nazwie "Brama Java Zabbix".
Gdy serwer Zabbix chce znać wartość jakiegoś licznika JMX na hoście, pyta bramę Java Zabbix, która przy użyciu API zarządzania JMX odpytuje zdalnie aplikację.
Więcej szczegółów na temat bramy Java Zabbix, włączając w to skąd ją pobrać i jak ją ustawić, można zobaczyć w tym rozdziale podręcznika.
Do obsługi zdalnego monitorowania JMX, aplikacje Java nie wymagają żadnej dodatkowej instalacji oprogramowania, ale konieczne jest ich uruchomienie z opcjami linii poleceń opisanymi poniżej.
Aby zacząć monitorowanie prostej aplikacji Java na hoście lokalnym, bez ograniczeń autoryzacji, koniecznie trzeba uruchomić ją przynajmniej z tymi opcjami:
java \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar
Spowoduje to, że Java będzie nasłuchiwała połączeń przychodzących JMX na porcie 12345 i nie będzie wymagała autoryzacji ani SSL.
Jeżeli chcemy zabezpieczyć połączenie, istnieje wiele innych dostępnych opcji Java. Na przykład, kolejne polecenie uruchamia aplikację z większym zestawem opcji dla większej sieci, a nie tylko lokalnie.
java \
-Djava.rmi.server.hostname=192.168.3.14 \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.password.file=/etc/java-6-openjdk/management/jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=/etc/java-6-openjdk/management/jmxremote.access \
-Dcom.sun.management.jmxremote.ssl=true \
-Djavax.net.ssl.keyStore=$YOUR_KEY_STORE \
-Djavax.net.ssl.keyStorePassword=$YOUR_KEY_STORE_PASSWORD \
-Djavax.net.ssl.trustStore=$YOUR_TRUST_STORE \
-Djavax.net.ssl.trustStorePassword=$YOUR_TRUST_STORE_PASSWORD \
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
-jar /usr/share/doc/openjdk-6-jre-headless/demo/jfc/Notepad/Notepad.jar
Większość (jeżeli nie wszystkie) z tych ustawień można określić w pliku /etc/java-6-openjdk/management/management.properties (w twoim systemie plik może być w innym miejscu).
Należy zauważyć, że gdy chcemy używać SSL, należy dodać do skryptu startup.sh bramy Java opcje -Djavax.net.ssl.*
, tak by wiedziała gdzie znaleźć magazyn kluczy i klucze zaufane.
Dokładny opis można zobaczyć na stronie Monitorowanie i zarządzanie przy użyciu JMX.
Mając uruchomioną bramę Java, serwer, który wie gdzie jej szukać i aplikację Java wspierającą zdalne monitorowanie JMX, możemy skonfigurować interfejsy i pozycje w interfejsie użytkownika Zabbix.
Rozpoczynamy od utworzenia interfejsu JMX na interesującym nas hoście:
Dla każdego interesującego nas licznika JMX należy dodać pozycję typu Agent JMX podłączoną do tego interfejsu. Jeżeli skonfigurowano autoryzację w aplikacji Java, należy również określić użytkownika i hasło.
Klucz na ekranie poniżej to jmx["java.lang:type=Memory","HeapMemoryUsage.used"]
. Składnia klucza pozycji JMX jest podobna do pozycji Zapcat, z wyjątkiem tego, że do oddzielania argumentów zamiast "][" używany jest przecinek. Klucz zawiera dwa parametry:
Poniżej można zobaczyć klucz pozycji JMX.
Jeżeli chcemy monitorować licznik Logiczny zwracający "true" lub "false", należy określić typ informacji jako "Numerycznie (liczba całkowita bez znaku)" a typ danych jako "Logiczny". Serwer zachowa wartości logiczne odpowiednio jako 1 lub 0.
Atrybuty proste
Nazwa obiektu MBean to nic innego jak ciąg znaków zdefiniowany w aplikacji Java. Z innej strony, nazwa atrybutu może być bardziej złożona. W przypadku atrybutu zwracającego proste typy danych (jak liczby, ciągi znaków itp.) nie ma się o co martwić, klucz będzie wyglądał następująco:
W tym przypadku nazwą obiektu jest "com.example:Type=Hello", nazwą atrybutu jest "waga" a prawdopodobnym typem zwracanej wartości powinno być "Liczba (zmiennoprzecinkowa)".
Atrybuty zwracające dane złożone
Sytuacja komplikuje się, gdy atrybut zwraca dane złożone. Na przykład: nazwą atrybutu jest "jablko" i zwraca zestaw danych reprezentujący jego parametry, jak "waga", "kolor" itp. Klucz mógłby wyglądać tak:
W ten sposób oddziela się przy pomocy kropki nazwę atrybutu od klucza zestawu danych. Podobnie, jeżeli atrybut zwraca zagnieżdżone dane złożone, części oddziela się kropką:
Problem z kropkami
Na razie jest dobrze. Ale co się stanie, jeżeli nazwa atrybutu lub klucz zestawu danych zawiera znak kropki? Na przykład:
Oto problem. Jak powiedzieć Zabbix, że nazwą atrybutu jest "wszystkie.owoce", a nie tylko "wszystkie"? Jak odróżnić kropkę będącą częścią nazwy od kropki separującej nazwę atrybutu od klucza zestawu danych?
Przed wersją 2.0.4 brama Java Zabbix nie potrafiła obsłużyć takiej sytuacji i użytkownik zostawał z pozycjami NIEWSPIERANYMI. Od 2.0.4 jest to możliwe, wystarczy tylko użyć znaku \ przed kropką będącą częścią nazwy:
W ten sam sposób, można postąpić z kluczami zawierającymi kropki:
Inne problemy
Znak \ również powinien być traktowany w identyczny sposób:
Jeżeli nazwy obiektów lub atrybutów zawierają spacje lub przecinki należy zamknąć je w podwójne cudzysłowy:
Aktualnie to wszystko. Miłego monitorowania JMX!