Рецепт настройки удалённого мониторинга контейнеров Tomcat и Jetty штатными средствами JDK

в 15:34, , рубрики: java, jetty, jmx, tomcat, метки: , , , ,

Проводя уже около 6 лет собеседования с Java-разработчиками заметил, что из приходивших кандидатов вообще никто не знает, что можно штатными средствами JDK удалённо мониторить состояние JVM с контейнерами сервлетов.
Поэтому далее пошаговый рецепт, как настроить и использовать эту замечательную возможность

Инструменты мониторинга


  • JConsole — GUI-инструмент для мониторинга и управления как локальными, так и удаленными JVM и приложениями. Про него читаём официальные доки
  • JVisualVM — упрощённо — это JConsole + профилировщик. Про этот инструмент отлично написал TheShade

Оба программных продукта расположена в %JAVA_HOME%/bin JDK и используют технологию JMX — Java Management Extensions

Настройка Tomcat


%CATALINA_HOME% — каталог, в который установлен Tomcat.

  1. В каталоге %CATALINA_HOME%/conf создать конфиг-файл remote.users с содержимым вида
    ЛОГИН_ПОЛЬЗОВАТЕЛЯ1 ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ1
    ЛОГИН_ПОЛЬЗОВАТЕЛЯ2 ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ2
    

    Имя файлу можно дать любое на ваше усмотрение. Файл содержит логины и пароли в явном (к сожалению) виде пользователей, которые будут иметь право осуществлять удалённый мониторинг.
    Например:

    tartaren from_tarascon
    portos passwordportos
    

  2. В каталоге %CATALINA_HOME%/conf создать конфиг-файл remote.acl с содержимым вида
    ЛОГИН_ПОЛЬЗОВАТЕЛЯ1 ПРАВА_ДОСТУПА
    ЛОГИН_ПОЛЬЗОВАТЕЛЯ2 ПРАВА_ДОСТУПА
    

    Имя файлу можно дать любое на ваше усмотрение. ПРАВА_ДОСТУПА — одна из двух констант readwrite или readonly.
    Например:

    tartaren readonly
    portos readwrite
    

  3. chmod 400 remote.users
  4. chmod 400 remote.acl
  5. chown tomcat:tomcat remote.users
    (пользователя и группу tomcat возможно необходимо заменить по ситуации)
  6. chown tomcat:tomcat remote.acl
    (пользователя и группу tomcat возможно необходимо заменить по ситуации)
  7. Найти скрипт запуска catalina.sh (обычно находится в %CATALINA_HOME%/bin)
  8. В скрипте перед секцией запуска добавить команду:
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.password.file=ПОЛНЫЙ_ПУТЬ_К_remote.users -Dcom.sun.management.jmxremote.access.file=ПОЛНЫЙ_ПУТЬ_К_remote.acl -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=НОМЕР_ПОРТА -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<b>IP_АДРЕС"
    

    IP_АДРЕС — IP-адрес Tomcat-сервера.
    НОМЕР_ПОРТА — Номер порта, на котором Tomcat-сервер будет отвечать на запросы JConsole или JVisualVM.
    Например:

                         *  *  *
      fi
      CATALINA_OPTS="$CATALINA_OPTS $JPDA_OPTS"
      shift
    fi
    
    CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.password.file=/usr/share/apache-tomcat-7.0.22/conf/remote.users -Dcom.sun.management.jmxremote.access.file=/usr/share/apache-tomcat-7.0.22/conf/remote.acl -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7777 -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=1.1.1.1"
    
    if [ "$1" = "debug" ] ; then
      if $os400; then
        echo "Debug command not available on OS400"
        exit 1
                         *  *  *
    

  9. Если хочется отключить парольную аутентификацию, то в список параметров CATALINA_OPTS необходимо добавить -Dcom.sun.management.jmxremote.authenticate=false
  10. Чтобы изменения в конфиге и скрипте вступили в силу, необходимо штатными средствами перезапустить Tomcat

Настройка Jetty


  1. Создать файлы remote.users и remote.acl (или с любыми иными именами на ваше усмотрение) в устраивающих вас каталогах.
  2. chmod 400 remote.users
  3. chmod 400 remote.acl
  4. chown jetty:jetty remote.users
    (пользователя и группу jetty возможно необходимо заменить по ситуации)
  5. chown jetty:jetty remote.acl
    (пользователя и группу tomcat возможно необходимо заменить по ситуации)
  6. Чаще всего Jetty используется в связке с Maven. Для запуска создать скрипт reboot.sh
    export MAVEN_OPTS="-Dcom.sun.management.jmxremote.password.file=/ПОЛНЫЙ_ПУТЬ_К_ФАЙЛУ/remote.users -Dcom.sun.management.jmxremote.access.file=/ПОЛНЫЙ_ПУТЬ_К_ФАЙЛУ/remote.acl -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=ПОРТ_ДЛЯ_МОНИТОРИНГА -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=IP_СЕРВЕРА"
    
    mvn -P dev clean compile jetty:run
    

  7. chmod +x reboot.sh
  8. Запускать (перезапускать) Jetty командой ./reboot.sh

Подключение JConsole


  1. запустить JConsole
  2. в появившейся форме:
  • выбрать режим Remote Access
  • ввести IP или доменное имя контейнера сервлетов c номером порта в формате
    IP_ИЛИ_ДОМЕН: НОМЕР_ПОРТА
  • заполнить поля Username и Password
  • нажать кнопку [Connect]

JConsole не сохраняет параметры подключения и их вводить надо каждый раз.
Если в контейнере сервлетов отключить парольную аутентификацию мониторинга, то подключаться можно командой jconsole IP_ИЛИ_ДОМЕН: НОМЕР_ПОРТА

Подключение JVisualVM


  1. запустить JVisualVM
  2. выбрать в меню File->Add JMX connection
  3. в появившейся форме:
  4. Connection — ввести IP или доменное имя контейнера сервлетов c номером порта в формате
    IP_ИЛИ_ДОМЕН: НОМЕР_ПОРТА
  5. если есть желание — включить «галку» Display name и ввести желаемый псевдоним для этого подключения
  6. включить «галку» Use security credentials
  7. заполнить поля Username и Password
  8. по желанию — включить «галку» Save security credentials
  9. нажать кнопку [OK]
  10. в левом дереве, в пункте Remote появится новый раздел с нашим контейнером
  11. на этом контейнере нажать правую кнопку мыши и выбрать пункт Open

Автор: gis

* - обязательные к заполнению поля