Minutely-Probes sind ein Mechanismus, um regelmäßig benutzerdefinierte Metriken an AppSignal zu senden. Dies ist ein System, das standardmäßig im AppSignal Ruby-Gem enthalten ist. Zu Beginn jeder Minute werden die Minutely-Probes nacheinander ausgelöst, um Metriken zu sammeln, und dann bis zur nächsten Minute pausiert.
Standardmäßig aktiviert das AppSignal Ruby-Gem Probes für Bibliotheken, die für Ihre App erkannt werden.
Hinweis: In AppSignal Ruby-Gem 3.7.0 und niedriger verwenden Sie das Modul
Appsignal::Minutely.probes, um Probes zu registrieren, anstelle der neuen
Appsignal::Probes-API.
Verwendung
Die Minutely-Probes ermöglichen es dem AppSignal Ruby-Gem, standardmäßig benutzerdefinierte Metriken für Integrationen und app-spezifische Metriken durch Erstellen Ihrer eigenen Probe zu sammeln.
Mehrere Instanzen
Einmal aktiviert, läuft das Minutely-Probes-System auf jeder Instanz einer App. Das bedeutet, wenn eine Probe Metriken ohne eine Art unterscheidendes Tag meldet, können globale Metriken durch Metriken auf Instanzebene überschrieben werden. Beispielsweise gibt es eine Probe, die verfolgt, wie groß die lokale Hintergrundjob-Queue für eine App ist. Die Queue-Datenbank läuft lokal auf der Instanz, und die Queue-Größen können stark variieren. Jede Instanz einer App meldet unterschiedliche Metrikwerte für dieselbe Metrik und dieselben Tags, was den Metrikwert jede Minute mit denen der zuletzt meldenden Instanz überschreibt.
Um Abhilfe zu schaffen, schlagen wir vor, Ihre Metriken mit dem Hostnamen oder etwas anderem zu taggen, das für jede Instanz einzigartig ist. Beispielsweise taggt die Sidekiq-Probe Metriken standardmäßig mit dem Redis-Hostnamen.
Alternativ können Sie Minutely-Probes deaktivieren für alle Instanzen außer einer, auf der der Minutely-Probes-Prozess läuft. Wir empfehlen die Verwendung der Umgebungsvariable APPSIGNAL_ENABLE_MINUTELY_PROBES, um sie nur auf der Instanz Ihrer Wahl zu aktivieren.
Konfiguration
Die Minutely-Probes werden mit der Konfigurationsoption enable_minutely_probes konfiguriert.
Probes erstellen
Wenn Sie mehr benutzerdefinierte Metriken aus Ihrer App verfolgen möchten als die mit unseren Integrationen ausgelieferten Standard-Probes, können Sie eigene Probe(s) hinzufügen.
Eine AppSignal-Minutely-Probe kann eines von drei Dingen sein. Welcher der drei Typen für Ihre Klasse verwendet werden soll, hängt vom Anwendungsfall ab.
Lambda-Probe
Der einfachste Probe-Typ zum Registrieren. Wenn Sie keine Abhängigkeiten für Ihre Probe haben, ist dies die bevorzugte Methode.
# config/initializers/appsignal.rb or a file that's loaded on boot
Appsignal::Probes.register(:my_probe, lambda do
Appsignal.set_gauge("database_size", 10)
end)
Klassen-Probe
Eine Klassen-Probe ist eine lazy initialisierte Probe. Sie wird nur gestartet, wenn die Minutely-Probes gestartet werden. Sie wird zu Beginn des Minutely-Probes-Threads initialisiert und bleibt initialisiert, solange Ihre App läuft.
Diese Methode ist nützlich, wenn Sie enable_minutely_probes nicht für jede Umgebung aktiviert haben und nicht möchten, dass sie standardmäßig initialisiert wird.
# config/initializers/appsignal.rb or a file that's loaded on boot
# Creating a probe using a Ruby class
class BackgroundJobLibraryProbe
def initialize
# This is only called when the minutely probe gets initialized
require "background_job_library"
@connection = BackgroundJobLibrary.connection
end
def call
stats = @connection.fetch_queue_stats
Appsignal.set_gauge "background_job_library_queue_length", stats.queue_length
Appsignal.set_gauge "background_job_library_processed_jobs", stats.processed_jobs
end
end
# Registering a Class probe
Appsignal::Probes.register(
:background_job_library_probe,
BackgroundJobLibraryProbe
)
Initialisierte Klassen-Probe
Diese Methode ist am nützlichsten zum Überschreiben von Standard-Probes. Das AppSignal Ruby-Gem liefert einige Probes für Integrationen standardmäßig mit. Diese Standard-Probes registrieren Probes als Klasse, sodass sie beim Überschreiben nicht initialisiert werden. Wenn die Standardkonfiguration der Probe nicht zu Ihrem Anwendungsfall passt, können Sie eine Standard-Probe überschreiben mit Ihrer eigenen Konfiguration.
Beachten Sie, dass wir keine Klasse als Probe registrieren, sondern eine Instanz der Klasse mit .new und ein Konfigurationsobjekt übergeben, z. B. BackgroundJobLibraryProbe.new(<config>).
# config/initializers/appsignal.rb or a file that's loaded on boot
require "background_job_library"
# Creating a probe using a Ruby class
class BackgroundJobLibraryProbe
def initialize(config)
@connection = BackgroundJobLibrary.connection(config)
end
def call
stats = @connection.fetch_queue_stats
Appsignal.set_gauge "background_job_library_queue_length", stats.queue_length
Appsignal.set_gauge "background_job_library_processed_jobs", stats.processed_jobs
end
end
# Registering an initialized Class probe
Appsignal::Probes.register(
:background_job_library_probe,
BackgroundJobLibraryProbe.new(:database => "redis://localhost:6379")
)
Probes registrieren
Probes können mit der register-Methode des Moduls Appsignal::Probes registriert werden.
Diese Methode akzeptiert zwei Argumente.
# config/initializers/appsignal.rb or a file that's loaded on boot
Appsignal::Probes.register(:my_probe, lambda do
Appsignal.set_gauge("database_size", 10)
end)
Rails-Apps
Wir empfehlen, Ihre Probes in einem Rails-Initializer zu registrieren, z. B.: config/initializers/my_probe.rb.
Abhängigkeitsanforderungen
Nicht jede Probe sollte standardmäßig zur Liste der Probes hinzugefügt werden. Manche Abhängigkeit kann erforderlich sein, damit die Probe ordnungsgemäß funktioniert. Diese Abhängigkeitsprüfung wird in den im Gem gelieferten Probes verwendet, kann aber auch in Ihren eigenen Probes verwendet werden.
Durch Hinzufügen einer Klassenmethode mit dem Namen dependencies_present? kann vor dem Start der Probe geprüft werden, ob sie gestartet werden soll. Dies funktioniert sowohl bei Klassen-Probes als auch bei initialisierten Klassen-Probes. Im letzteren Szenario sollte es in der initialize-Methode der Probe keinen Aufruf an die genannte Abhängigkeit geben, da diese bereits initialisiert ist.
# config/initializers/appsignal.rb or a file that's loaded on boot
require "background_job_library"
# Creating a probe using a Ruby class
class BackgroundJobLibraryProbe
def self.dependencies_present?
# Only start the probe if the BackgroundJobLibrary version is higher or
# equal to 1.0.0.
Gem::Version.new(BackgroundJobLibrary::Version) >= Gem::Version.new("1.0.0")
end
def initialize(config = {})
@config = config
end
def call
stats = connection.fetch_queue_stats
Appsignal.set_gauge "background_job_library_queue_length", stats.queue_length
Appsignal.set_gauge "background_job_library_processed_jobs", stats.processed_jobs
end
private
def connection
@connection ||= BackgroundJobLibrary.connection(@config)
end
end
# Registering a Class probe with a `dependencies_present?` check
Appsignal::Probes.register(
:background_job_library_probe,
BackgroundJobLibraryProbe
)
# Also works for initialized probes
Appsignal::Probes.register(
:background_job_library_probe,
BackgroundJobLibraryProbe.new(:url => "schema://my_connection_url:9090")
)
Standard-Probes überschreiben
AppSignal wird mit Standard-Probes für bestimmte Integrationen ausgeliefert. Wenn diese Probe aus irgendeinem Grund nicht ordnungsgemäß funktioniert oder zusätzliche Konfiguration für Ihren Anwendungsfall benötigt, können Sie die Standard-Probe überschreiben, indem Sie die Probe-Klasse mit Ihrer eigenen Konfiguration initialisieren.
Beispiel zum Überschreiben der Sidekiq-Probe.
# config/initializers/appsignal.rb or a file that's loaded on boot
Appsignal::Probes.register(
:sidekiq, # Use the same key as the default Sidekiq probe to override it
Appsignal::Probes::SidekiqProbe.new(:hostname => ENV["REDIS_URL"])
)
(Beachten Sie, dass Sie die Umgebungsvariable REDIS_URL selbst setzen müssen.)
Das Überschreiben von Probes protokolliert eine Debug-Nachricht in der appsignal.log-Datei, die helfen kann zu erkennen, ob eine Probe korrekt überschrieben wurde.
Probes deregistrieren
Um zuvor registrierte Probes, einschließlich der Standard-Probes, zu deregistrieren, verwenden Sie die Methode Appsignal::Probes.unregister. Rufen Sie die unregister-Methode mit dem Namen der Probe auf, um sie zu deregistrieren.
Appsignal::Probes.unregister(
:probe_name # Use the same key as used in `Probes.register` to unregister it
)