Active Support es una parte fundamental de Rails que proporciona extensiones del lenguaje Ruby, utilidades y otras cosas. Una de las cosas que incluye es una API de instrumentación que se puede utilizar dentro de una aplicación para medir ciertas acciones que ocurren dentro del código Ruby, como las que se encuentran dentro de una aplicación Rails o el propio framework. Sin embargo, no se limita a Rails, ya que también se puede utilizar de forma independiente en otros scripts de Ruby si se desea.
En esta guía, aprenderás cómo utilizar la API de instrumentación de Active Support para medir eventos dentro de Rails y otros códigos Ruby.
Después de leer esta guía, sabrás:
Lo que la instrumentación puede proporcionar.
Cómo agregar un suscriptor a un gancho.
Cómo ver los tiempos de la instrumentación en tu navegador.
Los ganchos dentro del framework de Rails para la instrumentación.
Cómo construir una implementación personalizada de instrumentación.
La API de instrumentación proporcionada por Active Support permite a los desarrolladores agregar ganchos a los que otros desarrolladores pueden conectarse. Hay varios de estos dentro del framework de Rails. Con esta API, los desarrolladores pueden elegir ser notificados cuando ocurren ciertos eventos dentro de su aplicación u otro código Ruby.
Por ejemplo, hay un gancho proporcionado dentro de Active Record que se llama cada vez que Active Record utiliza una consulta SQL en una base de datos. Este gancho podría ser suscripto y utilizado para realizar un seguimiento del número de consultas durante una determinada acción. Hay otro gancho relacionado con el procesamiento de una acción de un controlador. Esto podría ser utilizado, por ejemplo, para realizar un seguimiento de cuánto tiempo ha tardado una acción específica.
Incluso puedes crear tus propios eventos dentro de tu aplicación a los que luego puedes suscribirte.
Si te preocupa la precisión de started y finished para calcular un tiempo transcurrido preciso, entonces utiliza ActiveSupport::Notifications.monotonic_subscribe. El bloque dado recibirá los mismos argumentos que se mencionaron anteriormente, pero started y finished tendrán valores con un tiempo monótono preciso en lugar de un tiempo de reloj de pared.
Definir todos esos argumentos de bloque cada vez puede ser tedioso. Puedes crear fácilmente un ActiveSupport::Notifications::Event
a partir de los argumentos del bloque de esta manera:
ActiveSupport::Notifications.subscribe"process_action.action_controller"do|*args|event=ActiveSupport::Notifications::Event.new(*args)event.name# => "process_action.action_controller"event.duration# => 10 (en milisegundos)event.payload# => {:extra=>información}Rails.logger.info"#{event} ¡Recibido!"end
También puedes pasar un bloque que acepte solo un argumento, y recibirá un objeto de evento:
ActiveSupport::Notifications.subscribe"process_action.action_controller"do|event|event.name# => "process_action.action_controller"event.duration# => 10 (en milisegundos)event.payload# => {:extra=>información}Rails.logger.info"#{event} ¡Recibido!"end
También puedes suscribirte a eventos que coincidan con una expresión regular. Esto te permite suscribirte a
múltiples eventos a la vez. Así es como puedes suscribirte a todo lo relacionado con ActionController:
ActiveSupport::Notifications.subscribe(/action_controller/)do|*args|# inspeccionar todos los eventos de ActionControllerend
Rails implementa el estándar Server Timing para hacer que la información de tiempo esté disponible en el navegador web. Para habilitarlo, edita la configuración de tu entorno (normalmente development.rb, ya que se utiliza principalmente en desarrollo) para incluir lo siguiente:
config.server_timing=true
Una vez configurado (incluido reiniciar tu servidor), puedes ir a la pestaña Herramientas para desarrolladores de tu navegador, luego seleccionar Red y recargar tu página. Luego puedes seleccionar cualquier solicitud a tu servidor de Rails y verás los tiempos del servidor en la pestaña de tiempos. Para ver un ejemplo de cómo hacer esto, consulta la Documentación de Firefox.
La clave :cache_hits solo se incluye si la colección se renderiza con cached: true.
ruby
{
identifier: "/Users/adam/projects/notifications/app/views/posts/_post.html.erb",
count: 3,
cache_hits: 0
}
Agregar tus propios eventos también es fácil. Active Support se encargará de
todo el trabajo pesado por ti. Simplemente llama a ActiveSupport::Notifications.instrument con un nombre, payload y un bloque.
La notificación se enviará después de que el bloque regrese. Active Support generará los tiempos de inicio y fin,
y agregará el ID único del instrumentador. Todos los datos pasados a la llamada instrument se incluirán
en el payload.
Aquí tienes un ejemplo:
ActiveSupport::Notifications.instrument"my.custom.event",this: :datado# haz tus cosas personalizadas aquíend
También puedes llamar a instrument sin pasar un bloque. Esto te permite aprovechar la infraestructura de instrumentación para otros usos de mensajería.
Debes seguir las convenciones de Rails al definir tus propios eventos. El formato es: evento.biblioteca.
Si tu aplicación está enviando Tweets, debes crear un evento llamado tweet.twitter.
Comentarios
Se te anima a ayudar a mejorar la calidad de esta guía.
Por favor, contribuye si encuentras algún error tipográfico o factual.
Para empezar, puedes leer nuestra contribución a la documentación sección.
También puedes encontrar contenido incompleto o desactualizado.
Por favor, añade cualquier documentación faltante para main. Asegúrate de revisar
Edge Guides primero para verificar
si los problemas ya están resueltos o no en la rama principal.
Consulta las Directrices de las Guías de Ruby on Rails
para el estilo y las convenciones.
Si por alguna razón encuentras algo que corregir pero no puedes solucionarlo tú mismo, por favor
abre un problema.
Y por último, cualquier tipo de discusión sobre la documentación de Ruby on Rails
es muy bienvenida en el Foro oficial de Ruby on Rails.