> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Delayed::Job

[Delayed::Job](https://github.com/collectiveidea/delayed_job) é criado pelo excelente time da [Shopify](https://shopifyengineering.myshopify.com/) 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`

<Tip>
  **Observação**: O relatório de jobs usando este método é suportado desde a
  versão 2.11.0 da gem Ruby do AppSignal.
</Tip>

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`.

<CodeGroup>
  ```ruby Ruby theme={null}
  class StructJob < Struct.new(:id)
    def perform
      # Faça algo
    end
  end

  Delayed::Job.enqueue(StructJob.new("id"))
  # Reportado como "StructJob#perform"
  ```
</CodeGroup>

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.

<CodeGroup>
  ```ruby Ruby theme={null}
  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"
  ```
</CodeGroup>

## 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.

<CodeGroup>
  ```ruby Ruby theme={null}
  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"
  ```
</CodeGroup>

## Suporte a Delayed::Job.enqueue

<Tip>
  **Observação**: A detecção de nome de job foi adicionada na versão 2.11.0 da gem Ruby.
</Tip>

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.

<CodeGroup>
  ```ruby Ruby theme={null}
  Delayed::Job.enqueue job_object
  ```
</CodeGroup>

## Suporte ao Active Job

A integração com o Delayed Job é compatível com o [Active Job](/ruby/integrations/active-job). Ele reportará [tempos de fila nos gráficos](https://appsignal.com/redirect-to/app?to=performance/graphs), 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](https://github.com/appsignal/appsignal-ruby/pull/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](https://github.com/appsignal/appsignal-examples/tree/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.
