Zum Hauptinhalt springen
Delayed::Job wurde von den großartigen Leuten bei Shopify entwickelt und ist einer der beliebtesten Background-Prozessoren für Ruby und Rails. Das AppSignal-Gem erkennt Delayed Job, sobald es vorhanden ist, und klinkt sich in die Standard-Callbacks von Delayed Job ein. Es sind keine weiteren Aktionen erforderlich, um die Integration zu aktivieren. Diese Integration zielt darauf ab, alle verschiedenen Methoden zum Einreihen von Delayed::Job-Jobs zu unterstützen. Einige Methoden können bestimmte Einschränkungen und Anpassungsoptionen aufweisen.

Klassen mit #perform-Methoden

Hinweis: Die Erfassung von Jobs mit dieser Methode wird ab AppSignal Ruby Gem Version 2.11.0 unterstützt.
Delayed Job unterstützt das Einreihen von Jobs basierend auf Instanzen von Klassen oder Structs, die auf eine perform-Instanzmethode hören, wenn sie mit Delayed::Job.enqueue eingereiht werden. AppSignal verwendet den Klassennamen des Objekts als Action-Bezeichnung und hängt #perform an den Action-Namen an. Ein Job für StructJob wird als StructJob#perform gemeldet.
class StructJob < Struct.new(:id)
  def perform
    # Do stuff
  end
end

Delayed::Job.enqueue(StructJob.new("id"))
# Reported as "StructJob#perform"
Beachten Sie, dass diese Methode des Einreihens keine Argumente unterstützt, da ein ganzes Objekt eingereiht wird. Job-Objekte werden beim Einreihen serialisiert und bei der Verarbeitung deserialisiert. AppSignal liest den Zustand des deserialisierten Objekts nicht aus. Das Argument id für den StructJob im obigen Beispiel wird nicht gemeldet.

Jobs, die display_name verwenden

Delayed Job ermöglicht es jeder Klasse, ihren eigenen display_name zu definieren. Dieser display_name-Wert kann die Berichterstattung von AppSignal beeinträchtigen, wenn er aus dynamischen Werten erstellt wird, wie zum Beispiel den Argumenten, die dem Job übergeben werden. Wenn der Rückgabewert der display_name-Methode keinen String im Format ClassName#method_name zurückgibt, behandelt AppSignal jeden Job als separate Entität, was viele Incidents und Benachrichtigungen erzeugt. Dies durchbricht die Gruppierung, die AppSignal für diese Jobs vornimmt, und führt dazu, dass AppSignal viele einzigartige Varianten von Incidents für den Job meldet und unbrauchbare Metriken in den Graphen anzeigt. Um dies zu verhindern, definieren Sie eine appsignal_name-Methode, die einen Job-Namen im Format ClassName#method_name zurückgibt. Auf diese Weise werden die Jobs wieder korrekt gruppiert.
class StructJobWithName < Struct.new(:id)
  def perform
    # Do stuff
  end

  # This returns an unique job name, creating new incidents and graphs for each
  # unique job name.
  def display_name
    "StructJobWithName-#{id}"
  end

  # This will group the jobs back to a single entity, allowing incidents
  # and graphs to work properly.
  def appsignal_name
    "StructJobWithName#perform"
  end
end

Delayed::Job.enqueue(StructJobWithName.new("id"))
# Reported as "StructJobWithName#perform"

Unterstützung für Delay-Methodenaufrufe

Methodenaufrufe, die mit der Delay-Erweiterung in die Warteschlange gestellt werden, werden mit einem Action-Namen gemeldet, der ihrem Aufruf ähnelt. Die Argumente, die der verzögerten Methode übergeben werden, werden als Argumente für den Job gemeldet.
Post.delay.archive_all("some selector")
# Reported as "Post.archive_all"

Post.create(:title => "Post title").delay.send_mail("mail subject")
# Reported as "Post#send_mail"

Unterstützung für Delayed::Job.enqueue

Hinweis: Die Erkennung des Job-Namens wurde in Ruby Gem Version 2.11.0 hinzugefügt.
Benutzerdefinierte Job-Objekte, die mit Delayed::Job.enqueue eingereiht werden, werden wie gewohnt gemeldet, aber ohne Argumente. An Delayed::Job wird ein ganzes Objekt übergeben und in YAML serialisiert und wieder zurück. In diesem Szenario können wir keine Argumente erkennen.
Delayed::Job.enqueue job_object

Unterstützung für Active Job

Die Delayed Job-Integration ist mit Active Job kompatibel. Sie meldet Queue-Zeiten in Graphen, Queues und Prioritäten, wenn sie für den Job festgelegt sind. Führen Sie ein Upgrade auf Version 2.11.0 des Ruby-Gems oder neuer durch, um die Unterstützung zu verbessern.

Änderungen an der Integration

Queue-Zeit

In AppSignal für Ruby Gem 2.3.0 wurde eine Änderung an der Erfassung der Queue-Zeit vorgenommen. In PR #297 wurde die Startzeit des Jobs anstelle der Erstellungszeit des Jobs verwendet. Das bedeutet, dass die Zeit von der Erstellung eines Jobs bis zum geplanten Startzeitpunkt nicht mehr als Queue-Zeit erfasst wird. Dies verhindert, dass sehr lange Queue-Zeiten die Queue-Zeit-Graphen auf AppSignal.com verzerren.

Beispielanwendungen

Im Folgenden finden Sie eine Liste der verfügbaren Beispielanwendungen, mit denen Sie die Delayed::Job-Integration testen können:
  • AppSignal + Rails 5 + Delayed::Job
    • Das Beispiel zeigt, wie Sie AppSignal mit Delayed::Job und Rails einrichten. In der README-Datei sind alle bekannten und getesteten Methoden zum Einreihen von Jobs aufgeführt, die AppSignal unterstützt.