ActiveSupport::Notifications.subscribe 'xml.processed' do |*args|
event = ActiveSupport::Notifications::Event.new(*args)
event.name # 'xml.processed'
event.payload[:xml] # 'WTF_BBQ_10.xml'
event.duration # 10 miliseconds
event.time # Time
event.end # Time
event.payload[:exception] # ["RuntimeError", ":poop:"]
end
Slide 6
Slide 6 text
ActiveSupport::Notifications.subscribe %r[xml] do |*args|
event = ActiveSupport::Notifications::Event.new(*args)
event.name # 'xml.processed' / 'xml.not_found'
event.payload[:xml] # 'WTF_BBQ_10.xml'
event.duration # 10 miliseconds
event.time # Time
event.end # Time
event.payload[:exception] # ["RuntimeError", ":poop:"]
end
Slide 7
Slide 7 text
Q%(!+* ,#+$ ( b,&!+
class TimedSubscriber
def call(name, started, finished, id, payload)
# Instrumented block finished
end
end
ActiveSupport::Notifications.subscribe %r[xml], TimedSubscriber.new
Slide 8
Slide 8 text
Ev$)"$-
class EventedSubscriber
def start(name, id, payload)
# Instrumented block started
end
def finish(name, id, payload)
# Instrumented block finished
end
end
ActiveSupport::Notifications.subscribe %r[xml], EventedSubscriber.new
A!"#v$S%pp&r" 4
Slide 9
Slide 9 text
class OrderXmlParser
extend Forwardable
def_delegator ActiveSupport::Notifications, :instrument
def process(doc)
instrument 'xml.processed', :xml => doc do |payload|
# Actual work.
# payload[:xml] => doc
end
end
end
<3 F&rw(r-(b,$ <3
Slide 10
Slide 10 text
L&..#). &
I)*"r%/$)"(çã&
Slide 11
Slide 11 text
L&..#).
Slide 12
Slide 12 text
ActiveSupport::Notifications.subscribe 'xml.processed' do |*args|
event = ActiveSupport::Notifications::Event.new(*args)
Rails.logger.info "processed #{event.payload[:xml]}"
end
ActiveSupport::Notifications.subscribe 'xml.not_found' do |*args|
event = ActiveSupport::Notifications::Event.new(*args)
Rails.logger.info ":bomb: #{event.payload[:xml]} not found"
end
Slide 13
Slide 13 text
require 'active_support/log_subscriber'
class ProcessingLogger < ActiveSupport::LogSubscriber
# xml.processed
def processed(event)
info "processed #{event.payload[:xml]}"
end
# xml.not_found
def not_found(event)
debug ":bomb: #{event.payload[:xml]} not found"
end
end
ProcessingLogger.attach_to :xml
class ProcessingLogStore
def call(*args)
event = ActiveSupport::Notifications::Event.new(*args)
Redis.current.rpush(event.name, event.to_json)
end
end
ActiveSupport::Notifications.subscribe %r[xml], ProcessingLogStore
Slide 16
Slide 16 text
I)*"r%/$)"(çã&
Slide 17
Slide 17 text
• NewRelic
• StatsD
• Librato
• KISS metrics
Slide 18
Slide 18 text
• Workers (Resque, Sidekiq, etc)
• uso de APIs (Faraday)
• Rake tasks
• E toda a stack da sua aplicação :)