我应该在SignalR集线器中的哪里调用NewRelic.Api.Agent.NewRelic.IgnoreApdex()NewRelic.Api.Agent.NewRelic.IgnoreTransaction(),以防止长时间运行的持久连接遮盖我的应用程序监视日志?

最佳答案

噢,好问题,我自己还没想过。我认为您需要做的是编写一个自定义模块,因为模块在所有处理程序之前执行,检测到SignalR AspNetHandler处理程序是被请求的处理程序,如果是,则在此时调用NewRelic IgnoreXXX方法。

只是吐口水(例如,我还没有测试过)模块可能看起来像这样:

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>

更新:6/25/2013

正如@dfowler在评论中警告的那样,SignalR从那以后改变了其托管方法,现在改为依靠基于Owin的托管。这很棒,因为它直接将SignalR与ASP.NET/IIS分离,但这意味着上述方法显然不再有效。相反,您需要做的是确保为Owin管道配置一个模块,如下面的示例(同样提供here in a gist)以禁用对管道的跟踪:

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);
    }
}

然后,在映射任何SignalR连接/集线器之前,只需确保在Startup::Configuration方法中将此模块添加到IAppBuilder中即可。看起来应该像这样:

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

最后,应该指出的是,现在这采用了一种非常简单的方法,即假定您在应用程序范围内不会有任何其他Owin请求。如果您将SignalR混合到另一个具有其他Owin请求的Web应用程序中,则此特定模块的实现也会导致忽略它们,因此将需要一个更高级的模块,该模块可能检查传入的请求实际上是否针对SignalR URL。现在,我让读者自己弄清楚。

关于c# - 忽略New Relic中的持久性SignalR连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13490473/

10-15 21:12