제니퍼 APM

다운로드 4
업데이트 2026. 7. 30.

jennifer-profile

JENNIFER 트랜잭션 하나의 호출 프로파일을 호출 순서대로 한 행씩 읽습니다. 메서드, SQL과 그 패치, 외부 호출, 에러, 그 사이의 공백(GAP)이 각각 시작 오프셋, 수행 시간, 트랜잭션 대비 비중과 함께 나옵니다. 콘솔 트랜잭션 상세의 콜 트리와 프로파일 타임라인과 같은 내용입니다. 원인 분석의 마지막 단계에 씁니다. jennifer-xview로 찾은 느리거나 실패한 트랜잭션의 domain_id, txid, collection_time, response_time을 넘기면 어느 SQL, 외부 호출, 메서드가 시간을 썼거나 에러를 냈는지 보입니다.

  • elapsed_ms는 중첩 호출을 포함하므로 METHOD 행은 자식을 덮습니다. 가장 바깥 메서드보다 가장 깊은 행이나 SQL, TX_CALL 행에서 원인을 찾으세요.
  • 큰 GAP은 프로파일되지 않은 곳(메서드 프로파일이 없는 코드, 락, 대기)에서 쓴 시간입니다. 바로 앞 행이 그 시간에 실행 중이었습니다.
  • 에러는 ERROR 행입니다. parent_no가 에러를 낸 호출이고 message에 상세 내용이 있습니다.
  • 0행이 아니라 오류가 납니다: 트랜잭션은 collection_time 주변에서 찾아야 합니다(몇 초 차이는 괜찮고 1분 차이는 안 됩니다).
jennifer-profile [profile=값] domain_id=값 txid=값 collection_time=값 [response_time=값] [limit=값]
profile=값
선택. JENNIFER 콘솔 접속 프로파일(유형 jennifer-apm-console) 이름입니다. 지정하지 않으면 권한이 있는 콘솔 프로파일을 모두 사용합니다. domain_id는 콘솔마다 다르므로 domain_id를 쓸 때는 프로파일이 하나여야 합니다. 권한이 있는 프로파일이 여럿이면 지정하세요.
domain_id=값
필수. 예: 1000. 트랜잭션의 도메인(sid)으로, jennifer-xview 행의 domain_id입니다.
txid=값
필수. 예: -2980609390376924461. jennifer-xview 행의 txid입니다.
collection_time=값
필수. 예: 1792972233338 또는 "2026-10-26 08:50:33.338". jennifer-xview 행의 collection_time으로, epoch 밀리초, yyyyMMddHHmmss[SSS], 또는 큰따옴표로 감싼 yyyy-MM-dd HH:mm:ss[.SSS]로 지정합니다. 콘솔이 이 시각 주변에서 트랜잭션을 찾으므로 몇 초 차이는 괜찮지만 1분 차이는 찾지 못합니다.
response_time=값
선택. 예: 482. jennifer-xview 행의 response_time(밀리초)으로, 콘솔 요청에 함께 실립니다. 생략하면 0입니다.
limit=값
선택. 예: 20000. 반환할 최대 행 수로, 기본값은 10000입니다. 호출 순서대로 오므로 잘리면 프로파일의 뒷부분이 빠집니다.

출력 필드

필드타입이름설명
_time날짜시작 시각예: 2026-10-26 08:50:32. 호출이 시작된 시각입니다.
profile문자열접속 프로파일예: jennifer-prod
domain_id32비트 정수도메인 ID예: 1000
txid문자열트랜잭션 ID예: -2980609390376924461
no64비트 정수프로파일 번호예: 34. 콘솔이 매긴 호출의 프로파일 번호(No.)입니다.
parent_no64비트 정수부모 번호예: 0. 이 호출을 감싸는 호출의 프로파일 번호입니다. 최상위는 null입니다.
depth32비트 정수깊이예: 1. 콜 트리의 중첩 깊이로, 최상위는 0입니다.
type문자열유형예: METHOD, SQL, FETCH, TX_CALL(외부 호출), ERROR, MESSAGE, SOCKET, FILE, BATCH, STACK_TRACE, GAP. GAP은 프로파일된 호출 사이에서 아무 프로파일도 덮지 않는 시간(계측되지 않은 코드나 대기)이며 1ms 이상만 반환합니다.
name문자열이름예: javax.servlet.http.HttpServlet.service(ServletRequest,ServletResponse): void, SELECT ... FROM orders WHERE id = ?, EXTERNAL-CALL [HTTPS] URL_CONNECTION (url=https://...). 메서드, SQL(리터럴은 # 또는 ?), 외부 호출, 에러입니다.
start_ms64비트 정수시작 오프셋예: 47. 트랜잭션 시작부터의 밀리초입니다.
elapsed_ms64비트 정수수행 시간예: 112. 중첩 호출을 포함한 호출의 수행 밀리초입니다. 시간이 없는 유형(MESSAGE, FETCH, ERROR)은 null입니다.
share실수비중예: 23.24. 최상위 호출 시간 대비 elapsed_ms의 백분율입니다(콜 트리의 시간 막대).
cpu_ms64비트 정수CPU 시간예: 1. 밀리초입니다. 측정하지 않았으면 null입니다.
parameters문자열파라미터예: 1,alice. SQL의 바인드·인라인 값, 또는 프로파일된 메서드의 파라미터입니다.
message문자열메시지예: Connection refused. 에러의 상세 메시지 또는 다른 유형의 상세 내용입니다.
error불리언에러예: true. ERROR 행이거나 바로 아래 자식에 ERROR가 있습니다(콘솔의 빨간 표시).
receiver_domain_id64비트 정수수신 도메인예: 1001. 모니터링하는 다른 서비스로의 외부 호출이면 그 도메인입니다. 아니면 null입니다.
receiver_instance_id64비트 정수수신 인스턴스예: 75600. 모니터링하는 다른 서비스로의 외부 호출이면 그 인스턴스(oid)입니다. 아니면 null입니다.

사용 예

먼저 jennifer-xview로 트랜잭션을 고르고(여기서는 최근 10분 중 가장 느린 것) 그 행의 domain_id, txid, collection_time, response_time을 가져옵니다:

jennifer-xview domain_id=1000 duration=10m | sort limit=1 -response_time | fields domain_id, txid, collection_time, response_time, application

그 트랜잭션에서 가장 느린 SQL과 외부 호출 찾기:

jennifer-profile domain_id=1000 txid=-2980609390376924461 collection_time=1792972233338 response_time=482 | search type == "SQL" or type == "TX_CALL" | sort limit=10 -elapsed_ms | fields no, type, name, start_ms, elapsed_ms, share, parameters

GAP을 뺀 콜 트리:

jennifer-profile domain_id=1000 txid=-2980609390376924461 collection_time="2026-10-26 08:50:33.338" | search type != "GAP" | fields no, depth, type, name, start_ms, elapsed_ms, share

같은 SQL의 반복(N+1 쿼리) 집계:

jennifer-profile domain_id=1000 txid=-2980609390376924461 collection_time=1792972233338 | search type == "SQL" | stats count, sum(elapsed_ms) as total_ms, max(elapsed_ms) as max_ms by name | sort -total_ms

에러와 에러를 낸 호출:

jennifer-profile domain_id=1000 txid=-2980609390376924461 collection_time=1792972233338 | search error == true | fields no, parent_no, type, name, message