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.
O New Relic para Node.js instrumenta automaticamente a maioria das solicitações padrão da web, mas às vezes você deseja instrumentação expandida. Com a API de instrumentação personalizada do agente, você pode criar instrumentação para estruturas da Web, armazenamentos de dados e clientes de serviço de mensagens que de outra forma não seriam suportados.
A API de instrumentação personalizada do agente Node.js também permite:
Create transação da web (útil para coisas como web sockets, onde a transação não pode ser criada automaticamente).
Começando com o agente Node.js versão 2.0.0, A New Relic fornece uma API para expandir a instrumentação para estruturas web adicionais. Para obter mais informações, incluindo um tutorial, consulte a documentação da instrumentação da framework da web Node.js no GitHub.
Clientes de serviço de mensagens não suportados por instrumento
Começando com o agente Node.js versão 2.0.0, A New Relic fornece uma API para expandir a instrumentação para biblioteca adicional de serviços de mensagens. Para obter mais informações, incluindo um tutorial, consulte a documentação da instrumentação do cliente do serviço de mensagens Node.js no GitHub.
Armazenamentos de dados não suportados por instrumento
Começando com o agente Node.js versão 2.0.0, A New Relic fornece uma API para expandir a instrumentação para bibliotecas adicionais de armazenamento de dados. Para obter mais informações, incluindo um tutorial, consulte a documentação da instrumentação do armazenamento de dados Node.js no GitHub.
Instrumento de transação da web
Para criar uma transação personalizada da web, chame startWebTransaction para iniciar a transação. Para encerrar a transação, use qualquer uma destas opções:
Ending the transaction
Comments
Promessa
Se o manipulador passado para startWebTransaction retornar uma promessa, o agente encerrará a transação quando a promessa retornada for resolvida ou rejeitada.
Manual
Se você chamar getTransaction no contexto da nova transação, isso notificará o agente de que a transação será processada manualmente.
Se getTransaction for chamado no manipulador, você must encerrará a transação chamando transaction.end().
Síncrono
Se nenhuma dessas opções for atendida, a transação será encerrada quando o manipulador retornar de forma síncrona.
Este exemplo instrumento uma transação /websocket/ping , uma transação /websocket/update e uma transação /websocket/new-message dentro de socket.io. O exemplo /ping é síncrono, enquanto os exemplos /new-message e /update são assíncrono.
Este método fornece apenas dados básicos de tempo para a transação criada. Para criar dados de temporização e nomenclatura de transação mais complexos para uma framework específica, consulte a documentação da API Node.js e o tutorial WebFramework relacionado no GitHub.
Antecedentes do instrumento de transação
Você pode usar transação personalizada para instrumento de transação fora da web (tarefas em segundo plano); por exemplo:
Trabalhos periódicos dentro do seu aplicativo
Trabalho que continua após a conclusão de uma solicitação
Para instrumentar tarefas em segundo plano, chame startBackgroundTransaction em seu manipulador para iniciar uma transação em segundo plano. Para encerrar a transação, use qualquer uma destas opções:
Ending the transaction
Comments
Promessa
Se o manipulador passado para startBackgroundTransaction retornar uma promessa, o agente encerrará a transação quando a promessa retornada for resolvida ou rejeitada.
Manual
Se você chamar getTransaction no contexto da nova transação, isso notificará o agente de que a transação será processada manualmente.
Se getTransaction for chamado no manipulador, você must encerrará a transação chamando transaction.end().
Síncrono
Se nenhuma dessas opções for atendida, a transação será encerrada quando o manipulador retornar de forma síncrona.
Este exemplo de instrumento update:cache dentro de setInterval:
const nr =require('newrelic');
const redis =require('redis').createClient();
// Using API getTransaction to manage ending the transaction
Você pode criar instrumentação usando os métodos de registro de instrumentação na API. Escrever instrumentação usando a API de instrumentação permite especificar métricas e nomenclatura com mais detalhes por métodos de "monkey patching" (substituindo funções) em objetos relevantes. Outras opções podem oferecer visibilidade sobre transações da web que já estão instrumentadas, ou obter insights sobre banco de dados e outros trabalhos de transação que não são automaticamente instrumentados.
Para fazer isso, envolva seu retorno de chamada no rastreador personalizado. O rastreador personalizado cria e coleta métricas específicas para um segmento adicional dentro de uma transação existente, como uma função específica ou uma chamada de banco de dados.
Para instrumentar retornos de chamada individuais, chame startSegment() dentro do retorno de chamada e mova a lógica principal de retorno de chamada para a função handler .
Para instrumentalizar uma função que é chamada dentro de uma função assíncrona, envolva a função alvo e sua função assíncrona pai com startSegment().
Importante
Esses exemplos devem ser colocados no código que está sendo executado em uma transação. A origem da transação, personalizada ou criada automaticamente, não importa.
Este exemplo rastreia um único retorno de chamada:
// This is recorded as the `db:createObject` segment.
db.createObject(cb);
},function(err, result){
// This is recorded as the callback to the `db:createObject` segment.
if(util.handleError(err, res)){
return;
}
res.write(JSON.stringify(result.rows[0].id));
res.write('\n');
res.end();
});
Este exemplo rastreia pg.connect e client.query. Isto ocorre porque client.query é chamado por uma função pai assíncrono (pg.connect). Caso contrário, você não obteria nenhum dado de client.query. Isto permite que startSegment() propague a transação ativa através desses limites assíncronos.
nr.startSegment('pg:connect',true,function(cb){
pg.connect(config.db_string, cb);
},function(err, client, done){
if(util.handleError(err,'500', res)){
returndone();
}
nr.startSegment('pg:query',true,function(cb){
client.query('SELECT count(*) FROM test_count', cb);
},function(err, result){
if(util.handleError(err,'500', res)){
returndone();
}
res.write(result.rows[0].count);
res.write('\n');
});
});
Este exemplo é igual ao de retorno de chamada, mas para interagir com uma API baseada em promessa. Para promessas, simplesmente retorne a promessa e chame then após startSegment para continuar a execução.
nr.startSegment('pg:connect',true,function(){
// This `pg:connect` segment will time until the returned promise
// either resolves or rejects.
return pg.connect(config.db_string);
}).then(function(client){
// The transaction context is propagated into following promises.
return client.query('SELECT count(*) FROM test_count');
}).then(function(result){
res.write(result.rows[0].count);
res.write('\n');
res.end();
},function(err){
// Error from querying.
util.handleError(err,'500', res);
}).finally(function(){
return client.release();
});
},function(err){
// Error from connecting.
util.handleError(err,'500', res);
});
Este exemplo mostra como codificar o instrumento usando async/await para controlar o trabalho assíncrono. Isso requer o uso do Node.js 8 ou superior, bem como o agente New Relic for Node.js v2.3.0 ou superior.