ActiveSupport :: рд╕реВрдЪрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?

ActiveSupport::Notifications рд░реЗрд▓-рдЖрдзрд╛рд░рд┐рдд рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдкреНрд░рдгрд╛рд▓реА рд╣реИред рдЖрдк рд░реЗрд▓ рдореЗрдВ рдХреБрдЫ рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рд╡реЗ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдЕрдкрдирд╛ рдХреЛрдб рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ ActiveSupport::Callbacks рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред



рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдзрд┐рд╕реВрдЪрдирд╛ 'render' рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ:

 ActiveSupport::Notifications.subscribe("render") do |*args| #        render end 


рдЖрдк рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рдирд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдЖрдк рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╕рднреА рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕рднреА рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ subscribe рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдкрд╛рд╕ рди рдХрд░реЗрдВред subscribe рд╡рд┐рдзрд┐ subscribe рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рддреА рд╣реИ, рдЗрд╕реЗ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЖрдк ActiveSupport::Notifications.publish рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реВрдЪрдирд╛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ:

 ActiveSupport::Notifications.publish('render', 'arg1', 'arg2') 


subscribe рдмреНрд▓реЙрдХ рдореЗрдВ, 'render' , 'arg1' рдФрд░ 'arg2' рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореБрдЭреЗ рдЙрди рд░реЗрд▓реЛрдВ рдореЗрдВ рдХреЛрдб рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬреЛ рд╕реАрдзреЗ рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ, рд╢рд╛рдпрдж рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди ActiveSupport::Notifications рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА instrument рд╡рд┐рдзрд┐ рд╣реИред рдпрд╣ рдПрдХ рдмреНрд▓реЙрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рдЕрдВрдд рдХреЗ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рднреЗрдЬрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рднреАред рд░реЗрд▓ рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдФрд░ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ, рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рд▓реЙрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП subscribe рдФрд░ publish рддрд░реАрдХреЗ (рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╕рдорд╛рди "рдореАрдЯрд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рд▓реЙрдЧ рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ)

рдЙрд╕реА рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрди "рдореАрдЯрд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЙрд╕ рдХреЛрдб рдХреЛ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ рдЬрд╛рдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рд▓реЙрдЧ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

 def do_something #    end 


рдмрд╕ рдЗрд╕реЗ рдПрдХ ActiveSupport::Notifications.instrument рдореЗрдВ ActiveSupport::Notifications.instrument block

 def do_something ActiveSupport::Notifications.instrument('benchmark.do_something', desc: 'Some description') do #    end end 


рдХреБрдЫ рдЬрдЧрд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 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 ред



рдЕрдЧрд▓рд╛, рдмрд╕ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп рд▓рд┐рдЦреЗрдВред рдпрджрд┐ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ payload[:exception] рдХреЗ рдирд╛рдо рдФрд░ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдЧрд╛ред рдЗрд╕реЗ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред

ActiveSupport::Notifications рдХреА рднреВрдорд┐рдХрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП ActiveSupport::Notifications рд▓реЙрдЧ рд▓реЙрдЧ рдореЗрдВ ActiveSupport::Notifications , ActiveSupport::LogSubscriber , ActiveRecord::LogSubscriber , ActionController::LogSubscriber рдФрд░ ActionMailer::LogSubscriber ред

рдПрдХ рдФрд░ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕реВрдЪрдирд╛рдУрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЙрд╕реА рд╕рдордп рдЬрдм рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 callback = lambda do|*args| #        #  "event.name" end ActiveSupport::Notifications.subscribed(callback, "event.name") do #        end 


рдХрд┐рд╕реА рдИрд╡реЗрдВрдЯ рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рджрд╕реНрдпрддрд╛ 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 "#{target}_with_benchmark#{punctuation}" do |*args| ActiveSupport::Notifications.instrument("benchmark.#{self.name}.#{name}", options) do send("#{target}_without_benchmark#{punctuation}", *args) end end alias_method_chain name, :benchmark end end protected def benchmark_options_and_names *args options = args.last.is_a?(Hash) ? args.pop : {} [{desc: ''}.merge(options), args] end end ActiveSupport::Notifications.subscribe(%r/benchmark\.*/) do |name, start, ending, transaction_id, payload| _, classname, method = name.split(?.) duration = (1000.0 * (ending - start)) message = if payload[:exception].present? payload[:exception].join(' ') else payload[:desc].to_s end Rails.logger.info("Benchmark: %s.%s: %.0fms - %s" % classname, method, duration, message) end 


рдЗрд╕ рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛:

 class MyClass def my_method #   - end #       benchmark_it :my_method, desc: '  ' end 


рдпрд╣ рд╕рдм рдХрд┐рд╕ рд▓рд┐рдП рд╣реИ? рдПрдХ рд╣реА рд░реЗрд▓ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рд┐рдерд┐рд▓ рдпреБрдЧреНрдорд┐рдд рдШрдЯрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рддреЛ рдЖрдк рдРрд╕реЗ рд╕реВрдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдирдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддрджрдиреБрд╕рд╛рд░, рдореИрдВ рдЕрдкрдиреЗ ORM рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП MyORM , рдФрд░ рд▓реЙрдЧрд┐рдВрдЧ рдХрд╛рд░реНрдп рдХреЛ MyORM::LogSubscriber рд╕реЗ рд▓реЗ ActiveSupport::LogSubscriber рдЧрдпрд╛ рд╣реИ рдЬреЛ MyORM::LogSubscriber рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рд▓реЙрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕рдВрджреЗрд╢ рдХреЛрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рд╕реНрдорд┐рдпрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рд╣реИред рдареАрдХ рд╣реИ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЖрдкрдХреЛ рдкреВрд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕реЗрдВрд╕рд░ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдЗрди рд╕рдорд╛рди рд╕реЗрдВрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рддрд░рдл, рдореЗрд░рд╛ рдХреЛрдб рд░реЗрд▓ рд╕реЗ рдмрдВрдзрд╛ рдирд╣реАрдВ рд╣реИ, рджреВрд╕рд░реА рддрд░рдл, рд░реЗрд▓ рдХреЛ рднреА рдореЗрд░реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдореЗрд░рд╛ рд░рддреНрди рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд▓реЙрдЧрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд▓реЙрдЧрд┐рдВрдЧ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рдЖрд╡реЗрджрди рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдХреНрд╖реЗрддреНрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдпрд╣ рджрд┐рдЦрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред

Source: https://habr.com/ru/post/In160701/


All Articles