Les minutely probes sont un mécanisme permettant d’envoyer périodiquement des métriques personnalisées à AppSignal. C’est un système qui est inclus dans la gem Ruby AppSignal par défaut. Au début de chaque minute, les minutely probes sont déclenchées une par une pour collecter des métriques, puis mises en veille jusqu’à la minute suivante.
Par défaut, la gem Ruby AppSignal active les probes pour les bibliothèques détectées pour votre application.
Remarque : dans la gem Ruby AppSignal 3.7.0 et antérieures, utilisez le
module Appsignal::Minutely.probes pour enregistrer des probes, plutôt que
la nouvelle API Appsignal::Probes.
Utilisation
Les minutely probes permettent à la gem Ruby AppSignal de collecter des métriques personnalisées par défaut pour les intégrations et des métriques spécifiques à l’application en créant votre propre probe.
Plusieurs instances
Une fois activé, le système de minutely probes s’exécute sur chaque instance d’une application. Cela signifie que si une probe signale des métriques sans une sorte de tag distinctif, les métriques globales peuvent être écrasées par des métriques au niveau de l’instance. Par exemple, il existe une probe qui suit la taille de la file d’attente locale des tâches en arrière-plan pour une application. La base de données de la file d’attente s’exécute localement sur l’instance et les tailles de file d’attente peuvent varier considérablement. Chaque instance d’une application signale des valeurs de métriques différentes pour la même métrique et les mêmes tags, en écrasant la valeur de la métrique chaque minute avec celles de la dernière instance signalant.
Pour remédier à cela, nous suggérons de taguer vos métriques avec le nom d’hôte ou autre chose d’unique pour chaque instance. Par exemple, la probe Sidekiq tague les métriques avec le nom d’hôte Redis par défaut.
Alternativement, vous pouvez désactiver les minutely probes pour toutes les instances sauf une, sur laquelle le processus de minutely probes est exécuté. Nous suggérons d’utiliser la variable d’environnement APPSIGNAL_ENABLE_MINUTELY_PROBES pour ne l’activer que sur l’instance de votre choix.
Configuration
Les minutely probes sont configurées à l’aide de l’option de configuration enable_minutely_probes.
Création de probes
Si vous voulez suivre plus de métriques personnalisées depuis votre application que les probes par défaut fournies avec nos intégrations, vous pouvez ajouter vos propres probes.
Une minutely probe AppSignal peut être l’une des trois choses suivantes. Le type à utiliser pour votre classe dépend du cas d’utilisation.
Lambda probe
Le type de probe le plus simple à enregistrer. Si vous n’avez pas de dépendances pour votre probe, c’est la méthode préférée.
# 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)
Class probe
Une class probe est une probe initialisée paresseusement. Elle ne sera démarrée que si les minutely probes sont démarrées. Elle sera initialisée au début du thread des minutely probes et restera initialisée tant que votre application est en cours d’exécution.
Cette méthode est utile lorsque vous n’avez pas enable_minutely_probes activé pour chaque environnement et que vous ne voulez pas qu’il soit initialisé par défaut.
# 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
)
Initialized class probe
Cette méthode est particulièrement utile pour remplacer les probes par défaut. La gem Ruby AppSignal livre certaines probes pour les intégrations par défaut. Ces probes par défaut enregistrent les probes en tant que classe afin qu’elles ne soient pas initialisées lorsqu’elles sont remplacées. Lorsque la configuration par défaut de la probe ne correspond pas à votre cas d’utilisation, vous pouvez remplacer une probe par défaut avec votre propre configuration.
Notez que nous n’enregistrons pas une classe en tant que probe, mais une instance de la classe en utilisant .new et en passant un objet de configuration, par exemple 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")
)
Enregistrement des probes
Les probes peuvent être enregistrées avec la méthode register du module Appsignal::Probes.
Cette méthode accepte deux arguments.
# 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)
Applications Rails
Nous recommandons d’enregistrer vos probes dans un initializer Rails, comme : config/initializers/my_probe.rb.
Exigences de dépendance
Il ne faut pas toujours ajouter une probe à la liste des probes par défaut. Une dépendance peut être requise pour que la probe fonctionne correctement. Cette vérification de dépendance est utilisée dans les probes livrées avec la gem, mais peut également être utilisée dans vos propres probes.
En ajoutant une méthode de classe appelée dependencies_present?, une vérification peut être effectuée avant le démarrage de la probe pour savoir si elle doit être démarrée ou non. Cela fonctionne à la fois pour les class probes et les initialized class probes. Pour ce dernier scénario, il ne devrait pas y avoir d’appel à ladite dépendance dans la méthode initialize de la probe car elle est déjà initialisée.
# 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")
)
Remplacement des probes par défaut
AppSignal livre des probes par défaut pour certaines intégrations. Si pour une raison quelconque cette probe ne fonctionne pas correctement ou nécessite une configuration supplémentaire pour votre cas d’utilisation, vous pouvez remplacer la probe par défaut en initialisant la classe de probe avec votre propre configuration.
Exemple de remplacement de la probe Sidekiq.
# 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"])
)
(Notez que vous devrez définir vous-même la variable d’environnement REDIS_URL.)
Le remplacement des probes enregistrera un message de debug dans le fichier appsignal.log qui peut aider à détecter si une probe est correctement remplacée.
Désenregistrer les probes
Pour désenregistrer des probes précédemment enregistrées, y compris les probes par défaut, utilisez la méthode Appsignal::Probes.unregister. Appelez la méthode unregister avec le nom de la probe pour la désenregistrer.
Appsignal::Probes.unregister(
:probe_name # Use the same key as used in `Probes.register` to unregister it
)