具有NewRelic监控功能的ServiceStack

 qin2112 发布于 2023-02-13 19:07

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

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

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

3 个回答
  • 除了傻瓜的答案(确保代理实例不由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);
        }
    }
    

    2023-02-13 19:10 回答
  • 我在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上打开支持服务单,我们可以与您进一步合作以跟踪这些统计数据,或者至少让您进入通知列表我们改进了服务栈支持.

    2023-02-13 19:10 回答
  • 我从未使用过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;
            } 
        }
    });
    

    2023-02-13 19:10 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有