忽略New Relic中持久的SignalR连接

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

New Relic SignalR支配监控的屏幕截图

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

只是spitballing(例如我没有测试过)模块可能看起来像这样:

 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集成模式:

        

IIS经典模式:

        

更新:2013年6月25日

正如@dfowler在评论中警告的那样,SignalR已经改变了它的托管方式,而现在依赖于基于Owin的托管。 这很好,因为它直接将SignalR与ASP.NET / IIS分离,但这意味着上述方法显然不再适用。 相反,您需要做的是确保使用下面的示例模块配置Owin管道( 此处也在gist中提供)以禁用对管道的跟踪:

 public class NewRelicIgnoreTransactionOwinModule { private AppFunc _nextAppFunc; public NewRelicIgnoreTransactionOwinModule(AppFunc nextAppFunc) { _nextAppFunc = nextAppFunc; } public Task Invoke(IDictionary environment) { // Tell NewRelic to ignore this particular transaction NewRelic.Api.Agent.NewRelic.IgnoreTransaction(); return _nextAppFunc(environment); } } 

然后,在您的Startup :: Configuration方法中,确保在映射任何SignalR连接/集线器之前将此模块添加到IAppBuilder 。 这应该是这样的:

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

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

要继续使用Micah的答案,这里是用于忽略所有信号器调用的自定义检测文件。

将其创建为C:\ ProgramData \ New Relic.NET Agent \ Extensions \ IgnoreSignalR.xml

            

记得做iisreset。

也可以使用IgnoreTransactionTracerFactory通过自定义检测忽略事务。 当您不希望将API添加到项目中或希望忽略基于您无法更改的Framework方法的事务时,这尤其有用。

您的自定义检测文件看起来像:

           

如果您可以找到始终在请求线程上调用的SignalR框架方法(您只能在请求线程上调用IgnoreTransaction,而不是在异步线程上调用),您可以在上面填写assemblyName / className / methodName,它将是与在该方法中调用IgnoreTransaction API相同。

整个问题似乎是由SignalR控制器上的“连接”方法引起的。 我创建了一个集线器管道模块,它通过覆盖OnBeforeConnect方法忽略NewRelic日志记录。

在maphub为您的Web应用程序调用Application_Start()方法(global.asax.cs)之后的某处,添加以下内容:

 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工具

      
  public Task Invoke(IDictionary environment) { object value = ""; //Check if the OWIN key is present if (environment.ContainsKey("owin.RequestPath")) { //Get the value of the key environment.TryGetValue("owin.RequestPath", out value); //This will block all signalr request, but we can configure according to requirements if (value.ToString().Contains("/signalr")) { // Tell NewRelic to ignore this particular transaction NewRelic.Api.Agent.NewRelic.IgnoreTransaction(); NewRelic.Api.Agent.NewRelic.IgnoreApdex(); } } return _nextAppFunc(environment); } 

在SignalR.Core 2.2.2中,有两种AuthorizeRequest方法。 所以New Relic仪器文件应如下所示:

              

将此文件放到“C:\ ProgramData \ New Relic.NET Agent \ Extensions”解决问题。