Pular para o conteúdo principal
Delayed::Job é criado pelo excelente time da Shopify e é um dos processadores de background mais populares para Ruby e Rails. A gem do AppSignal detecta o Delayed Job quando ele está presente e se conecta aos callbacks padrão do Delayed Job. Nenhuma ação adicional é necessária para habilitar a integração. Esta integração tem como objetivo dar suporte a todos os diferentes métodos de enfileiramento do Delayed::Job. Alguns métodos podem ter limitações e opções de personalização.

Classes com métodos #perform

Observação: O relatório de jobs usando este método é suportado desde a versão 2.11.0 da gem Ruby do AppSignal.
O Delayed Job permite o enfileiramento de jobs com base em instâncias de classes ou structs que possuem um método de instância perform, quando enfileirados com Delayed::Job.enqueue. O AppSignal usará o nome da classe do objeto como nome da action, acrescentando #perform ao nome da action. Um job para StructJob é reportado como StructJob#perform.
class StructJob < Struct.new(:id)
  def perform
    # Faça algo
  end
end

Delayed::Job.enqueue(StructJob.new("id"))
# Reportado como "StructJob#perform"
Observe que este método de enfileiramento não suporta argumentos, pois um objeto inteiro é enfileirado. Os objetos do job são serializados ao serem enfileirados e desserializados ao serem processados. O AppSignal não lê o estado do objeto desserializado. O argumento id do StructJob no exemplo acima não é reportado.

Jobs usando display_name

O Delayed Job permite que qualquer classe defina seu próprio display_name. Esse valor de display_name pode interferir no relatório do AppSignal se for construído usando valores dinâmicos, como os argumentos passados ao job. Se o valor retornado pelo método display_name não for uma String no formato ClassName#method_name, o AppSignal trata cada job como uma entidade separada, criando muitos Incidents e notificações. Isso quebra o agrupamento que o AppSignal faz para esses jobs, resultando em muitas variações únicas de incidents reportadas para o job e métricas inutilizáveis nos gráficos. Para evitar que isso aconteça, defina um método appsignal_name que retorna um nome de job no formato ClassName#method_name. Dessa forma, os jobs serão agrupados corretamente novamente.
class StructJobWithName < Struct.new(:id)
  def perform
    # Faça algo
  end

  # Isso retorna um nome de job único, criando novos incidents e gráficos para cada
  # nome de job único.
  def display_name
    "StructJobWithName-#{id}"
  end

  # Isso agrupará os jobs novamente em uma única entidade, permitindo que os incidents
  # e gráficos funcionem corretamente.
  def appsignal_name
    "StructJobWithName#perform"
  end
end

Delayed::Job.enqueue(StructJobWithName.new("id"))
# Reportado como "StructJobWithName#perform"

Suporte a chamada de método delay

Chamadas de método enfileiradas com a extensão delay serão reportadas com um nome de action semelhante a como são chamadas. Os argumentos passados para o método delayed serão reportados como os argumentos do job.
Post.delay.archive_all("some selector")
# Reportado como "Post.archive_all"

Post.create(:title => "Post title").delay.send_mail("mail subject")
# Reportado como "Post#send_mail"

Suporte a Delayed::Job.enqueue

Observação: A detecção de nome de job foi adicionada na versão 2.11.0 da gem Ruby.
Objetos de jobs customizados enfileirados com Delayed::Job.enqueue serão reportados normalmente, mas não reportarão argumentos. Um objeto inteiro é passado para o Delayed::Job e serializado em YAML e de volta. Não conseguimos detectar argumentos nesse cenário.
Delayed::Job.enqueue job_object

Suporte ao Active Job

A integração com o Delayed Job é compatível com o Active Job. Ele reportará tempos de fila nos gráficos, filas e prioridades se definidos no job. Atualize para a versão 2.11.0 da gem Ruby ou mais nova para um suporte aprimorado.

Mudanças na integração

Tempo de fila

Na gem AppSignal for Ruby 2.3.0 foi feita uma mudança no registro do tempo de fila. No PR #297, o horário de início do job foi usado em vez do horário de criação do job. Isso significa que o tempo desde a criação de um job até o momento em que ele deveria iniciar não é mais registrado como tempo de fila. Isso evitará que tempos de fila muito longos distorçam os gráficos de tempo de fila no AppSignal.com.

Aplicações de exemplo

Abaixo está uma lista de aplicações de exemplo disponíveis para testar a integração com o Delayed::Job:
  • AppSignal + Rails 5 + Delayed::Job
    • O exemplo mostra como configurar o AppSignal com Delayed::Job e Rails. No arquivo README estão listados todos os métodos conhecidos e testados de enfileiramento de jobs que o AppSignal suporta.