A API do agente Java da New Relic permite configurar instrumentação personalizada para seu aplicativo Java. Este documento mostra um exemplo de uso de instrumentação personalizada com anotação em um aplicativo imaginário.
Importante
Para obter melhores resultados ao usar a API, certifique-se de ter a versão mais recente do agente Java.
Aplicativo de exemplo completo usando API
Abaixo está um exemplo de servlet de um aplicativo de loja imaginária usando a API do agente Java.
Dica
Se você copiar e colar o código de exemplo, certifique-se de usar o espaçamento apropriado em sua linha 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);
}
}
Como o exemplo usa a API
Aqui está o mesmo aplicativo de exemplo dividido em seções que descrevem como a API é usada:
Esta parte do exemplo mostra as importações necessárias para o aplicativo de exemplo e a API do agente 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 da chamada de API fornece instruções para instrumentar essa chamada usando a anotação trace @Trace
do New Relic. Todas as solicitações que atingirem processRequest
agora mostrarão um segmento no gráfico de chamadas de transação do 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 da chamada de API instrui a transação da web contendo um valor storeId
a aparecer na páginaTransactions do APM com o nome de transação personalizado que você definiu. Uma solicitação para qualquer loja aparecerá com o mesmo nome 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 da chamada de API exclui que o beta não público storeID
afete a pontuação Apdex.
if (storeId.equals("betaStore")) { // prevent the method from contributing to the Apdex score NewRelic.ignoreApdex();}
Esta parte da chamada de API insere metadados adicionais na solicitação de tempo de carregamento da página para que o rastreamento do browser possa ser vinculado ao userId
. Ele também registra o userId
como um parâmetro personalizado na transação para que apareça nos detalhes do parâmetro de um rastreamento da transação. (O tempo de carregamento da página às vezes é chamado de monitoramento de usuário real 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); }
Esta parte da chamada da API registra a quantidade de vezes que uma promoção foi visualizada para que a métrica possa aparecer em um dashboard personalizado.
Importante
Para métricas que você deseja representar graficamente no painel personalizado, certifique-se de acrescentar Custom/
ao nome da métrica; por exemplo, Custom/Promotion
.
String promotionId = req.getParameter("promotionId"); if (promotionId != null) { // increment the metric counter for the given name NewRelic.incrementCounter("Custom/Promotion"); }
Esta parte da chamada de API envia um conjunto de instruções ao manipulador para processar solicitações e tratar exceções.
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 da chamada de API define o que incluir no HttpServletResponse
. Para instrumentação manual de para monitor o tempo de carregamento da página (às vezes chamado de monitoramento de usuário real ou RUM):
Defina o cabeçalho após a tag <head>.
Defina o rodapé no final da tag <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 da chamada de API define as informações restantes a serem incluídas na resposta 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); }}