Удаленный мониторинг JVM в производственной среде - PullRequest
0 голосов
/ 11 июня 2018

Я использовал jConsole , чтобы отслеживать JVM через его графический интерфейс, а иногда и сохранять данные о производительности в csv, просто щелкая правой кнопкой мыши по графикам.Но теперь у меня есть требование записать данные о производительности JVM, такие как использование памяти кучи и использование ЦП удаленных JVM, непосредственно в локальный файл (с отметкой времени) без использования графического интерфейса.

Я пробовал много инструментов, включая следующиено у них нет необходимых функций, таких как подключение к удаленным JVM и запись выходных данных в локальные файлы.

  1. JVM Top
  2. JVM Mon

Может кто-нибудь предложить мне инструмент, который можно использовать для получения выходных данных CSV, которые похожи на результаты, которые могут быть получены с помощью jConsole, но без использования графического интерфейса.

1 Ответ

0 голосов
/ 11 июня 2018

Я обычно использую cmdline-jmxclient для извлечения моих данных MBean, я использую приток для хранения данных и позже показываю их на Grafana для панели мониторинга, ниже приведен пример сценария оболочки, который вызывает jmxclient

cmdline-jmxclient:

Если у вас MBean: com.yourcompany.data:type=datasystem,id=0 с вызванной операцией: jmxRefresh()

Тогда вы можете написать простой скрипт bash (при условии, что вы скачали cmdline-jmxclient-0.10.3.jar и поместите в ту же директорию, что и ваш скрипт):

#!/bin/bash

cmdLineJMXJar=./cmdline-jmxclient-0.10.3.jar
user=yourUser
password=yourPassword
jmxHost=localhost
port=9003

#No User and password so pass '-'
echo "Available Operations for com.yourcompany.data:type=datasystem,id=0"
java -jar ${cmdLineJMXJar} ${user}:${password} ${jmxHost}:${port} com.yourcompany.data:type=datasystem,id=0

echo "Executing XML update..."
java -jar ${cmdLineJMXJar} - ${jmxHost}:${port} com.yourcompany.data:type=datasystem,id=0 jmxRefresh

Аналогично, вы можете получить кучную память или любой другой MBean, открытый в вашей JVM.

Другой пример скрипта выглядит так:

#!/bin/bash

if [ $# -ne 3 ]; then
    echo "You need to supply both JMX host and port and metric. Exiting ..."
    exit 1
fi

JAVA_BIN="/usr/bin/java"
JMX_CMDLINE="./cmdline-jmxclient-0.10.3.jar"
APP_NAME="${1}"

if [ $3 = "DaemonThreadCount" -o $3 = "all" ]; then

  TEMPFILE=`mktemp`
  $JAVA_BIN -jar $JMX_CMDLINE - ${1}:${2}  "java.lang:type=Threading" DaemonThreadCount 2>> $TEMPFILE
  VALUE=`grep DaemonThreadCount $TEMPFILE | sed "s/.*DaemonThreadCount: //g" | cut -f2 -d:` 
  echo "$VALUE"
  rm -f $TEMPFILE

fi

if [ $3 = "HeapMemoryUsage" -o $3 = "all" ]; then

  TEMPFILE=`mktemp`
  $JAVA_BIN -jar $JMX_CMDLINE - ${1}:${2}  "java.lang:type=Memory" HeapMemoryUsage 2>> $TEMPFILE

  OUTPUT=`cat $TEMPFILE | egrep "committed:|used:" | sed "s/: /=/g"`

  for line in $OUTPUT
  do
    NAME=`echo $line | cut -f1 -d=`
    VALUE=`echo $line | cut -f2 -d=`
  done

  cat $TEMPFILE | grep used | cut -f2 -d" "
  rm -f $TEMPFILE

fi


if [ $3 = "PSPermGen" -o $3 = "all" ]; then

  rm -f $TEMPFILE

  $JAVA_BIN -jar $JMX_CMDLINE - ${1}:${2}  "java.lang:name=PS Perm Gen,type=MemoryPool" Usage 2>> $TEMPFILE

  OUTPUT=`cat $TEMPFILE | egrep "committed:|used:" | sed "s/: /=/g"`

  for line in $OUTPUT
  do
    NAME=`echo $line | cut -f1 -d=`
    VALUE=`echo $line | cut -f2 -d=`
    echo "$VALUE"
  done

fi
...