用于剖析Ruby on Rails应用程序的基本gem列表

即使是大多数有经验的Ruby on Rails开发人员有时也忘记了他们在漫长的开发过程中产生的烦人的错误,例如n + 1查询,或者由于无处不在的一些意外查询而浪费了很多时间。

并非在生产之前就可以避免所有这些错误,但是至少您可以尝试:)

是的,这是为了更好的开发过程而被遗忘或不那么受欢迎的宝石的又一清单。
让我们开始吧。

1.项目符号


Bullet-n + 1个查询作斗争的最流行,最简单的解决方案之一。

该gem提供了多种方式来向您显示某些查询效率不高。 浏览器(控制台日志),开发日志,输出文件。 我的选择只是使用开发日志,因为它并不那么令人讨厌(某些问题显示得不及时或无法使用当前体系结构轻松解决)。

工作原理 :例如,您对某个模型( 服务 )有索引请求。 并且此模型具有许多不同的关系( 服务has_many组 ),它们也具有关系..( 组has_many个用户用户has_many个徽标等)。 这可能会导致重复的低效率数据加载( n +1 )。 您想要显示logo_url,它只是开始为每个用户创建不必要的查询(有时您会立即看到它,有时不太清楚)。 在大多数情况下, 项目符号会在开发日志中抛出下一行:

GET /api/services USE eager loading detected Service => [:groups] Add to your finder: :includes => [:groups] Call stack /home/projects/test_app_name/app/services/index.rb:18:in `perform' /home/projects/test_app_name/app/controllers/services_controller.rb:7:in `index' 

如您所见,它显示了请求,发现的内容(急切加载),模型以及多次准确加载的内容。 当然要调用堆栈。

足够好的开始!



项目符号可以找到未使用的紧急加载和计数器缓存。 并允许您禁用其任何检测器。

 # Each of these settings defaults to true # Detect N+1 queries Bullet.n_plus_one_query_enable = false # Detect eager-loaded associations which are not used Bullet.unused_eager_loading_enable = false # Detect unnecessary COUNT queries which could be avoided # with a counter_cache Bullet.counter_cache_enable = false 



在我的项目中,我更喜欢禁用未使用的紧急加载查询,因为在许多地方使用了加载模型服务,在不同地方使用这种加载模型服务是很常见的情况,您不需要预先加载某些在其他地方显然需要的关系。 最终,这种情况非常令人讨厌。 您最好预先加载一些信息,然后忘记将其正确加载到某个地方。

我的配置(在development.rb中 ):

 config.after_initialize do Bullet.enable = true Bullet.rails_logger = true Bullet.unused_eager_loading_enable = false end 

更多信息


2. ActiveRecordQueryTrace(active_record_query_trace)


active_record_query_trace-记录/显示Active Record执行的所有SQL查询的回溯记录的gem

(我只是从他们的Github页面复制了说明的一部分,因为他们拥有您所需要知道的一切)

在Rails的开发控制台和日志中显示每个查询的回溯。 允许您跟踪应用程序中查询的执行位置。 对于性能优化以及在对大型应用程序进行更改时查找从哪里开始有用。

启用后,每个查询都会记录如下:

 Started GET "/" for 172.19.0.1 at 2019-09-29 07:08:04 +0000 Processing by HomeController#index as HTML Users::User Load (1.7ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 10014 LIMIT 1 Query Trace: app/controllers/concerns/user_stack.rb:44:in `peek' Clubs::Club Load (1.7ms) SELECT `clubs`.* FROM `clubs` WHERE `clubs`.`id` = 15 LIMIT 1 Query Trace: app/controllers/concerns/user_aware.rb:38:in `current_club' 

我想说的是,当您从头开始而不是从一开始就开始从事该项目并且不知道一切如何工作(或仅具有同事的功能)时,此gem非常有用,并且某些查询调用不容易理解。 确实可以节省很多时间。

还有一点注意事项:
对于每个ActiveRecord查询,日志文件中都会有一个附加的回溯。 默认情况下,它是5,足以使您的日志完全不可读。
但是可以控制:

 ActiveRecordQueryTrace.lines = 1 # or 2, something not big 

更多信息:


3.rails_panel


RailsPanel是用于Rails开发的Chrome扩展程序 ,它将结束您对development.log的了解 。 在浏览器中-开发人员工具面板中获取有关Rails应用程序请求的所有信息。 提供有关数据库/渲染/总时间,参数列表,渲染视图等的洞察力。

要使用此扩展名,您需要将meta_request gem添加到应用程序的Gemfile中:

 group :development do gem 'meta_request' end 

Chrome WebStore安装RailsPanel扩展。 这是推荐的安装扩展方式,因为它将在每个新版本上自动更新。

这是启用的rails_panel gem /扩展的示例:

图片

更多信息:


4.机架式迷你轮廓仪


安装gem并打开您的项目后,您将在页面的左上角看到弹出窗口(可以重新配置):



单击它后,您将看到更多详细信息:



如您所见,这里有很多有用的信息,可帮助您提高工作效率。 此外,它还可以与SPA应用程序一起使用。

更多信息:


5. newrelic / datadog


New Relic是由New Relic,Inc.开发的绩效管理系统 。 它为您提供有关Rails或Ruby应用程序在生产环境中运行时的性能的深入信息,并将其传输到newrelic.com,您可以在其中实时监视它们 。 (他们也没有付费帐户)

Datadog作为替代方案也是一个很好的选择。 它们提供与New Relic相同的功能。 只需检查它们的可能性,用户界面,价格,然后选择您喜欢的任何东西即可。

更多信息:


感谢您的阅读!

Source: https://habr.com/ru/post/zh-CN482330/


All Articles