New Relic Java 에이전트 API를 사용하면 Java 애플리케이션에 대한 사용자 정의 계측을 설정할 수 있습니다. 이 문서는 가상 애플리케이션에서 주석과 함께 사용자 정의 계측을 사용하는 예를 보여줍니다.
중요
API를 사용할 때 최상의 결과를 얻으려면 최신 Java 에이전트 릴리스 가 있는지 확인하십시오.
API를 사용하여 완전한 예제 앱
다음은 Java 에이전트 API를 사용하는 가상 스토어 앱의 서블릿의 예입니다.
팁
예제 코드를 복사하여 붙여넣는 경우 명령줄에 적절한 간격을 사용해야 합니다.
package test;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// Java agent API imports
import com.newrelic.api.agent.NewRelic;
import com.newrelic.api.agent.Trace;
public class TestServlet extends HttpServlet {
// instrumentation via annotation
@Trace(dispatcher = true)
protected void
processRequest(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
saveNewRelicInfo(req);
doRequestWork(req);
writeResponse(resp);
}
private void saveNewRelicInfo(HttpServletRequest req) {
String storeId = req.getParameter("storeId");
if (storeId != null) {
// set the name of the Transaction
NewRelic.setTransactionName(null, "/store");
if (storeId.equals("betaStore")) {
// prevent the method from contributing to the Apdex score
NewRelic.ignoreApdex();
}
}
String userId = req.getParameter("userId");
if (userId != null) {
// Tracks the user ID to the current transaction by setting the enduser.id agent attribute
NewRelic.setUserId(userId);
// set the user name to associate with the RUM JavaScript footer
// for the current web transaction
NewRelic.setUserName(userId);
// add a key/value pair to the current transaction
NewRelic.addCustomParameter("userId", userId);
}
String promotionId = req.getParameter("promotionId");
if (promotionId != null) {
// increment the metric counter for the given name
NewRelic.incrementCounter("Custom/Promotion");
}
}
protected void
doRequestWork(HttpServletRequest req) {
try {
long millisToSleep = new Random().nextInt(5000);
Thread.sleep(millisToSleep);
// record a response time in milliseconds for the given metric name
NewRelic.recordResponseTimeMetric("Custom/RandomSleep",
millisToSleep);
} catch (InterruptedException e) {
// report a handled exception
NewRelic.noticeError(e, false);
}
}
protected void
writeResponse(HttpServletResponse resp)
throws IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head>");
// get the RUM JavaScript header for the current web transaction
out.println(NewRelic.getBrowserTimingHeader());
out.println("<title>NewRelic API example servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>API example</h1>");
// get the RUM JavaScript footer for the current web transaction
out.println(NewRelic.getBrowserTimingFooter());
out.println("</body>");
out.println("</html>");
out.close();
}
protected void doGet(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
processRequest(req, resp);
}
protected void doPost(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
processRequest(req, resp);
}
}
예제에서 API를 사용하는 방법
다음은 API 사용 방법을 설명하는 섹션으로 나누어진 동일한 예시 앱입니다.
예제의 이 부분은 예제 애플리케이션 및 Java 에이전트 API에 필요한 가져오기를 보여줍니다.
package test;
import java.io.IOException;import java.io.PrintWriter;import java.util.Random;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;// Java agent API imports import com.newrelic.api.agent.NewRelic;import com.newrelic.api.agent.Trace;
API 호출의 이 부분은 New Relic의 추적 주석 @Trace
을 사용하여 이 호출을 계측하기 위한 지침을 제공합니다. processRequest
에 도달한 모든 요청은 이제 APM의 트랜잭션 추적 호출 차트 에 세그먼트를 표시합니다.
public class TestServlet extends HttpServlet { // instrumentation via annotation @Trace(dispatcher = true) protected voidprocessRequest(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { saveNewRelicInfo(req); doRequestWork(req); writeResponse(resp);}
API 호출의 이 부분은 storeId
값이 포함된 웹 트랜잭션이 설정된 사용자 정의 트랜잭션 이름과 함께 APM의 Transactions 페이지 에 표시되도록 지시합니다. 한 매장에 대한 요청은 동일한 집계 이름으로 표시됩니다.
private voidsaveNewRelicInfo(HttpServletRequest req) { String storeId = req.getParameter("storeId"); if (storeId != null) { // set the name of the Transaction NewRelic.setTransactionName(null, "/store"); }}
API 호출의 이 부분은 Apdex 점수 에 영향을 미치는 비공개 베타 storeID
를 제외합니다.
if (storeId.equals("betaStore")) { // prevent the method from contributing to the Apdex score NewRelic.ignoreApdex();}
API 호출의 이 부분은 브라우저 트레이스가 userId
와 연결될 수 있도록 페이지 로드 타이밍 요청에 추가 메타데이터를 삽입합니다. 또한 userId
을(를) 사용자 지정 트레이스로 기록하여 이벤트에 표시되도록 합니다. (페이지 로드 타이밍을 실사용자 모니터링 또는 RUM이라고도 합니다.)
String userId = req.getParameter("userId"); if (userId != null) { // set the user name to associate with the RUM JavaScript footer // for the current web transaction NewRelic.setUserName(userId); // add a key/value pair to the current transaction NewRelic.addCustomParameter("userId", userId); }
API 호출의 이 부분은 메트릭이 사용자 정의 대시보드에 나타날 수 있도록 프로모션이 조회된 횟수를 기록합니다.
중요
맞춤 대시보드 에서 그래프로 표시하려는 측정항목의 경우 측정항목 이름 앞에 Custom/
을 추가해야 합니다. 예: Custom/Promotion
.
String promotionId = req.getParameter("promotionId"); if (promotionId != null) { // increment the metric counter for the given name NewRelic.incrementCounter("Custom/Promotion"); }
API 호출의 이 부분은 요청을 처리하고 예외를 처리하기 위해 일련의 지침을 핸들러에 보냅니다.
protected voiddoRequestWork(HttpServletRequest req) { try { long millisToSleep = new Random().nextInt(5000); Thread.sleep(millisToSleep); // record a response time in milliseconds for the given metric name NewRelic.recordResponseTimeMetric("Custom/RandomSleep",millisToSleep); } catch (InterruptedException e) { // report a handled exception NewRelic.noticeError(e, false); } }protected voidwriteResponse(HttpServletResponse resp) throws IOException {
API 호출의 이 부분은 HttpServletResponse
에 포함할 항목을 정의합니다. 수동 측정의 경우 페이지 로드 타이밍을 모니터링하기 위한 의 로그 (실사용자 모니터링 또는 RUM이라고도 함):
<head> 태그 뒤에 헤더를 설정합니다.
<body> 태그 끝에 바닥글을 설정합니다.
resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter();out.println("<html>");out.println("<head>");// get the RUM JavaScript header for the current web transactionout.println(NewRelic.getBrowserTimingHeader());out.println("<title>NewRelic API example servlet</title>");out.println("</head>");out.println("<body>");out.println("<h1>API example</h1>");// get the RUM JavaScript footer for the current web transactionout.println(NewRelic.getBrowserTimingFooter());out.println("</body>");out.println("</html>");out.close();}
API 호출의 이 부분은 HttpServletResponse
응답에 포함할 나머지 정보를 정의합니다.
protected voiddoGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { processRequest(req, resp); }protected voiddoPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException { processRequest(req, resp); }}