트랜잭션
트랜잭션 트레이싱
트랜잭션 성능이 트랜잭션 시작과 종료 사이의 요약 지표들이나 속성들을 의미한다면 트랜잭션 트레이스는 트랜잭션이 수행되는 과정 중인 스텝들을 추적하는 것입니다. 트랜잭션이 느리거나 오류가 있다면 그 원인을 추적하기 위해서 수행 이력을 스텝별로 추적해야 합니다. 이것을 트랜잭션 트레이싱이라고 합니다.
와탭이 수집하는 스텝의 종류에는 크게 SQL 스텝, HTTP CALL 스텝, 메시지 스텝, SOCKET 오픈 스텝, DB 연결 스텝, 메소드 스텝 등이 있습니다.
와탭의 스텝(Step)은 스팬(Span)과 같은 뜻으로 사용됩니다.
-
DB 연결 스텝 START-END
RDB에 대한 연결에 대한 성능을 포함합니다. 스텝 정보에는 이름, 응답시간, 에러를 포함합니다.
-
SQL 스텝 START-END
JDBC SQL에 대한 성능을 포함합니다. 스텝 정보에는 연결 정보, SQL문, 에러가 포함되어 있습니다.
-
HTTP Call 스텝 START-END
외부 http 서비스 호출에 대한 성능을 포함합니다. 스텝 정보에는 url, host, port, 응답시간, 에러가 포함됩니다.
-
Message 스텝 ADD
트레이스를 수집하는 과정에서 비정형적인 모든 구간에 대한 이력을 수집할 때 메시지 스텝을 사용합니다.
-
SOCKET 스텝 ADD
Socket 오픈을 표현하는 스텝입니다.
-
METHOD 스텝 START-END
메소드 응답시간을 추적합니다.
-
ACTIVE STACK 스텝 START-END
액티브 스택에 대한 정보를 포함합니다. 별도 스레드가 생성하여 트레이스에 추가하는 방식으로 수집합니다.
-
profile_step_normal_count Int
기본값
1000
트랜잭션 트레이스의 기본 스텝 수를 지정합니다.
-
profile_step_heavy_count Int
기본값
1020
트레이스 기본 스텝을 초과한 경우, 최대 heavy 스텝 수를 제한합니다.
profile_step_normal_count
에서profile_step_heavy_time
을 초과하는 스텝을 카운팅 합니다. 응답시간이 없는 스텝들은 수집되지 않습니다. -
profile_step_max_count Int
기본값
1024
트레이스 스텝의 최대 수를 설정합니다. 수집된 트레이스 스텝 수가 이 값을 초과하면 이후 수집되는 스텝들은 모두 버려집니다.
profile_step_heavy_count
을 최대 1000으로 설정하면profile_step_max_count
만큼 액티브 스택이 수집됩니다. -
profile_step_heavy_time MiliSecond
기본값
100
Heavy 스텝의 기준을 지정합니다. 지정된 값보다 수행 시간이 긴 경우
profile_step_normal_count
를 초과하는 경우라도profile_step_heavy_count
이내에서 기록됩니다. -
profile_basetime MiliSecond
기본값
500
트랜잭션이 설정값 이하 시간 내에 종료된 경우 트레이스 정보를 수집하지 않습니다. 단 5분 단위로 최초 호출된 URL, 에러가 발생한 트랜잭션에 대한 트레이스 정보는 수집됩니다.
-
query_string_enabled Boolean
기본값
false
트랜잭션 URL의 쿼리 스트링을 함께 수집하는 기능을 활성화합니다.
-
query_string_urls String
트랜잭션에서 쿼리 스트링을 수집할 URL들을 등록합니다. 여러 개를 등록할 때는 콤마(,)를 사용합니다.
-
hook_method_patterns String
특정 메소드의 응답시간을 측정하고 싶을 때 사용합니다.
[MODULE_NAME]:[CLASS_NAME].[FUNCTION_NAME]
혹은[MODULE_NAME]:[FUNCTION_NAME]
형식으로 값을 사용합니다. 콤마(,) 구분자를 통하여 여러 메소드 패턴을 지정할 수 있으며 모듈에 대한 전체 클래스나, 클래스에 대한 전체 모듈은 asterisk(*)를 사용하여 추적이 가능합니다.노트-
이 옵션을 통해 등록한 메소드는 히트맵, 트레이스 분석 또는 트랜잭션 정보 창에서 Method 스텝으로 확인할 수 있습니다.
-
전체 모듈 추적은 오버헤드가 발생할 수 있으니 가급적 정확한 모듈명과 메소드명에 대한 사용을 권장합니다.
-
-
trace_error_callstack_depth Int
기본값
50
트랜잭션에서 에러 콜 스택을 수집할 때, 콜 스택 최대 라인수를 지정합니다. 이 데이터는 에러 통계 데이터에서 조회할 수 있습니다.
-
trace_active_callstack_depth Int
기본값
50
트랜잭션에서 액티브 스택을 수집할 때, 콜 스택 최대 라인수를 지정합니다.
-
trace_active_transaction_slow_time MiliSecond
기본값
3000
액티브 트랜잭션의 아크 이퀄라이저에서 slow 구간의 응답 기준을 지정합니다.
-
trace_active_transaction_very_slow_time MiliSecond
기본값
8000
액티브 트랜잭션의 아크 이퀄라이저에서 very slow 구간의 응답 기준을 지정합니다.
-
trace_active_transaction_lost_time MiliSecond
기본값
300000
트랜잭션의 종료를 기다리는 제한 시간입니다. 5분 안에 트랜잭션이 끝나지 않는 경우 트랜잭션을 정보를 더 이상 수집하지 않습니다.
HTTP 트랜잭션 추적
다음은 HTTP 요청 및 응답에 관련된 다양한 정보를 추적하고 기록하는 에이전트 옵션입니다. 이를 통해 사용자는 애플리케이션의 HTTP 트랜잭션을 세밀하게 모니터링하고 분석할 수 있습니다. 트랜잭션 이름에 파라미터 값을 추가하거나 특정 URL이나 HTTP 메소드를 제외할 수 있습니다. 또한 HTTP 헤더 정보와 파라미터 정보를 포함하여 트랜잭션을 보다 상세하게 기록할 수 있습니다.
-
profile_http_header_enabled Boolean
기본값
false
트레이스에 HTTP 헤더 정보를 출력합니다. 헤더 수집의 여부와 무관하게 헤더를 트레이스에 노출할 것인가에 대한 설정입니다.
-
profile_http_parameter_enabled Boolean
기본값
false
트레이스 내역에 http 파라미터 정보를 기록하려면
true
로 설정하세요. 단 파라미터는 별도 보안 키를 입력해야 조회할 수 있습니다. 보안 키는 에이전트 설치 경로의 paramkey.txt 파일에 6 자리로 지정합니다. paramkey.txt 가 존재하지 않는 경우 자동 생성되며 random 키가 설정됩니다. -
trace_normalize_enabled Boolean
기본값
true
트랜잭션 URL 을 파싱하여 정규화하는 기능을 활성화합니다.
노트값을
false
로 변경 시 패스 파라미터 파싱이 비활성화됩니다. 이 경우 통계 데이터의 의미가 약화됨으로 디버그 용도로만 잠시 사용하는 것이 좋습니다. -
trace_auto_normalize_enabled(*) Boolean
기본값
true
트랜잭션 URL 정규화할 때 패턴 값을 어노테이션에서 추출하여 자동으로 파싱하는 기능을 활성화합니다.
-
trace_normalize_urls String
트랜잭션 URL을 파싱하여 정규화 합니다. 호출 URL패턴을 파싱하여 패스 파라미터를 제거합니다.
노트예시,
/a/{v}/b
라고 선언하면/a/123/b
→/a/{v}/b
로 치환합니다. 여러 개를 등록할 때는 콤마(,)를 사용합니다./a/*/b
로 사용하여 특정 형식의 패스 파라미터를 제거하여 수집할 수 있습니다. -
web_static_content_extensions(*) String
기본값
js, htm, html, gif, png, jpg, css, swf, ico
스태틱 콘텐츠를 판단하는 확장자를 지정합니다. 여기에 설정된 확장자를 가진 트랜잭션들은 트레이스 추적과 카운팅이 제외됩니다.
-
trace_ignore_url_set String
트랜잭션 추적에서 제외할 URL을 설정합니다. 2개 이상의 값을 설정하려면 쉼표(,)를 구분자로 이용하세요.
노트이 옵션을 통해 등록한 URL은 히트맵, 트레이스 분석 또는 트랜잭션 정보 창에서 수집 제외됩니다.
-
trace_ignore_url_prefix String
트랜잭션 수집 예외 url prefix를 지정합니다. 지정한 값과 앞부분이 일치하는 url은 트랜잭션 성능을 수집하지 않습니다.
노트이 옵션을 통해 등록한 URL은 히트맵, 트레이스 분석 또는 트랜잭션 정보 창에서 수집 제외됩니다.
NON HTTP 트랜잭션 추적
-
트랜잭션 end-point
트랜잭션 엔드포인트는 트랜잭션의 시작 메소드입니다. HTTP 트랜잭션의 경우에는
HttpServlet.service()
혹은Filter.doFilter()
가 트랜잭션의 시작점이고 이곳을 트랜잭션 엔드 포인트라고 부릅니다. -
NON HTTP 추적
트랜잭션 엔드포인트로 지정된 메소드가 시작해서 종료될 때까지의 성능을 트랜잭션 성능이라고 합니다. Non http 트랜잭션을 추적하기 위해서는 엔드포인트를 지정해야 합니다.
노트엔드포인트 찾기
- 트랜잭션이 호출될 것으로 추정되는 모든 메소드에 대해 트레이스 추적을 설정하세요.
- 다시 시작 후 트랜잭션을 발생시켜 모니터링하세요.
back stack
옵션을 켜서 진입 메소드를 정확히 파악하세요.
대상 선정
-
메소드 트레이스 설정
메소드 트레이스를 설정하세요. 확실하게 트랜잭션에서 호출되는 클래스를 지정하세요. DB를 사용하는 프로그램에서는 JDBC 드라이버가 유용합니다.
whatap.confhook_method_patterns=jdbc.*.*
hook_method_access_public_enabled=true
hook_method_access_protected_enabled=true
hook_method_access_none_enabled=true -
트랜잭션 시작 옵션 설정
메소드가 호출되면 트랜잭션을 시작하세요. 트랜잭션 시작 옵션과 트랜잭션 시작 시 스택을 덤프하는 옵션을 켜세요.
whatap.conftrace_auto_transaction_enabled=true
trace_auto_transaction_backstack_enabled=true -
재시작 후 트레이스 분석
다시 시작하세요. 이후 서비스를 호출하면 트랜잭션이 추적되는 것을 볼 수 있습니다.
트랜잭션을 조회하면
jdbc.*
로 시작하는 모든 클래스의 메소드가 이 트랜잭션으로 나타나는 것을 알 수 있습니다. 트랜잭션 트레이스를 조회하면 TRANSACTION BACKSTACK라는 메시지 스텝을 확인할 수 있습니다.TRANSACTION BACKSTACKjdbc.FakePreparedStatement.executeQuery(FakePreparedStatement.java),
com.virtual.dao.SelectDAO.execute2(SelectDAO.java:29),
com.virtual.web.SimulaNonHttp.execute(SimulaNonHttp.java:147),
com.virtual.web.SimulaNonHttp.process(SimulaNonHttp.java:76),
com.virtual.web.SimulaNonHttp.run(SimulaNonHttp.java:100) -
스택 내용 확인
스택 내용을 확인하면 어떤 메소드로부터 출발하고 있는지 추정할 수 있습니다.
Examplecom.virtual.web.SimulaNonHttp.execute(SimulaNonHttp.java:147),
com.virtual.web.SimulaNonHttp.process(SimulaNonHttp.java:76),
com.virtual.web.SimulaNonHttp.run(SimulaNonHttp.java:100)위 3개의 메소드 중에 하나를 트랜잭션 시작점으로 판단할 수 있습니다. 이 상황에서는 역 컴파일을 수행해서 적절한 트랜잭션 엔드포인트를 결정해야 합니다.
로직을 보면
SimulaNonHttp.run
내에서while()
가 돌면서SimulaNonHttp.process()
을 호출하고SimulaNonHttp.execute()
가 수행됩니다.process()
가 적당하다는 것을 알 수 있습니다. 이 부분은 소스를 보고 판단해야 합니다.팁엔드포인트의 가장 중요한 기준은 종료되어야 한다는 것입니다. 정상적인 상황에서 지연되지 않고 곧바로 종료되어야 성능적인 판단을 할 수 있습니다.