Como instrumentar aplicações Ruby com o agente Ruby do Elastic APM

Enviar métricas de desempenho de aplicações Ruby ao APM Server pode ser tão fácil quanto instalar o Rubygem elastic-apm. A maioria das integrações é plug-n-play, e o suporte a Rails e Rack é oferecido internamente.

Entretanto, há várias maneiras de adicionar informações aos dados, além de maneiras de configurar suas próprias instrumentações personalizadas.

Adição de informações às partes já instrumentadas

Para adicionar mais informações aos dados que você já está reunindo, o Elastic APM tem alguns conceitos.

Supondo que a aplicação foi desenvolvida em torno do conceito de companies, você poderia atribuir current_company.short_name a cada transação e erro. As marcas são pares key-value simples e são indexadas no Elasticsearch, por isso podem ser filtradas e consultadas, assim você poderá segmentar as métricas do jeito que quiser:

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

Isso permitirá ver facilmente se determinados problemas de desempenho ou exceções estão afetando somente alguns de seus clientes.

Listagem somente das solicitações pela empresa Opbeans

Os usuários são outro conceito disseminado, e o Elastic APM tem um lugar reservado para eles também:

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

O agente incluirá os campos id, email e username de qualquer informação repassada. Evidentemente você pode personalizar os campos para qualquer nome que eles tenham em seu aplicativo.

O módulo SpanHelpers

Se você estiver atento a um método específico cuja duração deseja rastrear, poderá usar o módulo SpanHelpers. Ele oferece dois métodos: span_method e 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

Veja os documentos SpanHelpers do agente Ruby do Elastic APM.

Essa abordagem é excelente se o que você quer medir é uma simples chamada de método. Se quiser ter um controle mais granular, existe a API de utilização geral.

Criação manual de transações e durações

Para criar transações e durações manualmente, o agente fornece uma API pública. O agente em si usa essa API internamente para instrumentar a maioria das bibliotecas com suporte.

A primeira coisa de que você precisará é transaction. Se você estiver em uma solicitação no aplicativo Rails, no aplicativo Rack usando middleware ou em um trabalho em segundo plano em um dos executores de trabalho com suporte, será mais provável que já esteja em uma transação.

Se não estiver, crie uma transação como esta:

ElasticAPM.start # if it isn't started already

begin
  transaction = ElasticAPM.start_transaction 'Optional name', 'optional.type'
  # É de sua responsabilidade garantir que as transações sejam encerradas.
  # Para garantir que façamos isso, aplicamos wrap em begin..ensure.
ensure
  ElasticAPM.end_transaction
end

Como alternativa, há uma versão de bloco do mesmo que garante o encerramento posterior:

ElasticAPM.with_transaction do |transaction|
  # se precisar, você pode alterar a transação interna, por exemplo:
  transaction.name = method_that_returns_the_name

  # esteja ciente de que, se o agente não foi iniciado, `transaction` será nulo, mas o bloco ainda será avaliado
end

Dentro das transações, spans são as partes individuais de trabalho que o aplicativo executa. Se você estiver usando qualquer uma das bibliotecas instrumentadas automaticamente, bastará aplicar wrap nelas em uma transação.

Se precisar de durações adicionais, a API corresponderá à transação:

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

# Ou o bloco de
ElasticAPM.with_span 'Hard work' do |span|
  # ...
end

Por que isso demora tanto?… ah

Veja os documentos do agente Ruby do APM para a API pública.

Fácil de usar, fácil de expandir

Demos o máximo para facilitar a instalação inicial mínima do agente Ruby do APM o máximo possível. Se você não quiser, não precisará de nenhuma das informações anteriores e ainda assim, muito provavelmente, obterá muitas informações úteis.

Entretanto, se quiser colocar a mão na massa para dissecar cada parte do aplicativo, o Elastic APM também fornecerá as ferramentas necessárias para isso.

Experimente

O Ruby está executando bem? Onde ele está passando o tempo? Onde você deve concentrar a próxima rodada para melhorar a experiência dos usuários? O Elastic APM e o agente Ruby podem ajudar a responder a todas essas dúvidas e muito mais. Faça instrumentação do aplicativo e faça download do Elastic stack e execute localmente ou envie os rastreamentos ao Elasticsearch Service no Elastic Cloud com uma avaliação grátis, que inclui um servidor APM. Como sempre, se você tiver alguma dúvida, ideia, opinião ou preocupação, acesse o fórum Discuss.