Java Agent Guide

제목 : Java Agent Guide
작성자 : WhaTap Support
이메일 : support@whatap.io
날짜 : 2020-06-18
버전 : 1.2.2

설명 : 본 문서는 WhaTap Java 에이전트에 대해 설명합니다.

1. 지원 환경

Web Application Server (WAS) 뿐 아니라 데몬 및 배치 애플리케이션 등 JVM에서 동작하는 모든 어플리케이션에 적용 할 수 있습니다.
Java1.5 이하는 support@whatap.io 로 별도 문의 주세요.

1.1. JVM

Table 1. JVM
지원 범위 환경 OS JVM 버전

Fully Support

Java

JVM이 구동되는 모든 OS

Java6 이상
Java13 이하

Limited Support

Java

JVM이 구동되는 모든 OS

Java1.5 이하

1.2. WAS

1.3. Framework / Library

  • Spring Boot Project

  • Netty, Akka HTTP 및 Play Framework 등 비동기 Framework

  • 이외 Java EE Spec 준수 Application Server 에서 동작하는 모든 라이브러리

1.4. DataSource

  • Generic JDBC (any JDBC compliant driver)

  • DB2 JDBC

  • Derby JDBC

  • H2 JDBC

  • jTDS JDBC

  • MariaDB JDBC

  • Microsoft SQL Server JDBC

  • MySQL mysql-connector-java

  • Oracle ojdbc14, ojdbc5, ojdbc6, ojdbc7, ojdbc8

  • Postgres JDBC

  • Tibero

  • Jedis Redis driver

2. 일반 설치

와탭 APM 모니터링 서비스를 사용하기 위해서는 프로젝트를 구성하고 대상 서버에 에이전트를 설치해야 합니다.

설치에 앞서 필요한 사항은 설치 사전 안내서 를 참고 해 주세요.

Linux/Unix 환경에서 서버접속 계정은 WAS 또는 애플리케이션을 관리하는 계정을 사용합니다.

2.1. 프로젝트 생성

모니터링 프로젝트를 생성하기 위해 프로젝트 생성 버튼을 선택합니다.

Screenshot 2020 12 04 Cloud Monitoring
Figure 1. 첫 로그인

Java 아이콘을 선택합니다. 프로젝트명과 데이터 서버 지역(Region), 그룹을 선택한 뒤 저장 버튼을 클릭합니다.

Screenshot 2020 12 03 Cloud Monitoring
Figure 2. 프로젝트 생성 팝업

2.2. 라이센스 발급

생성한 프로젝트를 선택하면 설치 안내 페이지로 이동합니다.

Screenshot 2020 12 03 test 14737   Application Monitoring
Figure 3. 신규 프로젝트

설치 안내 페이지에서 라이센스를 발급 받습니다. 라이센스는 프로젝트단위로 고유한 값을 가집니다.

Screenshot 2020 12 03 test 14737   Application Monitoring1
Figure 4. 설치 안내 페이지 - 1

2.3. 에이전트 다운로드

라이센스를 발급 받은 후에 ‘에이전트 파일 다운로드’ 버튼이 활성화 됩니다. 해당 버튼을 눌러 와탭 에이전트 파일을 다운로드 받습니다.

Screenshot 2020 12 03 test 14737   Application Monitoring2
Figure 5. 설치 안내 페이지 - 2

서버에서 직접 다운로드 받을 수도 있습니다.

wget https://service.whatap.io/agent/whatap.agent.java.tar.gz

모니터링 대상 서버에 접속후 적절한 위치에 에이전트 파일의 압축을 해제합니다. 이 위치가 $WHATAP_HOME 이 됩니다.

tar -zxvf whatap.agent.java.tar.gz

2.4. 설정 적용

$WHATAP_HOME/whatap.conf 파일 내용에 라이선스키와 데이터 수집 서버 주소가 정상적으로 들어가 있는지를 확인합니다.
값이 없다면 설치 안내 페이지의 설정값을 복사해 붙여 넣습니다.

whatap.conf
license={라이센스 키}
whatap.server.host={수집서버 IP}
UI를 통해 다운로드 받은 경우 whatap.conf 에 설정값이 들어가 있습니다.
서버에서 직덥 다운로드 한 경우라면 설치안내 페이지의 라이센스키와 수집 서버 주소를 별도 입력해야 합니다.

2.5. 에이전트 적용

적용 대상(WAS, Batch 및 Daemon 과 같은 Java애플리케이션)에 javagent 옵션으로 whatap agent path를 추가 합니다.

JVM_OPTS
-javaagent:/whatap/whatap.agent-#.#.#.jar

재시작 후 프로세스 정보에서 설정한 옵션이 보인다면 설정 적용이 된 것입니다.

psgrep
Figure 6. ps -ef |grep java

2.6. 에이전트 적용(예)

환경별 설정 위치는 설치 페이지 및 애플리케이션 서버 별 적용 절차 에서 확인할 수 있습니다.

2.6.1. Tomcat – Linux

catalina.sh 상단에 JAVA_OPTS 을 추가 합니다.

catalina.sh
########## WHATAP ############
WHATAP_HOME=/whatap (1)
WHATAP_JAR=`ls ${WHATAP_HOME}/whatap.agent-*.jar | sort | tail -1`
JAVA_OPTS="${JAVA_OPTS} -javaagent:${WHATAP_JAR} "
########## WHATAP ############
1 WHATAP_HOME 을 지정합니다.

2.6.2. Tomcat – Windows

catalina.bat 상단에 JAVA_OPTS 를 추가 합니다.

catalina.bat
rem ########## WHATAP ############
set WHATAP_HOME=C:\whatap (1)
for /f %%f in ('dir /b /on %WHATAP_HOME%\whatap.agent-*.jar') do set last=%%f
set WHATAP_JAR=%last%
if x%JAVA_OPTS:whatap=%==x%JAVA_OPTS% (
  set JAVA_OPTS=%JAVA_OPTS% -javaagent:%WHATAP_HOME%\%WHATAP_JAR%
)
rem ########## WHATAP ############
1 WHATAP_HOME 을 지정합니다.

2.6.3. WAS 재기동

애플리케이션 서버를 재기동 합니다.
구동 로그를 확인 했을때 다음과 같은 WhaTap 캐릭터 로그가 보인다면 JAVA_OPTS 설정이 정상 적용 된 것입니다.

Nov 16, 2016 3:06:40 AM org.apache.catalina.startup.HostConfig deployDirectory
INFO: Deployment of web application directory /var/lib/tomcat7/webapps/ROOT has finished in 577 ms
Nov 16, 2016 3:06:40 AM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Nov 16, 2016 3:06:40 AM org.apache.catalina.startup.Catalina start
INFO: Server startup in 3984 ms
_           ____       ______
| | /| / / /  ___ /_  __/__ ____
| |/ |/ / _ \/ _ `// / / _ `/ _ \
|__/|__/_//_/\_,_//_/  \_,_/ .__/
                             /_/
Just Tap, Always Monitoring
WhaTap Agent version 0.3.9 20161115

2.7. 적용 확인

생성한 프로젝트 화면에 Agent가 보여지면 적용이 완료 된 것입니다.

Screenshot 2020 12 03 test 14737   Application Monitoring4
Figure 7. 프로젝트
Agent 명의 기본값은 {type}-{ip2}-{ip3}-{port} 입니다.
속성을 추가 하거나 이름을 변경하고자 하는 경우 에이전트 네이밍 을 참고 해 주시면 됩니다.

2.8. 에이전트 업데이트

관리 | 에이전트 업데이트 메뉴를 선택 후 최신버전 또는 최신 버전으로 모든 에이전트에 다운로드 버튼을 클릭합니다.

다운로드 된 에이전트는 어플리케이션 재시작시 자동 적용됩니다.

Screenshot 2020 12 04 test 14737   Application Monitoring1
Figure 8. 관리 - 에이전트 업데이트

2.9. 에이전트 삭제

애플리케이션 서버 JVM 옵션의 -javaagent 설정을 삭제 후 애플리케이션 서버를 재기동 합니다. 이후 $WHATAP_HOME 을 삭제 합니다.

2.10. 에이전트 롤백

관리 | 에이전트 업데이트 메뉴를 선택 후 다른 버전들 버튼을 클릭합니다.

agent rollback 1
Figure 9. 관리 - 에이전트 롤백1

롤백을 원하는 버전을 선택한 후 선택된 버전으로 모든 에이전트에 다운로드 혹은 선택된 버전 버튼을 이용하여 롤백을 원하는 서버들만 롤백합니다.

agent rollback 2
Figure 10. 관리 - 에이전트 롤백2

이후 에이전트 설치시 수정했던 스크립트에 WHATA_JAR 설정을 롤백을 원하는 버전으로 바꿔야 합니다.

10.27.00
Figure 11. 관리 - agent-2.0_25으로 롤백

적용된 에이전트는 어플리케이션 재시작시 자동 적용됩니다.

3. 고급 설치

Tomcat 과 같은 일반적인 Servlet 기반이 아닌 경우, 특수한 환경에서도 적용 할 수 있도록 다양한 설치 방안을 제공 합니다.
프로젝트 생성 및 에이전트 다운로드는 일반 설치과정과 동일합니다.

3.1. Attach 방식

Attach 방식으로 WhaTap Agent 를 적용 할 수 있습니다.
com.sun.tools.attach API를 사용해 애플리케이션 재시작 없이 WhaTap Agent를 적용 합니다.

ps 명령을 사용해 PID 를 확인 합니다.

Tomcat - pid
$ ps -ef | grep tomcat | grep -v 'grep'

ec2-user  3058     1  1 06:11 pts/0        00:00:02 /home/ec2-user/jdk1.8.0_111/bin/java -Djava.util.logging.config.file=/home/ec2-user/apache-tomcat-7.0.72/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.endorsed.dirs=/home/ec2-user/apache-tomcat-7.0.72/endorsed -classpath /home/ec2-user/apache-tomcat-7.0.72/bin/bootstrap.jar:/home/ec2-user/apache-tomcat-7.0.72/bin/tomcat-juli.jar -Dcatalina.base=/home/ec2-user/apache-tomcat-7.0.72 -Dcatalina.home=/home/ec2-user/apache-tomcat-7.0.72 -Djava.io.tmpdir=/home/ec2-user/apache-tomcat-7.0.72/temp org.apache.catalina.startup.Bootstrap start

확인한 PID를 파라미터로 $WHATAP_HOME/attach.sh(bat) 를 실행합니다.

attach.sh $pid
$ ./attach.sh 3058

JAVA_HOME=/jdk1.8.0_111
_      ____           ______
| | /| / / /  ___ /_  __/__ ____
| |/ |/ / _ \/ _ `// / / _ `/ _ \
|__/|__/_//_/\_,_//_/  \_,_/ .__/
                             /_/
Just Tap, Always Monitoring
WhaTap Agent version 0.4.2 20161123
Admin: ec2-user
PID: 3128
Java Path: /jdk1.8.0_111/jre
Java Version: 1.8.0_111
AttachAgent Success :  [3058] org.apache.catalina.startup.Bootstrap start

프로젝트 화면에서 에이전트가 정상 등록 되었는지 확인 합니다.

Attach 는 일회성 적용 입니다.
Attach 적용 후 일반 설치에 사용되는 “javaagent” 옵션을 적용 하면 애플리케이션 재기동 후에도 모니터링이 유지됩니다.

3.2. Java 1.4 이하

JDK1.4 환경에서 와탭 모니터링은 제약사항이 있으며, 설치 방법도 차이가 있습니다.

JDK1.4를 위한 에이전트 모듈은 support@whatap.io로 요청 바랍니다.
whatap.java14.tracer-[version].jar

3.2.1. boot.jar 생성

setup.sh를 사용하여 boot.jar파일을 생성합니다.

$setup.sh  [JAVA_HOME]

만약 [JAVA_HOME]을 지정하지 않으면 현재 패스에 걸려 있는 JDK의 위치를 자동으로 인식합니다.

setup.sh 결과 파일
whatap.java14.boot-1.0.2.jar

3.2.2. bootclasspath에 설치

bootclasspath 옵션을 사용해 빌드된 jar와 tracer jar를 prepend로 추가합니다.

java 실행 옵션
-Xbootclasspath/p:${WHATAP_HOME}/whatap.java14.boot-1.0.2.jar:${WHATAP_HOME}/whatap.java14.tracer-1.0.2.jar

3.2.3. 제약 사항

jdk1.4에서는 기능 제약있습니다.

동적 프로파일링이 안됩니다.
액티브스택이 동작하지 않습니다.
최신 기능이 동작하지 않습니다.

아래의 기능들이 동작하지 않습니다.

대분류 소분류 항목

대시보드

액티브 트랜잭션

실시간 스택트레이스

스택

탑 스택

전체 항목

스택

유니크 스택

전체 항목

스택

엑티브 스택

전체 항목

서버

더보기

컴포넌트 버전

서버

더보기

스레드 목록

서버

더보기

힙 히스토그램

서버

더보기

로드된 클래스

서버

더보기

오픈 소켓

서버

더보기

Method Perf Stat

서버

더보기

에이전트 덤프

3.3. Maven 활용

Maven pom.xml 에 에이전트를 정의해 버전과 설정을 관리 할 수 있습니다.

3.3.1. pom.xml 설정

repository 와 dependency
<!-- repository 를 추가 합니다 -->
<repositories>
        <repository>
                <id>io.whatap</id>
                <name>WhaTap maven repository</name>
                <url>http://repo.whatap.io/maven</url>
        </repository>
</repositories>

<!-- dependency 를 추가 합니다. -->
<dependencies>
    <dependency>
        <groupId>io.whatap</groupId>
        <artifactId>whatap.agent</artifactId>
        <version>2.0_12</version> (1)
        <scope>provided</scope>
    </dependency>
</dependencies>
1 릴리즈 노트 참고해 버전 정보 지정 합니다.

3.3.2. whatap.conf 설정

일반 설치와 동일하게 whatap.conf 를 설정 합니다.

whatap.conf 와 paramkey.txt 는 agent jar 파일과 동일한 경로에 둡니다.

3.3.3. javaagent 옵션 적용

JVM 옵션에 추가 합니다.

-javaagent:/path/to/whatap.agent-{version}.jar

3.4. PaaS 환경

PaaS 환경은 배포 대상 어플리케이션에 WhaTap Agent 와 설정을 포함하여 배포합니다.

3.4.1. IBM BlueMix

IBM BlueMix 는 컨테이너로 WebSphere Liberty 환경을 제공합니다. Liberty는 WebSphere Application Server 와 다른 경량화 환경으로 Spring Boot 가 동작하는 방식과 유사합니다.

설정 환경 예제 입니다. 가이드에 따른 환경 구성시 로컬 개발환경에서 생성되는 파일들은 아래와 같습니다.

whatap@vmwas01:/apps/bluemix/java-helloworld$ ls -alrt
합계 64
drwxrwxr-x 3 whatap whatap  4096 10월 29 13:13 ..
-rw-rw-r-- 1 whatap whatap  1079 10월 29 13:13 .classpath
-rw-rw-r-- 1 whatap whatap  1184 10월 29 13:13 .project
-rw-rw-r-- 1 whatap whatap    39 10월 29 13:13 .gitignore
-rw-rw-r-- 1 whatap whatap   151 10월 29 13:13 CONTRIBUTING.md
drwxrwxr-x 2 whatap whatap  4096 10월 29 13:13 .settings
-rw-rw-r-- 1 whatap whatap  2823 10월 29 13:13 pom.xml
-rw-rw-r-- 1 whatap whatap   122 10월 29 13:13 manifest.yml
-rw-rw-r-- 1 whatap whatap  3522 10월 29 13:13 README.md
-rw-rw-r-- 1 whatap whatap 11323 10월 29 13:13 LICENSE
drwxrwxr-x 3 whatap whatap  4096 10월 29 13:13 src
drwxrwxr-x 2 whatap whatap  4096 10월 29 13:13 target
drwxrwxr-x 8 whatap whatap  4096 10월 29 13:13 .git
drwxrwxr-x 6 whatap whatap  4096 10월 29 15:26 .

${APP_HOME}에서 src/main/resources/whatap-agent/ 디렉토리를 생성하고 jar 파일, conf 파일을 복사 합니다.

$ mkdir -p src/main/resources/whatap-agent/
$ cp /apps/whatap/whatap.agent.tracer-1.5.4.jar src/main/resources/whatap-agent/
$ cp /apps/whatap/whatap.conf src/main/resources/whatap-agent/

whatap.conf 설정은 PaaS 가 아닌 환경과 동일하게 적용합니다. 단, 적용 후 에이전트명 식별에 어려움이 있을 수 있으므로 상황에 맞는 에이전트명명[1] 정책을 적용 합니다.

${APP_HOME}/manifest.yml 파일에 옵션을 추가 합니다. yml 파일이므로 공백, 들여쓰기 기준을 잘 맞춰야 합니다.

manifest.yml
---
applications:
- name: sample-java-helloworld
  random-route: true
  memory: 256M
  path: target/JavaHelloWorldApp.war
  #여기서부터 추가됩니다.
  env:
    JAVA_OPTS: "-javaagent:/{APPLICATION_DIR}/WEB-INF/classes/whatap-agent/whatap.agent.tracer-1.5.4.jar -Dorg.osgi.framework.bootdelegation=whatap.* "

3.4.2. Elastic Beanstalk

Elastic Beanstalk를 사용하여 배포시 Whatap 서비스를 적용하는 방법에 대하여 설명합니다.

Spring Boot 결과물을 jar로 배포 할 경우

jar형태로 배포시에는 .ebextensions의 내용이 적용되지 않아 필요한 파일들을 압축하여 zip형태로 배포합니다.

  • 필요한 설정파일들

    • .elasticbeanstalk/config.yml : eb 명령을 실행하는 디렉토리 하위에 자동으로 생성

    • .ebextensions/{config_name}.config : eb 설정을 위한 파일

    • Procfile : JVM command line옵션을 설정하기 위한 파일

    • {application}.jar : 실행할 applicaion.jar파일

Service에 적용할 whatap.agent의 파일을 압축하여 S3(혹은 다운로드 할 수 있는 public 경로)에 업로드합니다.

whatap agent가 실행시 필요한 파일들
$ ls agent/
paramkey.txt whatap.agent-2.0_25.jar whatap.conf
디렉토리 압축하기
zip -r whatap-agent.zip agent

".ebextension/{config_name}.config" 파일에 download할 whatap agent경로를 입력합니다.
압축 파일 형태로 만들어 다운로드 할 수 있게 만들어 둔 경우 eb실행 시 자동으로 다운로드 받아서 압축을 풀어줍니다.

.ebextension/{config_name}.config
sources:
  target directory:
    S3경로
예시
sources:
  /home/webapp:
    http://s3.ap-northeast-2.amazonaws.com/{bucket-name}/whatap-agent.zip

whatap agent의 옵션들을 추가한 JVM command를 입력하여 Procfile을 작성합니다.

Procfile
web: java -javaagent:${WHATAP_JAR_FILE_PATH} -Dwhatap.name=${WHATAP_NAME} -Dwhatap.okind=${WHATAP_OKIND_NAME} -Dwhatap.server.home=${APPLICAION_PATH} -Dwhatap.conf.path=${WHATAP_HOME} -jar ${APPLICAIONT}.jar
예시
web: java -javaagent:/home/webapp/agent/whatap.agent-2.0_25.jar -Dwhatap.name=bootTest -Dwhatap.okind=test -Dwhatap.server.home=/var/app/current -Dwhatap.conf.path=/home/webapp/agent -jar whatap-boot-test.jar

Procfile과 .ebextensions폴더와 {application}.jar파일을 압축합니다.

zip -r {application}.zip Procfile .ebextensions/ {application}.jar

".elasticbeanstalk/config.yml" 파일에 deploy할 zip파일의 경로를 추가합니다.

.elasticbeanstalk/config.yml 파일
deploy:
  artifact: /path/to/{application}.zip

eb deploy 명령어를 실행하여 배포합니다.

eb deploy

자세한 내용은 AWS 가이드 문서를 참고 부탁드립니다.
https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/Welcome.html

3.5. Docker 환경

기존 Docker 이미지를 바탕으로 WhaTap 설정이 추가된 이미지를 빌드 합니다.

본 가이드는 Java Agent 만 설치하는 경우에 한합니다.
와탭 Kubernetes 모니터링과 함께 적용하는 경우 별도 절차를 따릅니다.

Step -1 도커 빌드 디렉토리 생성 합니다.

mkdir -p {Docker build Dir}

Step -2 whatap.conf 파일을 생성합니다.

cat >{Docker build Dir}/whatap.conf <<EOL
license=XXXXXXXXXXXXXX-XXXXXXXXXXXXXX-XXXXXXXXXXXXXX (1)
whatap.server.host=xx.xx.xx.xx/yy.yy.yy.yy (2)
EOL
1 프로젝트 라이센스키를 입력합니다.
2 Proxy IP 정보를 입력 합니다.

Step -3 Dockerfile을 생성합니다.
이미지를 빌드할때 와탭 이미지에서 -javaagent 옵션에 적용할 jar파일을 복사할수 있습니다.

cat >/home/silver/whatap/docker/Dockerfile <<EOL
FROM whatap/kube_mon as build
#실제 이미지 생성 ( 기존 이미지에 Whatap 추가 )
# $Image_Name(이미지명)
FROM $Image_Name
RUN mkdir -p /whatap
COPY --from=build /data/agent/micro/whatap.agent-*.jar /whatap
COPY ./whatap.conf /whatap/
... {중략} ...
EOL

Step -4 JAVA_OPTS에 아래 내용을 추가합니다.

WHATAP_HOME=/whatap
WHATAP_JAR=ls ${WHATAP_HOME}/whatap.agent-*.jar | sort | tail -1
export JAVA_OPTS="-javaagent:${WHATAP_JAR} "

Step -5 Docker 빌드

cd docker
docker build -t $Image_Name

4. 설치 점검

4.1. 설치 에러

4.1.1. 방화벽 설정 확인

와탭 서버에 대한 TCP 아웃바운드 정책이 설정되어 있지 않으면 모니터링 정보를 전송 할 수 없으므로 방화벽 차단을 해제해야 합니다.

telnet 명령을 사용해 " Connected to <IP> " 를 확인 해야 합니다.

telnet
$ telnet 52.193.60.176 6600
Trying 52.193.60.176...
Connected to 52.193.60.176.
Escape character is '^]'.
  • 수집 서버 IP 정보는 와탭 웹사이트에서 해당 프로젝트의 관리 > 에이전트 설치 메뉴에서 확인할 수 있습니다.

4.1.2. SpringBoot 2.2 이상

SpringBoot 2.2 이상에서 Embeded Tomcat 을 사용하는 경우 기본값으로 JMX관련 기능이 동작하지 않습니다.
이 경우 JMX 기능을 활성화 해야 합니다.

Since Spring Boot 2.2, JMX is disabled by default.
application.properties
spring.jmx.enabled=true
server.tomcat.mbeanregistry.enabled=true #tomcat embeded 인 경우
application.yml
spring:
  jmx:
    enabled: true
server:
  tomcat:
    mbeanregistry:
      enabled: true #tomcat embeded 인 경우

4.1.3. 애플리케이션 서버가 OSGi 프레임워크를 사용하는 경우

OSGI 프레임워크 구조의 애플리케이션 서버인 경우 JVM 옵션에 에이전트 패키지 prefix(whatap)를 등록해야 합니다.

Jboss EAP 6.0 이상
Jboss AS 7.0 이상
Wildfly 8.0 이상
IBM WebSphere AS 7.0 이상
등이 해당됩니다.
JBoss AS, Wildfly, JBoss EAP 6.0 이상

$JBOSS_HOME/bin/standalone.conf(domain.conf)파일에 prefix를 등록합니다.

 -Djboss.modules.system.pkgs=whatap
410
Figure 12. JBOSS EAP 7.0
WebSphere
 -Dcom.ibm.ws.classloader.server.alwaysAllowedPackages=whatap
  • Default로 ‘*’로 지정되어 있는 경우는 별도의 설정을 필요로 하지 않습니다.

  • 설정 위치는 ‘WebSphere‘를 참조합니다.

security.policy 권한 추가

$WEBSPHERE_HOME/properties/server.policy 또는 $WEBSPHERE_PROFILE_HOME/properties/server.policy
grant codeBase "file:$WHATAP_HOME/-"
{
   permission java.security.AllPermission;
};

4.1.4. 히트맵에 트랜잭션이 표시되지 않는 경우

IBM JDK의 경우 attach 방식으로 에이전트를 적용 한 경우 트랜잭션 정보가 수집되지 않으므로 ‘javaagent’ 방식으로 에이전트를 설치해야 합니다.

4.1.5. logmanager 관련 에러가 발생하는 경우

JBoss AS 7.0이상, JBoss EAP 6.0 이상 에서 logmanager 관련 에러가 발생한다면 JVM 옵션을 추가합니다.

 -Djava.util.logging.manager에 LogManager package명 설정
 -Xbootclassloader에 JBoss log manager JAR file 설정
420
Figure 13. 설정 추가 예

4.1.6. MBeanServerBuilder 에러가 발생하는 경우

JBoss 5.0 이하에서 MBeanServerBuilder 관련 에러가 출력된 경우 JVM 옵션 추가 합니다.

-Djboss.platform.mbeanserver를 true로 설정합니다.
430
Figure 14. 설정 추가 예

4.1.7. permission 오류가 발생하는 경우

Java Security Policy 관련 오류가 발생하는 경우, $JAVA_HOME/jre/lib/security/java.policy 파일에 권한 설정을 추가합니다.

모든 권한을 일괄 적용하고자 하는 경우, {JAVA_HOME}/jre/lib/security/java.policy 파일에 하기의 설정을 추가합니다.

grant {
   permission java.security.AllPermission;
};
java.io.FilePermission 오류가 발생하는 경우
440

$JAVA_HOME/jre/lib/security/java.policy 파일에 하기의 설정을 추가합니다.

grant {
   ...
   permission java.io.FilePermission {오류 메세지에서 확인된 패키지 경로}, "read"
};
java.util.PropertyPermission 오류가 발생하는 경우

$JAVA_HOME/jre/lib/security/java.policy 파일에 하기의 설정을 추가합니다.

grant {
   ...
   permission java.util.PropertyPermission {오류 메세지에서 확인된 패키지 경로}, "read"
};

4.1.8. Sigar library를 로딩하지 못하는 경우

$WHATAP_HOME/lib1/*.so 파일에 실행 권한이 있는지 확인 후 없다면 실행 권한을 부여합니다.

$ sudo chmod +x *.so
440

AIX 7에서 $WHATAP_HOME/lib1 하위에 libsigar-ppc64-aix-7.so 파일이 없어 오류가 발생한 경우 파일을 복사 합니다.

$ cp libsigar-ppc64-aix-5.so libsigar-ppc64-aix-7.so

4.2. 에이전트 네이밍

모니터링 대상을 식별하기 위해서는 이를 구분해야 할 필요가 있으며 와탭은 오브젝트 이름과 오브젝트 아이디를 통해서 대상을 구분합니다.

오브젝트(에이전트)이름은 프로젝트 단위로 고유해야 합니다.
오브젝트 아이디/이름이 바뀌면 이전 데이터와 연결되지 않습니다

와탭 모니터링 서비스에서는 모니터링 대상을 오브젝트 또는 에이전트로 혼용해서 사용합니다.

4.2.1. 이름 결정 방식

추가적인 설정이 없는 경우 오브젝트 이름은 자동으로 결정 됩니다.

예) IP 주소가 10.11.12.13 인 서버에서 Tomcat 이 8080 포트로 기동된 경우 TC-12-13-8080 이라는 오브젝트 이름으로 자동 부여됩니다.
whatap.oname 설정이 없는 경우 (기본값)
1. whatap.type을 식별한다.
2. whatap.type이 서블릿 컨테이너면 어플리케이션이 사용하는 포트를 식별 한다.
3. 포트가 식별되지 않는 경우라면 pid 를 검색 한다.
4. 식별된 정보에 IPv4 주소 3,4번째를 추가하여 최종 이름을 결정한다.

결과 : {type}-{ip2}-{ip3}-{port}

이와같은 이름 결정 방식을 사용하는 이유는 서비스 중지, 네트워크 단절 후 재 접속된 에이전트와 기존 에이전트로 부터 수신된 데이터의 연속성을 유지하기 위해서 입니다.

4.2.2. 이름 변수

와탭은 이름으로 사용할 수 있는 변수를 다음과 같이 제공 합니다.

오브젝트 이름 패턴에 사용할 수 있는 변수 종류
문자열

지정한 문자열을 사용합니다.

{type}

컨테이너 타입을 자동 식별해 부여 합니다. 자동 식별 대상은 다음과 같습니다.
JAVA, TOMCAT, JBOSS, RESIN, SPRINGBOOT, JETTY, JEUS, WEBLOGIC, WEBSPHERE, UNDERTOW, PLAY

{ip0}

IPv4 주소 중 첫번째 수를 사용합니다.

{ip1}

IPv4 주소 중 두번째 수를 사용합니다.

{ip2}

IPv4 주소 중 세번째 수를 사용합니다.

{ip3}

IPv4 주소 중 네번째 수를 사용합니다.

{pid}

Java Process 의 pid 를 사용합니다.

{port}

어플리케이션이 Listen 하는 포트를 사용합니다.

4.2.3. 이름 지정

자동으로 부여된 이름 대신 직접 이름을 정할수도 있습니다.

우선순위

옵션

설정위치

설명

1

-Dwhatap.name

JVM Option

어플리케이션명 패턴을 지정합니다.

default : {type}-{ip2}-{ip3}-{port}

2

-Dwhatap.oname

JVM Option

어플리케이션명을 고정값으로 지정합니다.

오브젝트 이름의 자동부여

클라우드 환경에서 Scale Out환경에서는 VM이 복사되어 사용될 수 있기 때문에 오브젝트 이름이 자동 부여되는 것이 중요합니다.

동일 프라이빗 IP를 사용하는 환경에서 오브젝트 이름 자동 부여

만약 2개의 VPC환경을 만들고 동일한 private IP 를 사용하도록 네트웍을 구성한경우 두개의 VPC는 별도의 프로젝트로 분리하거나 -Dwhatap.name을 서로 다른 패턴으로 지정하여 중복되지 않도록 해야 합니다.

오브젝트 이름을 명시적으로 지정할때는

java 실행 옵션에 지정할 수 있습니다.

-Dwhatap.oname=tomcat1
오브젝트 이름을 패턴으로 지정하고 싶을때

문자열과 변수를 조합해 사용할 수 있습니다.

-Dwhatap.name=front-{ip3}-{port}

4.3. MSA 업무 그룹 구분

Auto Scale Out 환경에서 자동 등록된 에이전트의 IP / Port / Pid 정보만을 가지고 업무 단위의 정보를 인지하기 어려운 경우가 있습니다.

이 경우 okind 속성을 부여하면 쉽게 식별이 가능합니다.

전형적인 Docker 환경의 모습입니다.
  • 각 에이전트는 잘게 쪼개어 놓은 MSA (Micro Service Architecture) 구성 요소 입니다.

  • 에이전트들은 자동으로 Scale In/Out 됩니다.

  • 어떤 IP를 가진 서버에서 어떤 pid 로 어플리케이션이 기동 될 지는 예측 할 수 없습니다.

이 경우 이름과 더불어 업무를 식별 할 수 있는 whatap.okind 옵션을 사용해 okind 속성을 추가 합니다.

JVM 옵션에 추가 할 수 있습니다.

JAVA_OPTS
-Dwhatap.okind=mobile_ui

설정 파일에 추가 할 수도 있습니다.

whatap.conf
whatap.okind=common_api
MSA 환경이라면 okind 속성을 추가해야만 와탭이 제공하는 다양한 기능을 활용 할 수 있습니다.

4.4. Scale In 에서 에이전트 자동 삭제

에이전트 이름을 자동부여하는 것은 Scale Out 시 운영자의 개입 없이 시스템을 자동으로 확장하기 위함입니다
그런데 Auto Scale 환경에서 Scale In이 발생하는 경우 정상적인 Shutdown으로 인식하는 것이 필요합니다.

자동 삭제를 위해서는 서버에서 에이전트로 부터 자동 삭제에 대한 메세지를 받아야 합니다. ${WHATAP_HOME}에 Java 프로세스의 whatap_{process id}.shutdown 파일이 나타나면 5초 이내에 에이전트는 서버에 “SILENT_SHUTDOWN” 이벤트를 전송합니다.

SILENT_SHUTDOWN 이벤트가 전송되고 1분 이내에 에이전트가 셧다운되면 와탭서버는 해당 에이전트를 곧바로 목록에서 제거하고 inactive이벤트도 발생키지 않습니다.

Tomcat 의 경우 shutdown.sh 에 지정 할 수 있습니다.

$TOMCAT_HOME/bin/shutdown.sh
touch $WHATAP_HOME/whatap_$CATALINA_PID.shutdown

4.5. AES 256 암호화 적용

와탭 APM 에이전트는 수집된 데이터를 암호화하여 서버로 전송합니다.
이를 위해 XOR 연산과 AES 암호화를 사용, 평문을 128비트 단위로 나누어 암복호화를 수행합니다.

강화된 보안을 필요로 하는 경우 256비트까지 확장할 수 있습니다.
기본적으로 JCE는 128비트를 지원하기 때문에 AES 256 비트를 적용하기 위해서는 jce 업데이트가 필요 합니다.

기본 환경에서 AES 256 적용시 오류
Unsupported keysize or algorithm parameters.
##혹은,
Illegal key size or default parameters.

링크에서 파일을 다운로드 한 후 $JAVA_HOME/jre/lib/security에 파일을 덮어씁니다.

jce 가 적용 되었다면 ${WHATAP_HOME}/whatap.conf 파일에 아래 설정을 추가합니다.

cypher_level=256 설정을 추가합니다.
cypher_level=256

애플리케이션 재시작 이후 적용 됩니다.

4.6. 애플리케이션 환경에 따른 부가 정보 수집

애플리케이션 환경에 따라 에이전트 기본값만으로는 원하는 수준의 정보를 얻지 못할 수 있습니다. 이 경우 에이전트 설정 값을 참고해 데이터를 추가 수집 할 수 있습니다.

다음은 자주 사용되지만 보안 등을 이유로 에이전트 기본값에서 제외된 옵션입니다. 필요하다면 설정 추가로 적용 할 수 있습니다.

SQL 파라미터를 수집합니다.

profile_sql_param_enabled=true

HTTP 파라미터를 수집합니다.

profile_http_parameter_enabled=true

HTTP Header 정보를 수집합니다.

profile_http_header_enabled=true

사용자 IP 정보를 HTTP Header의 Key 에서 추출합니다.

trace_http_client_ip_header_key=X-Forwarded-For

사용자 수 추적을 cookie 기반으로 합니다.

trace_user_method=cookie

SAP JCO 를 사용하는 경우 SAP Function 을 추적합니다.

hook_httpc_sap3_enabled=true

jedis 라이브러리를 사용하는 경우 Redis 응답시간과 파라미터를 추적합니다.

weaving_reserved=jedis-3.2
jedis_show_parameter=true

Spring MongoDB 를 사용하는 경우 응답시간과 파라미터를 추적합니다.

weaving_reserved=spring-mongodb-2.2
mongo_show_parameter=true

webflux 환경을 모니터링 합니다.

weaving_reserved=webflux-5.2

okhttp 사용한 외부 호출을 추적합니다.

weaving_reserved=okhttp-2.7
weaving_reserved=okhttp3

rabbitmq 호출을 추적합니다.

weaving_reserved=reactor-rabbitmq-1.2
weaving_reserved=spring-rabbitmq-2.1

5. 데이터

와탭 에이전트는 트랜잭션 성능, 주요 성능 통계 그리고 서비스와 자원에 대한 카운터를 수집합니다.

5.1. 트랜잭션 추적

5.1.1. 트랜잭션 시작과 종료

트랜잭션이란 사용자 브라우저의 요청을 처리하기 위한 서버 사이드의 LUW(Logical Unit of Work)를 말합니다. 개별 웹서비스(URL) 요청에 대한 처리과정이 바로 트랜잭션인 것입니다. 웹 어플리케이션에서 트랜잭션은 웹서비스(URL)에 대한 HTTP Request를 받아 Response를 반환하는 과정입니다.

애플리케이션의 성능은 이 트랜잭션들의 성능으로 요약할 수 있습니다.

트랜잭션 성능은 트랜잭션 시작에서 부터 종료시점, 그리고 응답시간및 자원 사용량 혹은 트랜잭션 호출자의 속성등의 정보들을 포함합니다.

기본적으로 트랜잭션 응답 분포와 트랜잭션 통계를 통해서 트랜잭션 성능을 분석할 수있습니다.

트랜잭션의 이름

트랜잭션의 이름은 URL입니다. 단 Get 파라미터(Query String)는 제외 됩니다.

브라우저 요청
http://www.whatap.io/hr/apply.do?name='kim'
트랜잭션 이름
/hr/apply.do
와탭에서는 "웹서비스 이름" 과 "트랜잭션 이름"을 혼용해서 사용합니다. 서비스 특정 URL과 그에 대한 요청을 처리하기 위한 모듈로 볼수있고 트랜잭션 그 요청에 대한 처리 하나를 의미하기 때문에 둘의 이름은 동일하게 URL이라고 할 수있습니다.
트랜잭션 이름 정규화

MSA 기반의 시스템이 발전하면서 URL + ? 인자 파라미터 형식보다 URL 패스에 파라미터를 넣는 방식을 많이 사용하게 됩니다.

http://www.whatap.io/hr/kim/apply.do

이렇게 패스파라미터를 그대로 트랜잭션 이름으로 사용하게 되면 통계적 관점의 성능 분석이 어렵게 됩니다. 따라서 이를 정규화할 필요가 있습니다. 와탭은 이때 정규화를 위한 옵션과 기능을 제공하고 있습니다.

whatap.conf
 trace_normalize_urls=/hr/{name}/apply.do

위와 같이 설정하면 트랜잭션 이름이 /hr/kim/apply.do → /hello/:name/apply.do 로 치환되어 수집됩니다. 만약 대상 url설정은 그대로 두고 기능만off하고자 한다면 다음과 같이 옵션을 지정할 수있습니다. 기본값은 true입니다.

whatap.conf
 trace_normalize_enabled=false

5.1.2. 트랜잭션 프로파일

트랜잭션 성능이 트랜잭션 시작과 종료사이의 요약 지표들이나 속성들을 의미한다면 트랜잭션 프로파일은 트랜잭션이 수행되는 과정중이 스텝들을 추적하는 것입니다.

트랜잭션이 느리거나 오류가 있다면 그 원인을 추적하기 위해서 수행 이력을 스텝별로 추적할 필요가 있는데 이것을 트랜잭션 프로파일링이라고 합니다.

와탭이 수집하는 스텝의 종류에는 크게 SQL 스텝, HTTP CALL스탭, 메세지 스텝, SOCKET오픈 스텝, DB연결 스텝, 메소드 스텝등이 있습니다.

DB연결 스텝

수집방식: START-END
RDB에 대한 연결에 대한 성능을 포함합니다. 스텝 정보에는 이름,응답시간,에러를 포함합니다.

SQL 스텝

수집방식: START-END
JDBC SQL에 대한 성능을 포함합니다. 스탭정보에는 연결정보,SQL문, 에러가 포함되어있습니다.

HTTP Call 스텝

수집방식: START-END
외부 http서비스 호출에 대한 성능을 포함합니다. 스텝 정보에는 url, host, port, 응답시간, 에러가 포함됩니다.

Message 스텝

수집방식: ADD
메세지 스텝을 프로파일을 수집하는 과정에서 비정형적인 모든 구간에 대한 이력을 수집할때 사용됩니다. file오픈 등등 혹은 사용자도 임의의 위치를 지정하는데 사용 할 수있습니다.

SOCKET 스탭

수집방식: ADD
Socket 오픈을 표현하는 스텝입니다.

METHOD 스탭

수집방식: START-END
메소드 응답시간을 추적합니다.

ACTIVE STATCK 스탭

수집방식: ADD
액티브 스탭에 대한 정보를 포함합니다. 별도 쓰레드가 생성하여 프로파일에 추가하는 방식으로 수집합니다

5.1.3. 트랜잭션 스탭 수집 방식

자바에이전트는 선형 수집 방식과 환형 수집방식을 제공합니다.

선형 수집

개별 트랜잭션 프로파일은 무한정 스텝을 수집할 수 없습니다. 트랜잭션 별로 길이가 제한된 버퍼에 프로파일 스텝을 저장합니다. 각 트랜잭션은 최대로 수집할 수있는 스텝의 수가 옵션으로 지정되어 있습니다.

profile_step_max_count

default: 1024
최대로 수집가능한 스텝수

profile_step_normal_count

default: 800
일반적으로 아무런 제약없이 수집되는 스텝수

profile_step_heavy_count

default : 1000
normal count를 초과한 경우에 스텝은 응답시간이 느린 스텝과 액티브 스택 스텝만 수집합니다.

profile_step_heavy_time

default:100
heavy count이내에서의 수집되는 스텝의 기준 시간은 profile_step_heavy_time입니다.

step buffer
Figure 15. Profile Step Buffer

수집되는 프로파일의 스텝 수가 heavy count를 초과하는 경우에는 액티브 스택만이 수집됩니. 단 이경우에도 최대 스텝 수는 profile_step_max_count를 넘을 수 없습니다.

환형 수집

선형 수집은 프로파일에서 앞부분을 수집하고 버퍼사이즈를 넘으면 나중 내용을 버리지만 반대로 환형 수집은 앞부분의 스텝을 버리는 방식입니다.

circular_profile_enabled=true
circular profile
Figure 16. Profile Step Circular Buffer

버퍼 사이즈는 profile_step_max_count에 설정합니다.

profile_step_max_count=1024

5.2. Active Stack

진행중인 트랜잭션을 액티브 트랜잭션이라고 합니다. 액티브 트랜잭션에서 정기적으로 덤프한 스택을 액티브 스택이라 합니다.

와탭 에이전트는 매 10초(옵션 가능)마다 액티브 트랜잭션에 대해서 액티브스택을 덤프하고 이것을 서버에 전송합니다. (active_stack_second=10)

5.2.1. 컴팩트한 액티브 스택 수집

액티브 스택은 스레드 덤프를 정기적으로 수행하기 때문에 잘못구현되면 에이전트에 오버헤드가 커질 수있습니다. 따라서 와탭은 에이전트 부하를 최소화하면서 액티브 스택을 수집하기 위해 다양한 옵션들을 가지고 있습니다.

서버 > 더보기 > 쓰레드 목록/덤프 메뉴에서 스레드 목록중에 "WhaTap-ActiveStackDump"쓰레드의 CPU Time을 확인하면 오버헤드를 판단할 수있습니다.
액티브스택의 예
java.lang.StringBuffer.append(StringBuffer.java:309)
java.util.regex.Matcher.appendReplacement(Matcher.java:839)
java.util.regex.Matcher.replaceAll(Matcher.java:906)
java.lang.String.replaceAll(String.java:2162)
core.log.triggers.TriggerRegister.changeNotify(TriggerRegister.java:114)
core.log.aop.handler.DaoInfo.log(DaoInfo.java:141)
core.log.aop.handler.DaoInfo.doAround(DaoInfo.java:102)
core.log.aop.reflection.profiler.AroundProfiler.invoke(AroundProfiler.java:19)
com.sun.proxy.$Proxy39.getUpdateCount(Unknown Source)
org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getNextResultSet(DefaultResultSetHandler.java:256)
org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:193)
org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:64)

* * *

sun.reflect.GeneratedMethodAccessor140.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
최적화된 데이터 수집
  • 트랜잭션을 수행중인 쓰레드에 대해서만 스택을 덤프합니다.

  • 액티브 스택 덤프 시간 간격을 조정 할 수 있습니다. (active_stack_second=10)

  • 액태브 스택의 최대 라인에 제한되어 있습니다,top라인에서 부터 기본 50라인을 수집합니다. (trace_active_callstack_depth=50)

  • 액티브 스택의 각 라인은 해쉬처리되어 수집됩니다.(text는 한번만)

  • 한 타임에 수집되는 최대 액티브스택 갯수도 제한 되어있습니다.(active_stack_count=100)

5.2.2. Background Thread에 대한 액티브 스택

@since v1.6.2
기본적으로 액티브 스택은 트랜잭션이 수행되고 있는 쓰레드의 스택을 말합니다. 하지만 일부 백그라운드 쓰레드에 대해서도 스택을 분석할 필요가 있을 수있습니다. 이때 옵션을 통해서 백그라운드 쓰레드에 대한 액티브 스택을 확보할 수있습니다.

async_stack_enabled=false

async_stack_enabled를 true로 설정하면 활성화됩니다.

active_stack_second=10

스택 덤프 간격은 포그라운드 액티브 스택 설정에 따라갑니다.

async_thread_match=http*,abc*

대상 쓰레드 이름을 지정할때는 '*' 사용하여 문자열 패턴을 지정합니다.

쓰레드 이름으로 스택 덤프 대상을 식별합니다. ","를 사용하여 match를 여러개를 지정할 수 있습니다.
async_thread_parking_class=sun.misc.Unsafe
async_thread_parking_method=park

스택의 Top메소드가 async_thread_parking에 등록된 클래스/메소드일때 쓰레드가 파킹상태에 있다고 판단하고 덤프를 생성하지 않습니다.

5.3. 통계(리스트 데이터)

와탭 에이전트는 트랜잭션정보, SQL과 같은 주요 프로파일 정보에 대해 통계정보를 수집 합니다. 매 5분마다 목록을 만들고 서버로 전송합니다.

5.3.1. 트랜잭션 통계

트랜잭션 통계를 수집합니다. 매 5분마다 최대 5000개의 URL별 수행 통계를 수집하여 서버에 전송합니다. 만약 서로다른 URL의 수가 5분동안 5000개가 넘으면 무시됩니다.

칼럼 설명 타입

hash

URL 해쉬

u4

count

건수

u4

error

에러건수

u4

time_sum

응답시간의 합

u8

time_max

최대 응답시간

u4

sql_count

SQL 수행 건수

u4

sql_time

SQL수행시간의 합

u8

sql_fetch

SQL 패치 건수

u4

sql_fetch_time

SQL 패치 시간의 합

u8

httpc_count

HTTP Call건수

u4

httpc_time

HTTP Call 시간의 합

u8

malloc_sum

메모리 사용량 SUM

u8

cpu_sum

CPU사용량 SUM

u8

malloc_sum은 trace_malloc_enabled=true로 변경해야 수집됩니다.(default: false)

5.3.2. SQL 수행 통계

5분동안의 SQL 수행 통계를 수집합니다. 5분동안 서로다른 SQL문장이 최대 5000까지만 허용이 됩니다. 만약 하나의 Java 프로세스에서 한계를 넘는 SQL이발생하면 통계데이터에서는 버려집니다.

칼럼 설명 타입

dbc

DB연결 정보의 Hash

u4

sql

SQL문 Hash

u4

count_total

수행 건수

u4

count_error

에러건수

u4

time_sum

응답시간의 합

u8

time_max

최대 응답시간

u4

fetch_count

패치 건수

u4

fetch_time

패치 시간의 합

u8

service

SQL을 수행한 service중에 하나

u4

service(URL) hash는 5분동안 해당 SQL을 호출한 URL중 하나(마지막 호출 URL)를 분석 활용을 위해 수집합니다.

5.3.3. HTTPCall 수행 통계

5분동안의 Http Call 수행 통계를 수집합니다. 5분동안 서로다른 Http Call문장이 최대 5000까지만 허용이 됩니다. 만약 하나의 node.js 프로세스에서 한계를 넘는 외부 Http Call이 발생하면 통계데이터에서는 버려집니다.

칼럼 설명 타입

url

타겟 URL hash

u4

host

Host or ip

u4

port

Tcp Port

u4

count_total

수행 건수

u4

count_error

에러건수

u4

time_sum

응답시간의 합

u8

time_max

최대 응답시간

u4

service

Http Call을 수행한 service중에 하나

u4

5.3.4. 에러 통계

5분동안 발생한 서비스 에러에 대한 통계입니다. 서로다른 에러+트랜잭션이름을 키로 발생 건수를 수집합니다. 5분당 최대 1000가지 서로다른 에러를 통계화합니다.

칼럼 설명 타입

classHash

에러클래스

u4

service

트랜잭션 HASH

u4

snapSeq

스택 정보

u8

msg

메세지 hash

u4

count

발생 건수

u4

5.3.5. IP별 호출 건수

IP별로 호출한 트랜잭션 건수을 통계적으로 수집합니다. 5분당 수집가능한 서로다른 IP수는 인스턴스당 최대 70000개 입니다.

칼럼 설명 타입

ip

ip주소

u4

count

건수

u4

5.3.6. UserAgent별 호출 건수

User Agnet 문자열의 Hash별로 호출 건수를 수집합니다. 5분당 수집가능한 서로다른 UserAgent Hash는 인스턴스당 최대 500개 입니다.

칼럼 설명 타입

hash

hash

u4

count

건수

u4

5.3.7. 트랜잭션 Caller 통계

멀티 서버가 rest 호출로 연결된 경우 Caller와 Callee간의 연관 통계를 수집할수있다. 이 데이터를 수집하기 위해서는 다음의 옵션을 먼저 설정해야 한다.

whatap.conf
mtrace_rate=100
mtrace_spec=v1
stat_mtrace_enabled=true
msa
Figure 17. MSA 시스템

위와 같은 아키텍처에서 caller&callee통계는 api1와 api2에서만 조회할 수있습니다. 사용자 브라우저에서 호출되는 시스템에서는 Caller통계를 조회할 수 없습니다.

하지만 Caller쪽 서버에서 데이터를 전송해야하기 때문에 모든 서버에 적절한설정이 들어가야 합니다.

whatap.conf of [front]
mtrace_rate=100
mtrace_spec=v1
stat_mtrace_enabled=true
whatap.conf of [api1] & [api2]
mtrace_spec=v1
stat_mtrace_enabled=true

수집되는 통계 데이터는 다음과 같습니다. Callee쪽에서 조회되어야합니다.

칼럼 설명 타입

caller_pcode

Caller의 프로젝트(와탭) 코드

u8

caller_spec

Caller의 버전 문자열 hash

u4

caller_url

Caller의 URL hash

u4

spec

Callee의 버전 문자열 hash

u4

url

Callee URL hash

u4

count

수행 건수

u4

error

에러건수

u4

time

응답시간의 합

u8

5.3.8. 트랜잭션 도메인 통계

와탭에이전트는 도메인별 트랜잭션 통계를 수집할 수 있습니다. 하나의 서버에 비즈니스적인 이유등으로 여러개의 도메인을 분리하여 서비스 하는 시스템에서는 도메인 별 분석이 필요할 수있습니다.

whatap.conf
stat_domain_enabled=true

수집되는 데이터는 도메인별 URL의 처리 현황을 파악할 수있습니다

칼럼 설명 타입

domain

서비스 도메인 hash

u4

url

트랜잭션 URL hash

u4

count

수행 건수

u4

error

에러건수

u4

time

응답시간의 합

u8

5.3.9. 트랜잭션 REFERER 통계

와탭에이전트는 Referer별 트랜잭션 통계를 수집할 수 있습니다.

whatap.conf
stat_referer_enabled=true

수집되는 데이터는 Referer 정보를 통계로 확인 할 수 있습니다.

칼럼 설명 타입

referer

Referer hash

u4

url

트랜잭션 URL hash

u4

count

수행 건수

u4

error

에러건수

u4

time

응답시간의 합

u8

5.4. 성능 카운터

와탭 에이전트는 트랜잭션 프로파일 정보, 통계 정보 외 애플리케이션 성능과 관련된 다양한 정보를 수집하며 이는 크게 3가지로 분류할 수있습니다.

Counters
  • User : 실시간 사용자 혹은 방문사용자

  • Service : 트랜잭션,SQL,외부호출 건수및 응답, 에러율등

  • Resource : 시스템,프로세스 자원 사용량

5.4.1. User Counter

사용자는 모니터링 대상 시스템을 사용하는 클라이언트를 말한다. 클라이언트에는 다른시스템 또한 포함될 수있지만 일반적으로는 브라우저를 기준으로 사용자 수를 계산 합니다.

웹시스템 성능에서 사용자는 부하를 발생시키는 시작이기 때문에 중요합니다. 사용자 추적을 위해서는 사용자는 어떤 기준으로 구분할 것이며 어떻게 카운팅 할 것인가에 대한 고려가 필요합니다.

사용자 구분

와탭 에이전트 사용자를 구분하기 위해 다양한 옵션을 제공합니다.

RemoteIP

기본값은 remote ip를 사용하여 사용자를 구분하는 것입니다. 하지만 remote ip 는 실제 사용자를 구분하는데 한계가 있습니다

Cookie(WHATAP)

쿠키를 사용하여 사용자를 구분할 수있습니다. 모든접속 클라이언트를 대상으로 "WHATAP"이라는 쿠키에 UUID를 저장 합니다.

whatap.conf
trace_user_using_ip=false
Header Key

http header에 전달되는 값으로 사용자를 구분할 수있습니다. .whatap.conf

user_header_ticket=USER
사용자 카운팅

사용자를 카운팅하는 방법에 따라서 다른 목적으로 사용될 수있다. 동시 사용자는 현재 시스템을 사용하는 사용자의 수를 알기 위해서 측정하고 일일 액티브 사용자는 하룻동안 해당 서비스에 관심을 갖는 사용자가 몇명인지에 대한 비즈니스적인 관리를 위해 측정합니다.

실시간 사용자

최근 5분 동안 사용자 수를 카운팅합니다. 매5초마다 shifting하면 사용자를 카운팅합니다. 각 서버에서 카운팅된 숫자는 HyperLogLog알고리즘을 통해서 머지됩니다.

일일 방문(액티브) 사용자(DAU)

하룻동안 시스템에 접속한 사용자를 카운팅합니다. 24시간 동안 접속한 사용자를 hyperloglog를 통해서 계산합니다.

와탭에서는 장기간 사용자를 카운팅 하기 위해 사용자데이터에 대한 byte block을 서버로 수집합니다. 이 데이터를 hyperloglog로 머지하면 이론적으로 한달 이상의 액티브 사용자를 계산 할 수 있습니다.

5.4.2. Service Counter

서비스 카운터에는 트랜잭션과 트랜잭션이 사용하는 SQL혹은 외부호출등에 대한 건수 응답시간 에러건수 등에 대한 성능지표가 포함 됩니다.

Transaction Counter

트랜잭션을 수행하면 측정하는 카운터입니다.

  • 건수

  • 응답시간

  • 에러건수

Active Transaction Counter

진행중인 트랜잭션의 수를 카운팅합니다.

  • 건수

  • Active Status
    진행 상태는 METHOD,SQL,HTTPC,DBC,SOCKET 5가지 상태로 고정되어있습니다.

    1. METHOD - 일반 함수를 호출하는 상태

    2. SQL - db sql을 수행중인 상태

    3. HTTPC - 외부 Http Api(서비스)를 호출중인 상태

    4. DBC - DB연결을 요청한 상태, 일반적으로 Pool에서 가져옴

    5. SOCKET - TCP세션을 Connecting 중인 상태

SQL

SQL 수행 현황을 카운팅합니다.

  • 건수

  • 응답시간

  • 에러 건수

  • 패치 건수

HTTP Call

외부 Http 호출에 대한 현황을 카운팅 합니다.

  • 건수

  • 응답시간

  • 에러 건수

5.4.3. Resource Counter

서버자원 혹은 node 프로세스 내부의 자원 사용량을 카운팅합니다.

CPU(sys,usr,wait,steal,irq, cores)

CPU사용량 % 입니다. 각 종류별로 수집됩니다. 가상환경에서만 Steal이 의미가 있습니다. Cput Core 갯수를 같이 수집하고 있습니다.

Process CPU

자바 프로세스가 사용하는 CPU %입니다.

Memory

시스템 메모리 사용율(%) 입니다.

Swap

Swap메모리 사용율(%) 입니다.

Disk

Disk는 Java Process의 Current 디렉토리의 사용율(%) 입니다.

Heap(Total, Used, Perm)

Java Heap메모리의 Total, Used, Perm량 입니다. 데이터 단위는 KBytes 입니다.

GC (Count,Time)

5초 동안 발생한 GC 건수와 시간의 합계입니다.

ObjectPendingFinalizationCount

GC 호출되는 도중에 finalize()수행하기 위해 대기중인 객체숫자로써 이값이 커지면 GC time이 지연될 수 있습니다.

Thread(start Count,Count, Daemon, Peak Count)

JVM이 실행된 이후부터 Start된 쓰레드 수, 현재 돌고 있는 스레드수, 데몬, 최대 쓰레드 수를 수집합니다. 쓰레드 풀이 필요한지에 대한 판단등을 할 수있습니다.

DB Connection Count(active,idle)

Connection Pool의 idle와 active 카운트를 수집합니다.

Tomcat Thread Pool(active, queueSize)

톰켓의 Executor쓰레드 풀이 설정되었을때 성능정보를 수집합니다.

   <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="50" minSpareThreads="2" maxQueueSize="78"/>
DB Connection Pool 카운터에 대한 이해

DB Connection Pool은 DataSource라고 합니다. WAS가 제공하는 경우가 일반적이지만 일부에서는 오픈소스 Pool을 사용하기도합니다 또한 사용량 정보가 JMX로 노출되기도 하지만 그렇지 않은 경우도 많아서 와탭은 2가지 방식을 제공하고 있습니다.

하나의 BCI에 의한 직접 조회방식과 JMX를 이용한 방식입니다. 기본은 BCI방식을 사용하고 보조 적으로 JMX를 사용할 수있도록 제공하고 있습니다.

아래는 개별 옵션별 디폴트 값과 연관되어 ByteCode Injection되는 클래스입니다.

hikari_pool_enabled=false
com.zaxxer.hikari.pool.HikariPool
dbcp_pool_enabled=true
org.apache.commons.dbcp.BasicDataSource
org.apache.commons.dbcp2.BasicDataSource
org.apache.tomcat.dbcp.dbcp.BasicDataSource
org.apache.tomcat.dbcp.dbcp2.BasicDataSource
tomcat_pool_enabled=true
org.apache.tomcat.jdbc.pool.ConnectionPool
weblogic_pool_enabled=true
weblogic.jdbc.common.internal.ConnectionPool
jeus_pool_enabled=true
jeus.jdbc.connectionpool.ConnectionPoolImpl
jboss_pool_enabled=true
org.jboss.jca.core.connectionmanager.pool.PoolStatisticsImpl
옵션을 변경한다면 BCI관련 옵션이기 때문에 재기동해야합니다. 클래스가 instrument된 후에도 추적 테이블에 등록되는 과정이 필요합니다. 따라서 실행중에 redefine을 해도 동작하지 않습니다.
관련 옵션 자동 결정
dbcp_pool_enabled==true 이면 tomcat_ds_enabled=false
weblogic_pool_enabled== true 이면 weblogic_ds_enabled=false

DataSource 의 현황은 JMX로 가져오려면 먼저 "옵션 자동 결정" 내용을 확인하고 관련된 pool쪽 옵션을 false로 선언하고 DataSource관련 옵션을 true로 변경해야 합니다. .DataSource관련 옵션

tomcat_ds_enabled=false
weblogic_ds_enabled=false

기본값은 false입니다.

ThreadPool 카운터

ThreadPool 카운터는 JMX Mbean 정보를 통해 수집됩니다.
Tomcat 과 같이 사용 사례가 많은 경우라면 문제 없지만 특정 환경 에서는 이 지표가 수집되지 않을 수 있으며 수집을 위해서는 추가 설정을 필요로 합니다.

관련 설정은 다음과 같으며 진행이 어려운 경우 support@whatap.io 로 문의 주실 수 있습니다.

whatap.conf
jmx_threadpool_objectname=Catalina:type=ThreadPool,name="http-bio-8080" (1)
jmx_threadpool_atter_activecount=connectionCount (2)
jmx_threadpool_atter_queuesize=maxThreads (3)
1 jmx_threadpool_objectname : JMX ThreadPool MBean 이름을 설정 합니다.
2 jmx_threadpool_atter_activecount : activecount 수치를 나타내는 attribute 를 설정 합니다.
3 jmx_threadpool_atter_queuesize : maxThreads 수치를 나타내는 attribute 를 설정 합니다.

JMX ThreadPool ObjectName 및 AttributeName 과 같은 Mbean 명은 JMX 모니터링 도구를 통해 확인하거나 각 WAS 별 Mbean 문서를 참고 합니다.

Jconsole 사용시
threadpool jmx01
Figure 18. ObjectName : Catalina:type=ThreadPool,name="http-bio-8080"
threadpool jmx02
Figure 19. ActiveName : connectionCount, QueueName : maxThreads
관련 문서 참고시

사용 중인 WAS, 프레임워크 관련 문서를 참고해 Mbean 정보를 확인 할 수도 있습니다.

결과 확인

설정이 정상적으로 되었다면 카운터에서 데이터를 조회 할 수 있습니다.

threadpool counter
Figure 20. 정상 상태

6. 에이전트 제어와 상태 조회

각 Java 프로세스 별로 에이전트 동작을 제어하거나 상태를 조회할 수 있습니다.

6.1. 부트 환경

에이전트가 시작하면 주요환경 정보를 모아 서버로 전송합니다. 이정보는 기동시의 에이전트 환경 상태를 확인할때 사용될 수있습니다. Yard 서버에 저장해 두기 때문에 에이전트가 종료되어도 조회할 수있습니다.

와탭 버전, OS정보, java버전, uptime등등의 정보들을 조회할 수 있습니다.

6.2. 환경 변수

에이전트에서는 현재의 환경 변수를 조회할 수있습니다. 화면에서 요청을 받았을때 조회됩니다. 따라서 프로세스가 정지된 상태에서는 조회할 수 없습니다.

6.3. 컴포넌트 버전

현재 로딩되어 사용되고 있는 jar 파일과 그 버전을 조회할 수있습니다.

6.4. 쓰레드 목록/덤프

JVM내에서 실행되고 있는 쓰레드 목록과 개별쓰레드의 상세 스택을 확인 할 수있습니다. 또한 전체 쓰레드를 덤프할 수도 있습니다.

6.5. 힙 히스토그램

JVM메모리에 올라가 있는 객체 목록들을 조회합니다.

JDK5이하 버전에서는 동작하지 않습니다.

6.6. 로드된 클래스

메모리에 로딩된 클래스 목록을 조회합니다. 그리고 특정 클래스의 signuture를 확인 할수있고 redefine을 요청할 수있습니다.

Class Redefine은 BCI를 위해 사용되는 기술입니다. 이미 로딩된 클래스를 재정의 하여 모니터링 코드를 삽입합니다.

6.7. 오픈 소켓

와탭은 Socket이 열릴때마다 타겟 주소를 목록을 메모리에 기록해둡니다. 그정보를 조회합니다.

6.8. 메소드 성능 상태

메소드 호출 빈도를 추적하고 싶을때 사용할 수있습니다. 아래 옵션에 지정된 클래스메소드들의 호출을 추적합니다.

hook_method_stat_supers
hook_method_stat_interfaces
hook_method_stat_patterns

6.9. DB 상태

Connection Pool의 상태를 조회합니다. "DB Connection Pool 카운터"쳅터에서 설명한 Connection Pool(DataSource)의 상태를 확인합니다.

6.10. 설정

에이전트 실행옵션을 설정할 수있습니다. whatap.conf에 값을 운영중에 변경할 수 있습니다. Configure 쳅터에서 소개하고 있는 대부분의 옵션은 whatap.conf에 적용할 수있습니다

일반적으로 설정은 런타임에 바로 reload됩니다. 다만 해당 설정의 메커니즘상 JVM이 기동될때 적용되는 옵션들은 재기동해야 할수 있습니다.

6.11. 쓰로틀링

부하량을 제어할 수 있습니다 쓰로틀링은 디폴트 상태에서는 OFF(false)되어있습니다. whatap.conf에 관련 옵션을 설정함으로 쓰로틀링 기능을 사용할 수있습니다.

throttle_enabled=false

쓰로틀링에는 크게 봉쇄제한 두가지 개념으로 되어있습니다.

6.11.1. 부정한 요청 [봉쇄]

등록된 URL혹은 IP에 대해서 모든 리퀘스트를 봉쇄합니다.

throttle_blocking_url=
throttle_blocking_ip=

HTTP요청이 봉쇄되면 아래 옵션에 따라 사용자 메세지가 전달됩니다. 만약 forward url이 설정되어있으면 그페이지로 사용자 응답이나가고 아니면 message가 브라우저에 리턴됩니다.

throttle_blocked_forward=
throttle_blocked_message=request blocked!!

6.11.2. 과도한 요청 [제한]

1) 부하량을 제한 하는 것입니다. 동시에 처리중인 트랜잭션이 기준입니다.

throttle_limit=10000

2) 제한 방법은 둘중 하나를 선택해야 합니다.

제한 방법-1

등록된 URL에 대해서만 제한한다. 나며지페이지는 전체 진행중인 트랜잭션 수가 limit를 넘었을지라도 제한하지 않습니다.

throttle_target_urls=
제한 방법-2

모두 제한하고 등록된 페이지는 통과시킨다.

throttle_passing_url=
throttle_passing_url_prefix=

3) HTTP요청이 거절되면 아래 옵션에 따라 사용자 메세지가 전달됩니다. 만약 forward url이 설정되어있으면 그페이지로 사용자 응답이나가고 아니면 message가 브라우저에 리턴됩니다.

throttle_rejected_forward=
throttle_rejected_message=too many request!!

4) Reject가 발생할때 이벤트를 발령합니다.

reject_event_enabled=false

6.12. 시스템 GC/힙덤프

강제 GC를 호출할 수있습니다.
힙덤프를 수행할 수있습니다.

힙 덤프 확보를 위해서는 1.5.2버전 이상의 에이전트를 사용하고,JDK6이상이고 heapdump_enabled옵션을 true로 설정해야 합니다.

6.13. 에이전트 로그

현재 에이전트 HOME에서 ./logs/에 로그를 기록 합니다.

## OPEN LOG FILE agent 20181106 00:00:00.610 ##
WhaTap Version 1.5.4 20180928 pid=47448

20181106 00:55:33 <47448>[A113] read java.net.SocketException

## OPEN LOG FILE agent 20181106 00:00:03.126 ##
WhaTap Version 1.5.4 20180928 pid=47333

20181106 00:55:33 <47333>[A113] read java.io.EOFException

로그 포멧은

[시간] [PID] [로그 내용]

PID가 바뀐다면 에이전트가 재기동 되었음을 의미합니다. 혹은 동일 로그에 두개의 프로세스(JVM)가 로그를 남기고 있습니다.

6.14. 에이전트 덤프

현재 진행중인 트랜잭션과 쓰레드의 스택을 덤프합니다. JDK의 쓰레드 덤프는 쓰레드 자체만을 덤프하지만 에이전트 덤프는 쓰레드와 진행중인 트랜잭션을 맵핑하여 덤프함으로 문제에 대한 다른 인사이트를 얻을 수있습니다.

12 :::thread::: 1404674 Thread-1404607 TIMED_WAITING ,blked #0,waited #17: 4cpu :::tx::: 5274572099194896286 /account/write/employee/daejun 1777ms 2cpu: sql #2 588ms: httpc #2 588ms

        java.lang.Thread.sleep(Native Method)
        whatap.util.ThreadUtil.sleep(ThreadUtil.java:37)
        jdbc.Control.exec(Control.java:23)
        jdbc.FakePreparedStatement.executeQuery(FakePreparedStatement.java:67)
        com.virtual.dao.SelectDAO.execute2(SelectDAO.java:29)
        com.virtual.web.Simula.execute(Simula.java:151)
        com.virtual.web.Simula$1.process(Simula.java:80)
        com.virtual.web.VExec.doFilter(VExec.java:14)
        org.apache.catalina.filters.FilterBase.doFilter(FilterBase.java:26)
        com.virtual.web.Simula.run(Simula.java:104)

6.14.1. 쓰레드 & 트랜잭션 덤프

지정한 임계상황이 되면 쓰레드와 진행중이 트랜잭션 URL을 덤프합니다.

  • 액티브트랜잭션 수가 급증하거나 CPU사용량이 급증했을때 기록을 남기기 위한 기능입니다.

  • thread_dump_actx(300)이상의 액티브 트랜잭션 갯수가 쌓이거나 thread_dump_cpu(-1:disabled)이상의 CPU사용이 발생할때 JVM내의 모든 쓰레드와 그 스택을 덤프합니다. 각 쓰레드가 수행하는 URL정보도 같이 덤프합니다. (값이 -1일때는 동작하지 않습니다.)

  • 한번 덤프가 발생하면 thread_dimp_interval 이상 시간이 경과되어야 다시 동작 합니다.

dump 1

6.14.2. 쓰레드 CPU 덤프

동작중인 쓰레드중에서 CPU를 많이 사용하고 있는 쓰레드를 찾고자 할때 사용합니다. 프로세스의 CPU가 높을때 CPU를 많이 사용하는 로직을 찾아야 하는데 배치잡이나 쓰레드의 수행시간이 짧으면 찾기 어려운 문제가 있습니다. 이때 쓰레드 CPU덤프를 활용할 수 있습니다.

dump 2

7. 설정

7.1. 설정 관리

7.1.1. 설정 파일

Whatap Java Agent 의 설정을 읽어드리는 기본값은 ${WHATAP_HOME}/whatap.conf 입니다.
경우에 따라 한 서버에서 여러 애플리케이션이 구동 되고, 이들에 대한 설정을 별도로 관리하고자 하는 경우 기동 스크립트에 JVM 옵션을 추가하여 지정 할 수 있습니다.

설정파일은 반드시 ${WHATAP_HOME}에 위치해야 합니다.
지정한 설정 파일을 사용
# A 서비스
-Dwhatap.config=whatap_Aservice.conf
# B 서비스
-Dwhatap.config=whatap_Bservice.conf

7.1.2. 설정 추가/변경

설정의 추가 / 변경은 서버 메뉴의 설정 탭에서 사용 가능 합니다.

서버 메뉴
Figure 21. 서버 메뉴

또는, 설정파일을 대상 서버에서 직접 편집해 사용 할 수 있습니다.

편집
$ vi /whatap/whatap.conf

상황에 따라 기동 스크립트에 JVM -D 옵션을 통해 적용 할 수도 있습니다.

JVM 옵션
export WHATAP_OPTS="$WHATAP_OPTS -Dwhatap.name={type}-{ip4}-{port}"
export WHATAP_OPTS="$WHATAP_OPTS -Dwhatap.okind=Aservice"
export JAVA_OPTS="$JAVA_OPTS $WHATAP_OPTS"

7.2. 에이전트 네이밍

whatap.name

Default : {type}-{ip2}-{ip3}-{port}
Type : String
에이전트 이름을 패턴으로 정의 합니다.

whatap.oname

Default : NONE
Type : String
에이전트 이름을 문자열로 정의 합니다.

whatap.okind

Default : NONE
Type : String
에이전트가 속한 그룹 단위를 정의 합니다.

whatap.onode

Default : NONE
Type : String
에이전트가 속한 노드 단위를 정의 합니다.

auto_oname_enabled

Default : false
Type : Boolean
서버에 등록될 에이전트 이름(oname)을 서버로부터 자동 부여 받는 기능을 활성화 합니다. 적용 시, -Dwhatap.name, -Dwhatap.oname 옵션은 무시됩니다. 수집 서버와의 통신을 통해 oname 을 부여 받은 이후, 에이전트의 일반적인 동작을 개시합니다.

auto_oname_prefix

Default : agent
Type : String
에이전트 이름을 서버로부터 자동 부여할 때 에이전트 이름의 prefix, 보통 업무 명을 사용합니다. prefix 일련번호 1~) 부여됩니다.

auto_oname_reset

Default : 0
Type : Int
서버로 부터 새로운 에이전트 이름을 부여받기 위해서 수정합니다. 에이전트 이름을 자동 부여하면 what.oname 이라는 시스템 환경 변수에 셋트됩니다. 한번 셋트되면 자바 인스턴스가 재기동 될 때까지 유지 되는데 리셋을 원할 때 auto_oname_reset 값을 수정합니다.(현재 설정 값과 다른 값으로 변경하면 적용됩니다.)

7.3. 에이전트 기능제어

shutdown

Default : false
Type : Boolean
true 인 경우 에이전트의 모든 동작을 중지하고 서버와의 연결을 종료합니다.

enabled

Default : true
Type : Boolean
전체 기능을 활성화 합니다. false인 경우에도 서버와 최소한의 통신을 유지하기 위한 정보는 전송됩니다.

transaction_enabled

Default : true
Type : Boolean (enabled=false 인 경우 false)
트랜잭션 추적 기능을 활성화 합니다. Hitmap에 기록되는 트랜잭션 정보가 해당합니다.

counter_enabled

Default : true
Type : Boolean (enabled=false 인 경우 false)
성능 카운터 추적 기능을 활성화합니다. 액티브트랜잭션 수, 사용자 수, JVM 자원 사용량, Process CPU 사용량 및 DB Pool 사용량 정보등이 해당됩니다.

stat_enabled

Default : true
Type : Boolean (enabled=false 인 경우 false)
통계정보 추적 기능을 활성화합니다. 5 분단위로 수집되는 트랜잭션, SQL, HTTPCALL, UserAgent, Client IP 등의 통계 데이터등이 해당됩니다.

sigar_enabled

Default : true
Type : Boolean (enabled=false 인 경우 false)
sigar library 를 통한 OS 정보 수집을 활성화합니다. 5 초 단위로 sigar library를 통해 수집되는 CPU, Memory, Disk등의 OS 자원 데이터가 해당됩니다.

active_stack_enabled

Default : true
Type : Boolean (enabled=false 또는 counter_enabled=false 인 경우 false)
액티브 스택 추적을 활성화합니다. 스텍 메뉴의 탑스택, 유니크스택 그리고 액티브스택이 해당됩니다.

license

Default : NONE
Type : String
에이전트 설치시 서버로부터 부여받은 라이센스를 지정합니다. 라이센스에는 에이전트가 속한 프로젝트와 보안 통신을 위한 암호키를 포함하고 있습니다.

cypher_level

Default : 128
Type : aes_bit [128|256]
AES 보안 알고리즘에 대한 암호 레벨을 지정합니다.

encrypt_level

Default : 2
Type : encrypt_level [1|2|3]
와탭 에이전트는 서버로 데이터 전송시 데이터 속성에 따라 선택적으로 암호화를 하므로 높은 보안을 유지하면서도 성능상 이점을 가지고 있습니다. 이와 별개로 데이터 유형에 상관없이 일괄적인 암호화 정책을 적용하려는 경우 당 옵션을 사용할 수 있습니다.

1 - 암호화 전송 기능 사용안함
2 - SQL파라미터, Plain Text와 같은 민감한 속성에 대하여 암호화 전송
3 - 모든 항목에 대하여 암호화 전송
stat_ip_enabled

Default : true
Type : Boolean
"통계 | 클라이언트IP" 항목의 IP 통계 사용 여부를 활성화합니다.

realtime_user_enabled

Default : true
Type : Boolean
"대시보드" 사용자 항목에서 사용되는 실시간 사용자 지표 수집 여부를 선택한다.

hook_direct_patch_classes

Default : NONE
Type : ClassFile_FullPath
직접적으로 특정 클래스를 로딩타임에 바꿔치기 하고자 할 때 사용합니다. 클래스를 컴파일한 후에 별도 파일로 만들고 그 파일의 풀패스를 지정합니다.

active_stack_second

Default : 10
Type : Seconds
액티브 스택을 추적하는 간격을 지정합니다.

값을 바꾸는 것을 권장하지 않습니다.
boot_redefine_size

Default : 100
Type : Int
Attach 방식이나 Watcher 방식으로 설치했을 때 이미 로딩된 클래스 중에 추적을 위해 BCI 를 새로 수행하게 됩니다. 이때 동시 redefine 하는 클래스 수를 정의합니다.

trace_component_enabled

Default : true
Type : Boolean
서버 | 더보기 | 컴포넌트 버전 기능을 활성화 합니다.

realtime_user_thinktime_max

Default : 300000
Type : MiliSeconds
실시간 사용자 측정시 동일 사용자로 인정되는 최대 호출간격을 지정합니다.

time_sync_interval_ms

Default : 300000
Type : MiliSeconds
에이전트와 서버간 시간 동기화 주기를 지정합니다. 동기화 하지 않을 경우 0으로 지정합니다.

detect_deadlock_enabled

Default : false
Type : Boolean
Java 쓰레드의 DeadLock 여부를 체크하여 감지시 이벤트를 발생시킵니다. 발생 주기는 5초 단위이며 같은 DeadLock 건에 대한 이벤트는 한시간에 한번만 발생시킵니다.

text_reset

Default : 0
Type : Int
와탭 에이전트는 한번 보낸 텍스트유형 데이터는 hash 처리되므로 다음날까지 재전송하지 않습니다. 이전 설정값과 다른 값을 설정하는 경우 재전송 합니다.

트랜잭션 URL, SQL String 등이 텍스트유형 데이터에 해당합니다.

7.4. 에이전트 통신

whatap_server_host

Default : 127.0.0.1,127.0.0.1
Type : ip_address
에이전트가 수집한 데이터를 전송할 서버를 지정합니다. 수집서버 이중화로 2개 이상의 IP를 가진 경우 콤마(,)로 분리하여 지정할 수 있습니다. 지정된 IP 에는 수집서버 proxy 데몬이 리스닝 상태로 서비스 되어야 합니다.

whatap_server_port

Default : 6600
Type : tcp_port
수집서버 PORT 를 지정합니다. 포트는 하나만 지정할 수 있으므로 whatap_server_host 에 지정된 수집서버들은 동일 PORT 를 사용해야 합니다.

tcp_so_timeout

Default : 60000
Type : MiliSecond
수집서버와 통신하는 TCP세션의 Socket Timeout 값을 지정합니다.

tcp_connection_timeout

Default : 5000
Type : MiliSecond
수집서버와 통신하는 TCP세션의 Connection Timeout 값을 지정합니다.

net_send_max_bytes

Default : 5242880
Type : Byte
수집서버로 데이터를 전송할 때 한번에 전송되는 최대 크기를 지정합니다.

net_send_queue1_size

Default : 256
Type : Int
프로파일 정보와 액티브스택을 제외한 나머지 데이터 전송에 사용될 Queue의 크기를 지정 합니다. 설정된 크기가 10 이하인 경우 10으로 지정됩니다.

net_send_queue2_size

Default : 512
Type : Int
프로파일 정보와 액티브스택 데이터 전송에 사용될 Queue의 크기를 지정 합니다. 설정된 크기가 10 이하인 경우 10으로 지정됩니다.

7.5. 에이전트 로그 관리

log_root

Default : ${WHATAP_HOME}/logs
Type : String
에이전트 로그 경로를 지정 할 수 있습니다.

log_datasource_lookup_enabled

Default : true
Type : Boolean
InitialContext Lookup 시 DataSource 인 경우 로그를 기록하는 기능을 활성화 합니다.

log_rotation_enabled

Default : true
Type : Boolean
에이전트 로그파일을 일자별로 관리하는 기능을 활성화 합니다.

log_keep_days

Default : 7
Type : Day
로그파일 보관기간을 지정합니다.

7.6. 트랜잭션 프로파일링

profile_step_normal_count

Default: 1000
Type : Int
트랜잭션 프로파일의 최대 스텝 수를 지정합니다.

profile_step_heavy_count

Default: 1020
Type : Int
Heavy한 스텝의 경우 프로파일 기본 스텝 수를 초과하더라도 정해진 값 만큼은 기록 됩니다.

profile_step_heavy_time

Default: 100
Type : MiliSecond
Heavy한 스텝의 기준을 지정 합니다. 지정된 값보다 수행시간이 긴 경우 profile_step_normal_count 를 초과하는 경우라도 profile_step_heavy_count 이내에서 기록됩니다.

profile_basetime

Default: 500
Type : MiliSecond
트랜잭션이 설정된 값 이하의 시간내에 종료된 경우 프로파일 정보를 수집하지 않습니다. 단, 5 분단위로 최초 호출된 URL, 에러가 발생한 트랜잭션에 대한 프로파일 정보는 수집됩니다.

active_stack_count

Default : 100
Type : Int
트랜잭션 내에서 수집하는 AtiveStack 의 최대 수를 지정합니다.

profile_method_resource_enabled

Default : false
Type : Boolean
프로파일에서 method 스텝이 수집될 때 해당 스텝에서 사용한 CPU 와 메모리 사용량을 추적합니다.

profile_position_method

Default : NONE
Type : String
지정한 메소드가 수행되는 시점의 StackTrace를 기록합니다.

profile_position_depth

Default : 50
Type : Int
position 추적을 위해 StackTrace를 기록 할 때 최대 라인 수를 지정합니다.

trace_error_callstack_depth

Default: 50
Type : Int
Error발생시 수집하는 StackTrace의 최대 라인 수를 지정합니다.

trace_active_callstack_depth

Default: 50
Type : Int
액티브스택에서 수집하는 StackTrace의 최대 라인수를 지정합니다

trace_active_transaction_yellow_time

Default: 3000
Type : MiliSecond
액티브 트랜잭션의 아크이퀄라이저에서 노란색으로 표현할 기준을 지정 합니다.

trace_active_transaction_red_time

Default: 8000
Type : MiliSecond
액티브 트랜잭션의 아크이퀄라이저에서 빨간색으로 표현할 기준을 지정 합니다.

hook_method_patterns

Default : NONE
Type : String
응답시간을 측정할 메소드를 지정합니다. 마지막 (.)을 구분자로 클래스 FullName과 메소드로 구분되며 (*)로 WildCard를 사용 할 수 있습니다. 대상이 여러개인 경우 콤마(,)로 구분합니다

  • Ex : hook_method_patterns=a.b.C1.*

hook_method_supers

Default : NONE
Type : String
특정 클래스를 상속받은 메소드의 응답시간을 측정하고자 할 때 Super Class를 지정합니다. 클래스 FullName을 지정하며 대상이 여러개인 경우 콤마(,)로 구분합니다.

  • Ex : hook_method_supers=a.b.C1

hook_method_interfaces

Default : NONE
Type : String
특정 인터페이스를 구현한 메소드의 응답시간을 측정하고자 할 때 Interface를 지정합니다. 인터페이스 FullName을 지정하며 대상이 여러개인 경우 콤마(,)로 구분합니다.

hook_method_ignore_classes

Default : NONE
Type : String
메소드 프로파일을 설정할 때 프로파일에서 제외 하고 싶은 클래스들을 지정합니다.

hook_method_access_public_enabled

Default : true
Type : Boolean
메소드 프로파일을 설정할 때 public 메소드에 대해서만 별도로 대상으로 할지를 결정합니다.

hook_method_access_private_enabled

Default : false
Type : Boolean
메소드 프로파일을 설정할 때 private 메소드에 대해서만 별도로 대상으로 할지를 결정합니다.

hook_method_access_protected_enabled

Default : true
Type : Boolean
메소드 프로파일을 설정할 때 protected 메소드에 대해서만 별도로 대상으로할지를 결정합니다.

hook_method_access_none_enabled

Default : true
Type : Boolean
메소드 프로파일을 설정할 때 no access indicated 메소드에 대해서만 별도로 대상으로 할지를 결정합니다.

stacklog_socket_port

Default : 0
Type : TCP_PortNumber
목적지의 TCP포트를 지정하면 Socket.connect() 시점 StackTrace를 에이전트 로그로 기록합니다. 기본설정으로 확인되지 않는 DB 연결, HTTPC 연결등을 추적할 때 사용할 수 있습니다.

설정된 목적지로 연결시마다 매번 StackTrace를 기록하므로 성능저하를 유발할 수 있습니다. 디버깅 용도로 선별된 에이전트에 한시적으로만 사용해야 합니다. * Ex : stacklog_socket_port=1521 #DB연결 상태 추적
biz_exceptions

Default : NONE
Type : String
비즈니스 Exception을 등록합니다. 여기에 등록되면 에러통계에서 제외됩니다. 프로파일 상세에서는 나타납니다.

ignore_exceptions

Default : NONE
Type : String
무시할 Exception을 등록합니다. 여기에 등록되면 에러 자체가 무시됩니다.

transaction_status_error_enable

Default : true
Type : Boolean
HTTP 401, 403과 같이 정상 응답이 아닌 HTTP상태 코드를 반환하는 경우 에러로 처리 합니다.

7.7. HTTP 트랜잭션 추적

profile_http_header_enabled

Default : false
Type : Boolean
프로파일 내역에 http 헤더 정보를 기록하고자 할 때 사용합니다.

profile_http_header_url_prefix

Default : /
Type : String
프로파일 내역에 http 헤더 정보를 기록할 대상 URL의 prefix를 정의 할 때 사용합니다.

profile_http_parameter_enabled

Default : false
Type : Boolean
프로파일 내역에 http 파라미터 정보를 기록하고자 할 때 사용합니다. 파라미터는 별도 보안키를 입력해야 조회 할 수 있습니다.

보안 키는 WAS서버 ${WHATAP_AGENT_HOME}/paramkey.txt 파일내에 6자리로 지정합니다.
paramkey.txt 파일이 존재하지 않는 경우 랜덤 값으로 자동 생성됩니다.
profile_http_parameter_url_prefix

Default : /
Type : String
프로파일 내역에 http 파라미터 정보를 기록할 대상 URL의 prefix를 정의 할 때 사용합니다.

trace_transaction_name_header_key

Default : NONE
Type : String
트랜잭션의 이름 끝부분에 지정한 http header key에서 추출한 값을 추가합니다.

trace_transaction_name_key

Default : NONE
Type : String
트랜잭션의 이름 끝부분에 지정한 http request parameter 에서 추출한 값을 추가합니다.

trace_normalize_enabled

Default : true
Type : Boolean
트랜잭션 URL 을 파싱하여 정규화하는 기능을 활성화합니다.

false 로 변경시 패스파라미터 파싱이 비활성화됩니다. 이 경우 통계데이터의 의미가 약화됨으로 디버그 용도로만 잠시 사용하는 것이 좋습니다.
trace_auto_normalize_enabled

Default : true
Type : Boolean
트랜잭션 URL 정규화할때 패턴값을 어노테이션에서 추출하여 자동으로 파싱하는 기능을 활성화합니다.

trace_normalize_urls

Default : NONE
Type : String
정규화 할 트랜잭션 URL 패턴을 정의 한다. 호출 URL 패턴을 파싱하여 패스파라미터를 제거합니다.

ex) /a/{v}/b 라고 선언하면 a/123/b ⇒ a/{v}/b 로 치환한다
여러 개를 등록할 때는 콤마(,)를 사용합니다. 치환패턴 정리 후 보완필요
web_static_content_extensions

Default : js, htm, html, gif, png, jpg, css, swf, ico
Type : String
스태틱 컨텐츠임을 판단하는 확장자를 지정합니다. 여기에 설정된 확장자를 가진 트랜잭션들은 프로파일 추적과 카운팅이 제외됩니다.

recursive_max

Default : 1000000
Type : Int
트랜잭션의 재귀호출 여부 검출을 위한 옵션으로, 단일 트랜잭션으로 부터 파생되는 재귀호출 횟수를 카운트하여 이벤트 알림을 발행하기 위한 기준을 지정합니다.

HTTP URL 재귀호출을 대상으로 함
jsp:forward 를 통해 재호출 되는 케이스도 카운트에 포함됨
hook_httpservlet_classes

Default : NONE
Type : String
HTTP 트랜잭션의 END POINT 를 추가로 지정한다. 메소드의 첫번째 2 개의 파라미터는 HttpServletRequest 와 HttpServletResponse 만 지정 가능합니다.

hook_jsp_patterns

Default : org.apache.jasper.servlet.JspServlet.serviceJspFile
Type : String
JSP 파일을 로딩하는 메소드를 지정합니다. 트랜잭션 호출 결과로 반환되는 JSP 정보를 프로파일에 표시합니다. 본 옵션을 통해 추가한 설정에 default 설정이 자동으로 추가됩니다.

trace_ignore_url_set

Default : NONE
Type : String
트랜잭션 추적에서 제외할 URL을 지정한다.

trace_ignore_url_prefix

Default : NONE
Type : String
트랜잭션 추적에서 제외할 URL prefix를 지정한다.

7.8. NON-Http 트랜잭션 추적

trace_auto_transaction_enabled

Default : false
Type : Boolean
프로파일 대상 메소드가 트랜잭션 시작점(Javax.http.httpservlet, hook_service_*) 내에서 수행되는 경우가 아니라면 수집이 되지 않습니다. 이 경우 프로파일 대상 메소드가 트랜잭션 시작점이 되도록 지정합니다.

주로 개발환경에서 백그라운드 트랜잭션의 END POINT 를 찾아낼 때 사용합니다.
trace_auto_transaction_backstack_enabled

Default : true
Type : Boolean
trace_auto_transaction_enabled=true 이 설정된 경우에 트랜잭션 시작시 StackTrace를 기록합니다. 이를 통해 트랜잭션의 시작점을 찾아낼 수 있습니다.

trace_background_socket_enabled

Default : true
Type : Boolean
트랜잭션이 아닌 백그라운드 쓰레드에 의한 소켓이 오픈될 때도 이를 기록합니다.

async_stack_enabled

Default : false
Type : Boolean
백그라운드 쓰레드에 대한 Active Stack 기능 사용 여부를 선택합니다.

async_thread_match

Default : NONE
Type : String
액티브 스택을 덤프할 백그라운드 쓰레드 이름을 지정한다. ","로여러개를 지정할 수있습니다. 이름을 지정할때는 "Thread-" 처럼 ""를 사용해서 비교 패턴을 사용할 수 있습니다.

async_thread_parking_class

Default : sun.misc.Unsafe
Type : String
스택의 Top메소드가 async_thread_parking에 등록된 클래스/메소드일때 쓰레드가 파킹상태에 있다고 판단하고 덤프를 생성하지 않습니다.

hook_service_patterns

Default : NONE
Type : String
NON-Http 트랜잭션 추적을 위한 시작점 패턴을 설정한다.

hook_serivce_ignore_methods

Default : NONE
Type : String
hook_service_patterns 에서 설정된 내역 중 시작점으로 불필요한 메소드를 추가 할 수 있다.

hook_service_supers

Default : NONE
Type : String
NON-Http 트랜잭션 추적을 위한 시작점의 공통 분모가 특정 클래스의 메소드를 상속받은 경우라면 이를 설정한다.

hook_service_interfaces

Default : NONE
Type : String
NON-Http 트랜잭션 추적을 위한 시작점의 공통 분모가 특정 인터페이스를 구현한 경우라면 이를 설정한다.

hook_service_access_public_enabled

Default : true
Type : Boolean
Non Http Demon 프로세스의 트랜잭션을 지정할 때 public 메소드에 대해서만 Access 권한을 기준으로 on/off 를 지정합니다

hook_service_access_private_enabled

Default : true
Type : Boolean
Non Http Demon 프로세스의 트랜잭션을 지정할 때 private 메소드에 대해서만 Access 권한을 기준으로 on/off 를 지정합니다

hook_service_access_protected_enabled

Default : true
Type : Boolean
Non Http Demon 프로세스의 트랜잭션을 지정할 때 protected 메소드에 대해서만 Access 권한을 기준으로 on/off 를 지정합니다

service_name_mode

Default : full
Type : String
트랜잭션 명을 지정하기 위해 full,class,method,string,arg 5가지 옵션을 사용할 수있습니다.

full : Full Class이름 사용
class : Class 이름 서비스 명으로 사용
method : Method이름을 서비스 명으로 사용
string : 문자열중에서 첫번째 파라미터를 서비스 명으로 사용
arg : 파라미터중에서 service_name_index옵션에 지정한 인덱스이 파라미터를 서비스 명으로 사용

7.9. 트랜잭션 연계 추적

mtrace_enabled

Default : false
Type : Boolean
트랜잰션 연계 추적 기능(MTID)을 사용 여부를 설정합니다. MTID 를 추적하면 등록된 모든 애플리케이션간의 호출을 확인 할 수 있습니다.

mtrace_rate

Default : 10
Type : Percentage
최초 트랜잭션이 발생할 때 발급받는 MTID(Multi Transaction ID)의 발급비율을 설정하는 옵션입니다.

mtrace_caller_key

Default : x-wtap-mst
Type : String
MTID 추적에 사용할 Caller Key Name을 정합니다.

mtrace_callee_key

Default : x-wtap-tx
Type : String
MTID 추적에 사용할 Callee Key Name을 정합니다.

mtrace_send_url_length

Default : 80
Type : Int
Http Caller는 Callee에게 자신의 URL을 넘져줍니다. 이때 URL길이를 제한하고 있습니다. 이 길이를 지정합니다.

mtrace_callee_id_send_enabled

Default : false
Type : Boolean
MTID 추적시 HTTPC 호출과 함께 발행된 Callee ID를 프로파일에 표현합니다.

mtrace_callee_id_recv_enabled

Default : false
Type : Boolean
MTID 추적시 수신한 Callee ID를 프로파일에 표현합니다.

mtrace_alltx_enabled

Default : false
Type : Boolean
log4j와 같은 로깅 시스템과 연계하기 위해서 모든 트랜잭션의 mtid를 추적할수있습니다.

mtrace_basetime

Default : 100
Type : Miliseconds
mtrace_alltx_enabled=true하면 너무 많은 로그가 남을 수있습니다. 이때는 프로파일 로깅량을 줄일 필요가 있습니다.

stat_mtrace_enabled

Default : false
Type : Boolean
Caller와 Callee의 상관 관계 통계를 수집합니다.
Caller에 적용하면 Caller의 상세 정보를 보내주고 Callee에 적용되면 url단위 Caller-Callee 호출통계를 수집서버로 전송합니다.

7.10. DB, SQL

dbcp_pool_enabled

Default : true
Type : Boolean
JMX를 사용하지 않고 DBCP의 DB Connection 정보를 추적하기 위해 사용됩니다.

hikari_pool_enabled

Default : false
Type : Boolean
JMX를 사용하지 않고 hikari pool의 DB Connection 정보를 추적하기 위해 사용됩니다.

tomcat_ds_enabled

Default : false
Type : Boolean
JMX를 사용하여 Tomcat DB Connection Pool 정보를 추적하는 기능을 활성화 합니다.

tomcat_pool_enabled

Default : true
Type : Boolean
JMX를 사용하지 않고 Tomcat DB Connection Pool 정보를 추적하는 기능을 활성화 합니다.

weblogic_ds_enabled

Default : false
Type : Boolean
JMX를 사용하여 Weblogic DB Connection Pool 정보를 추적하는 기능을 활성화 합니다.

weblogic_pool_enabled

Default : true
Type : Boolean
JMX를 사용하지 않고 Weblogic DB Connection Pool 정보를 추적하는 기능을 활성화 합니다.

jeus_pool_enabled

Default : true
Type : Boolean
JMX를 사용하지 않고 JEUS DB Connection Pool 정보를 추적하는 기능을 활성화 합니다.

profile_connection_open_enabled

Default : true
Type : Boolean
프로파일 내역에 DBConnection 오픈 정보를 기록합니다.

profile_dbc_close

Default : false
Type : Boolean (profile_connection_open_enabled=true 에서만 동작)
프로파일 내역에 DBConnection 클로즈 정보를 기록합니다.

profile_sql_param_enabled

Default : false
Type : Boolean
프로파일 내역에 SQL 파라미터 정보를 기록하고자 할 때 사용합니다. 파라미터는 별도 보안키를 입력해야 조회 할 수 있습니다.

보안 키는 WAS서버 ${WHATAP_AGENT_HOME}/paramkey.txt 파일내에 6자리로 지정합니다.
paramkey.txt 파일이 존재하지 않는 경우 랜덤 값으로 자동 생성됩니다.
profile_sql_resource_enabled

Default : false
Type : Boolean
프로파일에서 SQL 이 수집될 때 해당 스텝에서 사용한 CPU 와 메모리 사용량을 추적합니다.

profile_update_count

Default : false
Type : Boolean
excuteUpdate() 메소드를 통해 SQL UPDATE문이 수행된 경우 UPDATE 건수를 수집합니다.

custom_pool_classes

Default : NONE
Type : String
pre-define되지 않는 별도의 Connection Pool을 사용하는 경우 해당 클래스 명을 지정한다.

ds_update_interval

Default : 5000
Type : MiliSeconds
DB Connection 정보 Count 주기를 설정한다.

profile_position_sql

Default : false
Type : Boolean
SQL이 수행되는 시점의 StackTrace를 기록한다.

trace_dbc_leak_enabled

Default : false
Type : Boolean
DBConnection Leak 을 추적하는 기능을 활성화합니다.

Connection Wrapper를 사용해 Leak을 추적하기에 운영 서비스에 영향을 미칠 수 있으므로 반드시 테스트후 적용해야 합니다.
trace_dbc_leak_fullstack_enabled

Default : false
Type : Boolean
DBConnection Leak이 감지되는 경우 해당 시점 StackTrace를 수집합니다.

옵션 적용시 CPU 사용량이 다소 증가할 수 있습니다.
PeakTime시 적용을 피하고 문제해결 용도로만 한시적으로 적용 할 것을 권고합니다.
trace_sql_normalize_enabled

Default : true
Type : Boolean
SQL 문에서 리터럴 부분을 축출하여 SQL 문을 정규화하는 기능을 활성화합니다.

profile_error_jdbc_fetch_max

Default : 10000
Type : Int
SQL Fetch Count(ResultSet.next() 호출 건 수)가 지정한 값을 초과하면 TOO MANY Fetch 에러로 처리됩니다. 0으로 설정하는 경우 에러 처리를 하지 않습니다.

profile_error_sql_time_max

Default : 30000
Type : MiliSecond
SQL 수행시간이 지정한 값을 초과하면 TOO SLOW 에러로 처리됩니다. 0으로 설정하는 경우 에러 처리를 하지 않습니다.

hook_connection_open_patterns

Default : NONE
Type : String
DB Connection Open 시 호출되는 메소드를 등록합니다. 미리 지정되지 않은 Connection Pool 의 getConnection을 등록하는 것이 일반적입니다.

  • Ex : hook_connection_open_patterns=mypool.ConPool.getConnection

hook_jdbc_con_classes

Default : NONE
Type : String
미등록 되었던 JDBC Connection 클래스를 지정합니다.

  • Ex : hook_jdbc_con_classes=mypool.ConPool

hook_jdbc_pstmt_classes

Default : NONE
Type : String
미등록 되었던 jdbc PreparedStatement 클래스를 지정합니다. 주의할 점은 생성자 파라미터에 SQL 문자열이 전달되는 구조여야 합니다.

  • Ex : org.apache.derby.impl.jdbc.EmbedPreparedStatement

hook_jdbc_cstmt_classes

Default : NONE
Type : String
미등록 되었던 jdbc CallableStatement 클래스를 지정합니다.

  • Ex : org.apache.derby.impl.jdbc.EmbedCallableStatement

hook_jdbc_stmt_classes

Default : NONE
Type : String
미등록 되었던 JDBC Statement 클래스를 지정합니다.

  • Ex : org.apache.derby.impl.jdbc.EmbedStatement

hook_jdbc_rs_classes

Default : NONE
Type : String
미등록되었던 JDBC ResultSet 클래스를 지정합니다.

  • Ex : org.apache.derby.impl.jdbc.EmbedResultSet

hook_jdbc_wrapping_driver_patterns

Default : NONE
Type : String
DB2 드라이버처럼 난독 처리된 JDBC 드라이버는 hook_jdbc_xxx 옵션으로 직접 BCI 가 어렵다. 이런 경우 Wrapper 방식으로 SQL 추적할 수 있는데 이때 Driver.connect 를 지정하여 추적하게 됩니다.

debug_dbc_stack_enabled

Default : false
Type : Boolean
DB Connection 시점의 StackTrace 를 프로파일에 저장합니다. 어플리케이션에서 사용하는 Connection Pool 정보를 얻기위해 사용됩니다.

7.11. HTTPC, API Call

profile_error_httpc_time_max

Default : 10000
Type : MiliSecond
HTTPC 수행시간이 지정한 값을 초과하면 TOO SLOW 에러로 처리됩니다. 0으로 설정하는 경우 에러 처리를 하지 않습니다.

profile_httpc_resource_enabled

Default : false
Type : Boolean
프로파일에서 HTTP Call 스텝이 수집될 때 해당 스텝에서 사용한 CPU 와 메모리 사용량을 추적합니다.

profile_position_httpc

Default : false
Type : Boolean
HTTPC가 수행되는 시점의 StackTrace를 기록합니다.

trace_httpc_normalize_enabled

Default : true
Type : Boolean
트랜잭션내 HTTPC URL 을 파싱하여 정규화하는 기능을 활성화합니다.

trace_httpc_normalize_urls

Default : NONE
Type : String
정규화 할 HTTPC URL 패턴을 정의 한다. 호출 URL 패턴을 파싱하여 패스파라미터를 제거합니다.

ex) /a/{v}/b 라고 선언하면 a/123/b ⇒ a/{v}/b 로 치환한다
여러 개를 등록할 때는 콤마(,)를 사용합니다. 치환패턴 정리 후 보완필요
hook_httpc_patterns

Default : NONE
Type : String
HTTP Call 을 수행하는 클래스를 지정합니다.

7.12. Plug-in

hook_trace_helper_patterns

Default : NONE
Type : String
메소드 실행 및 종료 부분에서 프로파일 플러그인을 삽입할 포인트(클래스 및 메소드명)를 지정합니다

plugin 을 활용한 커스터마이즈 된 profile 정보 수집을 위한 용도로 하기 plugin 코드가 주입됩니다.
$WHATAP_HOME/plugin/TraceHelperStart.x
$WHATAP_HOME/plugin/TraceHelperEnd.x
hook_trace_helper_end_patterns

Default : NONE
Type : String
메소드 종료 부분에서 프로파일 플러그인을 삽입할 포인트(클래스 및 메소드명)를 지정합니다.

plugin 을 활용한 커스터마이즈 된 profile 정보 수집을 위한 용도로 하기 plugin 코드가 주입됩니다.
$WHATAP_HOME/plugin/TraceHelperEnd.x
hook_trace_helper_start_patterns

Default : NONE
Type : String
메소드 시작 부분에서 프로파일 플러그인을 삽입할 포인트(클래스 및 메소드명)를 지정합니다.

plugin 을 활용한 커스터마이즈 된 profile 정보 수집을 위한 용도로 하기 plugin 코드가 주입됩니다.
$WHATAP_HOME/plugin/TraceHelperStart.x

7.13. 사용자 수

trace_user_enabled

Default : true
Type : Boolean
실시간 사용자 집계 여부를 지정합니다.

사용자 추적 옵션이 중복 설정 된 경우 동작 우선순위
1. trace_user_using_ip
2. trace_user_using_jsession
3. user_header_ticket
trace_user_cookie_limit

Default: 2048
Type : Int
사용자 집계를 위해 쿠키를 발행하는 경우 기존 쿠키가 너무 많다면 쿠키 오버플로어가 발생 할 수 있습니다. 이를 회피하기 위해 limit 를 지정합니다.

trace_user_using_ip

Default : true
Type : Boolean
실시간 사용자 집계시 IP 를 기반으로 합니다.

trace_user_using_jsession

Default : false
Type : Boolean
실시간 사용자 집계시 SESSIONID 를 기반으로 합니다.

trace_http_client_ip_header_key

Default : NONE
Type : String
Remote Address 를 http header의 특정 key값으로 대체합니다.

예) trace_http_client_ip_header_key=X-Forwarded-For
WEB/WAS 앞에 L4와 같은 로드밸런서가 위치한 경우 Client의 IP가 아닌 L4의 IP가 Remote Address가 되는 경우가 있습니다.
이 상황에서 실제 Client IP정보가 http header에 특정 key 값으로 기록되는 경우라면 해당 key로 대체 할 수 있습니다.
user_header_ticket

Default : NONE
Type : String
HTTP Header 의 특정 값으로 사용자 수를 집계하고자 하는 경우 해당 Key값을 지정합니다.

7.14. 부하량 제어

throttle_enabled

Default : false
Type : Boolean
어플리케이션의 최대 동시 처리 수를 제한하는 쓰로틀링 기능을 활성화합니다. throttle_ 으로 시작하는 모든 옵션은 throttle_enabled=true 상태에서만 동작합니다.

쓰로틀링 제어와 관련한 정책은 다음과 같은 우선순위를 가지고 있습니다.
1. Block : URL, 사용자IP 기준으로 서비스를 차단하며 가장 우선하여 적용됩니다.
2. Passing : Passing에 적용된 URL들은 Reject 정책보다 우선합니다.
3. Reject : Block, Passing 정책 이후에 Reject 정책이 적용됩니다.
throttle_limit

Default: 10000
Type : Int
에이전트별 동시 처리되는 요청(트랜잭션)수가 지정한 값을 넘으면 추가로 도달하는 요청은 reject됩니다.

throttle_rejected_message

Default : too many request!!
Type : String
쓰로틀링 제한시 사용자에게 전달될 메시지를 정의합니다.

throttle_rejected_forward

Default : NONE
Type : URL
사용자 요청이 limit 값을 넘어 reject 될 때 사용자에게 전달되는 안내 페이지 URL을 정의합니다. throttle_rejected_message와 동시에 설정된 경우 throttle_rejected_forward 가 우선적용 됩니다.

안내페이지가 동일한 컨테이너에서 서비스 되는 경우, 이 역시 동시처리 수에 산정 되므로 제귀호출로 인한 장애요소가 될 수 있습니다. 그러므로 안내 페이지는 static html 페이지로 만들거나 외부에 있어야 합니다.
reject_event_enabled

Default : false
Type : Boolean
사용자 요청이 Reject된 경우 이벤트 알람을 발생할 지를 정의합니다.

reject_event_interval

Default: 30000
Type : MiliSecond
Reject에 대한 이벤트 알람 발생이후 설정된 시간동안 중복된 이벤트에 대하여 알람 발생을 하지 않습니다.

throttle_blocking_url

Default: NONE
Type : String
throttle_limit을 초과하지 않는 경우라도 블럭킹(처리 거부) 할 URL 을 지정합니다. 시스템 장애를 유발하는 URL을 긴급하게 블럭킹 하기 위해 사용할 수 있습니다.

throttle_blocking_ip

Default: NONE
Type : ip_address
사용자 IP를 기준으로 블럭킹하고자 할 때 지정합니다. 디도스 공격이나 잘못된 사용자를 IP 기반으로 차단 할 때 사용할 수 있습니다. 여러개인 경우 콤마(,)를 사용합니다.

throttle_target_urls

Default: NONE
Type : URL
등록된 URL을 대상으로만 쓰로틀 기능을 적용한다. 여러개인 경우 콤마(,) 로 구분합니다.

throttle_passing_url

Default: NONE
Type : String
throttle_limit을 초과하는 경우라도 처리되어야 할 URL이 있는 경우 지정합니다. 여러개인 경우 콤마(,)를 사용합니다.

throttle_passing_url_prefix

Default: NONE
Type : String
throttle_limit을 초과하는 경우라도 처리되어야 할 URL들을 prefix로 경우 지정합니다. 여러개인 경우 콤마(,)를 사용합니다.

throttle_blocked_message

Default : request blocked!!
Type : String
요청이 블러킹 된 사용자에게 전달할 메시지를 정의합니다.

throttle_blocked_forward

Default : NONE
Type : URL
요청이 블러킹 된 사용자에게 전달할 URL을 정의합니다. throttle_blocked_message와 동시에 설정된 경우 throttle_blocked_forward 가 우선적용 됩니다.

7.15. 에이전트 알림 설정

recursive_event_interval

Default : 300000
Type : MiliSeconds
트랜잭션의 재귀 호출에 대한 이벤트 알림 발행 간격을 지정합니다.

reject_event_enabled

Default : false
Type : Boolean
서비스 거절(호출 부하 제한/거절))시 이벤트 알림 발행 여부를 지정합니다.

reject_event_interval

Default : 300000
Type : MiliSeconds
서비스 거절(호출 부하 제한/거절))시 이벤트 알림 발행 간격을 지정합니다.

httpc_event_enabled

Default : false
Type : Boolean
HTTPC 연결오류 발생시 이벤트 알림 발행 여부를 지정합니다.

httpc_event_interval

Default : 300000
Type : MiliSeconds
HTTPC 연결오류 발생시 이벤트 알림 발행 간격을 지정합니다.

heap_event_enabled

Default : false
Type : Boolean
힙 사용량 임계 도달 시 이벤트 알림 발행 여부를 지정합니다.

heap_event_percent

Default : 90
Type : Percentage
힙사용량 이벤트 알림 발행 기준 임계치를 지정합니다.

heap_event_duration

Default : 30000
Type : MiliSeconds
힙사용량 이벤트 알림 발행 기준 지속시간을 지정합니다.

heap_event_interval

Default : 300000
Type : MiliSeconds
힙사용량 이벤트 알림 발행 간격을 지정합니다.

heap_event_action

Default : NONE
Type : String
힙사용량 이벤트 발생 시 실행할 동적 로딩 코드 지정

($WHATAP_HOME/plugin/ActionScript.x 에 작성한 Java 코드)에 전달할 ID ($id 로 전달됨)
disk_event_enabled

Default : false
Type : Boolean
디스크사용량 임계 도달 시 이벤트 알림 발행 여부를 지정합니다.

disk_event_percent

Default : 90
Type : Percentage
디스크사용량 이벤트 알림 발행 기준 임계치를 지정합니다.

disk_event_interval

Default : 300000
Type : MiliSeconds
디스크사용량 이벤트 알림 발행 간격을 지정합니다.

disk_event_action

Default : NONE
Type : String
디스크사용량 이벤트 발생 시 실행할 동적 로딩 코드 지정

($WHATAP_HOME/plugin/ActionScript.x 에 작성한 Java 코드)에 전달할 ID ($id 로 전달됨)
cpu_event_enabled

Default : false
Type : Boolean
CPU 사용량 임계 도달 시 이벤트 알림 발행 여부를 지정합니다.

cpu_event_percent

Default : 90
Type : Percentage
CPU 사용량 이벤트 알림 발행 기준 임계치를 지정합니다.

cpu_event_duration

Default : 30000
Type : MiliSeconds
CPU 사용량 이벤트 알림 발행 기준 지속시간을 지정합니다.

cpu_event_interval

Default : 300000
Type : MiliSeconds
CPU 사용량 이벤트 알림 발행 간격을 지정합니다.

cpu_event_action

Default : NONE
Type : String
CPU 사용량 이벤트 발생 시, 실행할 동적 로딩 코드에 전달할 ID를 지정합니다.

($WHATAP_HOME/plugin/ActionScript.x 에 작성한 Java 코드)에 전달할 ID ($id 로 전달됨)
dbc_dup_event_enabled

Default : false
Type : Boolean
DB Connection 이 중복 할당 되었을 때 이벤트 알림 발행여부를 지정합니다.

dbc_dup_event_fullstack_enabled

Default : false
Type : Boolean
DB Connection 이 중복 할당 될때 Stack 확보 여부를 지정합니다.

exception_event_enabled

Default : false
Type : Boolean
Exception 발생 시 이벤트 알림 발행 여부를 지정합니다.

exception_event_interval

Default : 60000
Type : MiliSeconds
Exception 발생 시 이벤트 알림 발행 간격을 지정합니다.

exception_event_set

Default : Null
Type : String
대상 Exception 을 지정합니다. 여러개 지정할 경우 ','로 구분자를 사용합니다.

exception_event_action

Default : Null
Type : String
이벤트 발생 시 실행할 동적 로딩 코드

($WHATAP_HOME/plugin/ActionScript.x 에 작성한 Java 코드)에 전달할 ID ($id 로 전달됨)

7.16. 성능 카운터 & 통계 확장

addin_monitor_num

Default : 0
Type : Int
성능 카운터 확장을 위해 추가 선언할 클래스 수 addin_monitor_num에 설정한 수만큰 addin_monitor_x를 선언합니다.

addin_monitor_0

Default : 0
Type : Int
클래스 이름을 지정한다. 이클래스들은 모두 whatap.agent.AddinMonitor의 구현 클래스 입니다.

addin_monitor_x 사용예
addin_monitor_num=2
addin_monitor_0=a.a.Class1
addin_monitor_1=a.a.Class2
stat_domain_enabled

Default : false
Type : Boolean
도메인별 트랜잭션 통계를 수집합니다.

stat_domain_max_count

Default : 7000
Type : Int
5분동안 한 JVM에서 수집할 도메인별 트랜잭션 통계의 최대 레코드 수입니다.

stat_mtrace_enabled

Default : false
Type : Boolean
멀티 서버 트랜잭션에서 Callser&Callee간에 버전별 의존성 통계를 수집합니다.

mtrace_spec

Default: v1
Type : String
현 인스턴스의 애플리케이션 버전을 지정합니다. 임의의 문자열을 지정할 수 있습니다. 이 데이터는 호출통계를 위해 사용됩니다.

stat_mtrace_max_count

Default : 7000
Type : Int
멀티 서버 트랜잭션에서 Callser&Callee간에 버전별 의존성 통계의 최대 레코드 수입니다.

stat_login_enabled

Default : false
Type : Boolean
로그인별 트랜잭션 통계를 수집합니다.

stat_login_max_count

Default : 7000
Type : Int
5분동안 한 JVM에서 수집할 로그인별 트랜잭션 통계의 최대 레코드 수입니다.

stat_referer_enabled

Default : false
Type : Boolean
Referer별 트랜잭션 통계를 수집합니다.

stat_referer_max_count

Default : 7000
Type : Int
5분동안 한 JVM에서 수집할 Referer별 트랜잭션 통계의 최대 레코드 수입니다.

stat_tx_max_count

Default : 5000
Type : Int
트랜잭션 통계 정보의 갯수를 제한합니다. 5분동안 수집되어 서버에 전송되는 통계정보에서 최대 레코드수를 제한합니다.

stat_sql_max_count

Default : 5000
Type : Int
SQL 통계 정보의 갯수를 제한합니다. 5분동안 수집되어 서버에 전송되는 통계정보에서 최대 레코드수를 제한합니다.

stat_httpc_max_count

Default : 5000
Type : Int
Http Call 통계 정보의 갯수를 제한합니다. 5분동안 수집되어 서버에 전송되는 통계정보에서 최대 레코드수를 제한합니다.

stat_error_max_count

Default : 1000
Type : Int
Error 통계 정보의 갯수를 제한합니다. 5분동안 수집되어 서버에 전송되는 통계정보에서 최대 레코드수를 제한합니다.

stat_useragent_max_count

Default : 500
Type : Int
User Agent 통계 정보의 갯수를 제한합니다. 5분동안 수집되어 서버에 전송되는 통계정보에서 최대 레코드수를 제한합니다.

7.17. 일반 로그 & GC 로그 모니터링

watchlog_enabled

Default : false
Type : Boolean
로그 모니터링을 활성화합니다.

watchlog_check_interval

Default : 2000
Type : Int
로그를 감시하는 주기입니다. 매 간격으로 로그 파일에 기록이 추가되었는지 확인합니다.

watchlog_read_count

Default : 8
Type : Int
로그를 읽어들이는 최대 횟수입니다. 한번에 watchlog_buffer_size만큼 읽어드립니다.

watchlog_buffer_size

Default : 131072(128k)
Type : Int
한번에 읽어들이는 로그 사이즈 입니다.

watchlog.LOGKEY

watchlog.LOGKEY.enabled=false
watchlog.LOGKEY.file=
watchlog.LOGKEY.words=
watchlog.LOGKEY.silent=10000
watchlog.LOGKEY.check_interval=1000
하나의 로그 파일을 감시하기 위한 설정입니다. file을 지정하고 감시한 word를 여러개를 ','이용하여 설정합니다. check_interval간격으로 로그를 감시하다가 키워드가 발견되면 경고하는 방식입니다. 한번 경고가 나가면 silent 만큼 경고를 멈춤니다.

gclog_enabled

Default : false
Type : Boolean
GC 로그 모니터링을 활성화합니다.

gclog_file

Default : Null
Type : File Name
GC 로그 파일경로를 지정합니다.

gclog_check_interval

Default : 2000
Type : Int
GC 로그를 감시하는 주기입니다. 매 간격으로 로그 파일에 기록이 추가되었는지 확인합니다.

gclog_word

Default : Full GC
Type : word
감시할 키워드를 등록합니다. 기본은 Full GC가 발생하면 정보를 서버에 전송하고 저장합니다.

7.18. 토폴로지 맵

tx_caller_meter_enabled

Default : false
Type : Boolean
토폴로지맵에서 외부 호출정보를 표현합니다. mtrace_enabled=true 인 경우 동작합니다.

sql_dbc_meter_enabled

Default : false
Type : Boolean
토폴로지맵에서 SQL 호출정보를 표현합니다.

httpc_host_meter_enabled

Default : false
Type : Boolean
토폴로지맵에서 httpc outbound 정보를 표현합니다.

actx_meter_enabled

Default : false
Type : Boolean
토폴로지맵에서 액티브 트랜잭션 상태를 표현합니다.

8. 부가 정보

8.1. 애플리케이션 서버별 적용 절차

애플리케이션 서버 설정 위치

SpringBoot

시작 스크립트

Tomcat

$CATALINA_HOME/bin/catalina.sh(bat)

JBoss 5.0 이하

$JBOSS_HOME/bin/run.conf

JBoss 7.0 이상 EAP 6.0이상

$JBOSS_HOME/bin/standalone.conf(domain.conf)

WebLogic

$WEBLOGIC_HOME/user_projects/domains/사용자도메인/bin/startWebLogic.sh(bat)

WebSphere

admin console 접속
1. Server > Server Types > WebSphere application servers > 서버 선택
2. 서버 Configuration탭 > Server Infrastructure의 Java and Process Management > Process definition 선택
3. Additional Properties의 Java Virtual Machine 선택
4. Generic JVM arguments 편집

Jeus7

$JEUS_HOME/domains/jeus_domain/config.xml

Jeus6

$JEUS_HOME/config/$hostname/JEUSMain.xml

Resin

$RESIN_HOME/conf/resin.properties

Jetty

watch_jetty.sh(bat)

play2

$PLAY_HOME/framework/build

Liberty

${server.config.dir}/jvm.options

8.1.1. SpringBoot

시작 스크립트 jvm 옵션에 -javaagent를 추가합니다.

java -javaagent:{whatap.agent-x.x.x.jar의 full path} -jar {application jar}

8.1.2. Tomcat on Windows Service

Tomcat을 Windows 인스톨러로 설치한 경우 "Tomcat Service Manager" 에 옵션 적용 합니다.

Tomcat Service Manager 를 관리자 권한으로 실행합니다.

파일명 : %TOMCAT_HOME%\bin\tomcat8w.exe 또는 tomcat7w.exe
tomcatw
Figure 22. Configure Tomcat on Windows Service

Java 탭 Java Options 항목에 에이전트 옵션을 추가 합니다.

-javaagent:%AGENT_FILE%
tomcatw jvm
Figure 23. Java - Java Options:

8.1.3. JBoss

JVM 옵션에 -javaagent 및 -Djboss.modules.system.pkgs에 설정을 추가합니다.

JBOSS 7.0 이상 EAP 6.0이상

-Djboss.modules.system.pkgs=whatap 추가

standalone.sh
#!/bin/sh
########## WHATAP ############
WHATAP_HOME=/home/ec2-user/whatap
WHATAP_JAR=`ls ${WHATAP_HOME}/whatap.agent-*.jar | sort | tail -1`
JAVA_OPTS="${JAVA_OPTS} -javaagent:${WHATAP_JAR} -Djboss.modules.system.pkgs=whatap "
########## WHATAP ############

8.1.4. WebLogic

설정 위치

$WEBLOGIC_HOME/user_projects/domains/사용자도메인/bin/startWebLogic.sh(bat)

  • javaagent 프로퍼티 설정을 추가합니다.

280
Figure 24. startWebLogic.sh

8.1.5. WebSphere

  1. 웹브라우저를 통해 admin console에 로그인 합니다.

290
  1. Servers > Server Type > WebSphere application servers 메뉴를 통해 에이전트를 설치할 서버를 선택합니다.

300
  1. 선택된 서버 Configuration 탭에 Server Infrastructure의 Java and Process Management > Process definition 메뉴를 선택합니다.

310
  1. Additional Properties의 Java Virtual Machine 메뉴를 선택합니다.

320
  1. WEBSHERE의 서비스 포트를 확인합니다.

330
  1. Configuration 탭의 Generic JVM arguments에 -javaagent와 -Dwhatap.port를 추가합니다.

340

8.1.6. Jeus

  1. Jeus 설정 파일에서 JVM 옵션을 설정합니다

설정 파일 위치

Jeus7

$JEUS_HOME/domains/jeus_domain/config.xml 에서 jvm-option에 -javaagent 옵션을 추가합니다.

Jeus6

$JEUS_HOME/config/$hostname/JEUSMain.xml 에서 command-option에 -javaagent 옵션을 추가합니다.

Jeus 7 - config.xml
<domain>
   <servers>
       <server>
           <name>server1</name>
           <jvm-config>
               <jvm-option>
                   -Xmx1024m -XX:MaxPermSize=128m
                   -javaagent:/whatap/whatap.agent-2.0_19.jar
               </jvm-option>
           </jvm-config>
       </server>
   </servers>
</domain>
350
Figure 25. Jeus 6 - JEUSMain.xml
  1. 애플리케이션 서버를 재시작 합니다.

jdown && jboot
  1. 애플리케이션 서버 로그와 에이전트 로그를 통해 에이전트가 정상적으로 기동하였는지, 에러가 발생하지 않았는지 확인합니다.

로그 파일 위치

에이전트

$WHATAP_HOME/logs/whatap-{SERVER_NAME}-{DATE}.log

JEUS6

$JEUS_HOME/logs/$NODE_NAME/JeusServer.log

JEUS7

$JEUS_HOME/domains/$HOST_NAME/servers/$NODE_NAME/logs/JeusServer.log

JEUS7
$JEUS_HOME/domains/$HOST_NAME/servers/$NODE_NAME/logs/JeusServer.log
370
  1. 에이전트가 애플리케이션 서버의 종류와 애플리케이션 서버의 서비스 container명을 인식했는지 확인합니다.

    와탭 사이트에서 whatap.name과 whatap.type을 확인합니다.
    service.whatap.io 로그인 > 프로젝트 선택 > 서버 메뉴 선택 > 더보기 > Boot Environment 메뉴 선택을 통해 확인합니다.

whatap.type에는 애플리케이션 서버의 종류가 명시되어야 하며, whatap.name의 마지막 요소가 container이름 이어야 합니다.

380
Figure 26. Boot Environment

8.1.7. Jetty

JVM 옵션에 -javaagent와 -Dwhatap.port를 추가합니다.

$JETTY_HOME/bin/jetty.sh 파일에 JVM 파일 옵션을 추가합니다.

390
Figure 27. jetty.sh

또는, 옵션을 적용하여 Jetty를 기동합니다.

Start Jetty without startup shell
$ java -javaagent:/home/vagrant/whatap/whatap.agent-2.0_10.jar -Dwhatap.port=8080 -jar start.jar &

8.1.8. Resin

  1. Resin 설정 파일에서 JVM 옵션을 설정합니다.

설정 파일 위치

Resin 4.x

$RESIN_HOME/conf/resin.properties 에서 jvm-arg를 추가하여 -javaagent 옵션을 설정합니다.

Resin4.x
(중략)
<resin xmlns="http://caucho.com/ns/resin">
   <cluster id="web-tier">
       <server-default>
           <jvm-arg>-Xmx1024m -XX:MaxPermSize=128m -javaagent:/whatap/whatap.agent-#.#_#.jar</jvm-arg>
       </server-default>
       ...
   </cluster>
</resin>
(중략)
  1. 애플리케이션 서버를 재시작 합니다.

  2. 애플리케이션 서버 로그와 에이전트 로그를 통해 에이전트가 정상적으로 기동 되었는지 에러가 발생하지 않았는지 확인합니다.

로그 파일 위치

에이전트

$WHATAP_HOME/logs/whatap-{SERVER_NAME}-{DATE}.log

RESIN4.x

$RESIN_HOME/log/jvm-app-#.log

8.1.9. Play

$PLAY_HOME/framework/build 에 에이전트 옵션을 설정합니다. 별도 사용하는 시작/중지 스크립트가 있다면 그곳에 적용합니다.

$PLAY_HOME/framework/build
#! /usr/bin/env sh
​
########## WHATAP START ############
WHATAP_HOME=/apps/whatap
WHATAP_JAR=`ls ${WHATAP_HOME}/whatap.agent-*.jar | sort | tail -1`
JAVA_OPTS="${JAVA_OPTS} -Dwhatap.play2=2.2.6 -javaagent:${WHATAP_JAR} " (1)
########## WHATAP END ############
​
if [ -z "${PLAY_VERSION}" ]; then
  PLAY_VERSION="2.2.6"
​
(중략)
1 Play는 기본 설정 이외 -Dwhatap.play2=2.2.6 옵션이 추가되어야 합니다.

8.1.10. Liberty

${server.config.dir}/jvm.options 에 에이전트 옵션을 설정합니다. 파일이 없는 경우 신규로 생성 합니다.

/wasliberty/usr/servers/defaultServer/jvm.options
-javaagent:/app/whatap/whatap.agent-2.0_21.jar
-Dorg.osgi.framework.bootdelegation=whatap.* (1)
1 OSGI 프레임워크를 사용하므로 이를 위한 설정을 추가 합니다.

8.2. 호환성 검증표

8.2.1. WAS

Java 버전 별로 다양한 WAS에서 와탭 에이전트 호환성 테스트를 수행한 결과입니다.

표시되지 않은 버전은 support@whatap.io 로 문의 바랍니다.
Tomcat

WAS Ver.

java se6 (jdk1.6.0)

java se7 (jdk1.7.0_80)

java se8 (jdk1.8.0_91)

tomcat6

ok

ok

ok

tomcat7

ok

ok

ok

tomcat8

not ok

ok

ok

tomcat9

not ok

not ok

ok

WAS Ver.

open jdk6 (1.6.0_45)

open jdk7 (1.7.0_80)

open jdk8 (1.8.0_91)

tomcat6

ok

ok

ok

tomcat7

ok

ok

ok

tomcat8

not ok

ok

ok

tomcat9

not ok

not ok

ok

WAS Ver.

ibm-java-x86_64-60

ibm-java-x86_64-71

ibm-java-x86_64-80

tomcat6

ok

ok

ok

tomcat7

ok

ok

ok

tomcat8

not ok

ok

ok

tomcat9

not ok

not ok

ok

Jeus

WAS Ver.

java se6 (jdk1.6.0)

java se7 (jdk1.7.0_80)

java se8 (jdk1.8.0_91)

jeus6

ok

ok

not ok

jeus7

ok

ok

not ok

WAS Ver.

open jdk6 (1.6.0_45)

open jdk7 (1.7.0_80)

open jdk8 (1.8.0_91)

jeus6

ok

ok

not ok

jeus7

ok

ok

not ok

WAS Ver.

ibm-java-x86_64-60

ibm-java-x86_64-71

ibm-java-x86_64-80

jeus6

ok

ok

not ok

jeus7

ok

ok

ok

WebLogic

업데이트 예정

WebSphere

WAS Ver.

ibm-java-x86_64-60

8.5.5.10

ok

JBOSS

JDK 6 이상 버전에서 지원되는 JBOSS Comunity, EAP, Wildfly의 모든 버전을 지원 합니다.

WAS Ver.

java se6 (jdk1.6.0)

java se7 (jdk1.7.0_80)

java se8 (jdk1.8.0_91)

jboss EAP 7.0 (standalone)

not ok

not ok

ok

jboss EAP 6.1.1 (standalone)

not ok

ok

not ok

jboss EAP 6.2 (standalone)

not ok

ok

ok

jboss EAP 6.3 (standalone)

not ok

ok

ok

jboss EAP 6.4 (standalone)

not ok

ok

ok

jboss EAP 7.0 (domain)

not ok

not ok

ok

jboss AS 5.1.0 (default)

ok

ok

ok

WAS Ver.

open jdk6 (1.6.0_45)

open jdk7 (1.7.0_80)

open jdk8 (1.8.0_91)

jboss EAP 7.0 (standalone)

not ok

not ok

ok

jboss EAP 6.1.1 (standalone)

not ok

ok

not ok

jboss EAP 6.2 (standalone)

not ok

ok

ok

jboss EAP 6.3 (standalone)

not ok

ok

ok

jboss EAP 6.4 (standalone)

not ok

ok

ok

jboss EAP 7.0 (domain)

not ok

not ok

ok

jboss AS 5.1.0 (default)

ok

ok

ok

WAS Ver.

ibm-java-x86_64-60

ibm-java-x86_64-71

ibm-java-x86_64-80

jboss EAP 7.0 (standalone)

not ok

not ok

ok

jboss EAP 6.1.1 (standalone)

not ok

ok

not ok

jboss EAP 6.2 (standalone)

not ok

ok

ok

jboss EAP 6.3 (standalone)

not ok

ok

ok

jboss EAP 6.4 (standalone)

not ok

ok

ok

jboss EAP 7.0 (domain)

jboss AS 5.1.0 (default)

ok

ok

ok

Jetty

WAS Ver.

java se6 (jdk1.6.0)

java se7 (jdk1.7.0_80)

java se8 (jdk1.8.0_91)

Jetty 8.1.21

not ok

ok

ok

Jetty 9.2.18

not ok

ok

ok

Jetty 9.3.12

not ok

not ok

ok

WAS Ver.

ibm-java-x86_64-60

ibm-java-x86_64-71

ibm-java-x86_64-80

Jetty 8.1.21

not ok

ok

ok

Jetty 9.2.18

not ok

ok

ok

Jetty 9.3.12

not ok

not ok

ok

8.2.2. DataSource

와탭 에이전트가 WAS가 제공하는 Connection pool을 사용하는 웹 애플리케이션의 DB 트랜잭션 프로파일링 기능 여부에 대해 검증한 결과입니다.

Tomcat

DB

JDBC Driver 화일명

JDBC Ver.

JDK Ver.

호환성

Mysql

mysql-connector-java-5.1.39-bin.jar

5.1.39

JDK 1.7.0_80

ok

MariaDB

mariadb-java-client-1.4.6.jar

1.4.6

JDK 1.7.0_80

ok

PostgreSQL

postgresql-9.4.1209.jre7.jar

9.4.1209

JDK 1.7.0_80

ok

AWS aurora

mysql-connector-java-5.1.39-bin.jar

5.1.39

JDK 1.7.0_80

ok

Oracle

ojdbc6-11.2.0.2.0.jar

11.2.0.2.0

JDK 1.7.0_80

ok

DB2

db2jcc.jar, db2jcc_license_cu.jar

1.4.2

JDK 1.7.0_80

ok

Jeus

DB

JDBC Driver 화일명

JDBC Ver.

JDK Ver.

호환성

Mysql

mysql-connector-java-5.1.39-bin.jar

5.1.39

JDK 1.7.0_80

ok

MariaDB

mariadb-java-client-1.4.6.jar

1.4.6

JDK 1.7.0_80

ok

PostgreSQL

postgresql-9.4.1209.jre7.jar

9.4.1209

JDK 1.7.0_80

ok

AWS aurora

mysql-connector-java-5.1.39-bin.jar

5.1.39

JDK 1.7.0_80

ok

Oracle

ojdbc6-11.2.0.2.0.jar

11.2.0.2.0

JDK 1.7.0_80

ok

DB2

db2jcc.jar, db2jcc_license_cu.jar

1.4.2

JDK 1.7.0_80

ok

WebLogic

DB

JDK Ver.

호환성

Mysql

JDK 1.8.0_91

ok

WebSphere

DB

JDBC Driver 화일명

JDBC Ver.

JDK Ver.

호환성

Mysql

mysql-connector-java-5.1.39-bin.jar

5.1.39

JDK 1.7.0_80

ok

Oracle

ojdbc6-11.2.0.2.0.jar

11.2.0.2.0

JDK 1.7.0_80

ok

JBoss

DB

JDBC Driver 화일명

JDBC Ver.

JDK Ver.

호환성

Mysql

mysql-connector-java-5.1.39-bin.jar

5.1.39

JDK 1.7.0_80

ok

MariaDB

mariadb-java-client-1.4.6.jar

1.4.6

JDK 1.7.0_80

ok

PostgreSQL

postgresql-9.4.1209.jre7.jar

9.4.1209

JDK 1.7.0_80

ok

AWS aurora

mysql-connector-java-5.1.39-bin.jar

5.1.39

JDK 1.7.0_80

ok

Oracle

ojdbc6-11.2.0.2.0.jar

11.2.0.2.0

JDK 1.7.0_80

ok

DB2

db2jcc.jar, db2jcc_license_cu.jar

1.4.2

JDK 1.7.0_80

ok

Jetty

DB

JDBC Driver 화일명

JDBC Ver.

JDK Ver.

호환성

Mysql

mysql-connector-java-5.1.39-bin.jar

5.1.39

JDK 1.7.0_80

ok

Oracle

ojdbc6-11.2.0.2.0.jar

11.2.0.2.0

JDK 1.7.0_80

ok


1. 에이전트 네이밍에 관한 세부 사항은 설치가이드의 에이전트 네이밍 부분을 참고합니다.