Pour votre application Java monitorée par New Relic, une méthode d'instrumentation personnalisée consiste à utiliser un fichier XML qui répertorie les méthodes et les classes que vous souhaitez . Cette documentation montre un exemple de fichier d'instrumentation XML. Pour plus d'informations, voir Instrumentation Java par XML.
Modifier le fichier XML dans UI
Pour modifier votre fichier XML directement depuis l’UI de New Relic : accédez one.newrelic.com > All capabilities > APM & services > (select an app) > Settings > Instrumentation à. À partir d'ici vous pouvez :
- Téléchargez un exemple de fichier XML.
- Sélectionnez un fichier XML existant ou modifiez-le.
- Rechercher l'historique de l'instrumentation.
Format de fichier XML
Le format de fichier XML inclut les nœuds racine et enfants.
Prudence
N'instrumenter pas toutes vos méthodes, car cela peut entraîner un problème de regroupement métrique.
Le nœud racine d’un fichier XML est extension
. Il peut avoir trois attributs différents :
Valeur | Définition |
---|---|
| Un nom unique mais descriptif identifiant votre extension XML. |
| Identifie si l'extension sera lue par l'agent Java. La valeur par défaut est |
| La version de l'extension. Si deux extensions ont le même nom, seule l'extension avec la version la plus élevée sera utilisée. |
Le nœud instrumentation
est un enfant de extension
. Il peut avoir un attribut : metricPrefix
. Il s'agit du préfixe utilisé pour les noms métriques lorsque le nœud nameTransaction
n'est pas spécifié. La valeur par défaut est CUSTOM
.
Le pointcut
est un nœud enfant de instrumentation
et peut avoir plusieurs attributs. De plus, un pointcut
peut avoir plusieurs nœuds enfants différents.
Valeur | Définition |
---|---|
| Si une transaction n'est pas déjà en cours lorsque ce point de coupure est atteint, alors une transaction sera démarrée. Si une transaction est déjà en cours, cette transaction continuera. Une nouvelle transaction ne sera pas créée. |
| Le format de nom à utiliser pour une métrique. S'il n'est pas présent, la valeur par défaut sera le nom de la classe suivi du nom de la méthode. Vous ne pouvez définir le |
| Lorsque |
| Lorsque |
| Définit le type de transaction. Les valeurs possibles sont |
Un pointcut
peut avoir plusieurs nœuds enfants différents :
Valeur | Définition |
---|---|
| Si cet élément est présent, l'agent nommera la transaction en utilisant le nom de la classe et la ou les méthodes instrumentées par ce pointcut. |
| Le nom complet sensible à la casse d'une classe d'annotation, y compris le nom du package. Toutes les méthodes marquées avec cette annotation seront mises en correspondance. |
| Le nom sensible à la casse de la classe à faire correspondre, y compris le nom du package. Associez ce nœud au nœud de méthode. Si ce nœud est présent sur un point de coupe, alors le nœud Le nœud Le
|
| Le nom sensible à la casse d'une interface, y compris le nom du package, dont les classes d'implémentation seront mises en correspondance. Associez ce nœud au nœud de méthode. Si ce nœud est présent sur un point de coupe, alors le nœud Le |
| Une méthode sur la classe pour instrument. Associez ce nœud à un nœud |
| Le nom de la classe, y compris le package, au format utilisé dans le bytecode, par exemple Toutes les méthodes qui renvoient un objet de cette classe seront mises en correspondance. |
| Un booléen indiquant s'il faut faire correspondre les lambdas. Le nœud
|
Le nœud method
peut avoir plusieurs enfants. Pour plus d'informations et d'exemples, voir dépannage Java instrumentation personnalisée.
Valeur | Définition |
---|---|
| Le nom exact, sensible à la casse, de la méthode à faire correspondre. Un nœud de méthode
|
| Les types de paramètres de la méthode spécifiés dans l'ordre. Si l'élément Un nœud de méthode
|
| Le nom sensible à la casse d'une classe indiquant un type de retour à faire correspondre. Toutes les méthodes qui renvoient ce type de classe seront mises en correspondance. |
Exemple
Voici un exemple de classe et un fichier XML qui pourraient être utilisés pour instrumenter cette 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>
Le premier bloc du fichier XML spécifie le nom et la version de l'extension. Comme l'extension XML par défaut est enabled
, cet attribut n'est pas spécifié.
Le deuxième bloc spécifie les méthodes dans SampleClass
qui doivent être instrumentées. Une transaction est démarrée au début du bloc. Il convient de noter que dans la classe d'exemple, il existe deux méthodes qui partagent un nom (getFirst
) mais ont des signatures différentes. Ceux-ci sont instrumentés avec un seul nœud de méthode. En supprimant le nœud parameters
, toutes les méthodes portant le même nom peuvent être associées sous un seul nœud de méthode.
Dans le troisième bloc, les méthodes spécifiées n’ont pas de transaction démarrée sur elles. C'est parce que la transaction a déjà été démarrée dans run
. La transaction ne sera pas ignorée et sera incluse dans la trace de transaction.