Esta tradução de máquina é fornecida para sua comodidade.
In the event of any inconsistency between the English version and the translated version, the English versionwill take priority. Please visit this page for more information.
A New Relic oferece diversas ferramentas para ajudar a obter as informações necessárias para fornecer métricas úteis sobre sua aplicação Node.js. Esses incluem:
Lendo os nomes das rotas (se usados) dos roteadores Express e Restify
Usando a API para nomear a solicitação atual, seja com nomes simples ou grupos de controladores com ações
Regras de suporte armazenadas na configuração do seu agente que podem marcar solicitações para serem renomeadas ou ignoradas com base em expressões regulares correspondentes aos URLs brutos da solicitação (também disponíveis como chamada de API)
O número de nomes que o New Relic rastreia precisa ser pequeno o suficiente para que a experiência do usuário seja robusta. Ele também precisa ser grande o suficiente para fornecer a quantidade certa de informações (sem sobrecarregar você com dados) para que você possa identificar pontos problemáticos em seu aplicativo com mais facilidade.
O agente Node.js captura o método HTTP junto com um caminho potencialmente parametrizado (como /user/:id) ou uma expressão regular (como /^/user/([-0-9a-f]+)$/). Essas informações passam a fazer parte do nome da solicitação.
Se você tiver suporte para rastreamento lento da transação e tiver adicionado 'request.parameters.*' a attributes.include em seu arquivo de configuração, o rastreamento da transação também terá os parâmetros da solicitação e seus valores anexados. Se você não gostar dos nomes de solicitação que o agente Node.js usa, poderá usar a chamada de API para criar nomes mais descritivos.
Dica
Se agrupar suas solicitações sob o nome genérico, /* será suficiente e você não precisará personalizar seu arquivo de configuração ou chamada de API.
Requisitos
A New Relic usa nomes de solicitação para agrupar solicitações para muitos gráficos e tabelas. O valor dessas visualizações diminuirá à medida que o número de nomes de solicitações diferentes aumentar.
Por exemplo, não inclua dados potencialmente dinâmicos, como GUIDs, IDs numéricos ou carimbo de data/hora nos nomes de solicitação que você criar. Se sua solicitação for lenta o suficiente para gerar um rastreamento da transação, esse trace conterá a URL original. Se você ativar a captura de parâmetro, o parâmetro também será anexado ao trace.
Dica
Evite ter mais de 50 nomes de transação diferentes. Por exemplo, se você tiver mais de algumas centenas de nomes de solicitações diferentes, repense sua estratégia de nomenclatura.
Evite problemas de agrupamento métrico
A API de nomenclatura de solicitações ajuda a New Relic a evitar problemas ao tentar lidar com muitas métricas, o que às vezes é chamado de "explosão métrica". A New Relic possui diversas estratégias para lidar com essas questões; o mais grave é simplesmente adicionar o aplicativo ofensivo à sua lista de negações.
O principal motivo para você ter cuidado ao usar essas ferramentas de nomenclatura de solicitações é evitar que isso aconteça com seu aplicativo. Para mais informações, veja questões de agrupamento métrico.
Diretrizes
Defina suas regras de configuração das mais específicas às mais gerais. As primeiras regras listadas em seu arquivo de configuração ou adicionadas com a API de nomenclatura de transação do Node.js serão aplicadas primeiro e devem ser estritamente de destino. Regras "fall-through" mais gerais devem ser adicionadas no final da lista, porque serão avaliadas na ordem em que foram configuradas ou adicionadas usando a API de nomenclatura de transação do Node.js.
Um varejista online tem um padrão de URL como este:
Com essas regras, o varejista criaria três nomes de transação:
/user/customers/:customer
/user/customers/all
/user/customers/all/prospects
Se o varejista revertesse o pedido, as regras pegariam all transação em :customer, o que não seria tão útil.
Carregar a API de nomenclatura de solicitação
Certifique-se de que carregar o módulo New Relic seja a primeira coisa que seu aplicativo faz, pois ele precisa ser inicializado antes que o restante do seu aplicativo seja carregado:
const newrelic =require('newrelic');
Isso retorna a API de nomenclatura da solicitação. Você pode exigir o módulo com segurança de vários módulos em seu aplicativo, pois ele se inicializa apenas uma vez.
Solicitar chamada de API
Aqui está um resumo da chamada de API de solicitação para o agente Node.js da New Relic.
newrelic.setTransactionName(name)
Nomeie a solicitação atual, seguindo os requisitos de nomenclatura da solicitação. Você pode chamar essa função em qualquer lugar dentro do contexto de um manipulador de solicitação HTTP, a qualquer momento após o início do processamento da solicitação, mas antes da conclusão da solicitação. Em geral, se os objetos de solicitação e resposta estiverem no escopo, você poderá definir o nome.
Chamar newrelic.setTransactionName() explicitamente substituirá quaisquer nomes definidos pelas rotas Express ou Restify. Além disso, as chamadas para newrelic.setTransactionName() e newrelic.setControllerName() substituirão uma à outra. O último a ser executado antes do término da solicitação vence.
newrelic.setControllerName(name,[action])
Nomeie a solicitação atual usando um padrão estilo controlador, incluindo opcionalmente a ação atual do controlador. Se a ação for omitida, o New Relic incluirá o método HTTP (GET, POST, etc.) como a ação. As regras para quando você pode chamar newrelic.setControllerName() são as mesmas de newrelic.setTransactionName(), incluindo os requisitos de nomenclatura da solicitação.
Chamar newrelic.setControllerName() explicitamente substituirá quaisquer nomes definidos pelas rotas Express ou Restify. Além disso, as chamadas para newrelic.setTransactionName() e newrelic.setControllerName() substituirão uma à outra. O último a ser executado antes do término da solicitação vence.
Define um retorno de chamada de instrumentação para um módulo específico.
O retorno de chamada onRequire fornecido será acionado quando o módulo fornecido for carregado com require. O parâmetro moduleName deve ser a string que será passada para require; por exemplo, 'express' ou 'amqplib/callback_api'. O retorno de chamada onError opcional será chamado se o parâmetro onRequire gerar um erro. Isso é útil para depurar sua instrumentação.
Use este método para:
Adicione instrumentação para módulos não instrumentados atualmente pela New Relic.
Instrumento seu próprio código.
Substitua a instrumentação integrada do agente Node.js pela sua própria.
Este método não é suportado ou necessário no aplicativo do módulo ES, pois a inicialização do agente no aplicativo do módulo ES é diferente do aplicativo CommonJS. No aplicativo do módulo ES, o agente é capaz de compensar o problema que este método resolve para o aplicativo CommonJS.
O método instrumentLoadedModule permite adicionar instrumentação padrão a módulos específicos em situações em que é impossível ter require('newrelic'); como a primeira linha do módulo principal do seu aplicativo.
// 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 não pode instrumentalizar nenhum módulo arbitrário. Seu objetivo é adicionar módulos que foram perdidos porque o agente não foi carregado como a primeira coisa em seu programa. O método instrumentLoadedModule só pode instrumentar módulos que o agente normalmente usaria. Você pode ver uma lista desses módulos no módulo lib/instrumentação do agente.
Instrumento a transação web especificada. Usando esta chamada de API, você pode usar instrumentos de transação que o New Relic não detecta automaticamente.
O url define o nome da transação e precisa ser estático. Não inclua dados variáveis, como ID do usuário.
O handle define a função que você deseja instrumento.
O New Relic capturará qualquer métrica que seria capturada por instrumentação automática, bem como instrumentação manual por meio de startSegment().
Você must processa transações personalizadas manualmente chamando newrelic.getTransaction() no início de sua transação e, em seguida, ligando para transaction.end() quando terminar. O New Relic começa a cronometrar a transação quando newrelic.startWebTransaction() é chamado e termina a transação quando transaction.end() é chamado.
Você também pode retornar uma promessa para indicar o fim da transação. Observe que se esta promessa for rejeitada, ela não será automaticamente vinculada ao monitoramento de erros da New Relic. Isso precisa ser feito manualmente com noticeError().
Instrumento a transação em segundo plano especificada. Usando esta chamada de API, você pode expandir a instrumentação da New Relic para capturar dados de transações em segundo plano.
O name define o nome da transação e precisa ser estático. Não inclua dados variáveis, como ID do usuário.
O group é opcional e permite agrupar tarefas semelhantes por meio do
O handle define uma função que inclui todo o trabalho em segundo plano que você deseja instrumentar.
O New Relic capturará qualquer métrica que seria capturada por instrumentação automática, bem como instrumentação manual por meio de startSegment().
Você must processa transações personalizadas manualmente chamando newrelic.getTransaction() no início de sua transação e, em seguida, ligando para transaction.end() quando terminar. O New Relic começa a cronometrar a transação quando newrelic.startBackgroundTransaction() é chamado e termina a transação quando transaction.end() é chamado.
Você também pode retornar uma promessa para indicar o fim da transação. Observe que se esta promessa for rejeitada, ela não será automaticamente vinculada ao monitoramento de erros da New Relic. Isso precisa ser feito manualmente com noticeError().
newrelic.getTransaction()
Retorna um identificador da transação atualmente em execução. Esse identificador pode então ser usado para interagir com uma determinada transação com segurança em qualquer contexto. É melhor usado com newrelic.startWebTransaction() e newrelic.startBackgroundTransaction().
Encerre a transação personalizada atual da web ou em segundo plano . Este método requer estar no contexto de transação correto quando chamado. Esta chamada de API não aceita argumentos.
O name define um nome para o segmento. Este nome ficará visível no trace da transação e como uma nova métrica na interface do New Relic.
A sinalização record define se o segmento deve ser registrado como uma métrica.
O handler é a função que você deseja acompanhar como um segmento.
O opcional callback é uma função passada ao manipulador para ser acionada após a conclusão do trabalho.
O agente começa a cronometrar o segmento quando startSegment é chamado. O segmento termina quando handler termina a execução ou callback é acionado, se for fornecido.
Use recordMetric para registrar uma métrica baseada em evento, geralmente associada a uma duração específica. O name deve ser uma string seguindo regras de nomenclatura de métrica padrão. O value geralmente será um número, mas também pode ser um objeto.
Quando value for um valor numérico, deverá representar a magnitude de uma medida associada a um evento; por exemplo, a duração de uma chamada de método específica.
Quando value é um objeto, ele deve conter chaves count, total, min, max e sumOfSquares , todas com valores numéricos. Este formulário é útil para agregar métricas por conta própria e reportá-las periodicamente; por exemplo, de um setInterval. Esses valores serão agregados a quaisquer valores coletados anteriormente para a mesma métrica. Os nomes dessas chaves correspondem aos nomes das chaves usadas pela API da plataforma.
newrelic.incrementMetric(name,[amount])
Use incrementMetric para atualizar uma métrica que funciona como um contador simples. A contagem da métrica selecionada será incrementada no valor especificado, com valor padrão de 1.
Evento personalizado chamada de API
Use esta chamada de API para registrar eventos adicionais:
newrelic.recordCustomEvent(eventType, attributes)
Use recordCustomEvent para registrar uma métrica baseada em evento, geralmente associada a uma duração específica.
O eventType deve ser uma sequência alfanumérica com menos de 255 caracteres.
O attributes deve ser um objeto de pares de chave e valor. As chaves devem ter menos de 255 caracteres e os valores devem ser string, número ou booleano.
O exemplo a seguir demonstra a gravação de um evento personalizado com vários atributos.
Use recordLogEvent para registrar um evento de log, caso a instrumentação de registro automático seja insuficiente para sua framework de registro. Consulte a documentação gerada automaticamente para obter detalhes dos tipos de parâmetros aceitos.
O exemplo a seguir demonstra a gravação de um evento de log associado a um erro.
transactionHandle.insertDistributedTraceHeaders é usado para implementar distributed tracing. Ele modifica o mapa headers transmitido adicionando cabeçalhos W3C Trace Context e cabeçalhos distributed trace New Relic. Os cabeçalhos New Relic podem ser desabilitados com distributed_tracing.exclude_newrelic_header: true na configuração. Este método substitui o método createDistributedTracePayload obsoleto, que cria apenas carga distributed trace da New Relic.
No exemplo a seguir, chamando insertDistributedTraceHeaders com um objeto vazio, os cabeçalhos distributed trace apropriados e os cabeçalhos W3C Trace Context serão gerados para a transação.
// Call newrelic.getTransaction to retrieve a handle on the current transaction.
transactionHandle.acceptDistributedTraceHeaders É usado para instrumentalizar o serviço chamado para inclusão em um distributed trace. Ele vincula os intervalos em um trace aceitando uma carga gerada por ou gerada por algum insertDistributedTraceHeaders outro W3C Trace Context compatível com tracer. Este método aceita os cabeçalhos de uma solicitação recebida, procura cabeçalhos W3C Trace Context e, se não for encontrado, recorre aos cabeçalhos distributed trace da New Relic. Este método substitui o obsoleto (e agora removido a partir da versão 7.0.0) acceptDistributedTracePayload , que lida apenas com carga distributed trace do New Relic.
transportType deve ser uma das seguintes strings:
AMQP
HTTP
HTTPS
FerroMQ
JMS
Kafka
Outro
Fila
Desconhecido
headers deve ser um objeto contendo todos os cabeçalhos da solicitação recebida. As chaves devem estar em minúsculas.
O exemplo a seguir demonstra a adição de cabeçalhos distributed trace recuperados de uma mensagem Kafka. Neste exemplo, assumimos que a mensagem Kafka recebida possui cabeçalhos distributed trace inseridos.
// incoming Kafka message headers
const headersObject = message.headers;
// Call newrelic.getTransaction to retrieve a handle on the current transaction.
Esta chamada é usada para implementar distributed tracing. Ele gera uma carga útil que é lida pelo aplicativo receptor com acceptDistributedTracePayload.
Importante
Observação: para manter a ordem adequada dos spans em um trace, você deve gerar a carga útil no contexto do span que a envia.
O objeto DistributedTracePayload possui dois métodos disponíveis para geração da carga em diferentes formatos:
DistributedTracePayload#text: retorna uma representação JSON da carga útil.
// Call newrelic.getTransaction to retrieve a handle on the current transaction.
var transactionHandle = newrelic.getTransaction();
var payload = transactionHandle.createDistributedTracePayload();
transactionHandle.acceptDistributedTracePayload É usado para instrumentalizar o serviço chamado para inclusão em um distributed trace. Ele vincula os períodos em um trace aceitando a carga gerada por createDistributedTracePayload.
transactionHandle.isSampled()
Retorna se esse trace está sendo amostrado.
Outra chamada de API
O agente Node.js da New Relic inclui chamada de API adicional.
newrelic.addCustomAttribute(name, value)
Defina um valor de atributo personalizado a ser exibido junto com o rastreamento da transação na interface do New Relic. Deve ser chamado dentro do contexto de uma transação para que tenha local para definir o atributo personalizado. o atributo personalizado aparecerá na visualização detalhada do trace da transação do APM e nos erros da transação.
Defina vários valores de atributo personalizado para serem exibidos junto com o rastreamento da transação na interface do New Relic. O atributo deve ser passado como um objeto único. Deve ser chamado dentro do contexto de uma transação para que tenha local para definir o atributo personalizado. o atributo personalizado aparecerá na visualização detalhada do trace da transação e nos erros da transação.
Defina um valor de atributo de span personalizado para ser exibido junto com um span de rastreamento de transação na interface do New Relic. Isso deve ser chamado dentro do contexto de um segmento/span ativo para que tenha um local para definir o atributo de span personalizado. O atributo de período personalizado aparecerá na seção atributo da visualização de detalhes do período.
Defina vários valores de atributo de span personalizados para serem exibidos junto com os spans de rastreamento da transação na interface do New Relic. O atributo deve ser passado como um objeto único. Isso deve ser chamado dentro do contexto de um segmento/span ativo para que tenha um local para definir o atributo de span personalizado. O atributo de período personalizado aparecerá na seção atributo da visualização de detalhes do período.
Retorna o trecho HTML a ser inserido no cabeçalho das páginas HTML para habilitar . O HTML instruirá o browser a buscar um pequeno arquivo JavaScript e iniciar o cronômetro da página.
Use esta chamada se seu aplicativo estiver fazendo seu próprio tratamento de erros com domínio ou cláusulas try/catch, mas você deseja que todas as informações sobre quantos erros estão saindo do aplicativo sejam gerenciadas centralmente. Ao contrário de outras chamadas do Node.js, isso pode ser usado fora dos manipuladores de rota, mas terá contexto adicional se for chamado dentro do escopo da transação.
error deve ser um Error ou um de seus subtipos, mas a API manipulará strings e objetos que tenham uma propriedade .message ou .stack anexada.
customAttributes é um objeto opcional de quaisquer atributos personalizados a serem exibidos na interface do New Relic.
expected é um booleano opcional para classificar o erro como um erro esperado. Se um erro coletado com noticeError for expected, ele será coletado e reportado, mas não afetará Apdex ou taxa de erros métricos. Por padrão, expected é false.
{extraInformation:"error already handled in the application"},
true
);
}
Cuidado
Os erros registrados usando este método não obedecem ao valor de configuração ignore_status_codes .
newrelic.setErrorGroupCallback(callback)
Este método permite definir um retorno de chamada personalizado para gerar nomes de grupos de erros, que serão usados pela Errors Inbox para agrupar erros semelhantes por meio do atributo do agente error.group.name.
As funções fornecidas devem retornar uma string e receber um objeto como argumento. O objeto contém informações relacionadas ao erro ocorrido e possui o seguinte formato:
Diga ao módulo se deve ou não ignorar uma determinada solicitação. Isso permite que você filtre explicitamente rotas ou solicitações irrelevantes e de pesquisa longa que você sabe que consumirão muito tempo. Isso também permite coletar métricas para solicitações que de outra forma seriam ignoradas.
Para ignorar a transação, defina o parâmetro como true: isso ignorará a transação.
Para evitar que uma transação seja ignorada com esta função, passe o parâmetro false.
Passar null ou undefined não alterará se a transação será ignorada.
newrelic.setUserID(string)
Este método oferece uma maneira de associar um identificador exclusivo a um evento de transação, rastrear a transação e erros na transação. Uma nova propriedade, enduser.id, será adicionada ao erro e reportada à Errors Inbox.
Use este método para desligar o agente normalmente, ambos os parâmetros são opcionais. Aqui está uma tabela de visão geral mostrando o parâmetro:
Parâmetro
Tipo
Atributo
Descrição
options
object
Opcional
Objeto com opções de desligamento
callback
function
Opcional
Função de retorno de chamada executada quando o agente para
Aqui está uma tabela detalhada mostrando as opções de desligamento do objeto:
Nome da opção
Tipo
Atributo
Padrão
Descrição
collectPendingData
boolean
Opcional
false
Informe ao agente se deve enviar quaisquer dados pendentes para o coletor New Relic antes de encerrar.
timeout
number
Opcional
0
O tempo padrão antes de forçar um desligamento. Quando collectPendingData for verdadeiro, o agente aguardará uma conexão antes de desligar. Esse tempo limite é útil para processos de curta duração, como AWS Lambda, para evitar que o processo permaneça aberto por muito tempo enquanto tenta se conectar.
waitForIdle
boolean
Opcional
false
Se for verdade, o agente não será encerrado até que não haja transação ativa.
Se não quiser colocar chamadas para o módulo New Relic diretamente no código do seu aplicativo, você poderá usar regras baseadas em padrões para nomear solicitações. Existem dois conjuntos de regras: um para renomear solicitações e outro para marcar solicitações para serem ignoradas pela instrumentação do New Relic.
Aqui está a estrutura das regras no agente Node.js da New Relic.
Uma lista de regras no formato {pattern : "pattern", name : "name"} para corresponder URLs de solicitação de entrada a pattern e nomear a transação New Relic correspondente name. Isso atua como uma substituição de regex, onde você pode definir o padrão como uma string ou como uma expressão regular JavaScript literal, e tanto o padrão quanto o nome são obrigatórios.
Ao passar uma regex como string, evite barras invertidas, pois o agente não as mantém quando fornecidas como string em um padrão. Defina suas regras de configuração das mais específicas às mais gerais, pois os padrões serão avaliados em ordem e são de natureza terminal. Para obter mais informações, consulte as diretrizes de nomenclatura.
Isso também pode ser definido com a variável de ambiente NEW_RELIC_NAMING_RULES, com diversas regras passadas como uma lista de literais de objetos JSON delimitados por vírgulas:
Quando definido como true (padrão), nenhuma outra regra será avaliada se esta regra corresponder. Definir isso como falso é útil quando várias regras devem ser usadas juntas. Por exemplo, uma regra poderia substituir um padrão comum em muitos URLs diferentes, enquanto as regras subsequentes seriam mais específicas.
replace_all
Padrão: false
Quando definido como true, todas as correspondências do padrão serão substituídas. Caso contrário, apenas a primeira partida será substituída. Usar o sinalizador g com literal de expressão regular terá o mesmo efeito. Por exemplo:
pattern: '[0-9]+',
replace_all: true
Isso tem o mesmo efeito que pattern: /[0-9]+/g.
precedence
Por padrão, as regras são avaliadas em ordem, da primeira à última. Se preferir ter controle total sobre o pedido, você pode atribuir a cada regra um atributo precedence . A precedência é um número inteiro e as regras são avaliadas em ordem crescente. Se precedence não for definido explicitamente, será definido como 500 por padrão.
Atributos adicionais são ignorados.
Testando suas regras de nomenclatura
O agente Node.js vem com uma ferramenta de linha de comando para testar regras de nomenclatura. Para obter mais informações, execute o seguinte comando na janela do terminal em um diretório onde seu aplicativo está instalado:
bash
$
node node_modules/.bin/newrelic-naming-rules
Exemplos de regras de nomenclatura [#examples-rules]
Aqui estão alguns exemplos de regras de nomenclatura e os resultados.
pattern: "^/items/[0-9]+$",
name: "/items/:id"
vai resultar em:
/items/123 => /items/:id
/orders/123 => /orders/123 (not replaced since the rule is a full match)
pattern: "[0-9]+",
name: ":id"
vai resultar em:
/orders/123 => /orders/:id
/items/123 => /items/:id
/orders/123/items/123 => /orders/:id/items/123
pattern: "[0-9]+",
name: ":id",
replace_all: true
vai resultar em:
/orders/123/items/123 => /orders/:id/items/:id
Usando referências de grupos de correspondência de expressões regulares:
pattern: '^/(items|orders)/[0-9]+$',
name: '/\\1/:id'
vai resultar em:
/orders/123 => /orders/:id
/items/123 => /items/:id
Isso também pode ser definido por meio da variável de ambiente NEW_RELIC_IGNORING_RULES, com diversas regras passadas como uma lista de padrões delimitados por vírgulas. Atualmente não há como escapar das vírgulas nos padrões.
Se você estiver usando socket.io, terá um caso de uso para ignorar regras imediatamente. Para evitar que o long polling do socket.io domine sua métrica de tempo de resposta e afete a métrica Apdex de seu aplicativo, adicione uma regra como:
// newrelic.js
exports.config={
// other configuration
rules:{
ignore:[
'^\/socket\.io\/.*\/xhr-polling'
]
}
};
Chamada de API para regras
Aqui estão as chamadas de API para nomear e ignorar regras com o agente Node.js da New Relic.
Versão programática de rules.name. Depois que as regras de nomenclatura forem adicionadas, elas não poderão ser removidas até que o processo Node.js seja reiniciado. Eles também podem ser adicionados por meio da configuração do agente Node.js. Ambos os parâmetros são obrigatórios.
Versão programática de rules.ignore. Depois que as regras de ignorar são adicionadas, elas não podem ser removidas até que o processo Node.js seja reiniciado. Eles também podem ser adicionados por meio da configuração do agente Node.js. Este parâmetro é obrigatório.