問題
New Relic の .NET エージェントは、処理されたエラーを標準的なエラーであるかのように報告します。これは、Azure のワーカーロール、コンソールアプリ、非同期作業、および同様の操作で最もよく見られます。
解決
誤ったエラー・レポートを避けるために、例外ハンドラを直接または間接的に含むメソッドをインスツルメンテーションします。この例のように、 カスタム・インスツルメンテーション ファイルを定義するか、 カスタム・トランザクション でメソッドをラップすることで、ターゲット・メソッドをインストゥルメントします。
この例では、 New Relic GetResponse()
からエラーを報告します。unless メソッド Foo()
がインストゥルメントされました。 Foo
がインストゥルメントされている限り、 New Relic Foo
が呼び出されたときにトランザクションを開始し、Foo
が終了したときにトランザクションを終了します。
エラーはFoo
が終了する前に処理されるため、NewRelicはエラーを報告しません。 GetResponse()
がFoo
トランザクションのセグメントになることにも注意してください。
using System.Collections.Generic;
using System.Threading.Tasks;
static void Main(string[] args)
Console.WriteLine("Got it " + i + "!");
static string GetNotFound()
string uri = "https://localhost/Test/this/is/not/a/real/page";
var request = (HttpWebRequest)WebRequest.Create(uri);
var response = request.GetResponse();
var data = new StreamReader(response.GetResponseStream()).ReadToEnd();
楽器Foo
へ:
カスタムインストルメンテーションファイルを定義します;たとえば、 CustomInstrumentation.xml
:
<?xml version="1.0" encoding="utf-8"?>
<extension xmlns="urn:newrelic-extension">
<match assemblyName="ErrorTester" className="ErrorTester.Program">
<exactMethodMatcher methodName="Foo" />
CustomInstrumenation.xml
をCoreInstrumentation.xml
と一緒にNewRelic拡張フォルダーに配置し、アプリケーションを再起動します。
Foo
をインストルメント化するには、カスタムトランザクションでラップします。
<extension xmlns="urn:newrelic-extension">
<tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.BackgroundThreadTracerFactory" metricName="Background/Task">
<match assemblyName="ErrorTester" className="ErrorTester.Program">
<exactMethodMatcher methodName="Foo" />
原因
New Relic の .NET エージェントが報告するエラーは、トランザクションを終了する処理されないエラーのみです。トランザクションが終了する前にアプリが例外ハンドラを呼び出した場合、New Relic はエラーを報告しません。
しかし、New Relic は、エラーが Web トランザクション、WCF トランザクション、またはカスタム トランザクションの外で発生した場合、例外ハンドラを必ずしも検出しません。これは、エージェントが"ミニトランザクション" を、トランザクションに関連付けられていないインスツルメンテッド・メソッドのために作成するためです。
計装化されたメソッドが終了すると、ミニトランザクションが終了します。ミニトランザクションがエラーを投げ、インスツルメンテッド・メソッドがそれを処理しない場合、New Relic はエラーを報告します。
これは、例に示すように、 GetResponse()
を呼び出すコンソールアプリで確認できます。 GetResponse
がエラーをスローした場合、 GetResponse()
がtry / catchブロック内で呼び出されても、NewRelicはそれを報告します。 GetResponse()
"mini-transaction"が終了し、トランザクションの終了時にエラーがまだ処理されていないため、エージェントはエラーを報告します。