La API New Relic agente de Java le permite configurar instrumentación personalizada para su aplicación Java. Este documento muestra un ejemplo del uso de instrumentación personalizada con anotaciones en una aplicación imaginaria.
Importante
Para obtener mejores resultados al utilizar la API, asegúrese de tener la última versión del agente de Java.
Aplicación de ejemplo completa usando API
A continuación se muestra un ejemplo del servlet de una aplicación de tienda imaginaria que utiliza la API del agente de Java.
Sugerencia
Si copia y pega código de ejemplo, asegúrese de utilizar el espacio adecuado en su línea de comando.
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);
}
}
Cómo utiliza el ejemplo la API
Aquí está la misma aplicación de ejemplo dividida en secciones que describen cómo se usa la API:
Esta parte del ejemplo muestra las importaciones necesarias para la aplicación de ejemplo y la API del agente de 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;
Esta parte de la llamada API proporciona instrucciones para instrumentar esta llamada utilizando la anotación traza @Trace
de New Relic. Cualquier solicitud que llegue a processRequest
ahora mostrará un segmento en el gráfico de llamadas de traza de la transacción de 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);}
Esta parte de la llamada API indica a la transacción web que contiene un valor storeId
que aparezca en la páginaTransactions de APM con el nombre de transacción personalizado que configuró. Una solicitud a cualquier tienda aparecerá bajo el mismo nombre agregado.
private voidsaveNewRelicInfo(HttpServletRequest req) { String storeId = req.getParameter("storeId"); if (storeId != null) { // set the name of the Transaction NewRelic.setTransactionName(null, "/store"); }}
Esta parte de la llamada API excluye que la versión beta no pública storeID
afecte la puntuación Apdex.
if (storeId.equals("betaStore")) { // prevent the method from contributing to the Apdex score NewRelic.ignoreApdex();}
Esta parte de la llamada API inserta metadatos adicionales en la solicitud de tiempo de carga de la página para que las trazas del navegador puedan vincularse con userId
. También registra el userId
como parámetro personalizado en la transacción para que aparezca en los detalles del parámetro de una traza de la transacción. (El tiempo de carga de la página a veces se denomina monitoreo de usuarios reales o 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); }
Esta parte de la llamada API registra la cantidad de veces que se vio una promoción para que la métrica pueda aparecer en un tablero personalizado.
Importante
Para las métricas que desea graficar en el panel personalizado, asegúrese de anteponer Custom/
al nombre de la métrica; por ejemplo, Custom/Promotion
.
String promotionId = req.getParameter("promotionId"); if (promotionId != null) { // increment the metric counter for the given name NewRelic.incrementCounter("Custom/Promotion"); }
Esta parte de la llamada API envía un conjunto de instrucciones al controlador para procesar solicitudes y manejar excepciones.
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 {
Esta parte de la llamada API define qué incluir en HttpServletResponse
. Para la instrumentación manual de para monitor el tiempo de carga de la página (a veces denominado monitoreo de usuarios reales o RUM):
Establezca el encabezado después de la etiqueta <head>.
Establezca el pie de página al final de la etiqueta <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();}
Esta parte de la llamada API define la información restante que se incluirá en la respuesta 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); }}