実行時間の長い永続的な接続がアプリケーションの監視ログを覆い隠すのを防ぐには、SignalR ハブのどこでまたはを呼び出す必要がありますNewRelic.Api.Agent.NewRelic.IgnoreApdex()
か?NewRelic.Api.Agent.NewRelic.IgnoreTransaction()
7 に答える
Micah の回答を続けるには、すべてのシグナル呼び出しを無視するためのカスタム インストルメンテーション ファイルを次に示します。
C:\ProgramData\New Relic.NET Agent\Extensions\IgnoreSignalR.xml に作成します
<?xml version="1.0" encoding="utf-8"?>
<extension xmlns="urn:newrelic-extension">
<instrumentation>
<!-- Optional for basic traces. -->
<tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.IgnoreTransactionTracerFactory">
<match assemblyName="Microsoft.AspNet.SignalR.Core" className="Microsoft.AspNet.SignalR.PersistentConnection">
<exactMethodMatcher methodName="ProcessRequest"/>
</match>
</tracerFactory>
</instrumentation>
</extension>
iisreset を忘れずに実行してください。
ああ、素晴らしい質問で、私はまだ自分自身について考えていませんでした。モジュールはすべてのハンドラーの前に実行されるため、SignalR AspNetHandlerハンドラーが要求されていることを検出し、その時点でNewRelicIgnoreXXXメソッドを呼び出すカスタムモジュールを作成する必要があると思います。
そのモジュールを吐き出すだけで(たとえば、これをテストしていません)、次のようになります。
public class SignalRNewRelicIgnoreHttpModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.PostMapRequestHandler += (s, a) =>
{
if(HttpContext.Current.Handler is SignalR.Hosting.AspNet.AspNetHandler)
{
NewRelic.Api.Agent.NewRelic.IgnoreTransaction();
}
};
}
public void Dispose()
{
}
}
次に(明らかに?)そのモジュールを次のように構成に登録する必要があります...
IIS統合モード:
<configuration>
<system.webServer>
<modules>
<add name="SignalRNewRelicIgnoreHttpModule" type="WhateverNamespace.SignalRNewRelicIgnoreHttpModule, WhateverAssemblyName" />
</modules>
</system.webServer>
</configuration>
IISクラシックモード:
<configuration>
<system.web>
<httpModules>
<add name="SignalRNewRelicIgnoreHttpModule" type="WhateverNamespace.SignalRNewRelicIgnoreHttpModule, WhateverAssemblyName" />
</httpModules>
</system.web>
</configuration>
更新:2013年6月25日
コメントで@dfowlerが警告しているように、SignalRはその後、ホスティングへのアプローチを変更し、代わりにOwinベースのホスティングに依存しています。これは、SignalRをASP.NET/IISから直接切り離すので素晴らしいですが、それは上記のアプローチが明らかに機能しなくなることを意味します。代わりに、パイプラインのトレースを無効にするために、以下のサンプルのようなモジュール(ここでも要点で利用可能)を使用してOwinパイプラインを構成する必要があります。
public class NewRelicIgnoreTransactionOwinModule
{
private AppFunc _nextAppFunc;
public NewRelicIgnoreTransactionOwinModule(AppFunc nextAppFunc)
{
_nextAppFunc = nextAppFunc;
}
public Task Invoke(IDictionary<string, object> environment)
{
// Tell NewRelic to ignore this particular transaction
NewRelic.Api.Agent.NewRelic.IgnoreTransaction();
return _nextAppFunc(environment);
}
}
次に、Startup :: Configurationメソッドで、IAppBuilder
SignalR接続/ハブをマップする前にこのモジュールを追加してください。これは次のようになります。
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use(typeof(NewRelicIgnoreTransactionOwinModule));
app.MapHubs();
}
}
最後に、現時点では、これは非常に単純なアプローチを採用しており、アプリケーションスコープに他のOwinリクエストがないことを前提としていることに注意してください。他のOwinリクエストがある別のWebアプリにSignalRを混在させる場合、この特定のモジュール実装はそれらも無視されるため、着信リクエストが実際にSignalRURLをターゲットにしていることを確認するより高度なモジュールが必要になります。今のところ、私はそれを理解するのは読者に任せています。
この全体の問題は、SignalR コントローラーの "connect" メソッドが原因のようです。OnBeforeConnect メソッドをオーバーライドして、NewRelic のログ記録を無視するハブ パイプライン モジュールを作成しました。
Web アプリの Application_Start() メソッド (global.asax.cs) で maphubs を呼び出した後のどこかに、次を追加します。
GlobalHost.HubPipeline.AddModule(new IgnoreNewRelicConnectionsModule());
次に、このクラスを作成します。
private class IgnoreNewRelicConnectionsModule : HubPipelineModule
{
protected override bool OnBeforeConnect(IHub hub)
{
NewRelic.Api.Agent.NewRelic.IgnoreTransaction();
return base.OnBeforeConnect(hub);
}
}
古いバージョンの SignalR を使用している場合は、ここに xml インストルメンテーションがあります。
<tracerFactory name="NewRelic.Agent.Core.Tracer.Factories.IgnoreTransactionTracerFactory">
<match assemblyName="SignalR.Hosting.AspNet" className="SignalR.Hosting.AspNet.AspNetHandler">
<exactMethodMatcher methodName="ProcessRequestAsync"/>
</match>
</tracerFactory>