본문으로 건너뛰기

트랜잭션

노트

트랜잭션에 대한 자세한 내용은 다음 문서를 참조하세요. 예를 들어 히트맵을 활용한 트랜잭션 분석 안내는 하위 메뉴인 다음 문서를 참조하세요.

트랜잭션 트레이싱

트랜잭션 성능이 트랜잭션 시작과 종료 사이의 요약 지표들이나 속성들을 의미한다면 트랜잭션 트레이스는 트랜잭션이 수행되는 과정 중인 스텝들을 추적하는 것입니다. 트랜잭션이 느리거나 오류가 있다면 그 원인을 추적하기 위해서 수행 이력을 스텝별로 추적해야 합니다. 이것을 트랜잭션 트레이싱이라고 합니다.

와탭이 수집하는 스텝의 종류에는 크게 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(*)를 사용하여 추적이 가능합니다.

    노트

    전체 모듈 추적은 오버헤드가 발생할 수 있으니 가급적 정확한 모듈명과 메소드명에 대한 사용을 권장합니다.

  • 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 트랜잭션 추적

  • 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개 이상의 값을 설정하려면 쉼표(,)를 구분자로 이용하세요.

  • trace_ignore_url_prefix String

    트랜잭션 수집 예외 url prefix를 지정합니다. 지정한 값과 앞부분이 일치하는 url은 트랜잭션 성능을 수집하지 않습니다.

NON HTTP 트랜잭션 추적

  • 트랜잭션 end-point

    트랜잭션 엔드포인트는 트랜잭션의 시작 메소드입니다. HTTP 트랜잭션의 경우에는 HttpServlet.service() 혹은 Filter.doFilter()가 트랜잭션의 시작점이고 이곳을 트랜잭션 엔드 포인트라고 부릅니다.

  • NON HTTP 추적

    트랜잭션 엔드포인트로 지정된 메소드가 시작해서 종료될 때까지의 성능을 트랜잭션 성능이라고 합니다. Non http 트랜잭션을 추적하기 위해서는 엔드포인트를 지정해야 합니다.

    노트

    엔드포인트 찾기

    1. 트랜잭션이 호출될 것으로 추정되는 모든 메소드에 대해 트레이스 추적을 설정하세요.
    2. 다시 시작 후 트랜잭션을 발생시켜 모니터링하세요.
    3. back stack 옵션을 켜서 진입 메소드를 정확히 파악하세요.

대상 선정

  1. 메소드 트레이스 설정

    메소드 트레이스를 설정하세요. 확실하게 트랜잭션에서 호출되는 클래스를 지정하세요. DB를 사용하는 프로그램에서는 JDBC 드라이버가 유용합니다.

    whatap.conf
    hook_method_patterns=jdbc.*.*
    hook_method_access_public_enabled=true
    hook_method_access_protected_enabled=true
    hook_method_access_none_enabled=true
  2. 트랜잭션 시작 옵션 설정

    메소드가 호출되면 트랜잭션을 시작하세요. 트랜잭션 시작 옵션과 트랜잭션 시작 시 스택을 덤프하는 옵션을 켜세요.

    whatap.conf
    trace_auto_transaction_enabled=true
    trace_auto_transaction_backstack_enabled=true
  3. 재시작 후 트레이스 분석

    다시 시작하세요. 이후 서비스를 호출하면 트랜잭션이 추적되는 것을 볼 수 있습니다.

    트랜잭션을 조회하면 jdbc.*로 시작하는 모든 클래스의 메소드가 이 트랜잭션으로 나타나는 것을 알 수 있습니다. 트랜잭션 트레이스를 조회하면 TRANSACTION BACKSTACK라는 메시지 스텝을 확인할 수 있습니다.

    TRANSACTION BACKSTACK
    jdbc.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)
  4. 스택 내용 확인

    스택 내용을 확인하면 어떤 메소드로부터 출발하고 있는지 추정할 수 있습니다.

    Example
    com.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()가 적당하다는 것을 알 수 있습니다. 이 부분은 소스를 보고 판단해야 합니다.

    엔드포인트의 가장 중요한 기준은 종료되어야 한다는 것입니다. 정상적인 상황에서 지연되지 않고 곧바로 종료되어야 성능적인 판단을 할 수 있습니다.

트랜잭션 END POINT 지정

  1. 트랜잭션 시작 지점을 다음과 같이 설정하세요.

    whatap.conf
    hook_service_patterns=com.virtual.web.SimulaNonHttp.process
  2. 애플리케이션을 다시 시작하세요.

process() 메소드가 새로운 트랜잭션의 엔드포인트가 됩니다.

노트

hook_service_patterns 옵션은 와일드카드 문자를 사용할 수 없으며, 2개 이상의 값을 설정하려면 쉼표(,)를 구분자로 이용하세요.

트랜잭션 이름 정의

일반적으로 메소드 명칭으로 트랜잭션을 구분할 수 있습니다.

whatap.conf
service_name_mode=[full,class,method,string,arg]
service_name_index=0
  • service_name_mode

    full, class, method, string, arg 5가지 옵션을 지정할 수 있습니다.

    • full: Full Class 이름을 서비스 명으로 사용합니다.

    • class: Class 이름을 서비스 명으로 사용합니다.

    • method: Method 이름을 서비스명으로 사용합니다.

    • string: 문자열 중에서 첫 번째 파라미터를 서비스 명으로 사용합니다.

    • arg: 파라미터 중에서 service_name_index 옵션에 지정한 인덱스에 파라미터를 서비스 명으로 사용합니다.

멀티 트랜잭션 추적

  • mtrace_rate Percentage

    기본값 0

    최초 트랜잭션이 발생할 때 발급받는 MTID(Multi Transaction ID)의 발급 비율을 설정하는 옵션입니다. MTID를 추적하면 등록된 모든 애플리케이션 간의 호출을 확인할 수 있습니다. 같은 프로젝트에 속한 애플리케이션은 Caller & Callee 기능을 통해 트랜잭션 트레이스를 바로 확인할 수 있습니다.

  • mtrace_spec String

    기본값 v1

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

  • mtrace_send_url_length Integer

    기본값 80

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