3.3 How to set up agents by WAS type

Add to $JAVA_HOME/bin path

For all WAS, add the JDK’s $JAVA_HOME/bin to the PATH in the user environment variable or startup script.

export JAVA_HOME="/usr/java/jdk1.8.0_92"
export PATH="$JAVA_HOME/bin:$PATH "

JBoss EAP 6.x, 7.x Standalone mode

For JBoss EAP, a setting in JBoss LogManager is required.

This is done by registering the com.opennaru.khan.agent and org.jboss.logmanager packages in jboss.modules.system.pkgs.

  • 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 When using function.sh Include (see below)

  • 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 mode

When using domain mode, you must set the startup options in the XML file.

  • 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 it helps prevent 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="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)

For Wildfly 14 using Java 11, you will need to set up JBoss LogManager.

Register the com.opennaru.khan.agent and org.jboss.logmanager packages in jboss.modules.system.pkgs. Also, specify the JBoss logging related JAR files using the -Xbootclasspath/a option, and specify the -Dsun.util.logging.disableCallerCheck=true option.

  • 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*.XML

<datasource jndi-name="\{\{ jndi_name }}" pool-name="\{\{ pool_name }}" enabled="true" use-ccm="true" statistics-enabled="true"> Β

JBoss EAP 5.x

Add the following settings to JAVA_OPTS at startup.

#JAVA_OPTS=%JAVA_OPTS% -Dcom.sun.management.jmxremote
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

For Tomcat, add the following settings to the catalina.sh file.

  • 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"
  • When using the getKhanAgentPath function, include the function.sh Include (see below).

WebLogic

For WebLogic, add the following settings to the startWebLogic.sh file.

  • 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

To monitor information about the Data Source in WebLogic, the following settings are required.

Select Domain → Configuration → General → Platform MBean Server Enabled, and select Platform MBean Server Used.

image

image

After making the above settings, the following settings will be added to the 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>

The following options should be added to the startup options

-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>

To monitor the data source of JEUS, the number of web sessions, you need to use the -Djeus.jmx.usePlatformMBeanServer=true option.

Also, to monitor the number of web sessions, click "JEUS Manager Resources → Security → SYSTEM_DOMAIN → Policy → 'Create new resource permission'" button in the JEUS Manager console and set it as follows.

image

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>

To monitor the data source of JEUS and the number of web sessions, you need to use the -Djeus.jmx.usePlatformMBeanServer=true option.

Also, to monitor the number of web sessions, click "Security → Accounts & Policies Management → policies → 'Add' button in the bottom 'Resource Permissions'" in the JEUS admin console and set it as follows.

image

After setting as above, the below bolded part of jeus_domain/config/security/SYSTEM_DOMAIN/policies.xml file is added.

        <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>

Setting up function.sh for agent file versioning

When upgrading the Agent JAR file, it is necessary to ensure that the final version of the file is available the next time WAS is started. The function.sh file is a script to make the final version of the Agent JAR file available.

When configuring javaagent, use the getKhanAgentPath function as shown below.

. ./function.sh

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

If you specify the directory of the Agent file in the above way, it loads the last jar file in the current.version text file in that directory.

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

/svc/test/khan-agent/current.version

  • Contents of the function.sh file.

#!/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
}