New Relic Java agent 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 コールのこの部分は、設定したカスタム トランザクション名で APM のTransactionsページに表示されるように、 storeId
値を含むウェブサイトに指示します。 1 つのストアへのリクエストは、同じ集合名で表示されます。
private voidsaveNewRelicInfo(HttpServletRequest req) { String storeId = req.getParameter("storeId"); if (storeId != null) { // set the name of the Transaction NewRelic.setTransactionName(null, "/store"); }}
API 呼び出しのこの部分は、非公開ベータ版storeID
がApdex スコアに影響を与えないようにします。
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); }}