L'API de l'agent Java New Relic vous permet de configurer une instrumentation personnalisée pour votre application Java. Ce document montre un exemple d’utilisation d’une instrumentation personnalisée avec annotation dans une application imaginaire.
Important
Pour de meilleurs résultats lors de l'utilisation de l'API, assurez-vous de disposer de la dernière version agent Java .
Exemple d'application complète utilisant l'API
Vous trouverez ci-dessous un exemple de servlet d'application de magasin imaginaire utilisant l'API de l'agent Java.
Conseil
Si vous copiez et collez un exemple de code, assurez-vous d'utiliser un espacement approprié sur votre ligne de commande.
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);
}
}
Comment l'exemple utilise l'API
Voici le même exemple d'application divisé en sections qui décrivent comment l'API est utilisée :
Cette partie de l'exemple montre les importations nécessaires pour l'exemple d'application et l'API de l'agent Java.
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;
Cette partie de l'appel d'API fournit des instructions pour instrumenter cet appel à l'aide de l'annotation de trace de New Relic : @Trace
. Toutes requests qui touchent processRequest
afficheront désormais un segment dans le graphique des appels de trace de transaction d'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);}
Cette partie de l'appel d'API indique à la transaction Web contenant une valeur storeId
d'apparaître dans la page Transactions d'APM avec le nom de transaction personnalisé que vous avez défini. Toute demande adressée à un magasin apparaîtra sous le même nom global.
private voidsaveNewRelicInfo(HttpServletRequest req) { String storeId = req.getParameter("storeId"); if (storeId != null) { // set the name of the Transaction NewRelic.setTransactionName(null, "/store"); }}
Cette partie de l'appel d'API exclut la version bêta non publique storeID
de l'impact sur le score Apdex.
if (storeId.equals("betaStore")) { // prevent the method from contributing to the Apdex score NewRelic.ignoreApdex();}
Cette partie de l'appel d'API insère des métadonnées supplémentaires dans la demande de temporisation de chargement de la page afin que la trace du navigateur puisse être liée au userId
. Il enregistre également le userId
comme paramètre personnalisé sur la transaction afin qu'il apparaisse dans les détails des paramètres d'une trace de transaction. (Le timing de chargement des pages est parfois appelé monitoring des utilisateurs réels ou 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); }
Cette partie de l'appel d'API enregistre le nombre de fois qu'une promotion a été vue afin que les métriques puissent apparaître sur un dashboard personnalisé.
Important
Pour les métriques que vous souhaitez représenter graphiquement dans un dashboard personnalisé, assurez-vous de préfixer Custom/
au nom de la métrique ; par exemple, Custom/Promotion
.
String promotionId = req.getParameter("promotionId"); if (promotionId != null) { // increment the metric counter for the given name NewRelic.incrementCounter("Custom/Promotion"); }
Cette partie de l'appel d'API envoie un ensemble d'instructions au gestionnaire pour traiter requests et gérer les exceptions.
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 {
Cette partie de l'appel d'API définit ce qu'il faut inclure dans le HttpServletResponse
. Pour instrumentation manuelle de pour monitorer le temps de chargement des pages (parfois appelé monitoring des utilisateurs réels ou RUM) :
Définissez l'en-tête après le <head> tag.
Définissez le pied de page à la fin du <body> tag.
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();}
Cette partie de l'appel d'API définit les informations restantes à inclure dans la réponse 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); }}