ActiveSupport::Notifications
рд░реЗрд▓-рдЖрдзрд╛рд░рд┐рдд рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреНрд░рдгрд╛рд▓реА рд╣реИред рдЖрдк рд░реЗрд▓ рдореЗрдВ рдХреБрдЫ рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рд╡реЗ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдЕрдкрдирд╛ рдХреЛрдб рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ
ActiveSupport::Callbacks
рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдзрд┐рд╕реВрдЪрдирд╛
'render'
рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ:
ActiveSupport::Notifications.subscribe("render") do |*args|
рдЖрдк рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЖрдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╕рднреА рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕рднреА рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ
subscribe
рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдкрд╛рд╕ рди рдХрд░реЗрдВред
subscribe
рд╡рд┐рдзрд┐
subscribe
рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рддреА рд╣реИ, рдЗрд╕реЗ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЖрдк
ActiveSupport::Notifications.publish
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реВрдЪрдирд╛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ:
ActiveSupport::Notifications.publish('render', 'arg1', 'arg2')
subscribe
рдмреНрд▓реЙрдХ рдореЗрдВ,
'render'
,
'arg1'
рдФрд░
'arg2'
рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореБрдЭреЗ рдЙрди рд░реЗрд▓реЛрдВ рдореЗрдВ рдХреЛрдб рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬреЛ рд╕реАрдзреЗ рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ, рд╢рд╛рдпрдж рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди
ActiveSupport::Notifications
рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА
instrument
рд╡рд┐рдзрд┐ рд╣реИред рдпрд╣ рдПрдХ рдмреНрд▓реЙрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдХреЗ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рднреЗрдЬрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рднреАред рд░реЗрд▓ рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдФрд░ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ, рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рд▓реЙрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
subscribe
рдФрд░
publish
рддрд░реАрдХреЗ (рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╕рдорд╛рди "рдореАрдЯрд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рд▓реЙрдЧ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ)
рдЙрд╕реА рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрди "рдореАрдЯрд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЙрд╕ рдХреЛрдб рдХреЛ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд▓реЙрдЧ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
def do_something
рдмрд╕ рдЗрд╕реЗ рдПрдХ
ActiveSupport::Notifications.instrument
рдореЗрдВ
ActiveSupport::Notifications.instrument
block
def do_something ActiveSupport::Notifications.instrument('benchmark.do_something', desc: 'Some description') do
рдХреБрдЫ рдЬрдЧрд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
config/initializers/benchmarking.rb
рд▓рд╛рдЗрди
'benchmark.'
рд╕рд╛рде рд╕рднреА рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ
'benchmark.'
ред
logger = Logger.new(File.join(Rails.root, 'log', "benchmarks.log")) ActiveSupport::Notifications.subscribe(%r/benchmark\.*/) do |name, start, ending, transaction_id, payload| method = name.split(?.).last duration = (1000.0 * (ending - start)) message = if payload[:exception].present? payload[:exception].join(' ') else payload[:desc].to_s end logger.info("Benchmark:%s: %.0fms - %s" % method, duration, message) end
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░ рдХреЛ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
name, start, ending, transaction_id, payload
ред
name
- рдкрдХрдбрд╝реЗ рдЧрдП рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХрд╛ рдирд╛рдоstart
- рдмреНрд▓реЙрдХ start
рд╕рдордпending
- рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрди рдЕрдВрдд рд╕рдордпtransaction_id
- transaction_id
- рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА, рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╣реА рдзрд╛рдЧреЗ рдХреЗ рднреАрддрд░ рдЕрджреНрд╡рд┐рддреАрдпpayload
- рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ "рдореАрдЯрд░" рдХреЛ рдкреНрд░реЗрд╖рд┐рдд
рдЕрдЧрд▓рд╛, рдмрд╕ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп рд▓рд┐рдЦреЗрдВред рдпрджрд┐ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ
payload[:exception]
рдХреЗ рдирд╛рдо рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдЧрд╛ред рдЗрд╕реЗ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред
ActiveSupport::Notifications
рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП
ActiveSupport::Notifications
рд▓реЙрдЧ рд▓реЙрдЧ рдореЗрдВ
ActiveSupport::Notifications
,
ActiveSupport::LogSubscriber
,
ActiveRecord::LogSubscriber
,
ActionController::LogSubscriber
рдФрд░
ActionMailer::LogSubscriber
ред
рдПрдХ рдФрд░ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрд╕реА рд╕рдордп рдЬрдм рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
callback = lambda do|*args|
рдХрд┐рд╕реА рдИрд╡реЗрдВрдЯ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рджрд╕реНрдпрддрд╛
unsubscribe
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреНрд░рд╛рд╣рдХ рд▓рд┐рдВрдХ рдкрд╛рд╕ рдХрд░реЗрдВред
ActiveSupport::Notifications.unsubscribe(subscriber)
рд╕реВрдЪрдирд╛ рд╡рд┐рддрд░рдг рддрдВрддреНрд░ рд╕реНрд╡рдпрдВ
ActiveSupport::Notifications::Fanout
рдореЗрдВ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ
ActiveSupport::Notifications::Fanout
, рдпрд╣
ActiveSupport::Notifications::Instrumenter
рдкрд░ рднреА рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛
ActiveSupport::Notifications::Instrumenter
рдХреНрд▓рд╛рд╕, рдЬреЛ
instrument
рдореЗрдердб рдореЗрдВ рдмреНрд▓реЙрдХ рдПрдХреНрдЬреАрдХреНрдпреВрд╢рди рдЯрд╛рдЗрдо рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ,
ActiveSupport::Notifications
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддрд░реАрдХреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдордард╡рд╛рд╕реА:
class Module def benchmark_it *names options, names = benchmark_options_and_names(*names) names.each do |name| target, punctuation = name.to_s.sub(/([?!=])$/, ''), $1 define_method "
рдЗрд╕ рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛:
class MyClass def my_method
рдпрд╣ рд╕рдм рдХрд┐рд╕ рд▓рд┐рдП рд╣реИ? рдПрдХ рд╣реА рд░реЗрд▓ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рд┐рдерд┐рд▓ рдпреБрдЧреНрдорд┐рдд рдШрдЯрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рддреЛ рдЖрдк рдРрд╕реЗ рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддрджрдиреБрд╕рд╛рд░, рдореИрдВ рдЕрдкрдиреЗ ORM рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
MyORM
, рдФрд░ рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛рд░реНрдп рдХреЛ
MyORM::LogSubscriber
рд╕реЗ рд▓реЗ
ActiveSupport::LogSubscriber
рдЧрдпрд╛ рд╣реИ рдЬреЛ
MyORM::LogSubscriber
рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рд▓реЙрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕рдВрджреЗрд╢ рдХреЛрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рд╕реНрдорд┐рдпрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рд╣реИред рдареАрдХ рд╣реИ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЖрдкрдХреЛ рдкреВрд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕реЗрдВрд╕рд░ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдЗрди рд╕рдорд╛рди рд╕реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рддрд░рдл, рдореЗрд░рд╛ рдХреЛрдб рд░реЗрд▓ рд╕реЗ рдмрдВрдзрд╛ рдирд╣реАрдВ рд╣реИ, рджреВрд╕рд░реА рддрд░рдл, рд░реЗрд▓ рдХреЛ рднреА рдореЗрд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдореЗрд░рд╛ рд░рддреНрди рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд▓реЙрдЧрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд▓реЙрдЧрд┐рдВрдЧ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рдЖрд╡реЗрджрди рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред