Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Stop flying blind. Profiling your App's Internals.

Stop flying blind. Profiling your App's Internals.

A talk on Rails metrics I gave at RailsWayCon 2012 in Berlin.

Robert Glaser

June 06, 2012
Tweet

More Decks by Robert Glaser

Other Decks in Programming

Transcript

  1. ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args| event = ActiveSupport::Notifications::Event.new(*args) PageViewMetric.create! do |metric|

    metric.path = event.payload[:path] metric.page_duration = event.payload[:page_duration] metric.view_duration = event.payload[:view_duration] metric.db_duration = event.payload[:db_runtime] end end
  2. BUILTIN RAILS INSTRUMENTATION ACTIONCONTROLLER start_processing.action_controller process_action.action_controller send_file.action_controller redirect_to.action_controller halted_callback.action_controller ACTIONMAILER

    deliver.action_mailer receive.action_mailer ACTIONVIEW render_template.action_view render_partial.action_view ACTIVERECORD sql.active_record CACHE cache_read.active_support cache_generate.active_support cache_fetch_hit.active_support cache_write.active_support cache_delete.active_support
  3. ActiveSupport::Notifications.subscribe(/^sql\./) do |*args| event = ActiveSupport::Notifications::Event.new(*args) blacklist = ['CACHE', 'SCHEMA',

    nil] # nil goes for inserts and updates unless blacklist.include?(event.payload[:name]) QueryMetric.create!(name: event.payload[:name], duration: event.duration) end end
  4. BUILTIN RAILS INSTRUMENTATION ACTIONCONTROLLER start_processing.action_controller process_action.action_controller send_file.action_controller redirect_to.action_controller halted_callback.action_controller ACTIONMAILER

    deliver.action_mailer receive.action_mailer ACTIONVIEW render_template.action_view render_partial.action_view ACTIVERECORD sql.active_record CACHE cache_read.active_support cache_generate.active_support cache_fetch_hit.active_support cache_write.active_support cache_delete.active_support
  5. ActiveSupport::Notifications.instrument 'iqvoc.concepts.published' 1. INSTRUMENTATION 2. SUBSCRIPTION ActiveSupport::Notifications.subscribe 'iqvoc.concepts.published' do |*args|

    event = ActiveSupport::Notifications.new(*args) event.name # => 'iqvoc.concepts.published' event.time # => start time object event.end # => finished time object event.duration # => convenience method event.payload # => optional hash end
  6. REGEXP SUBSCRIPTION ActiveSupport::Notifications.subscribe(/^iqvoc/) do |*args| event = ActiveSupport::Notifications.new(*args) puts event.name

    end # => iqvoc.concepts.created # => iqvoc.concepts.published # => iqvoc.concepts.branched # ...
  7. FEED IT TO FREE TOOLS GRAPHITE + DASHBOARD SOLUTIONS COMMERCIAL

    TOOLS LIBRATO METRICS NEWRELIC SCOUT KISS METRICS
  8. METRIKS EXAMPLE reporter = Metriks::Reporter::LibratoMetrics.new('[email protected]', '314c7284f190') reporter.start ActiveSupport::Notifications.subscribe 'iqvoc.concepts.published' do

    |*args| Metriks.meter('iqvoc.concepts.published').mark end ActiveSupport::Notifications.subscribe 'costly_operation' do |*args| event = ActiveSupport::Notifications::Event.new(*args) Metriks.timer('costly_operation').update(event.duration) end
  9. ASYNC NOTIFICATIONS SYNC QUEUE IS DEFAULT (FANOUT) DECOUPLE SLOW SUBSCRIPTIONS

    OF REQ/RESP-CYCLE USE THREADS/REAL QUEUE ActiveSupport::Notifications.notifier # => ActiveSupport::Notifications::Fanout ActiveSupport::Notifications.notifier = MyQueue
  10. DON‘T REBUILD LIBRATO/NEWRELIC TALK TO YOUR ADMIN DON‘T OVERPROFILE THINGS

    TRACK WHAT MATTERS STORE SUBSCRIPTIONS IN A SINGLE PLACE
  11. DERIVE BUSINESS VALUE SCALE UP IN CROWDED TIMES IDENTIFY SLOW

    VIEWS/QUERIES CORRELATE BOTTLENECKS AND CONVERSIONS