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

    Проводя уже около 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
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 12
    • 0
      Спасибо!
      Вот бы еще рецепт, как это связать с Nagios или Zabbix:)
    • +1
      Мы сделали чуть иначе, -Djava.rmi.server.hostname=localhost и -Dcom.sun.management.jmxremote.authenticate=false (всегда!), а пользователи для мониторинга подключаются через SSH-туннель (что легко скриптуется, если надо).
      • 0
        А вы случайно не знаете как профилирование памяти на удаленной машине настроить черезе visualvm?
        • +1
          увы, тут «не копенгаген». Может TheShade в теме? Попробуйте спросить у него.
          • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              А если на удаленной машине нет Х-ов? :-)
              • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              Подцепился к jstatd через VisualVM — возможностей профилирования даже меньше чем через jmx (есть только возможность посмотреть графики кучу+перм, тредов, класслоадера и параметры jvm).

              Но очень сильно порадовала возможность видеть сразу все процессы! :-)

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.