Pular para o conteúdo principal
Ruby on Rails é suportado prontamente pelo AppSignal. Para instalar, siga os passos de instalação no AppSignal, começando por clicar em ‘Add app’ na tela de contas. A integração do AppSignal para Rails funciona rastreando exceptions e performance em requisições. Quando um erro ocorre em um controller durante uma requisição, o AppSignal o reportará. Os problemas de performance serão baseados na duração de uma requisição e criarão uma linha do tempo de eventos detalhando quais partes da aplicação levaram mais tempo.

Active Job

Veja nossa página do Active Job para mais informações sobre como nossa instrumentation do Active Job funciona.

Action Cable

Veja nossa página do Action Cable para mais informações sobre como nossa instrumentation do Action Cable funciona.

Configurar o AppSignal em um initializer

Recomendamos usar nosso arquivo de configuração config/appsignal.rb ou variáveis de ambiente para configurar o AppSignal. Por padrão, não é possível configurar o AppSignal a partir de um initializer do Rails, porque o AppSignal carrega antes dos initializers da sua aplicação, para conseguir reportar erros que ocorrem durante a inicialização. Para configurar o AppSignal em um initializer do Rails, primeiro configure o Rails para iniciar o AppSignal depois que os initializers do app tiverem sido executados.
# config/application.rb

# ...

module MyApp
  class Application < Rails::Application
    # Adicione esta linha
    config.appsignal.start_at = :after_initialize

    # Outras configurações
  end
end
Em seguida, no initializer:
# config/initializers/appsignal.rb

Appsignal.configure do |config|
  config.ignore_actions = ["My action"]
end
Não chame Appsignal.start nos initializers. A gem Ruby iniciará o AppSignal automaticamente quando o Rails tiver executado todos os initializers. Quando um app Rails é configurado para iniciar o AppSignal depois que os initializers foram carregados, não é mais possível reportar erros dos initializers ao inicializar o app Rails.

Error reporting dos initializers

Por padrão, o AppSignal reporta erros que ocorrem em controllers, Rake tasks e jobs do Active Job. Ele não reporta erros que ocorrem quando a aplicação está inicializando, antes dos initializers do Rails. Para ser notificado quando esses erros ocorrem, adicione o seguinte ao seu arquivo config.ru, em torno da linha que requer o arquivo environment.rb.
# config.ru
begin
  require ::File.expand_path("../config/environment",  __FILE__)
rescue Exception => error
  Appsignal.send_error(error)
  raise
end
Os erros que ocorrem aqui não serão agrupados sob um incident com um nome de action.

Backtrace cleaner

Com a integração Rails, o AppSignal executará o backtrace de cada exception através do backtrace cleaner do Rails. Este cleaner dá a você a opção de modificar ou filtrar linhas indesejadas do backtrace, removendo desordem e ruído do backtrace. Você pode adicionar ou remover filters e silencers da configuração padrão. Filters mutarão a linha fornecida. Um exemplo seria remover o prefixo Rails.root. Silencers removerão a linha do backtrace se a expressão fornecida retornar true. Você pode adicionar essas regras adicionais do backtrace cleaner em um initializer. Por exemplo:
# config/initializers/backtrace_cleaner.rb
bc = Rails.backtrace_cleaner
bc.add_filter { |line| line.gsub(Rails.root.to_s, '<root>') }
bc.add_silencer { |line| line.index('<root>').nil? and line.index('/') == 0 }
bc.add_silencer { |line| line.index('<root>/vendor/') == 0 }
Para mais informações sobre o backtrace cleaner, veja a documentação do BacktraceCleaner do Rails.

Error reporter

O AppSignal reporta erros gerados via ActiveSupport::ErrorReporter por padrão. ActiveSupport::ErrorReporter foi introduzido no Rails 7.0 para padronizar o reporte de erros customizado. Você pode desabilitar essa funcionalidade com a opção de configuração enable_rails_error_reporter. Se uma transaction estiver ativa no contexto em que um erro é reportado através do Rails error reporter, ela incluirá os mesmos metadados e dados de sample que a transaction ativa: namespace, nome da action, tags, dados customizados, parâmetros, etc.
# Em ambos os cenários, o erro é reportado pelo AppSignal
Rails.error.handle do
  raise "some error"
end

Rails.error.record do
  raise "some error"
end
Na gem AppSignal for Ruby versão 3, alguns comportamentos eram diferentes. Por favor, consulte a seção comportamento legado da gem Ruby 3 para mais informações sobre as diferenças.

Namespace e action a partir da transaction atual

Ao reportar erros, determinamos o namespace e o nome da action em que ele ocorre, como um controller ou background job, em uma base de melhor esforço. O namespace do incident e o nome da action nem sempre serão definidos ou precisos. Se uma transaction do AppSignal estiver ativa (como em uma requisição web ou background job), o erro reportado com Rails.error.handle/record terá o mesmo namespace, nome da action, tags, parâmetros, dados customizados, etc. que a transaction ativa. Se nenhuma transaction do AppSignal estiver ativa, nenhum namespace, nome da action, tags, etc. serão definidos por padrão.

Namespace e action a partir do contexto

Se você quiser mudar o namespace e o nome da action do erro reportado sem mudá-los na transaction do AppSignal já ativa, você pode personalizar isso na chamada do error reporter.
# O erro reportado aqui terá o namespace "custom_namespace"
# e o nome de action "CustomizedActionName#index"
Rails.error.handle(:context => { :appsignal => { :namespace => "custom_namespace", :action => "CustomizedActionName#index" } }) do
  raise "some error"
end

Tags da transaction ativa

Por padrão, as tags de transaction da requisição/job são copiadas para a transaction do AppSignal do erro do error reporter a partir da transaction da requisição/job.
# Exemplo de controller Rails usando um callback before_action
class ExamplesController < ApplicationController
  before_action do
    Appsignal.add_tags(:tag1 => "value1", :tag2 => "value2")
  end

  def index
    # O erro reportado aqui terá as mesmas tags definidas
    # como no callback `before_action`
    Rails.error.handle do
      raise "some error"
    end
  end
end

Tags do contexto

Você pode adicionar tags a um erro reportado usando context na chamada Rails.error.handle/record. Essas tags serão definidas apenas no erro reportado com os métodos Rails.error.handle/record.
Rails.error.handle(:context => { :tag1 => "value1", :tag2 => "value2" }) do
  raise "some error"
end
As mesmas limitações de tagging se aplicam ao usar Appsignal.add_tags.

Comportamento legado da gem Ruby 3

Na gem AppSignal for Ruby versão 3, o comportamento do reporte de erro é diferente.
  • Erros reportados com o método Rails.error.handle são reportados ao AppSignal.
  • Erros reportados com Rails.error.record não são reportados ao AppSignal para evitar reportar o erro duas vezes quando ele estiver sendo reportado pelo nosso middleware de error reporting do Rails.
Todos os erros reportados com o Rails error reporter são reportados como erros separados. Eles nem sempre incluem os mesmos metadados e dados de sample de qualquer transaction ativa do AppSignal. Veja a seção sobre limitações de herança de contexto para mais informações.
# Reportado pelo AppSignal
Rails.error.handle do
  raise "some error"
end

# NÃO reportado pelo AppSignal
Rails.error.record do
  raise "some error"
end

Limitações de herança de contexto

Na gem Ruby 3, a herança de contexto da transaction ativa é limitada. Os metadados e alguns dos dados de sample são copiados apenas se estiverem definidos no momento em que Rails.error.handle/record é chamado. Na prática, isso significa que controllers Rails e jobs do Active Job serão reportados com precisão. Outras bibliotecas como jobs do Sidekiq não terão nome de action definido ao reportar erros com Rails.error.handle. Tags definidas após Rails.error.handle/record ser chamado não são reportadas para o erro reportado usando este helper.

Runners

O AppSignal reportará automaticamente erros dentro de Rails runners. Alguma configuração manual também é necessária para instrumentar a performance de um runner. Recomendamos colocar o código do runner em um arquivo separado e envolvê-lo no helper Appsignal.monitor, como mostrado no exemplo abaixo.
Bash
bin/rails runner path_to_file.rb
Appsignal.monitor(:namespace => :runner, :action => "Runner name") do
  # Algum código
end
Se seu Rails runner roda em um container que é iniciado apenas para executar esta task, certifique-se de que a opção enable_at_exit_hook esteja definida como true (o que deve ser o padrão em containers). Isso garantirá que os dados sejam descarregados para o agent do AppSignal antes do runner ser desligado.