Os relatórios do agente .NET da New Relic trataram os erros como se fossem erros padrão. Isto é mais comum com funções de trabalhador do Azure, aplicações de consola, trabalho assíncrono e operações semelhantes.
Solução
Para evitar falsos relatórios de erros, utiliza-se um método que contém direta ou indiretamente o manipulador de exceções. instrumento o método alvo definindo um arquivo de instrumentação personalizada , ou envolvendo o método em uma transação customizada, conforme mostrado neste exemplo:
Neste exemplo, o New Relic relata um erro de GetResponse()unless o método Foo() é instrumentado. Contanto que Foo seja instrumentado, o New Relic inicia uma transação quando Foo é chamado e termina a transação quando Foo termina.
Como o erro é tratado antes do término de Foo , o New Relic não reportará um erro. Observe também que GetResponse() se torna um segmento da transação Foo .
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Threading;
usingSystem.Threading.Tasks;
usingSystem.Net;
usingSystem.IO;
namespaceErrorTester
{
classProgram
{
staticvoidMain(string[] args)
{
var i =0;
while(true)
{
Foo(++i);
}
}
staticvoidFoo(int i)
{
try
{
GetNotFound();
}
catch(Exception ex)
{
Console.WriteLine("Got it "+ i +"!");
Thread.Sleep(1000);
}
}
staticstringGetNotFound()
{
string uri ="https://localhost/Test/this/is/not/a/real/page";
var request =(HttpWebRequest)WebRequest.Create(uri);
var response = request.GetResponse();
var data =newStreamReader(response.GetResponseStream()).ReadToEnd();
Os únicos erros relatados pelo agente .NET da New Relic são erros não tratados que encerram uma transação. Se seu aplicativo chamar um manipulador de exceção antes do término da transação, o New Relic não reportará um erro.
No entanto, o New Relic nem sempre detecta manipuladores de exceção quando o erro ocorre fora de uma transação da web, transação WCF ou transação personalizada. Isso ocorre porque o agente cria “minitransações” para métodos instrumentados que não estão associados a uma transação.
Quando o método instrumentado termina, a minitransação termina. Se a minitransação gerar um erro e o método instrumentado não tratar isso, o New Relic reportará um erro.
Você pode ver isso em um aplicativo de console que chama GetResponse(), conforme mostrado no exemplo. Se GetResponse gerar um erro, o New Relic irá reportá-lo, mesmo que GetResponse() seja chamado dentro de um bloco try/catch. O agente reporta um erro porque a GetResponse() "mini-transação" terminou e o erro ainda não foi tratado na saída da transação.