有没有人有成功将事务报告到NewRelic的ServiceStack Api的示例代码?
这似乎并不是微不足道的 - 它不是开箱即用的,添加一个RequestFilter
调用NewRelic.Api.Agent.NewRelic.SetTransactionName
不会改变它.
服务器和应用程序似乎配置正确 - 同一IIS服务器上的其他应用程序(ASP WebForms和ASP MVC)正确报告.我们正在使用IIS 7.5.每个应用程序都在自己的应用程序池中,并NewRelic.AppName
在web.config中有一个
除了傻瓜的答案(确保代理实例不由SS处理),如果您希望New Relic事务名称与您的服务DTO名称匹配,您可以执行以下操作:
public class NewRelicIntegrationPlugin : IPlugin { public void Register(IAppHost appHost) { appHost.RequestFilters.Insert(0, RenameNewRelicTransaction); } private void RenameNewRelicTransaction(IHttpRequest httpRequest, IHttpResponse httpResponse, object dto) { if ( dto != null ) NewRelic.Api.Agent.NewRelic.SetTransactionName("ServiceStack", dto.GetType().Name); } }
我在New Relic工作.
除了@mythz所说的,我想确认您已经单独配置了应用程序池(因此您没有看到其他一个受监视池中的事务) - 您已经设置了一个Web.config文件这个池的单独的应用程序名称(NewRelic.AppName设置),对吧?
假设是,并且您在该池中的代理的日志中至少看到了代理启动事件,我可以验证我们从其他客户那里听到了相同的信息,尽管自从我们上次访问该问题以来已经过了一段时间.对ServiceStack的更好的自动支持即将到来,但我没有ETA.
与遇到此问题的一位客户合作时,我们发现ServiceStack由于某种原因正在调用我们的代理.适用于它们的解决方案是在项目中覆盖ServiceStack的AppHostBase.Release实现,并验证要释放的对象(如果它是New Relic实例).他们在Web服务项目的AppHost中覆盖它(AppHost模板在App_Start\AppHost.cs的项目中),如下所示:
public override void Release(object instance) { if (instance.GetType().ToString().StartsWith("NewRelic.Agent", StringComparison.CurrentCultureIgnoreCase)) return; base.Release(instance); }
如果这不能解决问题,如果您可以在https://support.newrelic.com上打开支持服务单,我们可以与您进一步合作以跟踪这些统计数据,或者至少让您进入通知列表我们改进了服务栈支持.
我从未使用过NewRelic,但如果您在ServiceStack的Request Pipeline中尽早设置事务名称,例如在AppHost中的RawHttpHandlers中,它可能会有所帮助:
RawHttpHandlers.Add(httpReq => { NewRelic.Api.Agent.NewRelic.SetTransactionName( httpReq.HttpMethod, httpReq.AbsoluteUri); });
或者在较旧的ServiceStack v3中:
SetConfig(new EndpointHostConfig { RawHttpHandlers = { httpReq => { NewRelic.Api.Agent.NewRelic.SetTransactionName( httpReq.HttpMethod, httpReq.AbsoluteUri); return null; } } });