Where should I call NewRelic.Api.Agent.NewRelic.IgnoreApdex()
or NewRelic.Api.Agent.NewRelic.IgnoreTransaction()
in my SignalR hubs to prevent long-running persistent connections from overshadowing my application monitoring logs?
相关问题
- Sorting 3 numbers without branching [closed]
- Graphics.DrawImage() - Throws out of memory except
- MVC-Routing,Why i can not ignore defaults,The matc
- Why am I getting UnauthorizedAccessException on th
- 求获取指定qq 资料的方法
Oooh, great question and one I hadn't thought about yet myself. I think what you would have to do is write a custom module, since modules execute before all handlers, that detect that the SignalR AspNetHandler handler is the one being requested and, if so, call the NewRelic IgnoreXXX methods at that point.
Just spitballing (e.g. I haven't tested this) that module might look something like this:
Then (obviously?) you need to register that module in config like so...
IIS Integrated mode:
IIS Classic mode:
UPDATE: 6/25/2013
As warned by @dfowler in the comments, SignalR has since changed its approach to hosting and instead now relies on Owin based hosting instead. This is great because it decouples SignalR directly from ASP.NET/IIS, but that means the above approach obviously won't work anymore. Instead what you would need to do is to make sure to configure the Owin pipeline with a module like the sample one below (available here in a gist as well) to disable tracing for the pipeline:
And then, in your Startup::Configuration method just make sure you add this module to the
IAppBuilder
before you map any SignalR connections/hubs. That should look something like this:Finally, it should be noted that, right now this takes a very simplistic approach that assumes you're not going to have any other Owin requests in your application scope. If you're mixing SignalR into another web app that has other Owin requests this particular module implementation would cause those to be ignored as well, so a more advanced module that maybe checks that the incoming request is actually targeting a SignalR URL would be required. For now, I leave that up to the reader to figure out.
For people using an old version of SignalR here is the xml instrumentation
To continue with Micah's answer, here is the custom instrumentation file for ignoring all signalr calls.
Create it to C:\ProgramData\New Relic.NET Agent\Extensions\IgnoreSignalR.xml
Remember to do iisreset.
This whole issue seems to be caused by the "connect" method on the SignalR controller. I created a hub pipeline module which ignores NewRelic logging by overriding the OnBeforeConnect method.
Somewhere after the maphubs call in your Application_Start() method (global.asax.cs) for your web app, add the following:
Then create this class:
It is possible to ignore a transaction via custom instrumentation as well using the IgnoreTransactionTracerFactory. This is particularly useful when you don't want to add the API to your project or when you want to ignore transactions based on a Framework method that you cannot change.
Your custom instrumentation file would look something like:
If you can find a SignalR framework method that is always called on the request thread (you can only call IgnoreTransaction on the request thread, not on an async thread) you can fill out the assemblyName/className/methodName in the above and it would be the same as calling IgnoreTransaction API inside that method.