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 ofrece varias herramientas para ayudar a obtener la información necesaria para proporcionar métricas útiles sobre su aplicación Node.js. Éstas incluyen:
Leer los nombres de las rutas (si se usan) de los enrutadores Express y Restify
Usar la API para nombrar la solicitud actual, ya sea con nombres simples o grupos de controladores con acciones
Reglas de soporte que se almacenan en la configuración de su agente y que pueden marcar las solicitudes para cambiarles el nombre o ignorarlas en función de expresiones regulares que coincidan con las URL sin procesar de la solicitud (también disponible como API de llamada).
La cantidad de nombres que New Relic rastrea debe ser lo suficientemente pequeña para que la experiencia del usuario sea sólida. También debe ser lo suficientemente grande como para proporcionar la cantidad adecuada de información (sin abrumarlo con datos) para que pueda identificar los puntos problemáticos en su aplicación más fácilmente.
El agente de Node.js captura el método HTTP junto con una ruta potencialmente parametrizada (como /user/:id) o una expresión regular (como /^/user/([-0-9a-f]+)$/). Estos datos pasan a formar parte del nombre de la solicitud.
Si tiene soporte para la traza de la transacción lenta y ha agregado 'request.parameters.*' a attributes.include en su archivo de configuración, la traza de la transacción también tendrá el parámetro de solicitud y sus valores adjuntos. Si no le gustan los nombres de solicitud que utiliza el agente de Node.js, puede usar llamada API para crear nombres más descriptivos.
Sugerencia
Si agrupa sus solicitudes bajo el nombre genérico, entonces /* es suficiente y no necesita personalizar su archivo de configuración o API de llamada.
Requisitos
New Relic utiliza nombres de solicitudes para agrupar solicitudes de muchos gráficos y tablas. El valor de estas visualizaciones disminuirá a medida que aumente la cantidad de nombres de solicitudes diferentes.
Por ejemplo, no incluya datos potencialmente dinámicos como GUID, ID numéricos o marcas de tiempo en los nombres de las solicitudes que cree. Si su solicitud es lo suficientemente lenta como para generar una traza de la transacción, esa traza contendrá la URL original. Si habilita la captura de parámetros, el parámetro también se adjuntará a la traza.
Sugerencia
Evite tener más de 50 nombres de transacciones diferentes. Por ejemplo, si tiene más de un par de cientos de nombres de solicitudes diferentes, reconsidere su estrategia de nomenclatura.
Evite problemas de agrupación métrica
La API de nomenclatura de solicitudes ayuda a New Relic a evitar problemas al intentar manejar demasiadas métricas, lo que a veces se denomina "explosión métrica". New Relic tiene varias estrategias para abordar estos problemas; el más grave es simplemente agregar la aplicación infractora a su lista de denegados.
La razón principal para tener cuidado al utilizar estas herramientas de asignación de nombres de solicitudes es evitar que eso le suceda a su aplicación. Para obtener más información, consulte problemas de agrupación métrica.
Pautas
Define tus reglas de configuración desde las más específicas hasta las más generales. Las primeras reglas enumeradas en su archivo de configuración o agregadas con la API de nomenclatura de transacciones de Node.js se aplicarán primero y deben tener un objetivo específico. Se deben agregar reglas más generales "opcionales" hacia el final de la lista, porque se evaluarán en el orden en que se configuraron o agregaron usando la API de nomenclatura de transacciones de Node.js.
Un minorista en línea tiene un patrón de URL como este:
Con estas reglas, el minorista crearía tres nombres de transacción:
/user/customers/:customer
/user/customers/all
/user/customers/all/prospects
Si el minorista invirtiera el pedido, las reglas detectarían all transacción en :customer, lo que no sería tan útil.
Cargue la API de nomenclatura de solicitud
Asegúrese de que cargar el módulo New Relic sea lo primero que haga su aplicación, ya que necesita arrancar antes de que se cargue el resto de su aplicación:
const newrelic =require('newrelic');
Esto devuelve la API de nomenclatura de solicitud. Puede requerir con seguridad el módulo de varios módulos en su aplicación, ya que solo se inicializa una vez.
Solicitar API de llamada
Aquí hay un resumen de la API de solicitud de llamada para el agente Node.js de New Relic.
newrelic.setTransactionName(name)
Asigne un nombre a la solicitud actual, siguiendo los requisitos de nomenclatura de la solicitud. Puede llamar a esta función en cualquier lugar dentro del contexto de un controlador de solicitudes HTTP, en cualquier momento después de que haya comenzado el manejo de la solicitud, pero antes de que haya finalizado. En general, si los objetos de solicitud y respuesta están dentro del alcance, puede establecer el nombre.
Llamar explícitamente newrelic.setTransactionName() anulará cualquier nombre establecido por las rutas Express o Restify. Además, las llamadas a newrelic.setTransactionName() y newrelic.setControllerName() se sobrescribirán entre sí. El último en ejecutarse antes de que finalice la solicitud gana.
newrelic.setControllerName(name,[action])
Asigne un nombre a la solicitud actual utilizando un patrón de estilo de controlador, incluyendo opcionalmente la acción del controlador actual. Si se omite la acción, New Relic incluirá el método HTTP (GET, POST, etc.) como acción. Las reglas sobre cuándo puede llamar newrelic.setControllerName() son las mismas que para newrelic.setTransactionName(), incluidos los requisitos de denominación de la solicitud.
Llamar explícitamente newrelic.setControllerName() anulará cualquier nombre establecido por las rutas Express o Restify. Además, las llamadas a newrelic.setTransactionName() y newrelic.setControllerName() se sobrescribirán entre sí. El último en ejecutarse antes de que finalice la solicitud gana.
Establece una devolución de llamada de instrumentación para un módulo específico.
La devolución de llamada onRequire proporcionada se activará cuando el módulo dado se cargue con require. El parámetro moduleName debe ser la cadena que se pasará a require; por ejemplo, 'express' o 'amqplib/callback_api'. La devolución de llamada opcional onError se llama si el parámetro onRequire arroja un error. Esto es útil para depurar su instrumentación.
Utilice este método para:
Agregue instrumentación para módulos que New Relic no instrumenta actualmente.
Instrumenta tu propio código.
Reemplace la instrumentación integrada del agente Node.js por la suya propia.
Este método no es compatible ni necesario en la aplicación del módulo ES, ya que el agente arrancar en la aplicación del módulo ES es diferente a la aplicación CommonJS. En la aplicación del módulo ES, el agente puede compensar el problema que resuelve este método para la aplicación CommonJS.
El método instrumentLoadedModule le permite agregar instrumentación estándar a módulos específicos en situaciones en las que es imposible tener require('newrelic'); como la primera línea del módulo principal de su aplicación.
// load the agent
const newrelic =require('newrelic');
// module loaded before newrelic
const expressModule =require('express');
// instrument express after the agent has been loaded
newrelic.instrumentLoadedModule(
'express',// the module's name, as a string
expressModule // the module instance
);
Importante
Este método no puede instrumentar ningún módulo arbitrario. Su propósito es agregar módulos que se perdieron porque el agente no se cargó como lo primero en su programa. El método instrumentLoadedModule solo puede tocar módulos que el agente normalmente tocaría. Puedes ver una lista de estos módulos en el módulo lib/instrumentación del agente.
Instrumento la transacción web especificada. Con esta llamada API, puede realizar transacciones con instrumentos que New Relic no detecta automáticamente.
El url define el nombre de la transacción y debe ser estático. No incluya datos variables como el ID de usuario.
El handle define la función que deseas instrumento.
New Relic capturará cualquier métrica que se capturaría mediante la instrumentación automática, así como la instrumentación manual a través de startSegment().
Usted must maneja transacciones personalizadas manualmente llamando newrelic.getTransaction() al comienzo de su transacción y luego llamando a transaction.end() cuando haya terminado. New Relic comienza a cronometrar la transacción cuando se llama a newrelic.startWebTransaction() y finaliza la transacción cuando se llama transaction.end() .
También puede devolver una promesa para indicar el final de la transacción. Tenga en cuenta que si esta promesa se rechaza, no se vincula automáticamente al rastreo de errores de New Relic. Esto debe hacerse manualmente con noticeError().
El handle define una función que incluye todo el trabajo en segundo plano que deseas instrumentar.
New Relic capturará cualquier métrica que se capturaría mediante la instrumentación automática, así como la instrumentación manual a través de startSegment().
Usted must maneja transacciones personalizadas manualmente llamando newrelic.getTransaction() al comienzo de su transacción y luego llamando a transaction.end() cuando haya terminado. New Relic comienza a cronometrar la transacción cuando se llama a newrelic.startBackgroundTransaction() y finaliza la transacción cuando se llama transaction.end() .
También puede devolver una promesa para indicar el final de la transacción. Tenga en cuenta que si esta promesa se rechaza, no se vincula automáticamente al rastreo de errores de New Relic. Esto debe hacerse manualmente con noticeError().
newrelic.getTransaction()
Devuelve un identificador de la transacción que se está ejecutando actualmente. Este identificador se puede utilizar para interactuar con una transacción determinada de forma segura desde cualquier contexto. Se utiliza mejor con newrelic.startWebTransaction() y newrelic.startBackgroundTransaction().
Finalice la transacción personalizada web o en segundo plano actual. Este método requiere estar en el contexto de transacción correcto cuando se llama. Esta llamada API no acepta argumentos.
El name define un nombre para el segmento. Este nombre será visible en la traza de la transacción y como una nueva métrica en la UI de New Relic.
La marca record define si el segmento debe registrarse como una métrica.
El handler es la función que desea rastrear como segmento.
El callback opcional es una función que se pasa al controlador para que la active una vez finalizado su trabajo.
El agente comienza a cronometrar el segmento cuando se llama a startSegment . El segmento finaliza cuando handler termina de ejecutarse o cuando se activa callback , si se proporciona.
Utilice recordMetric para registrar una métrica basada en eventos, generalmente asociada con una duración particular. El name debe ser una cadena que siga las reglas de nomenclatura métrica estándar. El value normalmente será un número, pero también puede ser un objeto.
Cuando value es un valor numérico, debe representar la magnitud de una medición asociada con un evento; por ejemplo, la duración de una llamada a un método particular.
Cuando value es un objeto, debe contener claves count, total, min, max y sumOfSquares , todas con valores numéricos. Este formulario es útil para métrica agregada por su cuenta y reportarlas periódicamente; por ejemplo, de un setInterval. Estos valores se agregarán con cualquier valor recopilado previamente para la misma métrica. Los nombres de estas claves coinciden con los nombres de las claves utilizadas por la API de la plataforma.
newrelic.incrementMetric(name,[amount])
Utilice incrementMetric para actualizar una métrica que actúa como un contador simple. El recuento de la métrica seleccionada se incrementará en la cantidad especificada, por defecto en 1.
Evento personalizado llamada API
Utilice estas API de llamada para registrar eventos adicionales:
newrelic.recordCustomEvent(eventType, attributes)
Utilice recordCustomEvent para registrar una métrica basada en eventos, generalmente asociada con una duración particular.
El eventType debe ser una cadena alfanumérica de menos de 255 caracteres.
El attributes debe ser un objeto de pares clave y valor. Las claves deben tener menos de 255 caracteres y los valores deben ser cadenas, números o booleanos.
El siguiente ejemplo demuestra la grabación de un evento personalizado con múltiples atributos.
Utilice recordLogEvent para registrar un registro de eventos, en caso de que la instrumentación de registro automático sea insuficiente para su framework de registro. Consulte la documentación generada automáticamente para conocer los detalles de los tipos de parámetros aceptados.
El siguiente ejemplo demuestra cómo registrar un registro de eventos asociado a un error.
Esta sección detalla los métodos proporcionados por la instancia de clase TransactionHandle que se puede obtener a través de newrelic.getTransaction().
Utilice estos métodos para interactuar directamente con la transacción actual:
transactionHandle.end([callback])
Utilice transactionHandle.end para finalizar la transacción a la que hace referencia la instancia de identificador.
El callback se invoca cuando la transacción ha finalizado por completo. La transacción finalizada pasó a la devolución de llamada como primer argumento.
transactionHandle.ignore()
Utilice transactionHandle.ignore para ignorar la transacción a la que hace referencia la instancia del identificador.
transactionHandle.insertDistributedTraceHeaders Se utiliza para implementar rastreo distribuido. Modifica el mapa headers que se pasa agregando encabezados W3C Trace Context y encabezados distribuidos de rastreo New Relic. Los encabezados de New Relic se pueden desactivar con distributed_tracing.exclude_newrelic_header: true en la configuración. Este método reemplaza el método obsoleto createDistributedTracePayload , que solo crea carga distribuida de rastreo New Relic.
En el siguiente ejemplo, al llamar a insertDistributedTraceHeaders con un objeto vacío, se generarán los encabezados de rastreo distribuido y los encabezados W3C Trace Context apropiados para la transacción.
// Call newrelic.getTransaction to retrieve a handle on the current transaction.
transactionHandle.acceptDistributedTraceHeaders se utiliza para instrumentar el servicio llamado para su inclusión en un rastreo distribuido. Vincula los tramos en una traza aceptando una carga útil generada por insertDistributedTraceHeaders o generada por algún otro rastreador compatible con W3C Trace Context . Este método acepta los encabezados de una solicitud entrante, busca los encabezados W3C Trace Context y, si no los encuentra, recurre a los encabezados distribuidos del rastreo de New Relic. Este método reemplaza el obsoleto (y ahora eliminado a partir de la versión 7.0.0) Método acceptDistributedTracePayload , que solo maneja la carga distribuida de rastreo de New Relic.
transportType debe ser una de las siguientes cadenas:
AMQP
HTTP
HTTPS
HierroMQ
JMS
kafka
Otro
Cola
Desconocido
headers debe ser un objeto que contenga todos los encabezados de la solicitud entrante. Las claves deben estar en minúsculas.
El siguiente ejemplo demuestra cómo agregar encabezados rastreo distribuido recuperados de un mensaje de Kafka. En este ejemplo, asumimos que el mensaje entrante de Kafka tiene encabezados de rastreo distribuido insertados.
// incoming Kafka message headers
const headersObject = message.headers;
// Call newrelic.getTransaction to retrieve a handle on the current transaction.
Esta convocatoria se utiliza para implementar rastreo distribuido. Genera una carga útil que la aplicación receptora lee con acceptDistributedTracePayload.
Importante
Nota: Para mantener el orden correcto de los tramos en una traza, se debe generar la carga útil en el contexto del tramo que la envía.
El objeto DistributedTracePayload tiene dos métodos disponibles que se utilizan para generar la carga útil en diferentes formatos:
DistributedTracePayload#text: devuelve una representación JSON de la carga útil.
// Call newrelic.getTransaction to retrieve a handle on the current transaction.
var transactionHandle = newrelic.getTransaction();
var payload = transactionHandle.createDistributedTracePayload();
transactionHandle.acceptDistributedTracePayload se utiliza para instrumentar el servicio llamado para su inclusión en un rastreo distribuido. Vincula los tramos en una traza aceptando la carga útil generada por createDistributedTracePayload.
transactionHandle.isSampled()
Devuelve si esta traza está siendo muestreada.
Otra API de llamadas
El agente Node.js de New Relic incluye API de llamada adicional.
newrelic.addCustomAttribute(name, value)
Establezca un valor de atributo personalizado que se mostrará junto con la traza de la transacción en la UI de New Relic. Esto debe llamarse dentro del contexto de una transacción para que tenga un lugar para configurar el atributo personalizado. El atributo personalizado aparecerá en la vista detallada de la traza de la transacción de APM y en los errores de la transacción.
Establezca múltiples valores personalizados de atributos que se mostrarán junto con la traza de la transacción en la UI de New Relic. El atributo debe pasarse como un único objeto. Esto debe llamarse dentro del contexto de una transacción para que tenga un lugar para configurar el atributo personalizado. El atributo personalizado aparecerá en la vista detallada de la traza de la transacción y en los errores de la transacción.
Establezca un valor de atributo de intervalo personalizado que se mostrará junto con una traza de la transacción en la UI de New Relic. Esto debe llamarse dentro del contexto de un segmento/intervalo activo para que tenga un lugar para configurar el atributo de intervalo personalizado. El atributo de tramo personalizado aparecerá en la sección de atributos de la vista detallada del tramo.
Establezca múltiples valores de atributos de intervalo personalizados que se mostrarán junto con la traza de la transacción en la UI de New Relic. El atributo debe pasarse como un único objeto. Esto debe llamarse dentro del contexto de un segmento/intervalo activo para que tenga un lugar para configurar el atributo de intervalo personalizado. El atributo de tramo personalizado aparecerá en la sección de atributos de la vista detallada del tramo.
Devuelve el fragmento de HTML que se insertará en el encabezado de las páginas HTML para habilitar . El HTML le indicará al browser que busque un pequeño archivo JavaScript e inicie el temporizador de la página.
Utilice esta llamada si su aplicación realiza su propio manejo de errores con cláusulas de dominio o try/catch, pero desea que toda la información sobre cuántos errores surgen de la aplicación se administre de manera centralizada. A diferencia de otras llamadas de Node.js, esto se puede usar fuera de los controladores de ruta, pero tendrá contexto adicional si se llama desde dentro del alcance de la transacción.
error debe ser un Error o uno de sus subtipos, pero la API manejará cadenas y objetos que tengan una propiedad .message o .stack adjunta.
customAttributes es un objeto opcional de cualquier atributo personalizado que se mostrará en la UI de New Relic.
expected es un booleano opcional para clasificar el error como un error esperado. Si un error recopilado con noticeError es expected, se recopilará y reportará, pero no afectará Apdex ni a la tasa de errores métrica. De forma predeterminada, expected es false.
{extraInformation:"error already handled in the application"},
true
);
}
Advertencia
Los errores registrados con este método no obedecen al valor de configuración ignore_status_codes .
newrelic.setErrorGroupCallback(callback)
Este método le permite definir una devolución de llamada personalizada para generar nombres de grupos de errores, que serán utilizados por Errors Inbox para agrupar errores similares a través del atributo de agente error.group.name.
Las funciones proporcionadas deben devolver una cadena y recibir un objeto como argumento. El objeto contiene información relacionada con el error ocurrido y tiene el siguiente formato:
Indique al módulo si debe ignorar o no una solicitud determinada. Esto le permite filtrar explícitamente rutas o solicitudes irrelevantes y de sondeo largo que sabe que consumirán mucho tiempo. Esto también le permite recopilar métricas para solicitudes que de otro modo serían ignoradas.
Para ignorar la transacción, establezca el parámetro en true: esto ignorará la transacción.
Para evitar que una transacción sea ignorada con esta función, pase el parámetro false.
Pasar null o undefined no cambiará si se ignora la transacción.
newrelic.setUserID(string)
Este método le brinda una manera de asociar un identificador único con un evento de transacción, traza de la transacción y errores dentro de la transacción. Se agregará una nueva propiedad, enduser.id, al error y se informará a Errors Inbox.
Utilice este método para cerrar correctamente el agente; ambos parámetros son opcionales. Aquí hay una tabla general que muestra el parámetro:
Parámetro
Tipo
Atributo
Descripción
options
object
Opcional
Objeto con opciones de apagado
callback
function
Opcional
Función de devolución de llamada que se ejecuta cuando el agente se detiene
Aquí hay una tabla detallada que muestra las opciones de apagado del objeto:
Nombre de la opción
Tipo
Atributo
Por defecto
Descripción
collectPendingData
boolean
Opcional
false
Dígale al agente si debe enviar algún dato pendiente al recolector New Relic antes de apagarlo.
timeout
number
Opcional
0
El tiempo predeterminado antes de forzar un apagado. Cuando collectPendingData es verdadero, el agente esperará una conexión antes de cerrarse. Este tiempo de espera es útil para procesos de corta duración, como AWS Lambda, para evitar que el proceso permanezca abierto demasiado tiempo mientras intenta conectarse.
waitForIdle
boolean
Opcional
false
Si es verdadero, el agente no se cerrará hasta que no haya transacciones activas.
Si no desea colocar llamadas al módulo New Relic directamente en el código de su aplicación, puede usar reglas basadas en patrones para nombrar las solicitudes. Hay dos conjuntos de reglas: uno para cambiar el nombre de las solicitudes y otro para marcar las solicitudes que la instrumentación de New Relic debe ignorar.
Aquí está la estructura de las reglas en el agente Node.js de New Relic.
Una lista de reglas del formato {pattern : "pattern", name : "name"} para hacer coincidir las URL de solicitud entrantes con pattern y nombrar la transacción New Relic coincidente name. Esto actúa como un reemplazo de expresiones regulares, donde puede establecer el patrón como una cadena o como un literal de expresión regular de JavaScript, y tanto el patrón como el nombre son obligatorios.
Al pasar una expresión regular como una cadena, escape las barras invertidas, ya que el agente no las conserva cuando se las proporciona como una cadena en un patrón. Defina sus reglas de configuración desde las más específicas hasta las más generales, ya que los patrones se evaluarán en orden y son de naturaleza terminal. Para obtener más información, consulte las pautas de nomenclatura.
Esto también se puede configurar con la variable de entorno NEW_RELIC_NAMING_RULES, con múltiples reglas pasadas como una lista de literales de objetos JSON delimitados por comas:
Cuando se establece en true (predeterminado), no se evaluarán más reglas si esta regla coincide. Establecer esto en falso es útil cuando se deben usar varias reglas juntas. Por ejemplo, una regla podría reemplazar un patrón común en muchas URL diferentes, mientras que las reglas posteriores serían más específicas.
replace_all
Por defecto: false
Cuando se establece en true, se reemplazarán todas las coincidencias del patrón. En caso contrario, sólo se sustituirá el primer partido. Usar el indicador g con una expresión literal literal tendrá el mismo efecto. Por ejemplo:
pattern: '[0-9]+',
replace_all: true
Esto tiene el mismo efecto que pattern: /[0-9]+/g.
precedence
De forma predeterminada, las reglas se evalúan en orden, del primero al último. Si prefiere tener control total sobre el pedido, puede asignar a cada regla un atributo precedence . La precedencia es un número entero y las reglas se evalúan en orden ascendente. Si precedence no está definido explícitamente, se establecerá en 500 de forma predeterminada.
Se ignoran los atributos adicionales.
Probando tus reglas de nomenclatura
El agente de Node.js viene con una herramienta de línea de comando para probar reglas de nomenclatura. Para obtener más información, ejecute el siguiente comando en la ventana de terminal en un directorio donde esté instalada su aplicación:
bash
$
node node_modules/.bin/newrelic-naming-rules
Ejemplos de reglas de nomenclatura [#examples-rules]
A continuación se muestran algunos ejemplos de reglas de nomenclatura y los resultados.
pattern: "^/items/[0-9]+$",
name: "/items/:id"
resultará en:
/items/123 => /items/:id
/orders/123 => /orders/123 (not replaced since the rule is a full match)
pattern: "[0-9]+",
name: ":id"
resultará en:
/orders/123 => /orders/:id
/items/123 => /items/:id
/orders/123/items/123 => /orders/:id/items/123
pattern: "[0-9]+",
name: ":id",
replace_all: true
resultará en:
/orders/123/items/123 => /orders/:id/items/:id
Usando referencias de grupos de coincidencia de expresiones regulares:
pattern: '^/(items|orders)/[0-9]+$',
name: '/\\1/:id'
resultará en:
/orders/123 => /orders/:id
/items/123 => /items/:id
Esto también se puede configurar mediante la variable de entorno NEW_RELIC_IGNORING_RULES, con múltiples reglas pasadas como una lista de patrones delimitados por comas. Actualmente no hay forma de escapar de las comas en los patrones.
Si está utilizando socket.io, tendrá un caso de uso para ignorar reglas desde el primer momento. Para evitar que el sondeo prolongado de socket.io domine su métrica de tiempo de respuesta y afecte la métrica de Apdex de su aplicación, agregue una regla como:
// newrelic.js
exports.config={
// other configuration
rules:{
ignore:[
'^\/socket\.io\/.*\/xhr-polling'
]
}
};
Llamada API para reglas
Aquí está la API de llamada para nombrar e ignorar reglas con el agente Node.js de New Relic.
Versión programática de rules.name. Una vez que se agregan las reglas de nomenclatura, no se pueden eliminar hasta que se reinicie el proceso de Node.js. También se pueden agregar mediante la configuración del agente de Node.js. Ambos parámetros son obligatorios.
Versión programática de rules.ignore. Una vez que se agregan reglas para ignorar, no se pueden eliminar hasta que se reinicie el proceso de Node.js. También se pueden agregar mediante la configuración del agente de Node.js. Este parámetro es obligatorio.