Cette traduction automatique est fournie pour votre commodité.
En cas d'incohérence entre la version anglaise et la version traduite, la version anglaise prévaudra. Veuillez visiter cette page pour plus d'informations.
New Relic pour Java (version agent 3.37 ou supérieure) inclut une API pour instrumenter l'activité asynchrone. Pour les frameworks pris en charge, l'agent effectue généralement un travail asynchrone automatiquement. Cependant, l'API asynchrone peut toujours être utile pour ajouter des détails. Ce document fournit des exemples d'utilisation de jeton et de segments pour instrumenter votre application.
L'agent Java API fournit deux manières de trace l'activité asynchrone :
Tokens: les jetons sont transmis entre les threads pour lier l'unité de travail asynchrone à une transaction spécifique. Ils n'effectuent aucun chronométrage directement.
Segments: Les segments sont utilisés pour mesurer un morceau arbitraire de code d'application asynchrone, pas nécessairement associé à une méthode ou à un thread. Les segments sont généralement utilisés pour suivre les appels externes qui sont terminés par un mécanisme de rappel.
jeton : Connecter des threads asynchrones
Utilisez jeton pour lier des unités de travail arbitraires qui se trouvent sur des threads séparés. Cette section décrit comment utiliser les appels liés à jeton ensemble pour instrumenter le travail asynchrone. Pour des informations détaillées sur les classes et les méthodes, consultez la Javadoc.
Pour utiliser jeton, vous devez d’abord créer le jeton, puis lier un autre appel à la transaction d’origine. Vous devez lier le jeton dès que possible dans l’autre appel. Si vous ne liez pas le jeton immédiatement, vous risquez de perdre toutes les méthodes contenant un @Trace sous l'appel que vous essayez de lier. Vous pouvez également faire expirer le jeton dans l’appel d’origine. L'agent Java va ensuite lier le travail dans l'UI de New Relic. Ces exemples illustrent comment utiliser ensemble les appels liés à jeton :
Considérez la méthode parallelStream() dans le snippet de code ci-dessous. Étant donné que certains des appels à requestItemAsync() se produiront sur un thread distinct, un jeton est créé et transmis pour relier ce travail asynchrone au thread demandeur.
/**
* Example showing multi-threaded implementation of requesting data using a parallel {@link Stream}.
.map(id ->requestItemAsync(id, token))// requestItemAsync represents an example of work being passed to another thread. The token is passed along to allow linking the work on the new thread back to the thread that the token was originally created on.
@Trace(dispatcher = true): Indique à l'agent de démarrer une transaction. Pour en savoir plus sur cette méthode, consultez la Javadoc.
getToken(): Crée le jeton qui reliera les œuvres entre elles. Pour en savoir plus sur cette méthode, consultez la Javadoc.
token.expire(): Le jeton expire. Cela permet à la transaction de se terminer. Pour en savoir plus sur cette méthode, consultez la Javadoc.
L'exemple de code suivant montre requestItemAsync, qui peut s'exécuter sur un thread distinct du thread demandeur. Pour cette raison, le jeton qui a été créé dans l'exemple de code précédent est lié à la transaction dans requestItemAsync. Notez que requestItemAsync() possède l'annotation @Trace(async=true), qui indique à l'agent de trace cette méthode si elle est liée à une transaction existante.
Une fois que parallelStream() a collecté tous les résultats, le jeton a expiré. Ceci est important car cela garantit que la transaction ne reste pas ouverte après la fin de parallelStream() .
@Trace(async =true)
privateItemrequestItemAsync(long id,Token token){
token.link();
returnrequestItem(id);
}
Les API d'appelsagent dans cet exemple sont :
@Trace(async = true): Démarre une transaction. Pour en savoir plus sur cette méthode, consultez la Javadoc.
token.link(): Lie le travail effectué dans requestItemAsync() (qui s'exécute sur un thread différent) au thread demandeur. Pour en savoir plus sur cette méthode, consultez la Javadoc.
Pour afficher les détails de trace de la transaction, accédez à : one.newrelic.com APM & services > (select an app) > Transactions > Transaction trace > Trace details.
L'activité asynchrone est représentée dans la vue en cascade trace par des segments qui se chevauchent horizontalement, dans la dimension temporelle.
Il n'est pas nécessaire de lier les méthodes qui se trouvent sur le même thread, mais cela n'aura aucun effet négatif. Il arrive souvent qu'un seul jeton puisse être partagé, comme dans l'exemple parallelStream() .
Conseil
Par défaut, une transaction peut créer un maximum de 3000 jetons et chaque jeton a un délai d'expiration par défaut de 180 s. Vous pouvez modifier l'ancienne limite avec l'option de configuration token_limit et la seconde avec l'option de configuration token_timeout . la trace des transactions qui dépassent le token_limit contiendra un attribut token_clamp . L’augmentation de l’une ou l’autre des options de configuration peut augmenter l’utilisation de la mémoire de l’agent.
Segments : activité asynchrone arbitraire dans le temps
Les segments sont utilisés pour mesurer un morceau arbitraire de code d'application asynchrone, pas nécessairement associé à une méthode ou à un thread. Cette méthode est généralement utilisée pour chronométrer les connexions à des services externes. Utilisez des segments si vous souhaitez :
Code temporel qui se termine via un rappel
Chronométrer un appel asynchrone qui s'étend sur plusieurs méthodes
Mesurer le temps entre le moment où le travail est créé et celui où il est exécuté (par exemple, dans un pool de threads)
La méthode ci-dessous effectue un appel à un service externe (dans ce cas une base de données) en utilisant la méthode storeItem():
/**
* Example showing single threaded implementation of inserting data into a datasource.
L'objectif dans ce cas est de déterminer combien de temps le Callable dans l'instruction Lambda attend dans le pool de threads avant de s'exécuter, plutôt que de déterminer combien de temps storeItem() s'exécute. Pour cette raison, un segment est utilisé à la place d'un jeton, et @Trace(async = true) n'est pas nécessaire comme c'était le cas pour un jeton.
L'API d'appelagent dans cet exemple est :
@Trace(dispatcher = true): Démarre une transaction. Pour en savoir plus sur cette méthode, consultez la Javadoc.
L'exemple de code suivant montre un segment commençant par la méthode storeItem pour mesurer la durée d'attente de l'instruction Lambda dans le pool de threads. Pour arrêter le chronométrage du segment, vous devez appeler .end() ou .ignore(). Si vous don't souhaitez signaler le segment dans le cadre de sa transaction parent, appelez .ignore(). Sinon, pour signaler le segment comme faisant partie de sa transaction parent, appelez .end().
startSegment(...): Commence le segment qui chronométrera le code. Pour en savoir plus sur cette méthode, consultez la Javadoc.
reportAsExternal(DatastoreParameters()): Associe l'heure à un appel externe datastore Cela s'affichera dans APM avec les donnéesdatastore . Pour plus d'informations, consultez l'API reportAsExternal.
segment.end(): Arrête le chronométrage de ce segment. Pour en savoir plus sur cette méthode, consultez la Javadoc.
Une fois la méthode terminée, APM affiche une trace de transaction avec un appel externe.
Conseil
Par défaut, l'agent peut suivre un maximum de 1000 segments au cours d'une transaction donnée. Vous pouvez modifier cette limite avec l'option de configuration segment_timeout . la trace des transactions qui dépassent cette limite contiendra un attribut segment_clamp . L’augmentation de cette limite peut augmenter l’utilisation de la mémoire de l’agent.