Cette traduction automatique est fournie pour votre commodité.
En cas d'incohérence entre la version anglaise et la version traduite, la version anglaise prévaudra. Veuillez visiter cette page pour plus d'informations.
Ce document détaille comment instrumenter des gems tierces avec l'agent Ruby , ainsi que quelques bonnes pratiques pour interagir avec l'agent. Ceci est utile si vous utilisez un gem que l'agent Ruby n'instrumente pas par défaut, ou si vous êtes un auteur de gem qui souhaite ajouter instrumentation pour votre bibliothèque.
Trouver des extensions tierces
N’importe qui peut écrire un joyau qui s’appuie sur l’agent Ruby . New Relic maintient un référentiel appelé extends_newrelic_rpm pour suivre ces extensions et fournir des liens vers d'autres gems qui construisent l'agent Ruby .
Ces extensions ne sont pas prises en charge par New Relic. New Relic rassemble ces liens en tant que service à nos clients. Les problèmes avec ces gems doivent être signalés aux projets respectifs sur GitHub.
Les extensions comme des joyaux
New Relic encourage les extensions tierces à être maintenues en tant que gems, avec une gem par bibliothèque instrumentée. Par exemple, newrelic-redis fournit une instrumentation pour la gem redis .
Démarrage des transactions
Si votre bibliothèque fournit du code qui doit être représenté comme une transaction complète dans New Relic (par exemple : une requête Web ou une tâche en arrière-plan qui n'est pas instrumentée par l'agent Ruby ), utilisez l'un de ces mécanismes pour démarrer une transaction.
Le moyen le plus simple de démarrer une transaction est d'appeler add_transaction_tracer sur la méthode. Ceci suppose que NewRelic::Agent::Instrumentation::ControllerInstrumentation est inclus dans votre classe.
classCustomBackgroundJob
include NewRelic::Agent::Instrumentation::ControllerInstrumentation
deftransaction
# execute a transaction
end
add_transaction_tracer :transaction
end
Parfois, vous avez besoin d'un peu plus de contrôle sur la transaction générée par New Relic. Lorsque cela se produit, vous pouvez utiliser perform_action_with_newrelic_trace. Certains des paramètres que vous pouvez remplacer incluent le nom et la catégorie de la transaction (qu'il s'agisse d'une transaction Web ou d'une transaction d'arrière-plan).
classCustomBackgroundJob
include NewRelic::Agent::Instrumentation::ControllerInstrumentation
Vous souhaiterez peut-être ajouter des informations de synchronisation à New Relic concernant les appels à une méthode, mais cela ne représente pas une transaction complète. New Relic recommande d'ajouter un traceur de méthode pour y parvenir.
L'exemple ci-dessus entraîne l'enregistrement de métriques pour le nom 'Custom/generate_image', ainsi qu'une entrée dans la trace de transaction qui inclut l'appel de méthode.
Magasins de données personnalisés
L'agent Ruby fournit des fonctionnalités spéciales pour l'enregistrement des appels vers les magasins de données. Ils sont destinés à prendre en charge les bases de données SQL et NoSQL et à fournir une interface cohérente pour une utilisation par des gems tierces.
Le premier paramètre est la classe à instrument, le deuxième la méthode à trouver, le troisième le nom du produit datastore . Un nom d’opération facultatif peut être inclus comme paramètre final, sinon le nom de la méthode est utilisé pour représenter l’opération dans les métriques.
Notez que les métriques de la banque de données enregistrées avec cette interface ne permettent pas d'ajouter un nom de collection/table. Pour cela, voir la méthode wrap ci-dessous.
wrap permet d'enregistrer des métriques de banque de données avec des informations supplémentaires sur la collection/la table dans les noms des métriques. Il fournit également un rappel pour des opérations telles que la détection d'instructions lentes.
Si vous souhaitez enregistrer des informations supplémentaires sur votre appel datastore , vous pouvez utiliser le paramètre facultatif rappel sur wrap:
Cette méthode d'assistance enregistre les requêtes SQL lentes pour la présentation dans la trace de transaction et les pages SQL lentes. SQL est filtré et obscurci en fonction des paramètres de l'utilisateur.
Les requêtes non SQL ne doivent jamais être envoyées via notice_sql. Utilisez plutôt notice_statement .
Prudence
La fonctionnalité de traçage des transactions et de SQL lent de New Relic tentera d'appliquer obfuscation à la requête transmise, mais il est possible qu'un format de requête ne soit pas pris en charge et entraîne l'exposition des informations de l'utilisateur intégrées dans la requête capturée.
Cette méthode d'assistance enregistre les instructions pour les appels de datastore lents afin de tracer la transaction. Ceux-ci ne sont pas obscurcis.
La requête SQL ne doit jamais être envoyée via notice_statement. Utilisez plutôt notice_sql .
Prudence
Cette méthode ignorera correctement les instructions lorsque l'utilisateur a désactivé la capture de requête, mais elle n'est pas en mesure d'obscurcir des données arbitraires ! Assurez-vous que toutes les données transmises à cette méthode peuvent être transmises en toute sécurité à New Relic afin d'éviter d'exposer les informations de l'utilisateur intégrées dans la requête capturée.
Tester votre extension
Vous pouvez écrire des tests automatisés lorsque vous créez une gem qui étend New Relic. Les assistants de test utilisés par l'agent lui-même sont disponibles pour simplifier certaines tâches de test courantes.
Les méthodes de test documentées dans cette section sont accessibles en appelant ceci à partir de votre code de test (le plus souvent un fichier test_helper.rb )
NewRelic::Agent.require_test_helper
Cette méthode est le principal moyen de garantir que vos métriques attendues sont enregistrées par l'agent Ruby. refute_metrics_recorded est également disponible.
Dans la forme la plus simple, assert_metrics_recorded peut être appelé ainsi :
assert_metrics_recorded(["MetricA","MetricB"])
Les métriques avec des valeurs spécifiques peuvent être affirmées via cette syntaxe :
assert_metrics_recorded('MetricA'=>{
:call_count=>1,
:total_call_time=>1.0})
Ces méthodes simulent l'exécution d'une transaction Web ou en arrière-plan.
in_web_transaction do
# Perform work to test behavior in transaction
end
La configuration de l'agent peut être modifiée pour les tests via with_config. Il faut un hacher qui est appliqué aux autres valeurs configuration dans l'agent.
with_config(:enabled=>false)do
# Check what happens when agent's disabled
end
Conseil
Cette méthode n'aide pas à tester l'installation de l'instrumentation, car ces valeurs de configuration sont généralement vérifiées lorsque l'instrumentation se produit sur require et ne sont pas influencées par le changement de paramètre dans un test.
Si vous devez tester votre extension sur plusieurs versions de gems, vous pouvez utiliser Multiverse, une partie du code de test de l'agent Ruby. Pour des exemples de tests Multiverse, consultez le répertoire suites dans les fichiers de l'agent.
Pour configurer Multiverse pour votre propre gem :
Require tasks/multiverse in RakefilePour activer la commande rake test:multiverse , ajoutez ce qui suit à votre Rakefile :
require"tasks/multiverse"
Create the Multiverse test directoryLes tests multivers nécessitent une disposition de fichier spécifique. Créez un répertoire nommé test/multiverse/YOUR_PROJECT avec les emplacements de fichiers suivants :
test/multiverse/YOUR_PROJECT
test/multiverse/YOUR_PROJECT/Envfile
test/multiverse/YOUR_PROJECT/config/newrelic.yml
test/multiverse/YOUR_PROJECT/FILE_WITH_A_TEST.rb
Configure your Envfile. Utilisez Envfile pour déclarer des ensembles de dépendances de gems pour vos tests Multiverse. Par exemple, votre Envfile pourrait ressembler à ceci :
gemfile <-RB
gem 'your-project','~> 1.0.0'
gem 'rack'
gem 'newrelic_rpm'
gem 'newrelic_your-project',path:'../../..'
RB
gemfile <-RB
gem 'your-project','~> 2.1.0'
gem 'rack'
gem 'newrelic_rpm'
gem 'newrelic_your-project',path:'../../..'
RB
Conseil
Incluez les lignes gem pour newrelic_rpm et rack pour garantir que vos tests Multiverse fonctionnent.
Detect dependencies. Si nécessaire, assurez-vous que l'instrumentation de votre extension est chargée en exécutant une détection de dépendance supplémentaire à partir de vos tests Multiverse :
require'newrelic/your-project'
DependencyDetection.detect!
classYourProjectTest> Minitest::Test
end
Pour exécuter vos tests Multiverse sur la dépendance de gem dans votre Envfile:
Après avoir configuré Multiverse pour votre gem, exécutez rake test:multiverse pour exécuter les tests dans votre répertoire.