具有NewRelic监控功能的ServiceStack

Ant*_*ony 15 asp.net web-services servicestack newrelic

有没有人有成功将事务报告到NewRelicServiceStack Api的示例代码?

这似乎并不是微不足道的 - 它不是开箱即用的,添加一个RequestFilter调用NewRelic.Api.Agent.NewRelic.SetTransactionName不会改变它.

服务器和应用程序似乎配置正确 - 同一IIS服务器上的其他应用程序(ASP WebForms和ASP MVC)正确报告.我们正在使用IIS 7.5.每个应用程序都在自己的应用程序池中,并NewRelic.AppName在web.config中有一个

foo*_*ool 11

我在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);

}
Run Code Online (Sandbox Code Playgroud)

如果这不能解决问题,如果您可以在https://support.newrelic.com上打开支持服务单,我们可以与您进一步合作以跟踪这些统计数据,或者至少让您进入通知列表我们改进了服务栈支持.


myt*_*thz 10

我从未使用过NewRelic,但如果您在ServiceStack的Request Pipeline中尽早设置事务名称,例如在AppHost中的RawHttpHandlers中,它可能会有所帮助:

RawHttpHandlers.Add(httpReq => {
    NewRelic.Api.Agent.NewRelic.SetTransactionName(
        httpReq.HttpMethod, httpReq.AbsoluteUri);
});
Run Code Online (Sandbox Code Playgroud)

或者在较旧的ServiceStack v3中:

SetConfig(new EndpointHostConfig
{
    RawHttpHandlers = {
        httpReq => {
            NewRelic.Api.Agent.NewRelic.SetTransactionName(
                httpReq.HttpMethod, httpReq.AbsoluteUri);
            return null;
        } 
    }
});
Run Code Online (Sandbox Code Playgroud)


Tys*_*son 8

除了傻瓜的答案(确保代理实例不由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);
    }
}
Run Code Online (Sandbox Code Playgroud)