Para su aplicación Java New Relic-monitor, un método de instrumentación personalizado es utilizar un archivo XML que enumere los métodos y clases que desea instrumentar. Esta documentación muestra un archivo de instrumentación XML de ejemplo. Para más información, consulte Instrumentación Java por XML.
Editar archivo XML en UI
Para editar su archivo XML directamente desde la UI de New Relic: vaya a one.newrelic.com > All capabilities > APM & services > (select an app) > Settings > Instrumentation. Desde aquí puedes:
- Descargue un archivo XML de muestra.
- Seleccione un archivo XML existente para editar.
- Busque en el historial de instrumentación.
Formato de archivo XML
El formato de archivo XML incluye nodos raíz y secundarios.
Advertencia
No instrumente todos sus métodos, ya que esto puede provocar un problema de agrupación métrica.
El nodo raíz de un archivo XML es extension
. Puede tener tres atributos diferentes:
Valor | Definición |
---|---|
| Un nombre único pero descriptivo que identifica su extensión XML. |
| Identifica si la extensión será leída por el agente de Java. El valor predeterminado es |
| La versión de la extensión. Si dos extensiones tienen el mismo nombre, solo se utilizará la extensión con la versión más alta. |
El nodo instrumentation
es hijo de extension
. Puede tener un atributo: metricPrefix
. Este es el prefijo utilizado para los nombres métricos cuando no se especifica el nodo nameTransaction
. El valor predeterminado es CUSTOM
.
El pointcut
es un nodo hijo de instrumentation
y puede tener varios atributos. Además, un pointcut
puede tener varios nodos secundarios diferentes.
Valor | Definición |
---|---|
| Si una transacción aún no está en progreso cuando se alcanza este punto de corte, se iniciará una transacción. Si una transacción ya está en curso, esa transacción continuará. No se creará una nueva transacción. |
| El formato de nombre que se utilizará para una métrica. Si no está presente, el valor predeterminado será el nombre de la clase seguido del nombre del método. Solo puede configurar el |
| Cuando |
| Cuando |
| Establece el tipo de transacción. Los valores posibles son |
Un pointcut
puede tener varios nodos secundarios diferentes:
Valor | Definición |
---|---|
| Si este elemento está presente, el agente nombrará la transacción utilizando el nombre de la clase y los métodos instrumentados por este punto. |
| El nombre completo que distingue entre mayúsculas y minúsculas de una clase de anotación, incluido el nombre del paquete. Todos los métodos marcados con esta anotación coincidirán. |
| El nombre que distingue entre mayúsculas y minúsculas de la clase que debe coincidir, incluido el nombre del paquete. Empareje este nodo con el nodo de método. Si este nodo está presente en un punto de corte, entonces el nodo El nodo El
|
| El nombre que distingue entre mayúsculas y minúsculas de una interfaz, incluido el nombre del paquete, cuyas clases de implementación coincidirán. Empareje este nodo con el nodo de método. Si este nodo está presente en un punto de corte, entonces el nodo El |
| Un método sobre la clase de instrumento. Empareje este nodo con un nodo |
| El nombre de la clase, incluido el paquete, en el formato utilizado en el código de bytes, por ejemplo Todos los métodos que devuelvan un objeto de esa clase coincidirán. |
| Un booleano que indica si se deben hacer coincidir lambdas. El nodo
|
El nodo method
puede tener varios hijos. Para obtener más información y ejemplos, consulte resolución de problemas de instrumentación personalizada de Java.
Valor | Definición |
---|---|
| El nombre exacto, que distingue entre mayúsculas y minúsculas, del método que debe coincidir. Un nodo del método
|
| Los tipos de parámetros del método especificados en orden. Si el elemento Un nodo del método
|
| El nombre de una clase que distingue entre mayúsculas y minúsculas y que indica un tipo de valor devuelto que debe coincidir. Todos los métodos que devuelvan este tipo de clase coincidirán. |
Ejemplo
Aquí hay una clase de muestra y un archivo XML que podría usarse para instrumentar esa clase.
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>
El primer bloque del archivo XML especifica el nombre y la versión de la extensión. Como la extensión XML es la predeterminada enabled
, ese atributo no se especifica.
El segundo bloque especifica los métodos en SampleClass
que deben instrumentarse. Se inicia una transacción al comienzo del bloque. Vale la pena señalar que en la clase de ejemplo, hay dos métodos que comparten un nombre (getFirst
) pero tienen firmas diferentes. Estos están instrumentados con un único nodo de método. Al eliminar el nodo parameters
, todos los métodos con el mismo nombre pueden coincidir en un nodo de método.
En el tercer bloque, los métodos especificados no tienen una transacción iniciada en ellos. Esto se debe a que la transacción ya se inició en run
. La transacción no será ignorada y se incluirá en la traza de la transacción.