트랜잭션 end-point 설정

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

NON HTTP 추적

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

여기서는 알 수 없는 end-point를 찾는 과정은 다음과 같습니다.

  1. 트랜잭션이 호출될 것으로 추정되는 모든 메소드에 대해 프로파일 추적을 설정합니다.

  2. 다시 시작후 트랜잭션을 일으켜서 모니터링합니다.

  3. back stack 옵션을 켜서 진입 메소드를 정확히 파악합니다.

대상 선정

일단 메소드 프로파일을 설정합니다. 하지만 해당 클래스들이 잠재적인 트랜잭션 end point보다는 확실하게 트랜잭션에서 호출되는 클래스를 지정합니다. 그래서 DB를 사용하는 프로그램에서는 JDBC 드라이버가 일반적으로 유용합니다.

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
어느 메소드이건 호출되면 트랜잭션을 시작시킵니다. 옵션과 트랜잭션 시작 시 스택을 덤프하는 옵션을 켭니다.(whatap.conf)
trace_auto_transaction_enabled=true
trace_auto_transaction_backstack_enabled=true

다시 시작하고 서비스를 호출하면 트랜잭션이 추적되는 것을 볼 수 있습니다. 트랜잭션들을 조회해 보면 모든 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)

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

예제
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개의 메소드 중에 하나를 트랜잭션 시작점으로 판단하면 됩니다. 이 정도 상황에서는 역 컴파일을 수행해서 적절한 트랜잭션 end point를 결정해야 합니다.

로직을 간단히 보면 SimulaNonHttp.run 내에서 while()가 돌면서 SimulaNonHttp.process()을 호출하고 SimulaNonHttp.execute()가 수행됩니다. process()가 적당하다는 것을 알 수 있습니다. (이 부분은 소스를 보고 판단해야 합니다.)
end point의 가장 중요한 기준은 종료되어야 한다는 것입니다. 정상적인 상황에서 지연되지 않고 곧바로 종료되어야 성능적인 판단을 할 수 있습니다.

트랜잭션 END POINT 지정

트랜잭션 시작 지점을 아래와 같이 설정합니다.

hook_service_patterns=com.virtual.web.SimulaNonHttp.process

다시 시작하면 process() 메소드가 새로운 트랜잭션의 end point가 됩니다.

트랜잭션 이름 정의

보통의 경우에는 메소드 명칭으로 충분히 트랜잭션을 구분할 수 있습니다.

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옵션에 지정한 인덱스에 파라미터를 서비스 명으로 사용

플러그인 사용은 충분히 이해한 경우에만 사용하길 권장합니다.

플러그인 사용

WHATAP_HOME 디렉토리 아래에 plugin 디렉토리를 만듭니다. 그리고 vi를 통해 AppServiceStart.x 파일을 만듭니다.

app start plug

그리고는 println(“test”);라고 타이핑하고 저장하면 화면에 “test”라는 문자열이 출력되는 것을 확인할 수 있습니다. 그러면 파라미터에서 정보를 추출해 봅니다.

본 예제에는 파라미터에 HashMap에 전달되고 거기에는 url 파라미터가 전달되고 있습니다.
Object url =((java.util.HashMap)$point.getArgs()[0]).get("url");
$ctx.service((String)url);
//println(“url=“+url);

이렇게 플러그인을 만들면 트랜잭션 이름이 변경됩니다.