Slide 1

Slide 1 text

A!"#v$S%pp&r" N&"#'!("#&)*

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

# Subscribe... ActiveSupport::Notifications.subscribe 'xml.processed' do |*args| # ... end

Slide 4

Slide 4 text

# Publish! ActiveSupport::Notifications.instrument 'xml.processed', :xml => 'WTF_BBQ_10.xml'

Slide 5

Slide 5 text

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

Slide 14

Slide 14 text

r-r(.$/,&.r(.$ method=GET path=/jobs/833552.json format=json controller=jobs action=show status=200 duration=58.33 view=40.43 db=15.26

Slide 15

Slide 15 text

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 :)

Slide 19

Slide 19 text

• https://speakerdeck.com/nextmat/digging-deep-with- activesupportnotifications • http://api.rubyonrails.org/classes/ActiveSupport/ Notifications.html • http://railscasts.com/episodes/249-notifications-in-rails-3 • http://blog.librato.com/2012/05/digging-deep-with- activesupportnotifica.html R$f$rê)!#(*

Slide 20

Slide 20 text

')!