프로브 개념
JProfiler에 대한 사용자 정의 프로브를 개발하려면 몇 가지 기본 개념과 용어를 알고 있어야 합니다. JProfiler의 모든 프로브의 공통 기반은 특정 메소드를 가로채고 가로챈 메소드 매개변수 및 기타 데이터 소스를 사용하여 JProfiler UI에서 보고 싶은 흥미로운 정보를 포함하는 문자열을 생성하는 것입니다.
프로브를 정의할 때 초기 문제는 가로챈 메소드를 지정하고 문자열을 생성하기 위해 메소드 매개변수 및 기타 관련 객체를 사용할 수 있는 환경을 얻는 방법입니다. JProfiler에서는 이를 수행하는 세 가지 방법이 있습니다:
- 스크립트 프로브는 JProfiler UI에서 완전히 정의됩니다. 호출 트리에서 메소드에 오른쪽 클릭하여 스크립트 프로브 작업을 선택하고 내장된 코드 편집기에서 문자열에 대한 표현식을 입력할 수 있습니다. 이는 프로브를 실험하는 데 유용하지만 사용자 정의 프로브의 기능 중 매우 제한된 부분만 노출합니다.
- 임베디드 프로브 API는 사용자 코드에서 호출할 수 있습니다. 라이브러리, 데이터베이스 드라이버 또는 서버를 작성하는 경우 제품과 함께 프로브를 제공할 수 있습니다. JProfiler로 제품을 프로파일링하는 사람은 JProfiler UI에 자동으로 프로브가 추가됩니다.
- 인젝티드 프로브 API를 사용하여 IDE에서 타사 소프트웨어에 대한 프로브를 작성할 수 있으며, JProfiler의 프로브 시스템의 전체 기능을 사용할 수 있습니다. API는 주석을 사용하여 인터셉션을 정의하고 메소드 매개변수 및 기타 유용한 객체를 주입합니다.
다음 질문은: JProfiler가 생성한 문자열로 무엇을 해야 하는가입니다. 두 가지 다른 전략이 있습니다: 페이로드 생성 또는 호출 트리 분할.
페이로드 생성
프로브에 의해 생성된 문자열은 프로브 이벤트를 생성하는 데 사용할 수 있습니다. 이벤트는 해당 문자열로 설정된 설명과 가로챈 메소드의 호출 시간과 동일한 지속 시간, 그리고 관련 호출 스택을 가집니다. 해당 호출 스택에서 프로브 설명과 타이밍이 누적되어 호출 트리에 페이로드로 저장됩니다. 이벤트는 일정 최대 수 이후에 통합되지만, 호출 트리의 누적된 페이로드는 전체 녹화 기간 동안의 총 수치를 보여줍니다. CPU 데이터와 프로브가 모두 녹화되면, 프로브 호출 트리 뷰는 페이로드 문자열을 리프 노드로 사용하여 병합된 호출 스택을 보여주고, CPU 호출 트리 뷰는 프로브 호출 트리 뷰로의 주석 링크를 포함합니다.
CPU 데이터와 마찬가지로 페이로드는 호출 트리 또는 핫스팟 뷰에서 표시될 수 있습니다. 핫스팟은 대부분의 소모된 시간에 책임이 있는 페이로드를 보여주고, 백 트레이스는 이러한 페이로드를 생성하는 코드의 부분을 보여줍니다. 좋은 핫스팟 목록을 얻으려면 페이로드 문자열에 고유 ID나 타임스탬프가 포함되지 않아야 합니다. 모든 페이로드 문자열이 다르면 누적이 없고 핫스팟의 명확한 분포가 없기 때문입니다. 예를 들어, 준비된 JDBC 문장의 경우 매개변수를 페이로드 문자열에 포함해서는 안 됩니다.
스크립트 프로브는 구성된 스크립트의 반환 값에서 자동으로 페이로드를 생성합니다. 인젝티드 프로브는 유사하게
PayloadInterception
으로 주석이 달린 인터셉션 핸들러 메소드에서 문자열 또는 고급 기능을 위한 Payload
객체로 페이로드 설명을
반환합니다.
반면 임베디드 프로브는 Payload.exit
를 호출하여 페이로드 설명을 인수로 사용하여 페이로드를 생성하며,
Payload.enter
와 Payload.exit
사이의 시간이 프로브 이벤트 지속 시간으로 기록됩니다.
페이로드 생성은 서로 다른 호출 사이트에서 발생하는 서비스 호출을 기록할 때 가장 유용합니다. 일반적인 예는 데이터베이스 드라이버로, 페이로드 문자열은 쿼리 문자열 또는 명령의 형태입니다. 프로브는 작업이 측정되는 호출 사이트의 관점을 취하며, 이 작업은 다른 소프트웨어 구성 요소에 의해 수행됩니다.
호출 트리 분할
프로브는 실행 사이트의 관점을 취할 수도 있습니다. 이 경우 가로챈 메소드가 어떻게 호출되는지는 중요하지 않으며, 오히려 그 후에 어떤 메소드 호출이 실행되는지가 중요합니다. 일반적인 예는 추출된 문자열이 URL인 서블릿 컨테이너에 대한 프로브입니다.
페이로드를 생성하는 것보다 더 중요한 것은 프로브에 의해 생성된 각 고유 문자열에 대해 호출 트리를 분할할 수 있는 능력입니다. 각 문자열에 대해 호출 트리에 분할 노드가 삽입되어 모든 관련 호출의 누적 호출 트리를 포함합니다. 그렇지 않으면 하나의 누적 호출 트리만 있을 것이지만, 이제는 호출 트리를 서로 다른 부분으로 세분화하여 개별적으로 분석할 수 있는 분할 노드 집합이 있습니다.
여러 프로브는 중첩된 분할을 생성할 수 있습니다. 단일 프로브는 기본적으로 하나의 분할 수준만 생성하며, 스크립트 프로브에서는 지원되지 않는 재진입 가능으로 구성되지 않는 한 그렇습니다.
JProfiler UI에서 호출 트리 분할은 스크립트 프로브 기능과 번들로 제공되지 않으며, "메소드 분할"이라는
별도의 기능입니다. 이들은 페이로드를 생성하지 않고 호출 트리만 분할하므로 이름과 설명이 있는 프로브 뷰가 필요하지
않습니다.
인젝티드 프로브는 SplitInterception
으로 주석이 달린 인터셉션 핸들러 메소드에서 분할 문자열을 반환하고,
임베디드 프로브는 분할 문자열로 Split.enter
를 호출합니다.
텔레메트리
사용자 정의 프로브에는 두 가지 기본 텔레메트리가 있습니다: 이벤트 빈도와 평균 이벤트 지속 시간. 인젝티드 및 임베디드 프로브는 프로브 구성 클래스의 주석이 달린 메소드를 통해 추가 텔레메트리를 지원합니다. JProfiler UI에서 스크립트 텔레메트리는 스크립트 프로브 기능과 독립적이며, 도구 모음의 텔레메트리 구성 버튼 아래 "텔레메트리" 섹션에서 찾을 수 있습니다.
텔레메트리 메소드는 초당 한 번씩 폴링됩니다. Telemetry
주석에서 단위와 스케일 팩터를 구성할 수 있습니다.
line
속성을 사용하여 여러 텔레메트리를 단일 텔레메트리 뷰로 결합할 수 있습니다. TelemetryFormat
의
stacked
속성을 사용하여 선을 추가하고 스택형 선 그래프로 표시할 수 있습니다. 임베디드 및 인젝티드 프로브의 텔레메트리 관련 API는
동등하지만 각각의 프로브 유형에만 적용 가능합니다.
제어 객체
때때로 프로브 이벤트를 JProfiler에서 "제어 객체"라고 하는 관련된 장기 객체에 연결하는 것이 흥미로울 수 있습니다. 예를 들어, 데이터베이스 프로브에서는 쿼리를 실행하는 물리적 연결이 그 역할을 합니다. 이러한 제어 객체는 임베디드 API와 인젝티드 프로브 API로 열고 닫을 수 있으며, 프로브 이벤트 뷰에서 해당 이벤트를 생성합니다. 프로브 이벤트가 생성될 때 제어 객체를 지정할 수 있으며, 프로브의 "제어 객체" 뷰에 표시되는 통계에 기여합니다.
제어 객체는 열릴 때 지정해야 하는 표시 이름을 가집니다. 새 제어 객체가 프로브 이벤트 생성 시 사용되면, 프로브는 구성에서 이름 해석기를 제공해야 합니다.
또한, 프로브는 열거형 클래스를 통해 사용자 정의 이벤트 유형을 정의할 수 있습니다. 프로브 이벤트가 생성될 때 이러한 유형 중 하나를 지정할 수 있으며, 이벤트 뷰에 나타나 단일 이벤트 유형을 필터링할 수 있습니다. 더 중요한 것은 시간 축에 선으로 표시된 제어 객체를 보여주는 프로브의 타임라인 뷰가 이벤트 유형에 따라 색상이 지정된다는 것입니다. 사용자 정의 이벤트 유형이 없는 프로브의 경우, 색상은 이벤트가 기록되지 않는 유휴 상태와 프로브 이벤트 지속 시간 동안의 기본 이벤트 상태를 보여줍니다. 사용자 정의 유형을 사용하면 "읽기" 및 "쓰기"와 같은 상태를 구별할 수 있습니다.
녹화
모든 프로브와 마찬가지로 사용자 정의 프로브는 기본적으로 데이터를 기록하지 않으며, 필요에 따라 녹화를 활성화하고 비활성화해야 합니다. 프로브 뷰에서 수동 시작/중지 작업을 사용할 수 있지만, 시작 시 프로브 녹화를 켜야 하는 경우가 많습니다. JProfiler는 사용자 정의 프로브를 미리 알지 못하기 때문에, 녹화 프로파일에는 모든 사용자 정의 프로브에 적용되는 사용자 정의 프로브 체크 박스가 있습니다.
마찬가지로, 프로브 녹화를 시작하고 중지하는 트리거 작업에 대해 모든 사용자 정의 프로브를 선택할 수 있습니다.
프로그래밍 방식의 녹화를 위해
Controller.startProbeRecording(Controller.PROBE_NAME_ALL_CUSTOM, ProbeRecordingOptions.EVENTS)
를 호출하여 모든 사용자 정의 프로브를 기록하거나, 보다 구체적으로 하기 위해 프로브의 클래스 이름을 전달할 수 있습니다.