【问题标题】:How do I get a more detailed transaction trace with the Ruby New Relic agent如何使用 Ruby New Relic 代理获得更详细的事务跟踪
【发布时间】:2026-02-04 11:20:08
【问题描述】:

我正在 Heroku 上运行 rails 3.0 应用程序并使用 New Relic 插件/服务。

我一直在查看事务跟踪功能(在专业版中提供)以进一步了解应用程序的性能特征。但是,很大一部分时间(30-50%)是“未测量的时间”。在通过在某些地方放置 method_tracers 并通过相当慢的周期来测试我是否获得更多信息进行了一些尝试之后,我觉得这一切都进展不快。

似乎在 PHP 新的 relic 代理中,他们有一个很棒的功能,可以获取非常详细的跟踪,而无需猜测将方法跟踪器放在哪里:http://newrelic.com/docs/php/php-agent-faq#top100

对于 ruby​​ 有什么类似的吗?

注意:我已经在使用 rpm_contrib 来获取更多信息并启用垃圾收集统计信息。此外,这不是要解决性能问题,只是了解如何更好地使用可用的性能工具,并为那些没有工具的时间挠痒痒。

【问题讨论】:

  • 到目前为止,我发现在 Heroku 上获取更详细事务跟踪的最佳方法是使用来自 github.com/rack/rack-contribRack::Profiler

标签: ruby-on-rails ruby performance newrelic


【解决方案1】:

方法跟踪器可以很好地工作,但是如果您的控制器中有很多代码,请尝试使用 trace_execution_scoped 进行二进制搜索,它会记录一段代码所花费的时间:

http://newrelic.github.com/rpm/NewRelic/Agent/MethodTracer/InstanceMethods/TraceExecutionScoped.html#method-i-trace_execution_scoped

为此添加几个调用,为每个指标起一个合理的名称,例如“Custom/MySlowControllerAction/block0”(trace_execution_scoped 的第一个参数),然后重复。

您命名的指标不仅会显示在事务跟踪中,还会显示在 Web 事务选项卡下的控制器操作的性能细分中,因此您会看到所有请求中该代码块的平均时间,而不仅仅是慢的。

【讨论】:

  • 感谢您的信息,我不知道该功能。但是,我认为在您描述的方法中缩小范围时会更有用,但当您的起点更多是在整个请求级别时,则不是那么有用。
  • 您开始缩小范围的方法可以是控制器操作,但它通常占执行时间的大部分(不包括排队、中间件等)。
  • 有时这可能是一个很好的起点。在我的情况下,与未测量的时间有关,结果证明是由于使用 Alchemist gem 导致调用 BasicObject#method_missing 所花费的时间。当我使用 Alchemist 进行大约 5 次转换时,它产生了相当大的全球影响,75 次调用。这种核心对象的动态方法如果没有一些详细的痕迹很难追踪。
  • 权衡是在性能和​​更多细节之间。我们不想过多地影响您的表现。也许我们进一步深入研究的另一种模式是有意义的。有时间我会推荐给代理团队的。
【解决方案2】:

Ruby 目前没有类似的东西。当我有机会时,我会向 Ruby 工程师提及它。我的猜测是,除非收到很多请求,否则它暂时不会位居榜首。同时,您可以使用方法跟踪器来计算未测量的时间。

希望对您有所帮助。

【讨论】:

  • 感谢您的信息,希望将来在 ruby​​ 版本中看到此功能。
最近更新 更多