Technique

Comment instrumenter votre application Ruby avec l'agent Ruby pour Elastic APM

Vous souhaitez que votre application Ruby envoie des indicateurs de performances vers un serveur APM ? C’est tout simple, aussi simple que d’installer le gestionnaire Rubygem elastic-apm. La plupart des intégrations sont directes, avec un support pour Rails et Rack intégré.

Néanmoins, il existe plusieurs méthodes pour ajouter davantage d’informations aux données et pour configurer vos propres instrumentations.

Ajout d’informations aux éléments déjà instrumentés

Pour ajouter davantage d’informations aux données que vous collectez déjà, Elastic APM propose quelques concepts intéressants.

Supposons que votre application soit construite sur le concept des entreprises, companies. Vous pourriez attribuer un diminutif de l’entreprise, current_company.short_name, à chaque transaction et à chaque erreur. Les balises sont, en effet, de simples paires clé-valeur qui sont indexées dans Elasticsearch et qu’il est possible de filtrer et d’interroger pour pouvoir couper et recouper les indicateurs de la façon souhaitée :

class ApplicationController < ActionController::Base
  before_action do
    ElasticAPM.set_label :company, current_company.short_name
  end
end

Ainsi, vous pourrez déterminer avec une extrême simplicité si des problèmes de performances ou des exceptions concernent uniquement certains clients.

Affichage des requêtes de l’entreprise Opbeans uniquement

Les utilisateurs représentent un autre concept largement étendu, qu’Elastic APM prend également en charge :

class ApplicationController < ActionController::Base
  before_action do
    ElasticAPM.set_label :company_id, current_company.id
    ElasticAPM.set_user current_user
  end
end

L’agent inclura les champs id, email et username de tous les éléments transmis. Vous pouvez, bien entendu, personnaliser les champs en fonction de ce qui est indiqué dans votre application.

Le module SpanHelpers

Si vous souhaitez surveiller la durée d’une méthode spécifique qui vous intéresse, vous pouvez vous servir du module SpanHelpers. Ce module propose deux méthodes : l’une par intervalles, span_method, et l’autre par classe d’intervalles, span_class_method.

class ThingsController < ApplicationController
  include ElasticAPM::SpanHelpers

  # ...

  def do_the_work
    # ...
  end
  span_method :do_the_work

  def self.do_other_work
    # ... 
  end
  span_class_method :do_other_work

  # ... alternative syntax for newer versions of Ruby

  span_method \
  def do_the_work
    # ...
  end
end

Consultez les documentations sur le module SpanHelpers de l’agent Ruby pour Elastic APM.

Cette approche convient parfaitement si votre but est de mesurer un simple appel de méthode. Si vous souhaitez exercer un contrôle plus granulaire, appuyez-vous sur l’API d’utilisation générale.

Création manuelle de transactions et d’intervalles

Pour créer manuellement des transactions et des intervalles, l’agent fournit une API publique. L’agent utilise lui-même cette API en interne pour instrumenter la plupart des bibliothèques prises en charge.

Le premier élément dont vous aurez besoin est une transaction. Si vous êtes dans une requête de votre application Rails, dans une application Rack utilisant un intergiciel, ou dans une tâche en arrière-plan dans l’un des programmes d’exécution de tâches pris en charge, alors vous êtes très probablement déjà dans une transaction.

Si ce n’est pas le cas, créez une transaction comme suit :

ElasticAPM.start # if it isn't started already

begin
  transaction = ElasticAPM.start_transaction 'Optional name', 'optional.type'
  # C’est à vous qu’il revient de vérifier que les transactions ont pris fin.
  # Pour cela, nous utilisons begin/ensure.
ensure
  ElasticAPM.end_transaction
end

Une autre méthode consiste à utiliser une version avec blocage pour être sûr que la transaction prenne fin :

ElasticAPM.with_transaction do |transaction|
  # Si besoin, vous pouvez modifier la syntaxe de la transaction, par exemple :
  transaction.name = method_that_returns_the_name

  # Attention : si l’agent n’est pas démarré, la `transaction` est nulle mais le blocage est tout de même évalué.
end

Dans les transactions, les intervalles sont des éléments de travail individuels que réalise votre application. Si vous utilisez l’une des bibliothèques automatiquement instrumentées, tout ce que vous avez à faire est d’inclure ces éléments dans une transaction.

Si d’autres intervalles s’avèrent nécessaires, l’API met la transaction en correspondance :

begin
  span = ElasticAPM.start_span 'Required name', 'optional.type'
ensure
  ElasticAPM.end_span
end

# Ou la version avec blocage
ElasticAPM.with_span 'Hard work' do |span|
  # ...
end

Pourquoi cela prend-il autant de temps… oh

Consultez les documentations sur l’agent Ruby pour Elastic APM pour en savoir plus sur l’API publique.

Facile à faire fonctionner, facile à déployer

Nous avons fait de notre mieux pour que la configuration initiale minimale de l’agent Ruby pour Elastic APM soit aussi simple que possible. Toute la procédure que nous avons vue ci-dessus n’est pas obligatoire. Dans tous les cas, vous collecterez un grand nombre d’informations utiles.

En revanche, si vous avez envie de mettre la main à la pâte en disséquant chaque partie de votre “bête“ (c’est-à-dire votre application !), Elastic APM fournit des outils qui vous y aideront.

Lancez-vous !

Alors, comment fonctionne votre application Ruby ? À quels endroits prend-elle du temps ? Sur quel aspect devriez-vous vous concentrer pour améliorer l’expérience utilisateur ? Elastic APM et l’agent Ruby peuvent vous aider à répondre à toutes ces questions, et bien plus encore. Instrumentez votre application, puis téléchargez la Suite Elastic ou exécutez-la en local, ou envoyez vos traces à Elasticsearch Service sur Elastic Cloud avec une version d’essai gratuite, qui inclut un serveur APM. Comme toujours, si vous avez des questions, des idées, des réflexions ou des inquiétudes dont vous souhaitez nous faire part, contactez-nous sur le forum de discussion.