29

実行時間の長い永続的な接続がアプリケーションの監視ログを覆い隠すのを防ぐには、SignalR ハブのどこでまたはを呼び出す必要がありますNewRelic.Api.Agent.NewRelic.IgnoreApdex()か?NewRelic.Api.Agent.NewRelic.IgnoreTransaction()

監視を支配する SignalR の New Relic スクリーンショット

4

7 に答える 7

16

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 を忘れずに実行してください。

于 2014-11-11T12:43:56.843 に答える
9

ああ、素晴らしい質問で、私はまだ自分自身について考えていませんでした。モジュールはすべてのハンドラーの前に実行されるため、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メソッドで、IAppBuilderSignalR接続/ハブをマップする前にこのモジュールを追加してください。これは次のようになります。

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Use(typeof(NewRelicIgnoreTransactionOwinModule));
        app.MapHubs();
    }
}

最後に、現時点では、これは非常に単純なアプローチを採用しており、アプリケーションスコープに他のOwinリクエストがないことを前提としていることに注意してください。他のOwinリクエストがある別のWebアプリにSignalRを混在させる場合、この特定のモジュール実装はそれらも無視されるため、着信リクエストが実際にSignalRURLをターゲットにしていることを確認するより高度なモジュールが必要になります。今のところ、私はそれを理解するのは読者に任せています。

于 2012-11-21T18:01:17.047 に答える
4

この全体の問題は、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);
    }

}
于 2013-04-08T11:38:19.920 に答える
1

古いバージョンの 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>
于 2016-03-31T13:50:27.063 に答える