Cómo instrumentar tu app de Ruby con el agente Ruby de Elastic APM

Enviar métricas de desempeño desde tu app de Ruby al servidor de APM puede ser tan fácil como instalar el Rubygem elastic-apm. La mayoría de las integraciones son plug-and-play, y el soporte de Rails y Rack está incorporado.

Sin embargo, existen diversas maneras de agregar más información a los datos, así como de configurar tus propias instrumentaciones personalizadas.

Agregar más información a las partes ya instrumentadas

Existen algunos conceptos para agregar más información a los datos que ya estás recopilando, Elastic APM.

Digamos que tu app está construida alrededor del concepto de compañías. Podrías asignar current_company.short_name a cada transacción y error. Las etiquetas son simples pares clave-valor y se indexan en Elasticsearch. De este modo, se pueden filtrar y permiten hacer búsquedas para que puedas dividir tus métricas como quieras:

class ApplicationController < ActionController::Base
  before_action do
    ElasticAPM.set_label :company, current_company.short_name
  end
end

Esto hará que sea mucho más fácil ver si ciertos problemas de desempeño o excepciones solo afectan a algunos de tus clientes.

Solo enumeración de solicitudes de la compañía Opbeans

Los usuarios son otro concepto generalizado, y Elastic APM tiene un lugar para eso también:

class ApplicationController < ActionController::Base
  before_action do
    ElasticAPM.set_label :company_id, current_company.id
    ElasticAPM.set_user current_user
  end
end

El agente incluirá los campos ID, correo electrónico y nombre de usuario de todo lo que pase. Por supuesto, puedes personalizar los campos con la forma con la que se denominen en tu app.

El módulo SpanHelpers

Si ya has identificado un método específico del que quieras rastrear la duración, puedes usar el módulo SpanHelpers. Proporciona dos métodos, span_method y span_class_method.

class ThingsController < ApplicationController
  include ElasticAPM::SpanHelpers

  # ...

  def do_the_work
    # ...
  end
  span_method :do_the_work

  def self.do_other_work
    # ... 
  end
  span_class_method :do_other_work

  # ... alternative syntax for newer versions of Ruby

  span_method \
  def do_the_work
    # ...
  end
end

Consulta los documentos del agente Ruby de Elastic APM SpanHelpers.

Este enfoque es ideal si lo que quieres medir es una llamada de método simple. Si quieres un control más granular, puedes usar la API de uso general.

Crear transacciones e intervalos de forma manual

Para crear transacciones e intervalos de forma manual, el agente proporciona una API pública. El mismo agente usa esta API de manera interna para instrumentar la mayoría de las bibliotecas compatibles.

Lo primero que necesitas es una transacción. Si estás dentro de una solicitud en tu app Rails, tu app Racks con middleware, o un trabajo de fondo en uno de tus ejecutores de trabajo compatibles, es probable que ya estés dentro de una transacción.

Si no lo estás, crea una transacción así:

ElasticAPM.start # if it isn't started already

begin
  transaction = ElasticAPM.start_transaction 'Optional name', 'optional.type'
  # Es tu responsabilidad asegurarte de que las transacciones se finalicen.
  # Para asegurarnos de que lo hacemos, incluimos begin..ensure.
ensure
  ElasticAPM.end_transaction
end

Si no, existe una versión de bloque de lo mismo que se asegura de finalizar después:

ElasticAPM.with_transaction do |transaction|
  # Si lo necesitas, puedes alterar la transacción dentro, p. ej.:
  transaction.name = method_that_returns_the_name

  # Ten en cuenta que si el agente no se inicia, la `transacción` es nula pero el bloque aún se evalúa
end

Dentro de las transacciones, los intervalos son trabajos individuales que realiza tu app. Si estás usando cualquiera de las bibliotecas instrumentadas automáticamente, todo lo que tienes que hacer es incluirlas en una transacción.

Si necesitas intervalos adicionales, la API será igual a la transacción:

begin
  span = ElasticAPM.start_span 'Required name', 'optional.type'
ensure
  ElasticAPM.end_span
end

# O la forma en bloque
ElasticAPM.with_span 'Hard work' do |span|
  # ...
end

Por qué demora tanto... oh

Consulta los documentos del agente Ruby de APM para acceder a la API pública.

Fácil de comenzar, fácil de expandir

Nos hemos esforzado al máximo para que la configuración inicial mínima del agente de APM de Ruby sea lo más simple posible. Si no quieres usarlo, no necesitas todo lo anterior y es probable que obtengas mucha información que pueda usarse de todas maneras.

Sin embargo, si quieres ponerte manos a la obra diseccionando cada parte de la enormidad de tu app, Elastic APM te brinda las herramientas para que también lo hagas.

Pruébala

¿Qué tan bien funciona tu Ruby? ¿En qué está usando el tiempo? ¿Dónde deberías concentrar tu próximo esfuerzo para mejorar la experiencia del usuario? Elastic APM y el agente Ruby pueden ayudarte a responder todas estas preguntas y más. Instrumenta tu app y descarga el Elastic Stack o ejecútalo de manera local. Si no, envía tus rastreos a Elasticsearch Service en Elastic Cloud con una prueba gratuita, que incluye un servidor de APM. Como siempre, si tienes preguntas, ideas, dudas o preocupaciones, contáctanos en el foro de discusión.