Registrar transacciones de carrera larga en rieles -- ruby-on-rails campo con activerecord camp Relacionados El problema

Log long-running transactions in Rails


2
vote

problema

Español

Estoy recibiendo "MySQL2 :: ERROR: LOCK WEAD TIMEOUT ERRORES EXCEDOS" ERRORES EN MI APLICACIÓN DE RAILS DE PRODUCCIÓN y estoy buscando ayuda para depurar qué transacción está bloqueando las tablas para un tiempo excesivamente largo. MySQL tiene un registro "Query lento", pero no un registro de transacciones lentas, por lo que puedo decir.

¿Hay alguna manera de registrar información sobre cuánto tiempo toman las transacciones directamente de ActiverCord?

Original en ingles

I'm getting "Mysql2::Error: Lock wait timeout exceeded" errors in my production Rails app, and I'm looking for help debugging which transaction is locking the tables for an excessively long time. MySQL has a "slow query" log, but not a log of slow transactions, as far as I can tell.

Is there a way to log information about how long transactions take directly from ActiveRecord?

     

Lista de respuestas

4
 
vote

Mi equipo registra transacciones lentas como esta:

En lib/slow_transaction_logger.rb :

  module SlowTransactionLogger   LOG_IF_SLOWER_THAN_SECONDS = ENV.fetch("LOG_TRANSACTIONS_SLOWER_THAN_SECONDS", "5").to_f    def transaction(*args)     start = Time.now     value = super     finish = Time.now      duration = finish - start      return value if duration <= LOG_IF_SLOWER_THAN_SECONDS      backtrace = caller.       select { |path| path.start_with?(Rails.root.to_s) }.       reject { |row|         row.include?("/gems/") ||         row.include?("/app/middleware/") ||         row.include?("/config/initializers/")       }      puts "slow_transaction_logger: duration=#{duration.round(2)} start=#{start.to_s.inspect} finish=#{finish.to_s.inspect} class=#{name} caller=#{backtrace.to_json}"      value   end end   

En config/initializers/active_record.rb :

  class ActiveRecord::Base   class << self     prepend SlowTransactionLogger   end end   

Por defecto, registra las transacciones más lentas que 5 segundos, en cada entorno.

Si establece una variable de entorno Rails.logger4 (por ejemplo, en Heroku), puede modificar ese límite.

Registramos con puts intencionalmente porque termina en los registros en Heroku, y también lo vemos más fácilmente en dev y pruebas. Pero siéntase libre de usar Rails.logger si lo prefiere.

 

My team logs slow transactions like this:

In lib/slow_transaction_logger.rb:

module SlowTransactionLogger   LOG_IF_SLOWER_THAN_SECONDS = ENV.fetch("LOG_TRANSACTIONS_SLOWER_THAN_SECONDS", "5").to_f    def transaction(*args)     start = Time.now     value = super     finish = Time.now      duration = finish - start      return value if duration <= LOG_IF_SLOWER_THAN_SECONDS      backtrace = caller.       select { |path| path.start_with?(Rails.root.to_s) }.       reject { |row|         row.include?("/gems/") ||         row.include?("/app/middleware/") ||         row.include?("/config/initializers/")       }      puts "slow_transaction_logger: duration=#{duration.round(2)} start=#{start.to_s.inspect} finish=#{finish.to_s.inspect} class=#{name} caller=#{backtrace.to_json}"      value   end end 

In config/initializers/active_record.rb:

class ActiveRecord::Base   class << self     prepend SlowTransactionLogger   end end 

So by default, it logs transactions slower than 5 seconds, in every environment.

If you set a LOG_TRANSACTIONS_SLOWER_THAN_SECONDS environment variable (e.g. on Heroku), you can tweak that limit.

We log with puts intentionally because it ends up in the logs in Heroku, and we also we see it more easily in dev and tests. But feel free to use Rails.logger if you prefer.

 
 

Relacionados problema

1  Cómo manejar la transacción anidadada con ActiverCord 3.0.4 y DB_Cleaner  ( Howto handle nested transaction with activerecord 3 0 4 and db cleaner ) 
Estamos usando DB_Cleaner con un método limpio :transaction en una aplicación Rails 3.0.4 (que no podemos actualizar en este momento) con un MySQL 5.x DB. N...

1  Use ActiverCord para encontrar el resultado de 5 tablas anidadas  ( Use activerecord to find result of 5 nested tables ) 
Tengo un modelo de usuario (: nombre ,: contraseña ,: correo electrónico), y modelo de evento (: nombre,: etc.) y modelo de interés (: nombre) Luego creé do...

0  @ user.visit_count => método no definido  ( User visit count undefined method ) 
Estoy haciendo lo que pensé que era algo muy simple: encontrar un usuario e incrementar un entero. recording.wav6 Obtengo el siguiente error: recordi...

2  ¿Debería extender esta clase? (PHP)  ( Should i be extending this class php ) 
Estoy creando un ORM en PHP, y tengo una clase 'Orm' que básicamente crea un objeto correspondiente a una tabla de base de datos (apunta a una funcionalidad s...

2  Tratar de acceder al atributo en los rieles de la tabla de unirse  ( Trying to access attribute in join table rails ) 
ok, creo que tengo dos problemas que deben ser arreglados Tengo las siguientes tablas: Student , Register y una tabla de unirse que muestra los registr...

240  ¿Las tareas Rails Rakes proporcionan acceso a los modelos Activerecord?  ( Do rails rake tasks provide access to activerecord models ) 
Estoy tratando de crear una tarea de rastrillo personalizada, pero parece que no tengo acceso a mis modelos. Pensé que esto era algo implícitamente incluido c...

1  Usando ror con una tabla heredada que utiliza E-A-V  ( Using ror with a legacy table that uses e a v ) 
Necesito conectarme a una base de datos heredada y tire de un subconjunto de datos de una tabla que utiliza el modelo de valor de atributo entidad para almace...

1  Cómo estructurar los rieles enlace para que haga clic en Actualizar un atributo ActiveRecord  ( How to structure rails link so that clicking it will update an activerecord attr ) 
Tengo dos modelos en cuestión, un modelo de propiedad y un modelo de aplicación. La aplicación ha_many propiedades, y las propiedades pertenecen a la aplicaci...

0  Uniéndose a una asociación de uno a muchos con una asociación de muchos a muchos en rieles 3  ( Joining a one to many association with a many to many association in rails 3 ) 
Tengo una asociación de muchos a muchos entre una clase de usuario y una clase de tabla. Además, tengo una asociación de uno a muchos entre el usuario y la ta...

0  ¿Cómo obtener un modelo de Multi ActiveRecord con solo 1 une la consulta en YII2?  ( How to get multi activerecord model with only 1 join query in yii2 ) 
Por ejemplo: consulta SELECT book.*,author.* FROM book INNER JOIN author ON author.id = book.author_id WHERE book.id=1 obtener modelo $mode...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos