New Relic에서 모니터링하는 Java 애플리케이션의 경우 한 가지 사용자 정의 계측 방법은 계측하려는 메서드와 클래스를 나열하는 XML 파일을 사용하는 것입니다. 이 문서는 예제 XML 계측 파일을 보여줍니다. 자세한 내용 은 XML을 통한 Java 계측을 참조하세요.
UI에서 XML 파일 편집
뉴렐릭 UI 에서 직접 XML 파일을 편집하려면: one.newrelic.com > All capabilities > APM & services > (select an app) > Settings > Instrumentation로 이동하세요. 여기에서 다음을 수행할 수 있습니다.
- 샘플 XML 파일을 다운로드합니다.
- 기존 XML 파일 편집을 선택합니다.
- 계측 기록을 검색합니다.
XML 파일 형식
XML 파일 형식에는 루트 및 자식 노드가 포함됩니다.
주의
측정항목 그룹화 문제 가 발생할 수 있으므로 모든 방법을 계측하지 마십시오.
XML 파일의 루트 노드는 extension
입니다. 세 가지 다른 속성을 가질 수 있습니다.
값 | 정의 |
---|---|
| XML 확장을 식별하는 고유하지만 설명적인 이름입니다. |
| Java 에이전트에서 확장을 읽을지 여부를 식별합니다. 기본값은 |
| 확장의 버전입니다. 두 확장의 이름이 같은 경우 가장 높은 버전의 확장만 사용됩니다. |
instrumentation
노드는 extension
의 하위 노드입니다. 하나의 속성을 가질 수 있습니다: metricPrefix
. 이것은 nameTransaction
노드가 지정되지 않은 경우 메트릭 이름에 사용되는 접두사입니다. 기본값은 CUSTOM
입니다.
pointcut
은 instrumentation
의 하위 노드이며 여러 속성을 가질 수 있습니다. 또한 pointcut
에는 여러 다른 하위 노드 가 있을 수 있습니다.
값 | 정의 |
---|---|
| 이 포인트컷에 도달했을 때 트랜잭션이 아직 진행 중이 아니면 트랜잭션이 시작됩니다. 트랜잭션이 이미 진행 중이면 해당 트랜잭션이 계속됩니다. 새 트랜잭션이 생성되지 않습니다. |
| 메트릭에 사용할 이름 형식입니다. 존재하지 않으면 기본적으로 클래스 이름 뒤에 메소드 이름이 옵니다. |
| 이 pointcut이 트랜잭션을 시작하는 경우 |
|
|
| 트랜잭션의 유형을 설정합니다. 가능한 값은 |
pointcut
에는 여러 하위 노드가 있을 수 있습니다.
값 | 정의 |
---|---|
| 이 요소가 있으면 에이전트는 이 포인트컷에 의해 계측된 클래스 이름과 메서드를 사용하여 트랜잭션의 이름을 지정합니다. |
| 패키지 이름을 포함하는 주석 클래스의 대소문자를 구분하는 전체 이름입니다. 이 주석으로 표시된 모든 메서드가 일치합니다. |
| 패키지 이름을 포함하여 일치시킬 클래스의 대소문자를 구분하는 이름입니다. 이 노드를 메서드 노드와 페어링합니다. 이 노드가 pointcut에 있는 경우
|
| 구현 클래스가 일치할 패키지 이름을 포함하여 인터페이스의 대소문자 구분 이름입니다. 이 노드를 메서드 노드와 페어링합니다. 이 노드가 pointcut에 있는 경우
|
| 계측할 클래스의 메서드입니다. 이 노드를 |
| 패키지를 포함한 클래스 이름은 바이트코드에 사용되는 형식(예: 해당 클래스의 개체를 반환하는 모든 메서드가 일치합니다. |
| 람다와 일치할지 여부를 나타내는 부울입니다.
|
method
노드에는 여러 하위 항목이 있을 수 있습니다. 자세한 정보 및 예제는 Java 사용자 정의 계측 문제 해결 을 참조하십시오.
값 | 정의 |
---|---|
| 일치시킬 메소드의 정확한 대소문자를 구분하는 이름입니다. 메서드
|
| 순서대로 지정된 메소드의 매개변수 유형입니다. 메서드
|
| 일치시킬 반환 유형을 나타내는 클래스의 대소문자를 구분하는 이름입니다. 이 클래스 유형을 반환하는 모든 메서드가 일치합니다. |
예시
다음은 샘플 클래스와 해당 클래스를 계측하는 데 사용할 수 있는 XML 파일입니다.
package test;
import java.util.HashMap;import java.util.Map;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;
public class SampleTester {
private String configName; private Map<String, Long> maxSampleTimes;
public SampleTester(String pConfigName) { configName = pConfigName; maxSampleTimes = new HashMap<>(); }
public void checkSample(String name, long[] times) { if (times != null) { maxSampleTimes.put(name, getFirst(times)); } else { maxSampleTimes.put(name, (long) getFirst()); } }
private Long getFirst(long[] times) { return times[0]; }
private int getFirst() { return 0; }
public void printMaxRepeat(final long max) throws Exception { Runnable myRunnable = new Runnable() { public void run() { try { printMax(max); } catch (Exception e) { e.printStackTrace(); } } };
ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1); scheduledExecutor.scheduleWithFixedDelay(myRunnable, 0, 10000, TimeUnit.MILLISECONDS); }
private void printMax(long max) { System.out.println("max is " + max); }}
<?xml version="1.0" encoding="UTF-8"?><extension xmlns="https://newrelic.com/docs/java/xsd/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="newrelic-extension extension.xsd" name="customExtension" version="1.0">
<instrumentation metricPrefix="EXAMPLE"> <pointcut transactionStartPoint="true">
<!--class name is preceded by package name--> <className>test.SampleTester</className> <method> <name>checkSample</name> <parameters> <type attributeName="sampleName">java.lang.String</type> <type>long[]</type> </parameters> </method> <!--two methods with the same name but different signatures can share one node--> <method> <name>getFirst</name> </method> <method> <name>run</name> </method> </pointcut>
<pointcut transactionStartPoint="false" ignoreTransaction="false" excludeFromTransactionTrace="false" metricNameFormat="SampleTester/methods">
<className>test.SampleTester</className> <method> <name>printMaxRepeat</name> </method> <method> <name>printMax</name> </method> </pointcut>
</instrumentation></extension>
XML 파일의 첫 번째 블록은 확장의 이름과 버전을 지정합니다. XML 확장자는 기본 enabled
이므로 해당 속성은 지정되지 않습니다.
두 번째 블록은 계측해야 하는 SampleClass
의 메서드를 지정합니다. 블록의 시작 부분에서 트랜잭션이 시작됩니다. 예제 클래스에는 이름( getFirst
)을 공유하지만 서명이 다른 두 가지 메서드가 있다는 점은 주목할 가치가 있습니다. 이들은 단일 메소드 노드로 계측됩니다. parameters
노드를 제거하면 동일한 이름을 가진 모든 메소드가 하나의 메소드 노드에서 일치될 수 있습니다.
세 번째 블록에서 지정된 메서드에는 트랜잭션이 시작되지 않았습니다. 트랜잭션이 이미 run
에서 시작되었기 때문입니다. 트랜잭션은 무시되지 않으며 트랜잭션 추적에 포함됩니다.