Skip to main content

WAS 종류별 에이전트 설정 방법

Spring Boot

KHAN_AGENT_FILE=$(ls /data/test/tomcat/servers/khan-agent/khan-agent*.jar | sort -Vr | head -n 1)
export AGENT_OPTS=" -javaagent:$KHAN_AGENT_FILE "
#export AGENT_OPTS=" -javaagent:/svc/test/khan-agent/khan-agent.jar "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent-test11.conf"
export JAVA_OPTS="$AGENT_OPTS $JAVA_OPTS -noverify"


java -jar $JAVA_OPTS openmaru-dashboard-server-5.1.0.jar

JBoss EAP 6.x, 7.x Standalone 모드

JBoss EAP의 경우 JBoss LogManager의 설정이 필요합니다.

jboss.modules.system.pkgscom.opennaru.khan.agentorg.jboss.logmanager 패키지를 등록하여 합니다.

  • env.sh (6.x)
export AGENT_OPTS=" -javaagent:/svc/test/khan-agent/khan-agent.jar "
#export AGENT_OPTS=" -javaagent:$(getKhanAgentPath :/svc/test/khan-agent) "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent-test11.conf"

export JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
export JBOSS_LOGMANAGER_DIR="$JBOSS_HOME/modules/system/layers/base/org/jboss/logmanager/main"
export JBOSS_LOGMANAGER_JAR=`cd "$JBOSS_LOGMANAGER_DIR" && ls -1 *.jar`
#export JBOSS_LOGMANAGER_JAR=$(getLogmanagerPath "$JBOSS_HOME")

export JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:$JBOSS_LOGMANAGER_DIR/$JBOSS_LOGMANAGER_JAR"
export JAVA_OPTS=" $JAVA_OPTS -noverify"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.modules.system.pkgs=org.jboss.byteman,com.opennaru.khan.agent,org.github.jamm,org.jboss.logmanager"
  • env.sh (7.x)
export AGENT_OPTS=" -javaagent:/home/icfcgw/khan-agent/khan-agent-5.1.0.jar "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent-icfcgw.conf "

export JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.jboss.logmanager.LogManager "
export JBOSS_LOGMANAGER_DIR="$JBOSS_HOME/modules/system/layers/base/org/jboss/logmanager/main"
export JBOSS_LOGMANAGER_JAR=cd "$JBOSS_LOGMANAGER_DIR" && ls -1 *.jar
export JBOSS_WILDFLY_COMMON_DIR="$JBOSS_HOME/modules/system/layers/base/org/wildfly/common/main"
export JBOSS_WILDFLY_COMMON_JAR=cd "$JBOSS_WILDFLY_COMMON_DIR" && ls -1 *.jar

export JAVA_OPTS=" $JAVA_OPTS -noverify"
export JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:$JBOSS_LOGMANAGER_DIR/$JBOSS_LOGMANAGER_JAR:$JBOSS_WILDFLY_COMMON_DIR/$JBOSS_WILDFLY_COMMON_JAR"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.modules.system.pkgs=org.jboss.byteman,com.opennaru.khan.agent,org.github.jamm,\
org.jboss.logmanager,org.wildfly.common.net.HostName"

getKhanAgentPath, getLogmanagerPath 함수 사용 할 경우 function.sh Include (하단 참조)

  • start.sh
export JAVA_OPTS="$AGENT_OPTS $JAVA_OPTS"
  • standalone***.xml**
<datasource jndi-name="{{ jndi_name }}" pool-name="{{ pool_name }}" enabled="true" use-ccm="true" statistics-enabled="true">

JBoss EAP 6.x, 7.x Domain 모드

도메인 모드를 사용할 경우 XML 파일에 시작 옵션을 설정해야 합니다.

  • env.sh
export JAVA_OPTS=" $JAVA_OPTS -Djboss.modules.system.pkgs=org.jboss.byteman,com.opennaru.khan.agent,org.github.jamm,org.jboss.logmanager"
....
export JBOSS_LOGMANAGER_DIR="$JBOSS_HOME/modules/system/layers/base/org/jboss/logmanager/main"
export JBOSS_LOGMANAGER_JAR=`cd "$JBOSS_LOGMANAGER_DIR" && ls -1 *.jar`

export JAVA_OPTS=" $JAVA_OPTS -DJBOSS_LOGMANAGER=$JBOSS_LOGMANAGER_DIR/$JBOSS_LOGMANAGER_JAR "
  • domain.xml
  <system-properties>
{/* IPv4 is not required, but setting this helps avoid unintended use of IPv6 */}
<property name="java.net.preferIPv4Stack" value="true"/>

<property name="java.util.logging.manager" value="org.jboss.logmanager.LogManager" boot-time="true"/>
<property name="jboss.modules.system.pkgs" value="org.jboss.byteman,com.opennaru.khan.agent,org.github.jamm,org.jboss.logmanager" boot-time="true"/>
</system-properties>
...
<datasource jndi-name="{{ jndi_name }}" pool-name="{{ pool_name }}" enabled="true" use-ccm="true" statistics-enabled="true">
...
  • host-slave.xml
      <server name="test11" auto-start="true">
<jvm name="default">
<jvm-options>
<option value="-Xbootclasspath/p:${JBOSS_LOGMANAGER}"/>
<option value="-javaagent:/svc/test/khan-agent/khan-agent.jar"/>
<option value="-Xloggc:/svc/log/slave/test11/gclog/gc_${DATE}.log"/>
<option value="-XX:HeapDumpPath=/svc/log/slave/test11/heapdump"/>
</jvm-options>
</jvm>
<system-properties>
<property name="jboss.node.name" value="test11"/>
<property name="khan.config.file" value="khan-agent-test11.conf"/>

Wildfly 14(Java 11)

Java 11버전을 사용하는 Wildfly 14는 경우 JBoss LogManager의 설정이 필요합니다.

jboss.modules.system.pkgscom.opennaru.khan.agentorg.jboss.logmanager 패키지를 등록하여 합니다. 또, -Xbootclasspath/a 옵션을 사용하여 JBoss Logging 관련 JAR파일들을 지정하여야 하며, -Dsun.util.logging.disableCallerCheck=true 옵션을 지정한다.

  • env.sh
export AGENT_OPTS=" -javaagent:/svc/test/khan-agent/khan-agent.jar "
#export AGENT_OPTS=" -javaagent:$(getKhanAgentPath :/svc/test/khan-agent) "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent-test11.conf"

export JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
export JBOSS_LOGMANAGER_DIR="$JBOSS_HOME/modules/system/layers/base/org/jboss/logmanager/main"
export JBOSS_LOGMANAGER_JAR=`cd "$JBOSS_LOGMANAGER_DIR" && ls -1 *.jar`
export JBOSS_WILDFLY_COMMON_DIR="$JBOSS_HOME/modules/system/layers/base/org/wildfly/common/main"
export JBOSS_WILDFLY_COMMON_JAR=`cd "$JBOSS_WILDFLY_COMMON_DIR" && ls -1 *.jar`

export JAVA_OPTS=" -Xbootclasspath/a:$JBOSS_LOGMANAGER_DIR/$JBOSS_LOGMANAGER_JAR:$JBOSS_WILDFLY_COMMON_DIR/$JBOSS_WILDFLY_COMMON_JAR $JAVA_OPTS"
export JAVA_OPTS=" $JAVA_OPTS -noverify"
export JAVA_OPTS=" -Dsun.util.logging.disableCallerCheck=true $JAVA_OPTS"

export JAVA_OPTS=" $JAVA_OPTS -Djboss.modules.system.pkgs=org.jboss.byteman,com.opennaru.khan.agent,org.github.jamm,org.jboss.logmanager"
  • start.sh
export JAVA_OPTS="$AGENT_OPTS $JAVA_OPTS"
  • standalone-xxx.xml
<datasource jndi-name="{{ jndi_name }}" pool-name="{{ pool_name }}" enabled="true" use-ccm="true" statistics-enabled="true">

JBoss EAP 5.x

시작시 JAVA_OPTS에 아래 설정을 추가한다.

JAVA_OPTS=%JAVA_OPTS% -Djboss.platform.mbeanserver
JAVA_OPTS=%JAVA_OPTS% -Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl

JAVA_OPTS=" $JAVA_OPTS -javaagent:/svc/test/khan-agent/khan-agent.jar "
JAVA_OPTS=" $JAVA_OPTS -Dkhan.config.file=khan-agent-test11.conf"
JAVA_OPTS=" $JAVA_OPTS -noverify"

Tomcat

Tomcat의 경우 catalina.sh 파일에 아래 설정을 추가합니다.

  • catalina.sh
export AGENT_OPTS=" -javaagent:/svc/test/khan-agent/khan-agent.jar "
#export AGENT_OPTS=" -javaagent:$(getKhanAgentPath :/svc/test/khan-agent) "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent-test11.conf"
#export AGENT_OPTS="$AGENT_OPTS -Dcom.sun.management.jmxremote"
export JAVA_OPTS="$AGENT_OPTS $JAVA_OPTS -noverify"

getKhanAgentPath 함수 사용 할 경우 function.sh Include (하단 참조)

WebLogic

WebLogic의 경우 startWebLogic.sh 파일에 아래 설정을 추가합니다.

  • startWebLogic.sh
export AGENT_OPTS=" -noverify -javaagent:/svc/test/khan-agent/khan-agent.jar "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent-test11.conf "

DOMAIN_HOME="/svc/test/weblogic/wls1211/user_projects/domains/base_domain"

JAVA_OPTIONS=" $JAVA_OPTIONS $AGENT_OPTS -Djavax.management.builder.initial=weblogic.management.jmx.mbeanserver.WLSMBeanServerBuilder"
export JAVA_OPTIONS

WebLogic의 Data Source에 대한 정보를 모니터링하기 위해서는 다음과 같은 설정이 필요하다.

Domain -> Configuration -> General -> Platform MBean Server Enabled 선택, Platform MBean Server Used 선택

위와 같이 설정하면, config.xml 안에는 다음 설정이 추가된다.

<jmx>
<platform-m-bean-server-enabled>true</platform-m-bean-server-enabled>
<platform-m-bean-server-used>true</platform-m-bean-server-used>
</jmx>

시작 옵션에 다음 옵션을 추가하여야 한다.

-Djavax.management.builder.initial=weblogic.management.jmx.mbeanserver.WLSMBeanServerBuilder

JEUS 6

  • JEUSMain.xml
      <engine-container>
<name>container1</name>
<id>22</id>
<base-port>22001</base-port>
<command-option>-XX:MaxPermSize=128m -Xms256m -Xmx512m -javaagent:/svc/test/khan-agent/khan-agent.jar -Dkhan.config.file=khan-agent-test11.conf -noverify -Djeus.jmx.usePlatformMBeanServer=true -Djeus.ejb.enable.configDeleteOption=true -Djeus.container.name=example_container1</command-option>

JEUS의 데이터소스, 웹 세션 수를 모니터링 하려면, -Djeus.jmx.usePlatformMBeanServer=true 옵션을 사용하여야 한다.

또, 웹 세션 수 모니터링을 위하여 다음과 같이 JEUS 관리자 콘솔에서 “JEUS 매니저 리소스 -> 보안 -> SYSTEM_DOMAIN -> 정책 -> ‘새 리소스 권한 생성’” 버튼을 클릭하여 다음과 같이 설정하여야 한다.

JEUS 7/8

  • domain.xml
        <jvm-config>
<jvm-option>-Xmx1024m -XX:MaxPermSize=128m</jvm-option>
<jvm-option>-javaagent:/svc/test/khan-agent/khan-agent.jar -Dkhan.config.file=khan-agent-test11.conf -noverify -Djeus.jmx.usePlatformMBeanServer=true</jvm-option>
</jvm-config>

JEUS의 데이터소스, 웹 세션 수를 모니터링 하려면, -Djeus.jmx.usePlatformMBeanServer=true 옵션을 사용하여야 한다.

또, 웹 세션 수 모니터링을 위하여 다음과 같이 JEUS 관리자 콘솔에서 “Security -> Accounts & Policies Management -> policies -> 하단 ‘Resource Permissions’의 ‘Add’ ”버튼을 클릭하여 다음과 같이 설정하여야 한다.

위와 같이 설정하면 jeus_domain/config/security/SYSTEM_DOMAIN/policies.xml 파일의 아래 굵은 글씨체 부분이 추가된다.

        <resource-permissions>
<context-id>default</context-id>
<resource-permission>
<role>AdministratorsRole</role>
<resource>jeus.*</resource>
<actions>*</actions>
<classname>jeus.security.resource.ResourcePermission</classname>
</resource-permission>
<resource-permission>
<role>jndiUser</role>
<resource>jeus.jndi.*</resource>
<actions>lookup</actions>
<classname>jeus.security.resource.ResourcePermission</classname>
</resource-permission>
<resource-permission>
<resource>jeus.server.*</resource>
<actions>getstats</actions>
<classname>jeus.security.resource.ResourcePermission</classname>
<unchecked/>
</resource-permission>
</resource-permissions>

Jetty 9

  • jetty.sh
export AGENT_OPTS=" -javaagent:/svc/test/khan-agent/khan-agent.jar "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent3.conf -noverify"

export JAVA_OPTIONS="$AGENT_OPTS $JAVA_OPTIONS"

Resin 4.x

  • conf/resin.properties or resin.xml
jvm_args : -Xmx1024m -XX:MaxPermSize=256m -noverify -javaagent:/svc/test/khan-agent/khan-agent.jar -Dkhan.config.file=khan-agent3.conf
  • conf/cluster-default.xml
      <server-default>
<jvm-arg-line>${jvm_args}</jvm-arg-line>
<jvm-mode>${jvm_mode}</jvm-mode>

에이전트 파일 버전관리를 위한 function.sh 설정

Agent JAR 파일을 업그레이드 할 때, 다음에 WAS가 기동 될 때, 최종 버전의 파일을 사용할 수 있도록 할 필요가 있습니다. function.sh 파일은 최종 버전의 Agent JAR파일을 사용할 수 있도록 하는 스크립트입니다.

javaagent를 설정시 아래와 같이 getKhanAgentPath 함수를 이용하여 설정한다.

. ./function.sh

export AGENT_OPTS=" -javaagent:$(getKhanAgentPath :/svc/test/khan-agent) "

위와 같은 방법으로 Agent 파일의 디렉터리를 지정하여 설정할 경우, 해당 디렉터리의 current.version 텍스트 파일의 맨 마지막 jar 파일을 로딩한다.

/svc/test/khan-agent/khan-agent.jar

/svc/test/khan-agent/current.version
  • function.sh 파일의 내용
#!/bin/sh

function getKhanAgentPath() {
local KHAN_AGENT_PATH=$1

for file in $(cat $KHAN_AGENT_PATH/current.version); do
KHAN_AGENT_FILE="$file"
done

echo "$KHAN_AGENT_PATH/$KHAN_AGENT_FILE"
}

function listjars {
FILES=$(ls $1*.jar)
echo ${FILES}

}

function getLogmanagerPath {

JBOSS_HOME=$1
OVERLAYS_PATH="$JBOSS_HOME/modules/system/layers/base"

OVERLAYS_PATH="$JBOSS_HOME/modules/system/layers/base/.overlays"
MODULES_SOURCE_PATHS=("$JBOSS_HOME/modules/system/layers/base" "$JBOSS_HOME")

if [ -f "$OVERLAYS_PATH/.overlays" ]; then
for layer in $(tac $OVERLAYS_PATH/.overlays); do
MODULES_SOURCE_PATHS=("$OVERLAYS_PATH/$layer" $\{MODULES_SOURCE_PATHS[@]})
done
fi
name="org/jboss/logmanager/main/"

for source_dir in "$\{MODULES_SOURCE_PATHS[@]}"; do
if [ -d "$source_dir/$\{name}" ]; then
files="$(listjars $source_dir/$\{name})"

if [ -n "$files" ]; then
echo "$files" | sed -e "s/^[ \t]*//" | sed -e "s| |:|g" | sed -e ":a;N;$!ba;s|\n|:|g"
return
fi
else
files="$(compgen -G "$source_dir/$\{name}*.jar")"

if [ -n "$files" ]; then
echo "$\{files[0]}"
return
fi
fi
done

echo "Could not find any jar for the $name path, aborting"
exit 1
}

Java 9 이상 추가 옵션

--add-opens 옵션은 Java 9 이상에서 모듈 시스템의 접근 제어를 우회하기 위해 사용됩니다.

export AGENT_OPTS="$AGENT_OPTS --add-opens=java.base/java.lang=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.base/java.math=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.base/java.util=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.base/java.util.concurrent=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.base/java.net=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.base/java.text=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.sql/java.sql=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.net.http/jdk.internal.net.http=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.net.http/java.net.http=ALL-UNNAMED "