sql_metrics = []
File.foreach('log/production.log') do |line|
if line =~ /Completed.*ActiveRecord:\s(.+)ms/
sql_metrics << $1
end
end
Slide 14
Slide 14 text
No content
Slide 15
Slide 15 text
ENTER
ACTIVESUPPORT NOTIFICATIONS
Slide 16
Slide 16 text
SIMPLE
MESSAGING SYSTEM FOR INSTRUMENTING
Slide 17
Slide 17 text
ActiveSupport::Notifications.subscribe do |*args|
event = ActiveSupport::Notifications::Event.new(*args)
Rails.logger.debug(event.name)
end
ActiveSupport::Notifications.subscribe do |name, start, finish, id, payload|
...
end
Slide 18
Slide 18 text
No content
Slide 19
Slide 19 text
CONSUMING
BUILTIN RAILS METRICS
Slide 20
Slide 20 text
EXAMPLE
PAGE VIEWS
Slide 21
Slide 21 text
class PageViewMetric < ActiveRecordBase
attr_accessible :path, :page_duration, :view_duration, :db_duration
end
Slide 22
Slide 22 text
No content
Slide 23
Slide 23 text
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
UNSUBSCRIBING
AVOID POLLUTION OF YOUR METRICS SYSTEM
subscriber = ActiveSupport::Notifications.subscribe(/noisy_instrument/) do |*args|
end
ActiveSupport::Notifications.unsubscribe(subscriber)
Slide 34
Slide 34 text
TEMPORARY SUBSCRIPTIONS
callback = lambda { |*args| ... }
ActiveSupport::Notifications.subscribed(callback, "verbose_instrument") do
...
end
Slide 35
Slide 35 text
GOT DATA?
DO SOMETHING WITH IT
Slide 36
Slide 36 text
FEED IT TO
FREE TOOLS
GRAPHITE + DASHBOARD SOLUTIONS
COMMERCIAL TOOLS
LIBRATO METRICS
NEWRELIC
SCOUT
KISS METRICS
Slide 37
Slide 37 text
FEED IT TO
BOTS
HUBOT
CAMPFIRE
IRC
HIPCHAT
Slide 38
Slide 38 text
HOW
TO FEED
Slide 39
Slide 39 text
No content
Slide 40
Slide 40 text
METRIKS
METRICS LIBRARY FOR RUBY
THREADSAFE
NICE API
SUPPORT FOR MULTIPLE BACKENDS
METRIKS API
COUNTERS
Metriks.counter('iqvoc.page_views').increment
Slide 45
Slide 45 text
METRIKS API
METERS
meter = Metriks.meter('my_app.github_api_requests')
meter.mark
puts "rate: #{meter.mean_rate}/sec"
Slide 46
Slide 46 text
METRIKS API
TIMERS
timer = Metriks.timer('paypal_api_requests')
timer.time do
damn_slow_paypal_api_request
end
Slide 47
Slide 47 text
METRIKS EXAMPLE
reporter = Metriks::Reporter::LibratoMetrics.new('foo@bar.local', '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
Slide 48
Slide 48 text
LIBRATO METRICS
Slide 49
Slide 49 text
WRITE YOUR OWN REPORTER
Slide 50
Slide 50 text
LAST BUT NOT LEAST
Slide 51
Slide 51 text
BEST
PRACTICES
Slide 52
Slide 52 text
DEVELOPMENT != PRODUCTION
Slide 53
Slide 53 text
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
Slide 54
Slide 54 text
DON‘T REBUILD LIBRATO/NEWRELIC
TALK TO YOUR ADMIN
DON‘T OVERPROFILE THINGS
TRACK WHAT MATTERS
STORE SUBSCRIPTIONS IN A SINGLE PLACE
Slide 55
Slide 55 text
DERIVE BUSINESS VALUE
SCALE UP IN CROWDED TIMES
IDENTIFY SLOW VIEWS/QUERIES
CORRELATE BOTTLENECKS AND CONVERSIONS