Te ofrecemos esta traducción automática para facilitar la lectura.
En caso de que haya discrepancias entre la versión en inglés y la versión traducida, se entiende que prevalece la versión en inglés. Visita esta página para obtener más información.
New Relic para Java ( versión del agente 3.37 o superior) incluye una API para la actividad de instrumento asincrónico. Para el marco compatible, el agente generalmente instrumenta el trabajo asíncrono automáticamente. Sin embargo, la API asíncrona aún puede resultar útil para agregar detalles. Este documento proporciona ejemplos del uso de tokens y segmentos para instrumentar su aplicación.
Para obtener más información sobre cómo funciona New Relic instrumentado y muestra asíncrono en laUI
: los tokens se pasan entre subprocesos para vincular una unidad de trabajo asincrónica a una transacción específica. No realizan ningún cronometraje directamente.
: Los segmentos se utilizan para medir una pieza arbitraria de código de aplicación asincrónico, no necesariamente asociado con un método o hilo. Los segmentos se utilizan normalmente para rastrear llamadas externas que se completan mediante un mecanismo de devolución de llamada.
Token: conectar subprocesos asíncronos
Utilice token para vincular unidades de trabajo arbitrarias que se encuentran en hilos separados. Esta sección describe cómo usar las llamadas relacionadas con tokenjuntas para que el instrumento funcione asíncrono. Para obtener información detallada sobre clases y métodos, consulte el Javadoc.
Para usar tokens, primero debe crear el token y luego vincular otra llamada a la transacción de origen. Debes vincular el token lo antes posible dentro de la otra llamada. Si no vincula el token inmediatamente, corre el riesgo de perder cualquier método que contenga un @Trace debajo de la llamada que está intentando vincular. También puede caducar el token en la llamada original. El agente de Java luego vinculará el trabajo en la UI de New Relic. Estos ejemplos ilustran cómo utilizar juntas las llamadas relacionadas con el token :
Considere el método parallelStream() en el fragmento de código siguiente. Debido a que algunas de las llamadas a requestItemAsync() se producirán en un hilo separado, se crea un token y se pasa para vincular ese trabajo asincrónico al hilo solicitante.
/**
* 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.
Las llamadas a la API del agente en este ejemplo son:
@Trace(dispatcher = true): Le dice al agente que inicie una transacción. Para obtener más información sobre este método, consulte el Javadoc.
getToken(): Crea el token que vinculará el trabajo. Para obtener más información sobre este método, consulte el Javadoc.
token.expire(): El token caduca. Esto permite que la transacción finalice. Para obtener más información sobre este método, consulte el Javadoc.
El siguiente ejemplo de código muestra requestItemAsync, que podría ejecutarse en un subproceso independiente del subproceso solicitante. Por este motivo, el token que se creó en el ejemplo de código anterior está vinculado a la transacción en requestItemAsync. Tenga en cuenta que requestItemAsync() tiene la anotación @Trace(async=true) , que le indica al agente que trace este método si está vinculado a una transacción existente.
Después de que parallelStream() recopile todos los resultados, el token caduca. Esto es importante porque garantiza que la transacción no permanezca abierta después de que se complete parallelStream() .
@Trace(async =true)
privateItemrequestItemAsync(long id,Token token){
token.link();
returnrequestItem(id);
}
Las llamadas a la API del agente en este ejemplo son:
@Trace(async = true): inicia una transacción. Para obtener más información sobre este método, consulte el Javadoc.
token.link(): Vincula el trabajo que se está realizando en requestItemAsync() (que se ejecuta en un hilo diferente) al hilo solicitante. Para obtener más información sobre este método, consulte el Javadoc.
Para ver los detalles de la traza de la transacción, vaya a: one.newrelic.com APM & services > (select an app) > Transactions > Transaction trace > Trace details.
La actividad asincrónica se muestra en la vista de cascada de traza mediante segmentos que se superponen horizontalmente, en la dimensión temporal.
No es necesario vincular métodos que están en el mismo hilo, pero hacerlo no tendrá ningún efecto negativo. A menudo ocurre que se puede compartir un único token, como en el ejemplo parallelStream() .
Sugerencia
De forma predeterminada, una transacción puede crear un máximo de 3000 tokens y cada token tiene un tiempo de espera predeterminado de 180 segundos. Puede cambiar el límite anterior con la opción de configuración token_limit y el último con la opción de configuración token_timeout . La traza para transacciones que excedan el token_limit contendrá un atributo token_clamp . Aumentar cualquiera de las opciones de configuración puede aumentar el uso de memoria del agente.
Segmentos: actividad asíncrona arbitraria de tiempo
Los segmentos se utilizan para medir una pieza arbitraria de código de aplicación asincrónico, no necesariamente asociado con un método o hilo. Esto se utiliza más comúnmente para cronometrar conexiones a servicios externos. Utilice segmentos si desea:
Código de tiempo que se completa mediante una devolución de llamada
Cronometrar una llamada asincrónica que abarque muchos métodos
Mida el tiempo entre el momento en que se crea el trabajo y su ejecución (por ejemplo, en un grupo de subprocesos)
El siguiente método realiza una llamada a un servicio externo (en este caso una base de datos) utilizando el método storeItem():
/**
* Example showing single threaded implementation of inserting data into a datasource.
El objetivo en este caso es averiguar cuánto tiempo espera Callable en la declaración Lambda en el grupo de subprocesos antes de ejecutarse, en lugar de determinar cuánto tiempo se ejecuta storeItem() . Por este motivo, se utiliza un segmento en lugar de un token y @Trace(async = true) no es necesario como lo era para un token.
La llamada API del agente en este ejemplo es:
@Trace(dispatcher = true): inicia una transacción. Para obtener más información sobre este método, consulte el Javadoc.
El siguiente ejemplo de código muestra un segmento que comienza en el método storeItem para medir cuánto tiempo espera la declaración Lambda en el grupo de subprocesos. Para dejar de cronometrar el segmento, debe llamar a .end() o .ignore(). Si don't desea informar el segmento como parte de su transacción principal, llame a .ignore(). De lo contrario, para informar el segmento como parte de su transacción principal, llame a .end().
Las llamadas a la API del agente en este ejemplo son:
startSegment(...): Comienza el segmento que cronometrará el código. Para obtener más información sobre este método, consulte el Javadoc.
reportAsExternal(DatastoreParameters()): Asocia la hora con una llamada externa de almacenamiento de datos. Esto se mostrará en APM con almacenamiento de datos datos. Para obtener más información, consulte API reportAsExternal.
segment.end(): Detiene el cronometraje de este segmento. Para obtener más información sobre este método, consulte el Javadoc.
Cuando se completa el método, APM muestra una traza de la transacción con una llamada externa.
Sugerencia
De forma predeterminada, el agente puede rastrear un máximo de 1000 segmentos durante una transacción determinada. Puede cambiar este límite con la opción de configuración segment_timeout . La traza de transacción que exceda este límite contendrá un atributo segment_clamp . Aumentar este límite puede aumentar el uso de memoria del agente.