Java Agent 2.0
v2.0_52
v2.0_50
2021-07-13
URL 정규화 기능 오류 수정
클래스 상속관계를 활용하여 URL 매핑을 설정한 경우에도 URL 정규화가 가능하도록 오류를 수정하였습니다.
@RequestMapping(value = "/api/calls")
@RestController
public class ParentController {
}
...
@RestController
public class ChildController extends ParentController {
@GetMapping(value = "/child-first/{id}")
public ResponseEntity<?> findItemById(@PathVariable(value = "id") long id) {
return ResponseEntity.ok().body("result");
}
}
v2.0_34
v2.0_32
Custom Pool 카운트 추적 옵션 추가
Custom Pool을 추적할때 메소드 설정 옵션 "custom_pool_method_total"이 추가 되었습니다.
custom_pool_method_idle과 custom_pool_method_total 중 하나만 설정하면 됩니다.
custom_pool_id=myPool custom_pool_method_active=getActiveConnection custom_pool_method_idle=getIdleConnection custom_pool_method_total=getTotalConnection
v2.0_30
커스텀 Connection Pool Count 추적을 위한 옵션 추가
기 정의되지 않은 클래스들을 Pool사이즈를 카운팅하기 위한 옵션이 추가되었습니다.
custom_pool_id=myPool custom_pool_method_active=getActiveConnection custom_pool_method_idle=getIdleConnection
custom_pool_id는 custom_pool_classes에 설정된 값과 일치 해야합니다.
일반적으로 아래와 같이 설정됩니다.
custom_pool_classes=myPool@com.mydb.MyDataSource custom_pool_id=myPool custom_pool_method_active=getActiveConnection custom_pool_method_idle=getIdleConnection
"myPool"이라는 id에 custom_pool 설정이 적용됩니다.
Custom Pool의 정보를 조회하면서 에러가 발생하면 1시간에 한번씩 로그에 기록됩니다. |
컨넥션 풀 클래스 HOOK옵션을 분리
컨넥션 풀 클래스를 Instrument를 결정하는 옵션과 실제 데이터를 수집하는 옵션을 분리했습니다.
hook_hikari_pool_enabled = true hook_dbcp_pool_enabled = true hook_tomcat_pool_enabled = true hook_weblogic_pool_enabled = true hook_jeus_pool_enabled = true hook_jboss_pool_enabled = true hook_jedis_pool_enabled = true hook_hybris_pool_enabled = true hook_c3p0_pool_enabled = true
hook_xxx는 자바 프로세스가 재기동 되기 전에 설정되어야하지만 데이터를 수집하는 옵션 (ex hikari_pool_enabled)은 실행중에 변경이 가능합니다. |
v2.0_27
내부 에러 처리 클래스 인스턴스변경
와탭 내부에서는 에러 정보를 효과적으로 수집하기 위해 와탭에서 정의한 에러 클래스를 사용하고 있습니다. 이 에러 클래스들을 인스턴스를 관리하는 클래스를 추가 하였습니다.
외부 기능적으로 이전 버전과 차이는 없습니다.
JVM 버그가 의심되는 에러가 발견되어 회피 목적으로 변경하였습니다.
Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class whatap.error.CONNECTION_OPEN_FAIL
v2.0_26
액티브스택 수집 최적화
에이전트 tps에 따라 액티브 스택 수집 최적화 옵션 자동 적용 기능을 추가 했습니다.
auto_active_stack_count=true
-
TPS < 100
active_stack_count = 50 -
TPS < 300
active_stack_count = 30 -
TPS >= 300
active_stack_count = 20
auto_active_stack_count의 기본값은 가변적입니다. active_stack_count가 명시적으로 설정되어있으면 기본값이 false이고 명시적으로 whatap.conf에 설정되어 있지 않으면 기본값이 false입니다. |
액티브스택 성능 부가 정보 옵션 추가
액티브 스택을 수집할때 해당 트랜잭션의 성능 상태를 추가로 수집할 수있습니다.
active_stack_prefx_enabled=false
whatap.conf에 active_stack_prefx_enabled 값을 true로 설정하면 액티브스택 수집 시점의 트랜잭션의 성능 정보를 수집합니다.
-
cpuTime : cpu사용 millisecond
-
malloc : 메모리 사용 bytes
-
sqlCount : 현 트랜잭션의 총 SQL 건수
-
sqlTime : 현 트랜잭션의 총 SQL시간
-
httpcCount : 현 트랜잭션의 총 HTTPCall 건수
-
httpcTime : 현 트랜잭션의 총 HTTPCall 시간
-
actSqlDbc : 수행중인 SQL의 DB
-
actSql : 수행중인 SQL
-
actHttpc : 수행중인 외부 호출 URL
v2.0_25
-
TXID기반 추적 방식 리팩토링
-
Weaving 플러그인 새로 빌드함
-
Java Process CpuTime 조회 오류 수정
-
Exception 경고시 Class이름과 메세지 포함되도록 변경
v2.0_14
v2.0_11
BCI디버깅을 위한 덤프
hook_dump_enabled=true
hook_dump_enabled=true를 설정하면 와탭 에이전트에 의해 변경되는 클래스는 모든 덤프합니다.
${WHATAP_HOME}/classes에 수정된 파일이 모두 덤프됩니다.
어떤 클래스가 BCI에 의해 변경되었는지를 확인할 수있습니다. |
JDBC관련 기본 BCI 대상 클래스 OFF 옵션
와탭에이전트는 주요하게 SQL을 추적해야하는 JDBC관련 클래스를 내부에 기본 설정하고 있습니다.
이 기본 설정을 OFF할 수있는 옵션이 추가 되었습니다.
hook_jdbc_default_enabled=true hook_jdbc_stmt_default_enabled=true hook_jdbc_pstmt_default_enabled=true hook_jdbc_cstmt_default_enabled=true hook_jdbc_rs_default_enabled=true
기본값은 true입니다. Statement, PreparedStatement, CallableStatement, ResultSet클래스에 대해서 구분하여 지정할 수있습니다.
hook_jdbc_default_enabled의 설정값은 hook_jdbc_stmt_default_enabled의기본값이됩니다.
BCI 대상 클래스 제어
BCI을 위한 모듈의 동작여부를 제어합니다. 아래 옵션들은 자바 프로세스를 재기동해야 정상 적용됩니다.
hook_http_enabled=true hook_serivce_enabled=true hook_dbsql_enabled=true hook_dbopen_enabled=true hook_methods_enabled=true hook_socket_enabled=true hook_file_enabled=true
-
hook_http_enabled: HttpServlet, ServletFilter등에 대한 기본 BCI 설정
-
hook_serivce_enabled: 직접 설정한 Tx시작 제어
-
hook_dbsql_enabled: JDBC관련 BCI 제어 , hook_jdbc_default_enabled는 기본 hooking 설정된 클래스를 무시하는 것이고 hook_dbsql_enabled는 해당 BCI 기능 자체는 OFF 할 수 있습니다.
-
hook_dbopen_enabled: getConnection(Connection Open)부분에 대한 BCI 제어
-
hook_methods_enabled: 메소드 프로파일에 대한 BCI 제어
-
hook_socket_enabled: Socket Open추적(트랜잭션 프로파일)에 대한 BCI제어
-
hook_file_enabled: File Open 추적(트랜잭션 프로파일)에 대한 BCI제어
v2.0_09
HTTP 기본 추적 제어
javaee 서블릿은 기본으로 http 요청을 추적합니다. 주요 트랜잭션 시작 클래스가 와탭 에이전트에 등록되어있기 때문입니다.
javax.servlet.http.HttpServlet org.apache.catalina.filters.FilterBase weblogic.servlet.jsp.JspBase org.apache.catalina.core.ApplicationFilterChain
javax.servlet.Filter
기본 클래스/인터페이스는 hook_http_default_enabled=false를 설정하면 제외됩니다.
hook_http_default_enabled=true
HTTP 클래스 추가를 위해서는 hook_httpservlet_classes를 사용합니다.
hook_httpservlet_classes=javax.servlet.http.HttpServlet
HTTP 인터페이스를 추가를 위해서는 hook_http_filters를 사용합니다.
hook_http_filters=javax.servlet.Filter
hook_httpservlet_classes/hook_http_filters에 등록되기 위해서는 service혹은 doFilter메소드를 포함하고 있어야 합니다. |
hook_httpservlet_classes/hook_http_filters옵션들은 변경시 재기동이 필요합니다. |
v2.0_08
사용자 추적 옵션 수정
trace_user_method=ip
ip, cookie, jsession, header,none
4가지중 하나를 선택할 수있습니다.
-
ip : 클라이언트 ip를 사용자로 구분하여 카운팅 합니다.
-
cookie: WHATAP 쿠키를 자동으로 생성하여 사용자를 카운팅 합니다.
-
header: http header 값을 조회하여 사용자를 카운팅합니다. trace_user_header_key 를 지정해 주어야 합니다.
-
jsession: 쿠키값 중에서 JSESSIONID값을 읽어 사용자를 카운팅합니다.
-
none : 사용자를 카운팅하지 않습니다.
"trace_user_method" 설정된 값은 whatap.log에 출력됩니다. |
주요 메소드 Exception 추적
트랜잭션 프로파일시 트랜잭션 중간에 Exception을 catch해버리면 Exception발생여부를 알 수없습니다. 즉 트랜잭션 정보가 정상 종료로 표시됩니다. 그것은 모든 메소드의 Exception을 추적할 수없기 때문입니다.
하지만 여러가지 이유로 주요메소드에서 발생하는 Exception에 대해서는 에러로 표시하고자할때 필요합 옵션이 추가 되었습니다.
hook_method_error_supers hook_method_error_interfaces hook_method_error_patterns
위 옵션에 설정된 클래스의 메소들에서 Exception이 발생하면 트랜잭션 에러로 처리됩니다.
에이전트 접속 정보 설정키 변경
에이전트가 서버에 정보를 전송하기 위해서는 license값이 등록되어있어야 합니다.
license=x49s223s812hc-x496iqddmlug9c-z4orgmapfi
키를 변경하였습니다. license -→ whatap.project.token
whatap.project.token=x49s223s812hc-x496iqddmlug9c-z4orgmapfi
license옵션 키도 동일하게 사용가능합니다. |
URL Prefix 기반 정규화
prefix를 등록하고 등록한 prefix로 시작하는 URL는 prefix 값으로 변경(정규화)하는 기능을 추가하였습니다.
trace_normalize_prefix=/a,/b
옵션은 운영중에도 실시간 반영됩니다.
Jedis 프로파일링
jedis드라이버를 사용하여 redis를 호출하는 경우 응답시간을 추적할 수있습니다.
weaving_reserved=jedis-3.2
jedis 2.x까지 적용할 수있습니다. |
jedis_basetime=100
기본으로 응답시간이 100ms이상인 경우에 프로파링됩니다. 모든 jedis호출을 프로파일링 하고 싶으면 jedis_basetime=0으로 설정합니다.
jedis_show_parameter=false
jedis호출중에서 파라미터 값을 같이 프로파일링할때 true로 설정합니다.
-
getSet
-
get/set
-
hget/hset
위의 명령들을 프로파일링 합니다.
만약 다른 명령을 프로파일링하고자 한다면 support@whatap.io로 문의바랍니다. |
Spring Kafka 트랜잭션 추적
Kafka Listener가 데이터를 받아 처리하는 로직을 추적하는 기능을 추가하였습니다.
weaving_reserved=spring-kafka-1.3, spring-kafka-2.4
Spring Kafka-1.1.x ~ 1.3.x 는 spring-kafka-1.3를 사용할 수 있고 Spring Kafka-2.0.x ~ 2.4.x 는 spring-kafka-2.4를 사용합니다. https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka 트랜잭션 이름은 "kafka:topic-name" 형태가 됩니다. |
Spring MongoDB 프로파일링
몽고DB 메소드 호출에 대한 응답시간을 추적할 수있습니다.
weaving_reserved=spring-mongodb-2.2
spring-mongodb-2.2는 Sping Data MongoDB 1.1.x~2.2.x까지 적용할 수 있습니다. https://mvnrepository.com/artifact/org.springframework.data/spring-data-mongodb |
mongodb_basetime=100
기본으로 응답시간이 100ms이상인 경우에 프로파링됩니다. 모든 jedis호출을 프로파일링 하고 싶으면 jedis_basetime=0으로 설정합니다.
mongo_show_parameter=false
jedis호출중에서 파라미터 값을 같이 프로파일링할때 true로 설정합니다.
-
getSet
-
get/set
-
hget/hset
위의 명령들을 프로파일링 합니다.
만약 다른 명령을 프로파일링하고자 한다면 support@whatap.io로 문의바랍니다. |
Disk 사용량 카운팅
리눅스 환경에서 디스크 사용량을 추적할 수 있습니다.
디스크는 여러개가 마운트되어있을 수있습니다. 따라서 마운트된 디스크를 지정하여 모니터링 할 수있습니다.
diskusage_enabled=false diskusage_interval=300000 diskusage_default_enabled=false
diskusage_default_enabled=true가 설정되면 diskusage_path 설정은 무시됩니다.
diskusage_interval 간격(ms)으로 디스크 사용량을 추적하여 데이터를 보냅니다.
diskusage_count=2 diskusage_0_id=root diskusage_0_path=/ diskusage_1_id=home diskusage_1_path=/home
Byte Code Instrumentation(BCI) 예외 옵션
자바에서 성능추적이 필요한 주요 클래스들은 기본으로 BCI를 통해 수행 내용을 추적하도록 구현되어있습니다.
하지만 간혼 추적이 부적절한 클래스들이 존재할 수있는데 무시하기 위한 옵션이 있습니다.
hook_ignore_classes=org.mariadb.jdbc.MariaDbResultSet
v2.0_07
mariaDB jdbc driver 2.4.x에서 SQL 바인드변수의 추적이 안되는 버그 수정
사용자 카운팅을 위해 JSESSIONID의 값을 사용할 수있습니다. 근데 JSESSIONID를 다른 키로 변경한경우 변경된 키를 사용할 수있도록 옵션이 추가 되었습니다. 기본값은 JSESSIONID입니다. trace_user_using_jsession_key=JSESSIONID
v2.0_04
hook_exception_handler에 등록된 메소드에서 Exception이 catch되는 경우에 biz_exceptions에 등록된 에러에 대한 예외 처리가 되지 않고 profile_exception_stack 옵션이 동작하지 않는 버그 수정
v2.0_00
에이전트 통합
이전버전(v1.9.7이하)에서 WhaTap에이전트는 java5~8을 위한 whatap.agent.tracer-1.x.x.jar 와 java9~java13을 위한 whatap.agent.java9-1.x.x.jar로 분리하여 제공되었었습니다. 그러나 v2.0이후부터는 java5~13 혹은 이후 java까지도 whatap.agent-2.x_xx.jar로 통합되어 제공됩니다.
Hybris connection pool 추적 기능추가
Hybris는 SAP에서 인수한 e-commerce 솔루션입니다. Hybris는 자체개발한 DB Connection Pool을 사용하고 있습니다. 이 풀의 갯수를 추적하는 기능이 추가 되었습니다.
hybris_pool_enabled=true (기본값:true)
JNDI 혹은 JDBC URL 별로 DB연결수 추적
카운터 수집은 DB연결 정보(JDBC URL/JNDI)별로 연결수를 추적하도록 수정되었습니다. 에이전트별 DB연결수는 동일합니다.
연결정보에 대한 상세 데이터를 별도 수집할 수있습니다. (TAG 데이터)
pool_detail_enabled=true
ECS CPU 사용량 추적
AWS ECS환경에서 자바 에이전트가 설치되면 자동으로 인지하여 ECS에서 제공하는 CPU정보를 조회합니다. 그리고 할당된 CPU Limit를 수집합니다.
Active Transaction 조회 기능 강화
액티브 트랜잭션 정보가 요청되었을때 보다 상세한 정보를 리턴합니다. domain, 진행중인 SQL, httpcall 정보등이 추가되었습니다.
Http Header Demp(Profile) 키 수정
Http Header Demp(Profile)시 기본 생략 키를 등록하였습니다.
profile_http_header_ignore_keys=cookie,accept,user-agent,referer
만약 key를 제거하려면 none을 설정합니다.
profile_http_header_ignore_keys=none
CPU 모니터링 모듈 정리
환경에 따라 여러가지 CPU사용량 수집을 위해 여러가지 모듈이 선택되어 사용될 수 있습니다.
-
JMS : JMX 사용
-
/proc : Linux /proc/stat 조회
-
sigar : 오픈소스 sigar 라이브러리
-
ECS API : AWS ECS api
-
KUBE : 와탭 쿠버 모니터링
-
Shell : Shell 프로그램
와탭의 자바에이전트는 CPU수집 모듈중에 환경에 따라 자동으로 선택됩니다.
if (쿠버 환경) {
<KUBE>
} else if (AWS ECS) {
<ECS>
} else if ( 설정 linux_proc_stat_enabled) {
if (리눅스) {
</proc/stat>
} else {
<JMX>
}
} else if (설정 shell_perf_enabled) {
<SHELL>
} else if (설정 sigar_enabled) {
<SIGAR>
} else {
<JMX>
}
linux_proc_stat_enabled=false shell_perf_enabled=false sigar_enabled= jdk8이하?true:false
Weaving 플러그인 관리 개선
1.9.x에서는 위빙 플러그인의 버전이이나 중복 설정 여부를 체크하지 않았습니다. 2.0부터는 플러그인 별로 컴포넌트 이름과 버전이 관리됩니다.
플러그인 이름과 버전
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.10.5 Created-By: 11.0.2+9-LTS (Oracle Corporation) PlugIn: okhttp3 //플러그인 이름 Build: 001 //플러그인 빌드 버전 Agent-Version: 2.0
설치된 jar 파일에서 manifest내의 "PlugIn:" 값을 기준으로 최근 "Build"를 로딩합니다.
Reserved 플러그인
자주사용되는 위빙플러그인은 whatap.agent.jar 파일내에 임베디드되었습니다.
akka-2.5.jar axis-1.4.jar okhttp-2.7.jar okhttp3.jar play-2.7.jar reactor-rabbitmq-1.2.jar spring-rabbitmq-2.1.jar springboot-start.jar tomcat-boot.jar webflux-5.2.jar
임베디드된 다른 위빙 컴포넌트들은 weaving_reserved 옵션으로 설정할 수있습니다. ".jar"를 제외한 파일명을 설정합니다.
weaving_reserved=akka-2.5, okhttp3