Para sua aplicação Java New Relic-monitor, um método de instrumentação personalizada é usar um arquivo XML que lista os métodos e classes que você deseja instrumentar. Esta documentação mostra um exemplo de arquivo de instrumentação XML. Para mais informações, veja Instrumentação Java por XML.
Edite o arquivo XML na interface
Para editar seu arquivo XML diretamente da interface do New Relic: Vá para one.newrelic.com > All capabilities > APM & services > (select an app) > Settings > Instrumentation. A partir daqui você pode:
- Baixe um arquivo XML de amostra.
- Selecione um arquivo XML existente para edição.
- Pesquise o histórico de instrumentação.
Formato de arquivo XML
O formato de arquivo XML inclui nós raiz e filhos.
Cuidado
Não instrumente todos os seus métodos, pois isso pode levar a um problema de agrupamento métrico.
O nó raiz de um arquivo XML é extension
. Pode ter três atributos diferentes:
Valor | Definição |
---|---|
| Um nome exclusivo, mas descritivo, que identifica sua extensão XML. |
| Identifica se a extensão será lida pelo agente Java. O padrão é |
| A versão da extensão. Se duas extensões tiverem o mesmo nome, somente a extensão com a versão mais recente será usada. |
O nó instrumentation
é filho de extension
. Pode ter um atributo: metricPrefix
. Este é o prefixo utilizado para os nomes das métricas quando o nó nameTransaction
não é especificado. O padrão é CUSTOM
.
O pointcut
é um nó filho de instrumentation
e pode ter vários atributos. Além disso, um pointcut
pode ter vários nós filhos diferentes.
Valor | Definição |
---|---|
| Se uma transação ainda não estiver em andamento quando esse ponto for atingido, uma transação será iniciada. Se uma transação já estiver em andamento, então essa transação continuará. Uma nova transação não será criada. |
| O formato de nome a ser usado para uma métrica. Se não estiver presente, o padrão será o nome da classe seguido pelo nome do método. Você só pode definir |
| Quando |
| Quando |
| Define o tipo da transação. Os valores possíveis são |
Um pointcut
pode ter vários nós filhos diferentes:
Valor | Definição |
---|---|
| Se este elemento estiver presente, o agente nomeará a transação usando o nome da classe e o(s) método(s) instrumentado(s) por este pointcut. |
| O nome completo que diferencia maiúsculas de minúsculas de uma classe de anotação, incluindo o nome do pacote. Todos os métodos marcados com esta anotação serão correspondidos. |
| O nome da classe que diferencia maiúsculas de minúsculas, incluindo o nome do pacote. Emparelhe este nó com o nó do método. Se este nó estiver presente em um pointcut, então o nó O nó O
|
| O nome de uma interface que diferencia maiúsculas de minúsculas, incluindo o nome do pacote, cujas classes de implementação serão correspondidas. Emparelhe este nó com o nó do método. Se este nó estiver presente em um pointcut, então o nó O |
| Um método na classe para instrumento. Emparelhe este nó com um nó |
| O nome da classe, incluindo pacote, no formato usado no bytecode, por exemplo Todos os métodos que retornam um objeto dessa classe serão correspondidos. |
| Um booleano que indica se lambdas devem ser correspondidos. O nó
|
O nó method
pode ter vários filhos. Para obter mais informações e exemplos, consulte resolução de problemas de instrumentação Java personalizada.
Valor | Definição |
---|---|
| O nome exato que diferencia maiúsculas de minúsculas do método a ser correspondido. Um nó do método
|
| Os tipos de parâmetro do método especificados em ordem. Se o elemento Um nó de método
|
| O nome de uma classe que diferencia maiúsculas de minúsculas indicando um tipo de retorno a ser correspondido. Todos os métodos que retornam este tipo de classe serão correspondidos. |
Exemplo
Aqui está um exemplo de classe e um arquivo XML que pode ser usado para instrumentar essa classe.
package test;
import java.util.HashMap;import java.util.Map;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;
public class SampleTester {
private String configName; private Map<String, Long> maxSampleTimes;
public SampleTester(String pConfigName) { configName = pConfigName; maxSampleTimes = new HashMap<>(); }
public void checkSample(String name, long[] times) { if (times != null) { maxSampleTimes.put(name, getFirst(times)); } else { maxSampleTimes.put(name, (long) getFirst()); } }
private Long getFirst(long[] times) { return times[0]; }
private int getFirst() { return 0; }
public void printMaxRepeat(final long max) throws Exception { Runnable myRunnable = new Runnable() { public void run() { try { printMax(max); } catch (Exception e) { e.printStackTrace(); } } };
ScheduledExecutorService scheduledExecutor = Executors.newScheduledThreadPool(1); scheduledExecutor.scheduleWithFixedDelay(myRunnable, 0, 10000, TimeUnit.MILLISECONDS); }
private void printMax(long max) { System.out.println("max is " + max); }}
<?xml version="1.0" encoding="UTF-8"?><extension xmlns="https://newrelic.com/docs/java/xsd/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="newrelic-extension extension.xsd" name="customExtension" version="1.0">
<instrumentation metricPrefix="EXAMPLE"> <pointcut transactionStartPoint="true">
<!--class name is preceded by package name--> <className>test.SampleTester</className> <method> <name>checkSample</name> <parameters> <type attributeName="sampleName">java.lang.String</type> <type>long[]</type> </parameters> </method> <!--two methods with the same name but different signatures can share one node--> <method> <name>getFirst</name> </method> <method> <name>run</name> </method> </pointcut>
<pointcut transactionStartPoint="false" ignoreTransaction="false" excludeFromTransactionTrace="false" metricNameFormat="SampleTester/methods">
<className>test.SampleTester</className> <method> <name>printMaxRepeat</name> </method> <method> <name>printMax</name> </method> </pointcut>
</instrumentation></extension>
O primeiro bloco do arquivo XML especifica o nome e a versão da extensão. Como a extensão XML é padrão enabled
, esse atributo não é especificado.
O segundo bloco especifica os métodos em SampleClass
que devem ser instrumentados. Uma transação é iniciada no início do bloco. É importante notar que na classe de exemplo, existem dois métodos que compartilham um nome (getFirst
), mas possuem assinaturas diferentes. Estes são instrumentados com um único nó de método. Ao remover o nó parameters
, todos os métodos com o mesmo nome podem ser correspondidos em um nó de método.
No terceiro bloco, os métodos especificados não possuem uma transação iniciada neles. Isso ocorre porque a transação já foi iniciada em run
. A transação não será ignorada e será incluída no rastreamento da transação.