我应该在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/