Tracer des applications Ruby

ddtrace est le client de tracing de Datadog pour Ruby. Il permet de tracer les requêtes qui transitent par vos serveurs Web, bases de données et microservices, offrant ainsi aux développeurs une visibilité optimale sur les goulots d’étranglement et les requêtes problématiques.

Prise en main

Si vous effectuez une mise à niveau depuis une version 0.x, consultez notre guide dédié.

Pour la documentation générale sur l’APM, consultez la documentation relative à la configuration.

Pour découvrir comment APM se présente une fois que votre application a commencé à envoyer des informations à Datadog, consultez la section relative aux termes et concepts.

Pour vous familiariser avec l’API de la bibliothèque, consultez notre documentation YARD.

Pour contribuer au code, consultez les règles de contribution et le guide de développement.

Table des matières

Compatibilité

Interpréteurs Ruby pris en charge :

TypeDocumentationVersionType de prise en chargeVersion du gem prise en charge
MRIhttps://www.ruby-lang.org/3.1ComplèteDernière
3.0ComplèteDernière
2.7ComplèteDernière
2.6ComplèteDernière
2.5ComplèteDernière
2.4ComplèteDernière
2.3ComplèteDernière
2.2Complète (sauf pour le profiling)Dernière
2.1Complète (sauf pour le profiling)Dernière
2.0Fin de vie depuis le 7 juin 2021< 0.50.0
1.9.3Fin de vie depuis le 6 août 2020< 0.27.0
1.9.1Fin de vie depuis le 6 août 2020< 0.27.0
JRubyhttps://www.jruby.org9.3ComplèteDernière
9.2ComplèteDernière

Serveurs Web pris en charge :

TypeDocumentationVersionType de prise en charge
Pumahttp://puma.io/2.16+/3.6+Complète
Unicornhttps://bogomips.org/unicorn/4.8+/5.1+Complète
Passengerhttps://www.phusionpassenger.com/5.0+Complète

Frameworks de tracing pris en charge :

TypeDocumentationVersionVersion du gem prise en charge
OpenTracinghttps://github.com/opentracing/opentracing-ruby0.4.1+>= 0.16.0

Complète indique que toutes les fonctionnalités du traceur sont prises en charge.

Obsolète indique que la prise en charge passera à Maintenance dans une prochaine version.

Maintenance indique que seules les corrections de bugs critiques seront backportées jusqu’à la fin de vie.

Fin de vie indique que le service n’est plus pris en charge.

Prise en charge par macOS (Apple)

L’utilisation de ddtrace sous macOS est prise en charge à des fins de développement, mais pas pour des déploiements en production.

Prise en charge par Microsoft Windows

Microsoft Windows ne prend actuellement pas en charge ddtrace. Nous acceptons les contributions de la communauté et les problèmes associés, mais ils ne sont pas prioritaires.

Installation

Il vous suffit de suivre quelques étapes rapides pour pouvoir tracer votre application Ruby :

  1. Configurer l’Agent Datadog pour le tracing
  2. Instrumenter votre application
  3. Associer votre application à l’Agent Datadog

Configurer l’Agent Datadog pour le tracing

Avant d’installer ddtrace, installez l’Agent Datadog afin que ddtrace puisse lui envoyer des données de trace.

Configurez ensuite l’Agent Datadog de façon à ce qu’il accepte les traces. Pour ce faire, effectuez l’une des opérations suivantes :

  • Définissez DD_APM_ENABLED=true dans l’environnement de l’Agent.

OU

De plus, dans les environnement conteneurisés…

  • Définissez DD_APM_NON_LOCAL_TRAFFIC=true dans l’environnement de l’Agent.

OU

Consultez les instructions de configuration spécifiques pour Docker, Kubernetes, Amazon ECS ou Fargate pour vérifier que l’Agent est configuré de façon à recevoir des traces dans un environnement conteneurisé.

Configurer l’ingestion des données de trace

L’Agent Datadog détecte par défaut les traces via HTTP sur le port 8126.

Pour modifier le protocole ou le port utilisés pour la détection des données de trace par l’Agent, procédez comme suit :

Pour une détection HTTP via TCP :

  • Définissez DD_APM_RECEIVER_PORT=<port> dans l’environnement de l’Agent.

OU

Pour un socket de domaine Unix (UDS) :

  • Définissez DD_APM_RECEIVER_SOCKET=<chemin-vers-fichier-socket>.

OU

Instrumenter votre application

Applications Rails ou Hanami

  1. Ajoutez le gem ddtrace à votre fichier Gem :

    source 'https://rubygems.org'
    gem 'ddtrace', require: 'ddtrace/auto_instrument'
    
  2. Installez le gem avec bundle install.

  3. Créez un fichier config/initializers/datadog.rb contenant :

    Datadog.configure do |c|
      # Add additional configuration here.
      # Activate integrations, change tracer settings, etc...
    end
    

    Grâce à ce bloc, vous pouvez :

Autres applications Ruby

Si votre application n’utilise pas les gems pris en charge (Rails ou Hanami) qui sont indiqués ci-dessus, vous pouvez la configurer comme suit :

  1. Ajoutez le gem ddtrace à votre fichier Gem :

    source 'https://rubygems.org'
    gem 'ddtrace'
    
  2. Installez le gem avec bundle install.

  3. Utilisez require pour exiger les bibliothèques ou frameworks pris en charge à instrumenter.

  4. Ajoutez require 'ddtrace/auto_instrument' à votre application. _Remarque : effectuez cette opération après avoir exigé les bibliothèques ou frameworks pris en charge.

    # Example frameworks and libraries
    require 'sinatra'
    require 'faraday'
    require 'redis'
    
    require 'ddtrace/auto_instrument'
    
  5. Ajoutez un bloc de configuration à votre application :

    Datadog.configure do |c|
      # Add additional configuration here.
      # Activate integrations, change tracer settings, etc...
    end
    

    Grâce à ce bloc, vous pouvez :

Configurer OpenTracing

  1. Ajoutez le gem ddtrace à votre fichier Gem :

    source 'https://rubygems.org'
    gem 'ddtrace'
    
  2. Installez le gem avec bundle install.

  3. Ajoutez ce qui suit à votre fichier de configuration OpenTracing :

    require 'opentracing'
    require 'datadog/tracing'
    require 'datadog/opentracer'
    
    # Activate the Datadog tracer for OpenTracing
    OpenTracing.global_tracer = Datadog::OpenTracer::Tracer.new
    
  4. Ajoutez un bloc de configuration à votre application :

    Datadog.configure do |c|
      # Configure the Datadog tracer here.
      # Activate integrations, change tracer settings, etc...
      # By default without additional configuration,
      # no additional integrations will be traced, only
      # what you have instrumented with OpenTracing.
    end
    

    Grâce à ce bloc, vous pouvez :

Configurer OpenTelemetry

Vous pouvez envoyer directement des traces OpenTelemetry à l’Agent Datadog (sans ddtrace) avec OTLP. Consultez notre documentation sur l’ingestion OTLP dans l’Agent Datadog pour en savoir plus.

Associer votre application à l’Agent Datadog

Par défaut, ddtrace se connecte à l’Agent à l’aide des premiers paramètres disponibles, selon les priorités indiquées :

  1. Via les paramètres de configuration explicitement fournis (hostname, port et transport)
  2. Via le socket de domaine Unix (UDS) situé à l’emplacement /var/run/datadog/apm.socket
  3. À l’aide du protocole HTTP via TCP sur 127.0.0.1:8126

Si votre Agent Datadog effectue une écoute à l’un de ces emplacements, aucune configuration supplémentaire n’est requise.

Si votre Agent s’exécute sur un autre host ou conteneur que votre application, ou si vous souhaitez envoyer des traces via un autre protocole, vous devez configurer votre application en conséquence.

Dernières étapes d’installation

Une fois la configuration terminée, vos services commencent à apparaître sur la page des services APM après quelques minutes. Pour apprendre à utiliser l’IU de l’APM, cliquez ici.

Instrumentation manuelle

Si le framework que vous utilisez n’est pas pris en charge, vous pouvez choisir d’instrumenter manuellement votre code.

Pour tracer du code Ruby, vous pouvez utiliser la méthode Datadog::Tracing.trace :

Datadog::Tracing.trace(name, **options) do |span, trace|
  # Incorporer le code que vous souhaitez instrumenter dans ce bloc
  # La span peut également être modifiée ici
  # Exemple : changement de nom de ressource, définition de tags, etc.
end

Assurez-vous de remplacer name par une string décrivant le type d’opération effectuée (p. ex. 'web.request' ou 'request.parse')

options correspond aux arguments de mot-clé facultatifs suivants :

CléTypeDescriptionValeur par défaut
autostartBoolIndique si la mesure du temps doit démarrer automatiquement. Si cette clé est définie sur false, l’utilisateur doit appeler span.start.true
continue_fromDatadog::TraceDigestProlonge une trace qui provient d’un autre contexte d’exécution. TraceDigest décrit le point de continuation.nil
on_errorProcRemplace le comportement de gestion des erreurs générées par une span. Arguments : span et error. Définit l’erreur sur la span par défaut.`proc {
resourceStringNom de la ressource ou de l’action tracée. Les traces associées à un même nom de ressource seront regroupées pour la collecte de métriques (elles resteront toutefois consultables séparément). Généralement spécifique à un domaine, tel qu’une URL, une requête, etc. (p. ex. 'Article#submit', http://exemple.com/articles/list.)name de la span.
serviceStringLe nom du service auquel cette span appartient (p. ex. 'mon-service-web')default-service du traceur, $PROGRAM_NAME ou 'ruby'
start_timeTimeHeure d’initialisation réelle de la span. Utile dans les cas où les événements tracés se sont déjà produits.Time.now
tagsHashTags supplémentaires à ajouter à la span.{}
typeStringType de span ('http', 'db', etc.)nil

Nous vous conseillons fortement de définir un service et une resource au strict minimum. Les spans sans service ou resource (nil) seront ignorées par l’Agent Datadog.

Exemple d’instrumentation manuelle :

get '/posts' do
  Datadog::Tracing.trace('web.request', service: 'my-blog', resource: 'GET /posts') do |span|
    # Tracer l'appel activerecord
    Datadog::Tracing.trace('posts.fetch') do
      @posts = Posts.order(created_at: :desc).limit(10)
    end

    # Ajouter des tags APM
    span.set_tag('http.method', request.request_method)
    span.set_tag('posts.count', @posts.length)

    # Tracer le rendu du modèle
    Datadog::Tracing.trace('template.render') do
      erb :index
    end
  end
end

Tracing asynchrone

Il n’est pas toujours possible d’utiliser Datadog::Tracing.trace autour d’un bloc de code. Il arrive que certaines instrumentations basées sur des événements ou des notifications ne vous notifient qu’au début ou à la fin d’un événement.

Pour tracer ces opérations, vous pouvez tracer le code de façon asynchrone en appelant Datadog::Tracing.trace sans bloc :

# Certains frameworks d'instrumentation appellent ce qui suit après la fin d'un événement…
def db_query(start, finish, query)
  span = Datadog::Tracing.trace('database.query', start_time: start)
  span.resource = query
  span.finish(finish)
end

Lorsque vous appelez Datadog::Tracing.trace sans bloc, la Datadog::Tracing::SpanOperation renvoyée par la fonction est initialisée, mais pas finalisée. Vous pouvez ensuite modifier cette span comme bon vous semble, puis la finaliser avec finish.

Toutes les spans doivent être finalisées. Si une span est encore ouverte alors que la trace se termine, cette dernière sera ignorée. Si vous pensez que l’une de vos traces n’est pas finalisée, activez le mode debugging afin de visualiser les avertissements.

Pour éviter ce problème lorsque vous avez recours à des événements d’initialisation et de finalisation, utilisez Datadog::Tracing.active_span pour récupérer la span active.

# Exemple : ActiveSupport::Notifications appelle ce qui suit au début d'un événement
def start(name, id, payload)
  # Démarrer une span
  Datadog.Tracing.trace(name)
end

# Exemple : ActiveSupport::Notifications appelle ce qui suit à la fin d'un événement
def finish(name, id, payload)
  # Récupérer la span active (thread-safe)
  current_span = Datadog.Tracing.active_span
  unless current_span.nil?
    current_span.resource = payload[:query]
    current_span.finish
  end
end

Enrichir les traces à l’aide de méthodes imbriquées

Vous pouvez ajouter des informations supplémentaires sous forme de tags à la span active en utilisant la méthode de votre choix. Attention : si la méthode est appelée et qu’aucune span n’est active, active_span est défini sur nil.

# Exemple : ajouter un tag à la span active

current_span = Datadog::Tracing.active_span
current_span.set_tag('my_tag', 'my_value') unless current_span.nil?

Vous pouvez également récupérer la span active en utilisant la méthode active_trace. Cette méthode renverra nil si aucune trace n’est active.

# exemple : accéder à la trace active

current_trace = Datadog::Tracing.active_trace

Instrumenter des intégrations

Un vaste nombre de bibliothèques et de frameworks sont pris en charge par défaut, ce qui signifie qu’ils peuvent être instrumentés automatiquement. Ces instrumentations ne sont pas activées par défaut, mais elles peuvent facilement être activées et configurées avec l’API Datadog.configure :

Datadog.configure do |c|
  # Activer et configurer une intégration
  c.tracing.instrument :integration_name, **options
end

options correspond aux arguments de mot-clé pour la configuration propre aux intégrations.

Vous trouverez ci-dessous la liste des intégrations disponibles ainsi que leurs options de configuration :

NomCléVersions prises en charge : MRIVersions prises en charge : JRubyConfigurationSource Gem
Action Cableaction_cable>= 5.0>= 5.0LienLien
Action Maileraction_mailer>= 5.0>= 5.0LienLien
Action Packaction_pack>= 3.2>= 3.2LienLien
Action Viewaction_view>= 3.2>= 3.2LienLien
Active Jobactive_job>= 4.2>= 4.2LienLien
Active Model Serializersactive_model_serializers>= 0.9>= 0.9LienLien
Active Recordactive_record>= 3.2>= 3.2LienLien
Active Supportactive_support>= 3.2>= 3.2LienLien
AWSaws>= 2.0>= 2.0LienLien
Concurrent Rubyconcurrent_ruby>= 0.9>= 0.9LienLink
Dallidalli>= 2.0>= 2.0LienLien
DelayedJobdelayed_job>= 4.1>= 4.1LienLien
Elasticsearchelasticsearch>= 1.0>= 1.0LienLien
Ethonethon>= 0.11>= 0.11LienLien
Exconexcon>= 0.50>= 0.50LienLien
Faradayfaraday>= 0.14>= 0.14LienLien
Grapegrape>= 1.0>= 1.0LienLien
GraphQLgraphql>= 1.7.9>= 1.7.9LienLien
gRPCgrpc>= 1.7Gem non disponibleLienLien
hanamihanami>= 1, < 2>= 1, < 2LienLien
http.rbhttprb>= 2.0>= 2.0LienLien
httpclienthttpclient>= 2.2>= 2.2LienLien
httpxhttpx>= 0.11>= 0.11LienLien
Kafkaruby-kafka>= 0.7.10>= 0.7.10LienLien
Makara (via Active Record)makara>= 0.3.5>= 0.3.5LienLien
MongoDBmongo>= 2.1>= 2.1LienLien
MySQL2mysql2>= 0.3.21Gem non disponibleLienLien
Net/HTTPhttp(Toute version de Ruby prise en charge)(Toute version de Ruby prise en charge)LienLien
Postgrespg>= 0.18.4Gem non disponibleLienLien
Prestopresto>= 0.5.14>= 0.5.14LienLien
Qlessqless>= 0.10.0>= 0.10.0LienLien
Queque>= 1.0.0.beta2>= 1.0.0.beta2LienLien
Racecarracecar>= 0.3.5>= 0.3.5LienLien
Rackrack>= 1.1>= 1.1LienLien
Railsrails>= 3.2>= 3.2LienLien
Rakerake>= 12.0>= 12.0LienLien
Redisredis>= 3.2>= 3.2LienLien
Resqueresque>= 1.0>= 1.0LienLien
Rest Clientrest-client>= 1.8>= 1.8LienLien
Sequelsequel>= 3.41>= 3.41LienLien
Shoryukenshoryuken>= 3.2>= 3.2LienLien
Sidekiqsidekiq>= 3.5.4>= 3.5.4LienLien
Sinatrasinatra>= 1.4>= 1.4LienLien
Sneakerssneakers>= 2.12.0>= 2.12.0LienLien
Stripestripe>= 5.15.0>= 5.15.0LienLien
Sucker Punchsucker_punch>= 2.0>= 2.0LienLien

CI Visibility

Pour la solution CI Visibility Datadog, il est possible d’activer et de configurer l’instrumentation de bibliothèque à l’aide de l’API Datadog.configure suivante :

Datadog.configure do |c|
  # Activer et configurer une intégration
  c.ci.instrument :integration_name, **options
end

options correspond aux arguments de mot-clé pour la configuration propre aux intégrations.

Voici la liste des intégrations CI Visibility disponibles :

NomCléVersions prises en charge : MRIVersions prises en charge : JRubyConfigurationSource Gem
Cucumbercucumber>= 3.0>= 1.7.16LienLien
RSpecrspec>= 3.0.0>= 3.0.0LienLien

Action Cable

L’intégration Action Cable permet de tracer les messages des broadcasts et les actions effectuées sur un canal.

Vous pouvez l’activer via Datadog.configure :

require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :action_cable
end

Action Mailer

L’intégration Action Mailer permet de tracer les actions ActionMailer pour la version 5 de Rails.

Vous pouvez l’activer via Datadog.configure :

require 'ddtrace'
Datadog.configure do |c|
  c.tracing.instrument :action_mailer, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
email_dataIndique si des métadonnées supplémentaires de charge utile sur les e-mails doivent être ajoutées aux spans action_mailer.deliver. Champs inclus : ['subject', 'to', 'from', 'bcc', 'cc', 'date', 'perform_deliveries'].false

Action Pack

Action Pack est généralement configuré en même temps que Rails, mais il est possible de l’activer séparément :

require 'actionpack'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :action_pack
end

Action View

Action View est généralement configuré en même temps que Rails, mais il est possible de l’activer séparément :

require 'actionview'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :action_view, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
template_base_pathUtilisé pour le parsing du nom du modèle. Si vous ne stockez pas vos modèles dans le dossier views/, vous devrez peut-être modifier cette valeur.'views/'

Active Job

Active Job est généralement configuré en même temps que Rails, mais il est possible de l’activer séparément :

require 'active_job'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :active_job
end

ExampleJob.perform_later

Active Model Serializers

L’intégration Active Model Serializers permet de tracer l’événement serialize pour les versions 0.9+ et l’événement render pour les versions 0.10+.

require 'active_model_serializers'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :active_model_serializers
end

my_object = MyModel.new(name: 'my object')
ActiveModelSerializers::SerializableResource.new(test_obj).serializable_hash

Active Record

Active Record est généralement configuré en même temps qu’un framework Web (tel que Rails ou Sinatra), mais il est possible de le configurer séparément :

require 'tmpdir'
require 'sqlite3'
require 'active_record'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :active_record, **options
end

Dir::Tmpname.create(['test', '.sqlite']) do |db|
  conn = ActiveRecord::Base.establish_connection(adapter: 'sqlite3',
                                                 database: db)
  conn.connection.execute('SELECT 42') # traced!
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
service_nameNom de service utilisé pour la partie base de données de l’instrumentation de active_record.Nom de l’adaptateur de base de données (p. ex. 'mysql2')

Configurer les paramètres de tracing par base de données

Il est possible de configurer les paramètres de tracing par connexion de base de données via l’option describes :

# Ajouter une option `:describes` avec une clé de connexion.
# Toutes les clés suivantes sont acceptées et fonctionnent de façon similaire.
# Si un bloc est spécifié, cela renvoie un objet Settings
# qui accepte toutes les options de configuration énumérées ci-dessus.

Datadog.configure do |c|
  # Symbole correspondant à votre connexion de base de données dans config/database.yml
  # Uniquement disponible si vous utilisez Rails avec Active Record.
  c.tracing.instrument :active_record, describes: :secondary_database, service_name: 'secondary-db'

  # Modèle de configuration du bloc.
  c.tracing.instrument :active_record, describes: :secondary_database do |second_db|
    second_db.service_name = 'secondary-db'
  end

  # Chaîne de connexion avec les paramètres de connexion suivants :
  # adapter, username, host, port et database.
  # Les autres champs sont ignorés.
  c.use :active_record, describes: 'mysql2://root@127.0.0.1:3306/mysql', service_name: 'secondary-db'

  # Hash avec les paramètres de connexion suivants :
  # adapter, username, host, port, database.
  # Les autres champs sont ignorés.
  c.tracing.instrument :active_record, describes: {
      adapter:  'mysql2',
      host:     '127.0.0.1',
      port:     '3306',
      database: 'mysql',
      username: 'root'
    },
    service_name: 'secondary-db'

  # Si vous utilisez le gem `makara`, il est possible de faire correspondre la connexion `role` :
  c.use :active_record, describes: { makara_role: 'primary' }, service_name: 'primary-db'
  c.use :active_record, describes: { makara_role: 'replica' }, service_name: 'secondary-db'
end

Vous pouvez également créer des configurations basées sur les correspondances partielles de champs de connexion de base de données :

Datadog.configure do |c|
  # Correspond à n'importe quelle connexion sur le host `127.0.0.1`.
 c.tracing.instrument :active_record, describes: { host:  '127.0.0.1' }, service_name: 'local-db'

  # Correspond à n'importe quelle connexion `mysql2`.
  c.tracing.instrument :active_record, describes: { adapter: 'mysql2'}, service_name: 'mysql-db'

  # Correspond à n'importe quelle connexion `mysql2` à la base de données `reports`.
  #
  # Si plusieurs configurations `describe` correspondent, seule la dernière s'applique.
  # Ici, une connexion avec l'adaptateur `mysql` et la base de données `reports`
  # sera configurée avec `service_name: 'reports-db'`, et non `service_name: 'mysql-db'`.
  c.tracing.instrument :active_record, describes: { adapter: 'mysql2', database:  'reports'}, service_name: 'reports-db'
end

Lorsque plusieurs configurations describes correspondent à une connexion, la dernière règle configurée qui correspond est appliquée.

Si Active Record trace un événement qui utilise une connexion qui correspond à une clé définie par describes, les paramètres de tracing associés à cette connexion sont utilisés. Si la connexion ne correspond à aucune des connexions décrites, les paramètres par défaut définis par c.tracing.instrument :active_record sont utilisés à la place.

Active Support

Active Support est généralement configuré en même temps que Rails, mais il est possible de l’activer séparément :

require 'activesupport'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :active_support, **options
end

cache = ActiveSupport::Cache::MemoryStore.new
cache.read('city')

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
cache_serviceNom de service utilisé pour la mise en cache avec l’instrumentation de active_support.active_support-cache

AWS

L’intégration AWS permet de tracer l’ensemble des interactions (tels que les appels d’API) avec les services AWS (S3, ElastiCache etc.).

require 'aws-sdk'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :aws, **options
end

# Exécuter l'appel tracé
Aws::S3::Client.new.list_buckets

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
service_nameNom de service utilisé pour l’instrumentation de aws'aws'

Concurrent Ruby

L’intégration Concurrent Ruby ajoute la prise en charge de la propagation de contexte lorsque ::Concurrent::Future est utilisé. De cette façon, il est possible de s’assurer que le code tracé dans Future#execute est associé au bon parent.

Pour activer votre intégration, utilisez la méthode Datadog.configure :

# Dans l'initialiseur Rails ou un équivalent
Datadog.configure do |c|
  # Patcher ::Concurrent::Future pour utiliser un ExecutorService qui propage le contexte
  c.tracing.instrument :concurrent_ruby
end

# Passer le context au code exécuté dans Concurrent::Future
Datadog::Tracing.trace('outer') do
  Concurrent::Future.execute { Datadog::Tracing.trace('inner') { } }.wait
end

Cucumber

Lorsque vous utilisez le framework cucumber, l’intégration Cucumber trace toutes les exécutions de scénarios et d’étapes.

Pour activer votre intégration, utilisez la méthode Datadog.configure :

require 'cucumber'
require 'ddtrace'

# Configurer l'intégration Cucumber par défaut
Datadog.configure do |c|
  c.ci.instrument :cucumber, **options
end

# L'exemple suivant décrit comment appliquer des tags provenant d'un scénario à la span active
Around do |scenario, block|
  active_span = Datadog.configuration[:cucumber][:tracer].active_span
  unless active_span.nil?
    scenario.tags.filter { |tag| tag.include? ':' }.each do |tag|
      active_span.set_tag(*tag.name.split(':', 2))
    end
  end
  block.call
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
enabledDéfinit si Cucumber doit être tracé ou non. Utile pour désactiver le tracing temporairement. true ou false.true
service_nameNom de service utilisé pour l’instrumentation de cucumber.'cucumber'
operation_nameNom de l’opération utilisée pour l’instrumentation de cucumber. Utile si vous souhaitez renommer les métriques de traces automatiques, par exemple trace.#{nom_opération}.errors.'cucumber.test'

Dalli

L’intégration Dalli permet de tracer l’ensemble des appels à votre serveur memcached :

require 'dalli'
require 'ddtrace'

# Configurer le comportement de tracing de Dalli par défaut
Datadog.configure do |c|
  c.tracing.instrument :dalli, **options
end

# Configurer le comportement de tracing de Dalli pour un client spécifique
client = Dalli::Client.new('localhost:11211', **options)
client.set('abc', 123)

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
service_nameNom de service utilisé pour l’instrumentation de dalli'memcached'

DelayedJob

L’intégration DelayedJob utilise des hooks de cycle de vie pour tracer les exécutions de tâches et les mises en file d’attente.

Vous pouvez l’activer via Datadog.configure :

require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :delayed_job, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
error_handlerGestionnaire d’erreurs personnalisé appelé lorsqu’une tâche renvoie une erreur. Arguments : span spécifiée et error. Définit une erreur sur la span par défaut. Utile pour ignorer les erreurs temporaires.`proc {

Elasticsearch

L’intégration Elasticsearch permet de tracer n’importe quel appel à perform_request depuis l’objet Client :

require 'elasticsearch/transport'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :elasticsearch, **options
end

# Envoyer une requête à Elasticsearch
client = Elasticsearch::Client.new url: 'http://127.0.0.1:9200'
response = client.perform_request 'GET', '_cluster/health'

# Si vous souhaitez utiliser des paramètres différents pour une instance client spécifique
Datadog.configure_onto(client.transport, **options)

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
quantizeHash contenant les options de quantification. Possibilité d’utiliser :show avec un tableau de clés à ne pas quantifier (ou :all pour ignorer la quantification), ou :exclude avec un tableau de clés à exclure entièrement.{}
service_nameNom de service utilisé pour l’instrumentation de elasticsearch'elasticsearch'

Ethon

L’intégration ethon permet de tracer n’importe quelle requête HTTP par le biais d’objets Easy ou Multi. Notez que cette intégration prend également en charge la bibliothèque Typhoeus, qui est basée sur Ethon.

require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :ethon, **options

  # Si nécessaire, spécifier un nom de service différent pour les hostnames correspondant à une expression régulière
  c.tracing.instrument :ethon, describes: /user-[^.]+\.example\.com/ do |ethon|
    ethon.service_name = 'user.example.com'
    ethon.split_by_domain = false # Uniquement nécessaire si split_by_domain prend par défaut la valeur true
  end
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
distributed_tracingActive le tracing distribuétrue
service_nameNom de service utilisé pour l’instrumentation de ethon'ethon'
split_by_domainDéfinir sur true pour utiliser le domaine de requête comme nom de service.false

Excon

L’intégration excon est disponible via le middleware ddtrace :

require 'excon'
require 'ddtrace'

# Configurer le comportement de tracing d'Excon par défaut
Datadog.configure do |c|
  c.tracing.instrument :excon, **options

  # Si nécessaire, spécifier un nom de service différent pour les hostnames correspondant à une expression régulière
  c.tracing.instrument :excon, describes: /user-[^.]+\.example\.com/ do |excon|
    excon.service_name = 'user.example.com'
    excon.split_by_domain = false # Uniquement nécessaire si split_by_domain prend par défaut la valeur true
  end
end

connection = Excon.new('https://example.com')
connection.get

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
distributed_tracingActive le tracing distribuétrue
error_handlerUn Proc qui accepte un paramètre response. S’il renvoie une valeur truthy, la span de la trace est définie comme une erreur. Par défaut, seules les réponses 5XX sont définies comme des erreurs.nil
service_nameNom de service pour l’instrumentation d’Excon. Lorsque spécifié à un middleware pour une connexion spécifique, s’applique uniquement à cet objet de connexion.'excon'
split_by_domainDéfinir sur true pour utiliser le domaine de requête comme nom de service.false

Configurer des paramètres différents pour chaque connexion

Si vous utilisez plusieurs connexions avec Excon, vous pouvez définir des paramètres différents pour chaque connexion en configurant leurs constructeurs avec un middleware :

# Incorporer la pile de middlewares par défaut dans le middleware de tracing Datadog
Excon.new(
  'http://example.com',
  middlewares: Datadog::Tracing::Contrib::Excon::Middleware.with(options).around_default_stack
)

# Insérer le middleware dans une pile de middlewares personnalisée.
# Remarque : le middleware de tracing doit être inséré après le ResponseParser !
Excon.new(
  'http://example.com',
  middlewares: [
    Excon::Middleware::ResponseParser,
    Datadog::Tracing::Contrib::Excon::Middleware.with(options),
    Excon::Middleware::Idempotent
  ]
)

options est un hash pouvant contenir n’importe quel paramètre énuméré dans le tableau ci-dessus.

Faraday

L’intégration faraday est disponible via le middleware ddtrace :

require 'faraday'
require 'ddtrace'

# Configurer le comportement de tracing de Faraday par défaut
Datadog.configure do |c|
  c.tracing.instrument :faraday, **options

  # Si nécessaire, spécifier un nom de service différent pour les hostnames correspondant à une expression régulière
  c.tracing.instrument :faraday, describes: /user-[^.]+\.example\.com/ do |faraday|
    faraday.service_name = 'user.example.com'
    faraday.split_by_domain = false # Uniquement nécessaire si split_by_domain prend par défaut la valeur true
  end
end

# Si vous souhaitez utiliser des paramètres différents pour une instance client spécifique
connection = Faraday.new('https://example.com') do |builder|
  builder.use(:ddtrace, **options)
  builder.adapter Faraday.default_adapter
end

connection.get('/foo')

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
distributed_tracingActive le tracing distribuétrue
error_handlerUn Proc qui accepte un paramètre response. S’il renvoie une valeur truthy, la span de la trace est définie comme une erreur. Par défaut, seules les réponses 5XX sont définies comme des erreurs.nil
service_nameNom du service pour l’instrumentation de Faraday. Lorsque spécifié à un middleware pour une connexion spécifique, s’applique uniquement à cet objet de connexion.'faraday'
split_by_domainDéfinir sur true pour utiliser le domaine de requête comme nom de service.false

Grape

L’intégration Grape permet d’instrumenter les endpoints et filtres Grape. Elle peut être utilisée conjointement à d’autres intégrations telles que Rack et Rails.

Pour activer votre intégration, utilisez la méthode Datadog.configure avant de définir votre application Grape :

# api.rb
require 'grape'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :grape, **options
end

# Ensuite, définir votre application
class RackTestingAPI < Grape::API
  desc 'main endpoint'
  get :success do
    'Hello world!'
  end
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
enabledDéfinit si Grape doit être tracé ou non. Utile pour désactiver le tracing temporairement. true ou false.true
error_statusesDéfinit un code de statut ou une plage de codes de statut qui doivent être considérés comme des erreurs. '404,405,500-599' ou [404,405,'500-599'].nil

GraphQL

L’intégration GraphQL permet d’instrumenter les requêtes GraphQL.

Pour activer votre intégration, utilisez la méthode Datadog.configure :

# Dans l'initialiseur Rails ou un équivalent
Datadog.configure do |c|
  c.tracing.instrument :graphql, schemas: [YourSchema], **options
end

# Ensuite, exécuter une requête GraphQL
YourSchema.execute(query, variables: {}, context: {}, operation_name: nil)

La méthode instrument :graphql accepte les paramètres suivants. Des options supplémentaires peuvent être spécifiées avec options :

CléDescriptionValeur par défaut
schemasObligatoire. Tableau d’objets GraphQL::Schema à tracer. Le tracing sera activé pour tous les schémas énumérés, en utilisant les options spécifiées dans cette configuration. Si aucun schéma n’est spécifié, le tracing ne sera pas activé.[]
service_nameNom de service utilisé pour l’instrumentation de graphql'ruby-graphql'

Configurer des schémas GraphQL manuellement

Si vous préférez configurer les paramètres de tracing pour un schéma spécifique (par exemple lorsque plusieurs schémas sont associés à des noms de service différents), vous pouvez ajouter ce qui suit à la définition du schéma via l’API GraphQL :

# Schéma basé sur une classe
class YourSchema < GraphQL::Schema
  use(
    GraphQL::Tracing::DataDogTracing,
    service: 'graphql'
  )
end
# Schéma de type .define
YourSchema = GraphQL::Schema.define do
  use(
    GraphQL::Tracing::DataDogTracing,
    service: 'graphql'
  )
end

Vous pouvez également modifier un schéma déjà défini :

# Schéma basé sur une classe
YourSchema.use(
    GraphQL::Tracing::DataDogTracing,
    service: 'graphql'
)
# Schéma de type .define
YourSchema.define do
  use(
    GraphQL::Tracing::DataDogTracing,
    service: 'graphql'
  )
end

Si vous avez opté pour la configuration manuelle, n’utilisez pas instrument :graphql dans Datadog.configure afin d’éviter que le tracing soit effectué en double. Ces deux modes de configuration du tracing de GraphQL ne doivent pas être utilisés en même temps.

gRPC

L’intégration grpc permet d’ajouter des intercepteurs côté client et côté serveur, qui sont exécutés en tant que middleware avant l’appel de procédure à distance du service. Les applications gRPC étant souvent distribuées, l’intégration partage les données de tracing entre client et serveur.

Pour configurer votre intégration, utilisez la méthode Datadog.configure comme suit :

require 'grpc'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :grpc, **options
end

# Côté serveur
server = GRPC::RpcServer.new
server.add_http2_port('localhost:50051', :this_port_is_insecure)
server.handle(Demo)
server.run_till_terminated

# Côté client
client = Demo.rpc_stub_class.new('localhost:50051', :this_channel_is_insecure)
client.my_endpoint(DemoMessage.new(contents: 'hello!'))

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
distributed_tracingActive le tracing distribuétrue
service_nameNom de service utilisé pour l’instrumentation de grpc'grpc'
error_handlerGestionnaire d’erreurs personnalisé appelé lorsqu’une requête entraîne une erreur. Un Proc qui accepte les paramètres span et error. Définit l’erreur sur la span par défaut.`proc {

Configurer des paramètres différents pour chaque client

Lorsque plusieurs clients appellent plusieurs services différents, vous avez la possibilité de passer directement l’intercepteur Datadog :

configured_interceptor = Datadog::Tracing::Contrib::GRPC::DatadogInterceptor::Client.new do |c|
  c.service_name = "Alternate"
end

alternate_client = Demo::Echo::Service.rpc_stub_class.new(
  'localhost:50052',
  :this_channel_is_insecure,
  :interceptors => [configured_interceptor]
)

De cette façon, l’intégration fera en sorte que le configured_interceptor établisse une configuration de tracing unique pour cette instance client.

hanami

L’intégration hanami effectuera l’instrumentation de routing, action et render pour votre application Hanami. Pour activer l’instrumentation hanami, il est recommandé de procéder à une instrumentation automatique avec ce qui suit :

gem 'ddtrace', require: 'ddtrace/auto_instrument'

Créez ensuite un fichier d’initialiseur dans votre dossier config/initializers :

# config/initializers/datadog.rb
Datadog.configure do |c|
  c.tracing.instrument :hanami, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
service_nameNom de service utilisé pour l’instrumentation de hanami.nil

http.rb

L’intégration http.rb permet de tracer n’importe quel appel HTTP effectué via le gem Http.rb.

require 'http'
require 'ddtrace'
Datadog.configure do |c|
  c.tracing.instrument :httprb, **options
  # Si nécessaire, spécifier un nom de service différent pour les hostnames correspondant à une expression régulière
  c.tracing.instrument :httprb, describes: /user-[^.]+\.example\.com/ do |httprb|
    httprb.service_name = 'user.example.com'
    httprb.split_by_domain = false # Uniquement nécessaire si split_by_domain prend par défaut la valeur true
  end
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
distributed_tracingActive le tracing distribuétrue
service_nameNom de service utilisé pour l’instrumentation de httprb.'httprb'
split_by_domainDéfinir sur true pour utiliser le domaine de requête comme nom de service.false
error_status_codesPlage ou tableau de codes de statut HTTP devant être tracés en tant qu’erreurs.400...600

httpclient

L’intégration httpclient permet de tracer n’importe quel appel HTTP effectué via le gem httpclient.

require 'httpclient'
require 'ddtrace'
Datadog.configure do |c|
  c.tracing.instrument :httpclient, **options
  # SI nécessaire, spécifier un nom de service différent pour les hostnames correspondant à une expression régulière
  c.tracing.instrument :httpclient, describes: /user-[^.]+\.example\.com/ do |httpclient|
    httpclient.service_name = 'user.example.com'
    httpclient.split_by_domain = false # Uniquement nécessaire si split_by_domain prend par défaut la valeur true
  end
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
distributed_tracingActive le tracing distribuétrue
service_nameNom de service pour l’instrumentation de httpclient.'httpclient'
split_by_domainDéfinir sur true pour utiliser le domaine de requête comme nom de service.false
error_status_codesPlage ou tableau de codes de statut HTTP devant être tracés en tant qu’erreurs.400...600

httpx

httpx gère sa propre intégration avec ddtrace :

require "ddtrace"
require "httpx/adapters/datadog"

Datadog.configure do |c|
  c.tracing.instrument :httpx

  # Si nécessaire, spécifier un nom de service différent pour les hostnames correspondant à une expression régulière
  c.tracing.instrument :httpx, describes: /user-[^.]+\.example\.com/ do |http|
    http.service_name = 'user.example.com'
    http.split_by_domain = false # Uniquement nécessaire si split_by_domain prend par défaut la valeur true
  end
end

Kafka

L’intégration Kafka permet de tracer le gem ruby-kafka :

Vous pouvez l’activer via Datadog.configure :

require 'active_support/notifications' # nécessaire pour activer l'instrumentation 'ruby-kafka'
require 'kafka'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :kafka
end

MongoDB

L’intégration permet de tracer n’importe quelle Command envoyée depuis le pilote Ruby pour MongoDB vers un cluster MongoDB. De plus, les ODM (Object Document Mappers) tels que Mongoid qui utilisent le pilote Ruby officiel seront automatiquement instrumentés. Pour activer l’intégration, procédez simplement ainsi :

require 'mongo'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :mongo, **options
end

# Créer un client MongoDB et l'utiliser normalement
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'artists')
collection = client[:people]
collection.insert_one({ name: 'Steve' })

# Si vous souhaitez utiliser des paramètres différents pour une instance client spécifique
Datadog.configure_onto(client, **options)

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
quantizeHash contenant les options de quantification. Possibilité d’utiliser :show avec un tableau de clés à ne pas quantifier (ou :all pour ignorer la quantification), ou :exclude avec un tableau de clés à exclure entièrement.{ show: [:collection, :database, :operation] }
service_nameNom de service utilisé pour l’instrumentation de mongo'mongodb'

Configurer les paramètres de tracing par connexion

Il est possible de configurer les paramètres de tracing par connexion via l’option describes :

# Ajouter une option `:describes` avec une clé de connexion.
# Toutes les clés suivantes sont acceptées et fonctionnent de façon similaire.
# Si un bloc est spécifié, cela renvoie un objet Settings
# qui accepte toutes les options de configuration énumérées ci-dessus.

Datadog.configure do |c|
  # Chaîne pour la connexion réseau
  c.tracing.instrument :mongo, describes: '127.0.0.1:27017', service_name: 'mongo-primary'

  # Expression régulière pour la connexion réseau
  c.tracing.instrument :mongo, describes: /localhost.*/, service_name: 'mongo-secondary'
end

client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'artists')
collection = client[:people]
collection.insert_one({ name: 'Steve' })
# L'appel tracé appartiendra au service `mongo-primary`

client = Mongo::Client.new([ 'localhost:27017' ], :database => 'artists')
collection = client[:people]
collection.insert_one({ name: 'Steve' })
# L'appel tracé appartiendra au service `mongo-secondary`

Lorsque plusieurs configurations describes correspondent à une connexion, la dernière règle configurée qui correspond est appliquée.

MySQL2

L’intégration MySQL2 permet de tracer n’importe quelle commande SQL envoyée via le gem mysql2.

require 'mysql2'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :mysql2, **options
end

client = Mysql2::Client.new(:host => "localhost", :username => "root")
client.query("SELECT * FROM users WHERE group='x'")

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
service_nameNom de service utilisé pour l’instrumentation de mysql2'mysql2'
comment_propagationMode de propagation des commentaires SQL pour la surveillance des bases de données.
(exemple : disabled | service| full).

Important : veuillez noter que l’activation de la propagation des commentaires SQL entraîne le stockage de données potentiellement confidentielles (noms des services) dans les bases de données ; ces données sont alors accessibles aux tierces parties ayant accès à la base de données.
'disabled'

Net/HTTP

L’intégration Net/HTTP permet de tracer n’importe quel appel HTTP effectué via le module Net::HTTP de la bibliothèque standard.

require 'net/http'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :http, **options

  # Si nécessaire, spécifier un nom de service différent pour les hostnames correspondant à une expression régulière
  c.tracing.instrument :http, describes: /user-[^.]+\.example\.com/ do |http|
    http.service_name = 'user.example.com'
    http.split_by_domain = false # Uniquement nécessaire si split_by_domain prend par défaut la valeur true
  end
end

Net::HTTP.start('127.0.0.1', 8080) do |http|
  request = Net::HTTP::Get.new '/index'
  response = http.request(request)
end

content = Net::HTTP.get(URI('http://127.0.0.1/index.html'))

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
distributed_tracingActive le tracing distribuétrue
service_nameNom de service utilisé pour l’instrumentation de http'net/http'
split_by_domainDéfinir sur true pour utiliser le domaine de requête comme nom de service.false
error_status_codesPlage ou tableau de codes de statut HTTP devant être tracés en tant qu’erreurs.400...600

Si vous souhaitez configurer chaque objet de connexion séparément, vous pouvez utiliser la méthode Datadog.configure_onto comme suit :

client = Net::HTTP.new(host, port)
Datadog.configure_onto(client, **options)

Postgres

L’intégration PG trace les commandes SQL envoyées via le gem pg par l’intermédiaire de :

  • exec, exec_params, exec_prepared ;
  • async_exec, async_exec_params, async_exec_prepared ; ou
  • sync_exec, sync_exec_params, sync_exec_prepared.
require 'pg'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :pg, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
service_nameNom de service utilisé pour l’instrumentation de pg'pg'
comment_propagationMode de propagation des commentaires SQL pour la surveillance des bases de données.
(exemple : disabled | service| full).

Important : veuillez noter que l’activation de la propagation des commentaires SQL entraîne le stockage de données potentiellement confidentielles (noms des services) dans les bases de données ; ces données sont alors accessibles aux tierces parties ayant accès à la base de données.
'disabled'

Presto

L’intégration Presto permet de tracer n’importe quelle commande SQL envoyée via le gem presto-client.

require 'presto-client'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :presto, **options
end

client = Presto::Client.new(
  server: "localhost:8880",
  ssl: {verify: false},
  catalog: "native",
  schema: "default",
  time_zone: "US/Pacific",
  language: "English",
  http_debug: true,
)

client.run("select * from system.nodes")

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
service_nameNom de service utilisé pour l’instrumentation de presto'presto'

Qless

L’intégration Qless utilise des hooks de cycle de vie pour tracer les exécutions de tâches.

Pour tracer une tâche Qless :

require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :qless, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
tag_job_dataActiver le tagging avec des arguments de tâches. true pour l’activer, false pour le désactiver.false
tag_job_tagsActiver le tagging avec des tags de tâches. true pour l’activer, false pour le désactiver.false

Que

L’intégration Que est un middleware qui permet de tracer les exécutions de tâches.

Vous pouvez l’activer via Datadog.configure :

require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :que, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
enabledDéfinit si Que doit être tracé ou non. Utile pour désactiver le tracing temporairement. true ou false.true
tag_argsActiver le tagging du champ d’arguments d’une tâche. true pour l’activer, false pour le désactiver.false
tag_dataActiver le tagging du champ de données d’une tâche. true pour l’activer, false pour le désactiver.false
error_handlerGestionnaire d’erreurs personnalisé appelé lorsqu’une tâche renvoie une erreur. Arguments : span spécifiée et error. Définit une erreur sur la span par défaut. Utile pour ignorer les erreurs temporaires.`proc {

Racecar

L’intégration Racecar permet de tracer les tâches Racecar.

Vous pouvez l’activer via Datadog.configure :

require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :racecar, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
service_nameNom de service utilisé pour l’instrumentation de racecar'racecar'

Rack

L’intégration Rack permet d’utiliser un middleware pour tracer toutes les requêtes avant qu’elles n’atteignent le framework ou l’application cible. Elle répond à l’interface minimale Rack, offrant des valeurs raisonnables qui peuvent être récupérées au niveau de Rack.

Cette intégration est automatiquement activée avec les frameworks Web tels que Rails. Si vous utilisez une application Rack standard, activez l’intégration dans votre config.ru :

# Exemple de config.ru
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :rack, **options
end

use Datadog::Tracing::Contrib::Rack::TraceMiddleware

app = proc do |env|
  [ 200, {'Content-Type' => 'text/plain'}, ['OK'] ]
end

run app

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
applicationVotre application Rack. Obligatoire pour middleware_names.nil
distributed_tracingActive le tracing distribué de façon à associer les traces de ce service aux traces d’autres services si des en-têtes de tracing sont reçus.true
headersHash d’en-têtes de requête ou de réponse HTTP à ajouter en tant que tags à rack.request. Accepte les clés request et response des valeurs sous forme de tableau, par exemple ['Last-Modified']. Ajoute les tags http.request.headers.* et http.response.headers.* respectivement.{ response: ['Content-Type', 'X-Request-ID'] }
middleware_namesActivez cette option pour utiliser la dernière classe middleware exécutée comme nom de ressource pour la span rack. Si cette option et l’instrumentation rails sont toutes les deux activées, rails a la priorité et définit le nom de ressource rack sur le contrôleur rails actif, le cas échéant. Nécessite l’option application.false
quantizeHash contenant les options de quantification. Possibilité d’utiliser :query ou :fragment.{}
quantize.baseDéfinit la façon dont la base de l’URL (schéma, host et port) est gérée. Peut être défini sur :show, pour conserver la base de l’URL dans le tag http.url et ne pas définir le tag http.base_url, ou sur nil pour supprimer la base de l’URL du tag http.url par défaut, ce qui permet de conserver le chemin et définir le tag http.base_url. Cette option doit être imbriquée dans l’option quantize.nil
quantize.queryHash contenant les options propres à la requête lors de la quantification des URL. Possibilité d’utiliser :show ou :exclude. Voir les options ci-dessous. Cette option doit être imbriquée dans l’option quantize.{}
quantize.query.showDéfinit les valeurs à afficher systématiquement. Spécifiez un tableau de chaînes, :all pour afficher toutes les valeurs, ou nil pour n’afficher aucune valeur. Cette option doit être imbriquée dans l’option query.nil
quantize.query.excludeDéfinit les valeurs à supprimer dans leur intégralité. Spécifiez un tableau de chaînes, :all pour supprimer entièrement la chaîne de la requête, ou nil pour tout conserver. Cette option doit être imbriquée dans l’option query.nil
quantize.query.obfuscateDéfinit le comportement d’écriture des chaînes de requête. Spécifiez un hash d’options, :internal pour utiliser les paramètres d’obfuscation internes par défaut, ou nil pour désactiver l’obfuscation. Veuillez noter que l’obfuscation s’effectue au niveau des chaînes, et non des paires key-value. Lorsque l’obfuscation est activée, le paramètre query.show prend par défaut la valeur :all s’il n’était pas défini. Cette option doit être imbriquée dans l’option query.nil
quantize.query.obfuscate.withDéfinit la chaîne par laquelle les valeurs obfusquées sont remplacées. Spécifiez une chaîne. Cette option doit être imbriquée dans l’option query.obfuscate.'<censuré>'
quantize.query.obfuscate.regexDéfinit l’expression régulière servant à censurer la chaîne de requête. Spécifiez une expression régulière ou :internal afin d’utiliser l’expression régulière interne par défaut (afin de censurer les données sensibles les plus courantes). Chaque valeur correspondant à l’expression régulière est entièrement censurée et remplacée par la valeur de query.obfuscate.with. Cette option doit être imbriquée dans l’option query.obfuscate.:internal
quantize.fragmentDéfinit la façon dont les fragments d’URL sont gérés. Spécifiez :show pour afficher les fragments d’URL ou nil pour les masquer. Cette option doit être imbriquée dans l’option quantize.nil
request_queuingSurveille le temps que la requête HTTP passe dans la file d’attente du serveur frontend. Consultez la rubrique Mise en file d’attente des requêtes HTTP pour découvrir comment configurer cette option.false
web_service_nameNom de service pour les spans de mise en file d’attente des requêtes sur le serveur frontend. (Ex. : 'nginx')'web-server'

Modifications apportées aux options :

  • Dans une prochaine version, la valeur par défaut de quantize.base sera définie sur :show et non plus sur :exclude. Il est recommandé d’effectuer soi-même ce changement.
  • Dans une prochaine version, la valeur par défaut de quantize.query.show sera définie sur :all. De même, quantize.query.obfuscate sera par défaut défini sur :internal. Il est recommandé d’effectuer soi-même ces changements.

Configurer le comportement de quantification des URL

Datadog.configure do |c|
  # Comportement par défaut : toutes les valeurs sont quantifiées ; la base et le fragment sont supprimés.
  # http://example.com/path?category_id=1&sort_by=asc#featured --> /path?category_id&sort_by
  # http://example.com:8080/path?categories[]=1&categories[]=2 --> /path?categories[]

  # Supprimer la base de l'URL (schéma, host, port)
  # http://example.com/path?category_id=1&sort_by=asc#featured --> /path?category_id&sort_by#featured
  c.tracing.instrument :rack, quantize: { base: :exclude }

  # Afficher la base de l'URL
  # http://example.com/path?category_id=1&sort_by=asc#featured --> http://example.com/path?category_id&sort_by#featured
  c.tracing.instrument :rack, quantize: { base: :show }

  # Afficher les valeurs de tous les paramètres de chaîne de requête correspondant précisément à 'category_id'
  # http://example.com/path?category_id=1&sort_by=asc#featured --> /path?category_id=1&sort_by
  c.tracing.instrument :rack, quantize: { query: { show: ['category_id'] } }

  # Afficher toutes les valeurs de tous les paramètres de chaîne de requête
  # http://example.com/path?category_id=1&sort_by=asc#featured --> /path?category_id=1&sort_by=asc
  c.tracing.instrument :rack, quantize: { query: { show: :all } }

  # Exclure l'intégralité des paramètres de chaîne de requête correspondant précisément à 'sort_by'
  # http://example.com/path?category_id=1&sort_by=asc#featured --> /path?category_id
  c.tracing.instrument :rack, quantize: { query: { exclude: ['sort_by'] } }

  # Supprimer entièrement la chaîne de requête
  # http://example.com/path?category_id=1&sort_by=asc#featured --> /path
  c.tracing.instrument :rack, quantize: { query: { exclude: :all } }

  # Afficher les fragments d'URL
  # http://example.com/path?category_id=1&sort_by=asc#featured --> /path?category_id&sort_by#featured
  c.tracing.instrument :rack, quantize: { fragment: :show }

  # Obfusquer la chaîne de requête, avec un comportement par défaut permettant d'afficher toutes les valeurs
  # http://example.com/path?password=qwerty&sort_by=asc#featured --> /path?<redacted>&sort_by=asc
  c.tracing.instrument :rack, quantize: { query: { obfuscate: {} } }

  # Obfusquer la chaîne de requête à l'aide de l'expression régulière fournie, avec un comportement par défaut permettant d'afficher toutes les valeurs
  # http://example.com/path?category_id=1&sort_by=asc#featured --> /path?<redacted>&sort_by=asc
  c.tracing.instrument :rack, quantize: { query: { obfuscate: { regex: /category_id=\d+/ } } }

  # Obfusquer la chaîne de requête à l'aide d'une chaîne d'écriture personnalisée
  # http://example.com/path?password=qwerty&sort_by=asc#featured --> /path?REMOVED&sort_by=asc
  c.tracing.instrument :rack, quantize: { query: { obfuscate: { with: 'REMOVED' } } }
end

Rails

L’intégration Rails permet de tracer les requêtes, les appels de base de données, le rendu des modèles ainsi que les opérations read/write/delete du cache. L’intégration exploite l’instrumentation d’Active Support en écoutant l’API Notification de façon à tracer chaque opération instrumentée par l’API.

Pour activer l’instrumentation Rails, créez un fichier initialiseur dans votre dossier config/initializers :

# config/initializers/datadog.rb
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :rails, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
distributed_tracingActive le tracing distribué de façon à associer les traces de ce service aux traces d’autres services si des en-têtes de tracing sont reçus.true
request_queuingSurveille le temps que la requête HTTP passe dans la file d’attente du serveur frontend. Consultez la rubrique Mise en file d’attente des requêtes HTTP pour découvrir comment configurer cette option.false
exception_controllerClasse ou module qui identifie une classe de contrôleur d’exception personnalisé. Le traceur offre une gestion améliorée des erreurs lorsqu’il peut identifier les contrôleurs d’exception personnalisés. Par défaut, lorsque cette option n’est pas définie, le traceur « devine » à quoi ressemble un contrôleur d’exception personnalisé. Cette option facilite leur identification.nil
middlewareAjoute le middleware de tracing à l’application Rails. Définir sur false pour ne pas charger le middleware.true
middleware_namesPermet aux requêtes de middleware court-circuitées d’afficher le nom du middleware en tant que ressource pour la trace.false
service_nameNom de service utilisé lors du tracing de requêtes d’application (au niveau de rack)'<nom_app>' (récupéré à partir de l’espace de nommage de votre application Rails)
template_base_pathUtilisé pour le parsing du nom du modèle. Si vous ne stockez pas vos modèles dans le dossier views/, vous devrez peut-être modifier cette valeur.'views/'

Versions prises en charge

Versions MRIVersions JRubyVersions Rails
2.13.2-4.2
2.2-2.33.2-5.2
2.44.2.8-5.2
2.54.2.8-6.1
2.6-2.79.25.0-6.1
3.06.1

Rake

Il est possible d’instrumenter vos tâches Rake en activant l’intégration rake et en fournissant la liste des tâches à instrumenter.

Évitez d’instrumenter des tâches Rake à exécution longue, car elles peuvent agréger des traces volumineuses en mémoire qui ne sont vidées qu’à la fin de la tâche.

Pour les tâches à exécution longue, procédez à une instrumentation manuelle autour des chemins de code récurrents.

Pour activer le tracing des tâches Rake, ajoutez ce qui suit à votre Rakefile :

# Au début de votre Rakefile :
require 'rake'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :rake, tasks: ['my_task'], **options
end

task :my_task do
  # Spécifier votre tâche…
end

Rake::Task['my_task'].invoke

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
enabledDéfinit si les tâches Rake doivent être tracées ou non. Utile pour désactiver le tracing temporairement. true ou false.true
quantizeHash contenant les options de quantification des arguments de tâche. Des détails supplémentaires et des exemples sont disponibles plus bas.{}
service_nameNom de service utilisé pour l’instrumentation de rake'rake'
tasksNom des tâches Rake à instrumenter[]

Configurer le comportement de quantification des tâches

Datadog.configure do |c|
  # On considère une tâche qui accepte :one, :two, :three…
  # L'invocation se fait avec 'foo', 'bar', 'baz'.

  # Comportement par défaut : tous les arguments sont quantifiés.
  # `rake.invoke.args` tag  --> ['?']
  # `rake.execute.args` tag --> { one: '?', two: '?', three: '?' }
  c.tracing.instrument :rake

  # Afficher les valeurs pour l'argument :two uniquement
  # `rake.invoke.args` tag  --> ['?']
  # `rake.execute.args` tag --> { one: '?', two: 'bar', three: '?' }
  c.tracing.instrument :rake, quantize: { args: { show: [:two] } }

  # Afficher les valeurs pour tous les arguments.
  # `rake.invoke.args` tag  --> ['foo', 'bar', 'baz']
  # `rake.execute.args` tag --> { one: 'foo', two: 'bar', three: 'baz' }
  c.tracing.instrument :rake, quantize: { args: { show: :all } }

  # Exclure entièrement l'argument :three
  # `rake.invoke.args` tag  --> ['?']
  # `rake.execute.args` tag --> { one: '?', two: '?' }
  c.tracing.instrument :rake, quantize: { args: { exclude: [:three] } }

  # Supprimer entièrement les arguments
  # `rake.invoke.args` tag  --> ['?']
  # `rake.execute.args` tag --> {}
  c.tracing.instrument :rake, quantize: { args: { exclude: :all } }
end

Redis

L’intégration Redis permet de tracer les appels simples ainsi que les pipelines.

require 'redis'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :redis, **options
end

# Exécuter les commandes Redis
redis = Redis.new
redis.set 'foo', 'bar'

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
service_nameNom de service utilisé pour l’instrumentation de redis'redis'
command_argsAffiche les arguments de la commande (p. ex., key pour GET key) en tant que nom de ressource et tag.true

Configuration des paramètres de trace par instance

Pour la version 5 de Redis et les versions ultérieures :

require 'redis'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :redis # L'instrumentation de l'intégration doit quand même être activée
end

customer_cache = Redis.new(custom: { datadog: { service_name: 'custom-cache' } })
invoice_cache = Redis.new(custom: { datadog: { service_name: 'invoice-cache' } })

# L'appel tracé appartiendra au service `customer-cache`
customer_cache.get(...)
# L'appel tracé appartiendra au service `invoice-cache`
invoice_cache.get(...)

Pour les versions de Redis antérieures à la version 5 :

require 'redis'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :redis # L'instrumentation de l'intégration doit quand même être activée
end

customer_cache = Redis.new
invoice_cache = Redis.new

Datadog.configure_onto(customer_cache, service_name: 'customer-cache')
Datadog.configure_onto(invoice_cache, service_name: 'invoice-cache')

# L'appel tracé appartient au service `customer-cache`
customer_cache.get(...)
# L'appel tracé appartient au service `invoice-cache`
invoice_cache.get(...)

Configurer les paramètres de tracing par connexion

Il est possible de configurer les paramètres de tracing par connexion via l’option describes :

# Ajouter une option `:describes` avec une clé de connexion.
# Toutes les clés suivantes sont acceptées et fonctionnent de façon similaire.
# Si un bloc est spécifié, cela renvoie un objet Settings
# qui accepte toutes les options de configuration énumérées ci-dessus.

Datadog.configure do |c|
  # La configuration par défaut pour les clients Redis
  c.tracing.instrument :redis, service_name: 'redis-default'

  # La configuration correspondant à un socket Unix donné.
  c.tracing.instrument :redis, describes: { url: 'unix://chemin/vers/fichier' }, service_name: 'redis-unix'

  # Pour les connexions réseau, la recherche de correspondance tient uniquement compte des champs suivants :
  # scheme, host, port, db
  # Tous les autres champs sont ignorés.

  # Chaîne de connexion réseau
  c.tracing.instrument :redis, describes: 'redis://127.0.0.1:6379/0', service_name: 'redis-connection-string'
  c.tracing.instrument :redis, describes: { url: 'redis://127.0.0.1:6379/1' }, service_name: 'redis-connection-url'
  # Hash client réseau
  c.tracing.instrument :redis, describes: { host: 'my-host.com', port: 6379, db: 1, scheme: 'redis' }, service_name: 'redis-connection-hash'
  # Sous-ensemble du hash de connexion uniquement
  c.tracing.instrument :redis, describes: { host: ENV['APP_CACHE_HOST'], port: ENV['APP_CACHE_PORT'] }, service_name: 'redis-cache'
  c.tracing.instrument :redis, describes: { host: ENV['SIDEKIQ_CACHE_HOST'] }, service_name: 'redis-sidekiq'
end

Lorsque plusieurs configurations describes correspondent à une connexion, la dernière règle configurée qui correspond est appliquée.

Resque

L’intégration Resque utilise des hooks Resque qui viennent entourer la méthode perform.

Pour tracer une tâche Resque :

require 'resque'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :resque, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
error_handlerGestionnaire d’erreurs personnalisé appelé lorsqu’une tâche renvoie une erreur. Arguments : span spécifiée et error. Définit une erreur sur la span par défaut. Utile pour ignorer les erreurs temporaires.`proc {

Rest Client

L’intégration rest-client est disponible via le middleware ddtrace :

require 'rest_client'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :rest_client, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
distributed_tracingActive le tracing distribuétrue
service_nameNom de service utilisé pour l’instrumentation de rest_client.'rest_client'
split_by_domainDéfinir sur true pour utiliser le domaine de requête comme nom de service.false

RSpec

Lorsque vous utilisez le framework de test rspec, l’intégration RSpec trace toutes les exécutions d’exemples et de groupes d’exemples

Pour activer votre intégration, utilisez la méthode Datadog.configure :

require 'rspec'
require 'ddtrace'

# Configurer une intégration RSpec par défaut
Datadog.configure do |c|
  c.ci.instrument :rspec, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
enabledDéfinit si les tests RSpec doivent être tracés ou non. Utile pour désactiver le tracing temporairement. true ou false.true
service_nameNom de service utilisé pour l’instrumentation de rspec.'rspec'
operation_nameNom de l’opération utilisée pour l’instrumentation de rspec. Utile si vous souhaitez renommer les métriques de traces automatiques, par exemple trace.#{nom_opération}.errors.'rspec.example'

Sequel

L’intégration Sequel permet de tracer les requêtes envoyées à votre base de données.

require 'sequel'
require 'ddtrace'

# Se connecter à la base de données
database = Sequel.sqlite

# Créer une table
database.create_table :articles do
  primary_key :id
  String :name
end

Datadog.configure do |c|
  c.tracing.instrument :sequel, **options
end

# Exécuter une requête
articles = database[:articles]
articles.all

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
service_nameNom de service utilisé pour l’instrumentation de sequelNom de l’adaptateur de base de données (p. ex. 'mysql2')

Configurer des paramètres différents pour chaque base de données

Si vous utilisez plusieurs bases de données avec Sequel, vous pouvez définir des paramètres différents pour chacune d’entre elles en configurant leurs objets Sequel::Database respectifs :

sqlite_database = Sequel.sqlite
postgres_database = Sequel.connect('postgres://user:password@host:port/database_name')

# Configurer chaque base de données avec des noms de service différents
Datadog.configure_onto(sqlite_database, service_name: 'my-sqlite-db')
Datadog.configure_onto(postgres_database, service_name: 'my-postgres-db')

Shoryuken

L’intégration Shoryuken est un middleware exécuté côté serveur qui permet de tracer les exécutions de tâches.

Vous pouvez l’activer via Datadog.configure :

require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :shoryuken, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
tag_bodySpans de tag avec le corps de message SQS true ou falsefalse
error_handlerGestionnaire d’erreurs personnalisé appelé lorsqu’une tâche renvoie une erreur. Arguments : span spécifiée et error. Définit une erreur sur la span par défaut. Utile pour ignorer les erreurs temporaires.`proc {

Sidekiq

L’intégration Sidekiq est un middleware exécuté côté client et côté serveur qui permet de tracer les mises en file d’attente et les exécutions des tâches.

Vous pouvez l’activer via Datadog.configure :

require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :sidekiq, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
tag_argsActiver le tagging des arguments des tâches. true pour l’activer, false pour le désactiver.false
error_handlerGestionnaire d’erreurs personnalisé appelé lorsqu’une tâche renvoie une erreur. Arguments : span spécifiée et error. Définit une erreur sur la span par défaut. Utile pour ignorer les erreurs temporaires.proc { |span, error| span.set_error(error) unless span.nil? }
quantizeHash contenant les options de quantification des arguments de tâche.{}

Sinatra

L’intégration Sinatra permet de tracer les requêtes et le rendu des modèles.

Pour commencer à utiliser le client de tracing, assurez-vous d’importer ddtrace et instrument :sinatra après sinatra ou sinatra/base, et avant de définir votre application/vos routages :

Application classique

require 'sinatra'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :sinatra, **options
end

get '/' do
  'Hello world!'
end

Application modulaire

require 'sinatra/base'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :sinatra, **options
end

class NestedApp < Sinatra::Base
  get '/nested' do
    'Hello from nested app!'
  end
end

class App < Sinatra::Base
  use NestedApp

  get '/' do
    'Hello world!'
  end
end

Options d’instrumentation

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
distributed_tracingActive le tracing distribué de façon à associer les traces de ce service aux traces d’autres services si des en-têtes de tracing sont reçus.true
headersHash d’en-têtes de requête ou de réponse HTTP à ajouter en tant que tags à sinatra.request. Accepte les clés request et response des valeurs sous forme de tableau, par exemple ['Last-Modified']. Ajoute les tags http.request.headers.* et http.response.headers.* respectivement.{ response: ['Content-Type', 'X-Request-ID'] }
resource_script_namesAjouter le nom du script devant les noms des ressourcesfalse

Sneakers

L’intégration Sneakers est un middleware exécuté côté serveur qui permet de tracer les exécutions de tâches.

Vous pouvez l’activer via Datadog.configure :

require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :sneakers, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
enabledDéfinit si Sneakers doit être tracé ou non. Utile pour désactiver le tracing temporairement. true ou false.true
tag_bodyActiver le tagging des messages des tâches. true pour l’activer, false pour le désactiver.false
error_handlerGestionnaire d’erreurs personnalisé appelé lorsqu’une tâche renvoie une erreur. Arguments : span spécifiée et error. Définit une erreur sur la span par défaut. Utile pour ignorer les erreurs temporaires.`proc {

Stripe

L’intégration Stripe trace les requêtes de l’API Stripe.

Vous pouvez l’activer via Datadog.configure :

require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :stripe, **options
end

options correspond aux arguments de mot-clé suivants :

CléDescriptionValeur par défaut
enabledDéfinit si Stripe doit être tracé ou non. Utile pour désactiver le tracing temporairement. true ou false.true

Sucker Punch

L’intégration sucker_punch permet de tracer toutes les tâches planifiées :

require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :sucker_punch
end

# L'exécution de cette opération est tracée.
LogJob.perform_async('login')

Configuration supplémentaire

Pour modifier le comportement par défaut du tracing Datadog, vous pouvez définir des variables d’environnement ou spécifier des options personnalisées dans un bloc Datadog.configure. Exemple :

Datadog.configure do |c|
  c.service = 'billing-api'
  c.env = ENV['RACK_ENV']

  c.tracing.report_hostname = true
  c.tracing.test_mode.enabled = (ENV['RACK_ENV'] == 'test')
end

Options de configuration disponibles :

ParamètreVariable d’environnementValeur par défautDescription
Global
agent.hostDD_AGENT_HOST127.0.0.1Hostname de l’Agent auquel les données de trace sont envoyées.
agent.portDD_TRACE_AGENT_PORT8126Port du host de l’Agent auquel les données de trace doivent être envoyées. Si, dans la configuration de l’Agent, receiver_port ou DD_APM_RECEIVER_PORT est défini sur une valeur autre que la valeur 8126 par défaut, alors DD_TRACE_AGENT_PORT ou DD_TRACE_AGENT_URL doit avoir la même valeur.
DD_TRACE_AGENT_URLnilPermet de définir l’endpoint d’URL auquel les traces sont envoyées. Cette option est prioritaire par rapport à agent.host et agent.port. Si, dans la configuration de l’Agent, receiver_port ou DD_APM_RECEIVER_PORT est défini sur une valeur autre que la valeur 8126 par défaut, alors DD_TRACE_AGENT_PORT ou DD_TRACE_AGENT_URL doit avoir la même valeur.
diagnostics.debugDD_TRACE_DEBUGfalsePermet d’activer ou de désactiver le mode debugging et d’afficher des logs détaillés. Il est déconseillé d’utiliser cette option pour les environnements de production ou d’autres environnements sensibles. Consultez la rubrique Debugging et diagnostic pour en savoir plus.
diagnostics.startup_logs.enabledDD_TRACE_STARTUP_LOGSnilPermet d’indiquer le diagnostic et la configuration de lancement dans un log, et ainsi d’évaluer l’état du tracing au démarrage de l’application. Consultez la rubrique Debugging et diagnostic pour en savoir plus.
envDD_ENVnilL’environnement de votre application (p. ex. production, staging, etc.). Cette valeur est définie en tant que tag pour toutes les traces.
serviceDD_SERVICENom de fichier RubyLe nom de service par défaut de votre application (p. ex., billing-api). Cette valeur est définie en tant que tag pour toutes les traces.
tagsDD_TAGSnilTags personnalisés sous forme de paires de valeurs séparées par des , (p. ex., layer:api,team:intake). Ces tags sont définis pour toutes les traces. Consultez la rubrique Environnement et tags pour en savoir plus.
time_now_provider->{ Time.now }Permet de modifier la façon dont l’heure est récupérée. Consultez la rubrique Définir le fournisseur de temps pour en savoir plus.
versionDD_VERSIONnilLa version de votre application (p. ex., 2.5, 202003181415, 1.3-alpha, etc.). Cette valeur est définie en tant que tag pour toutes les traces.
telemetry.enabledDD_INSTRUMENTATION_TELEMETRY_ENABLEDfalseCette option vous permet d’activer l’envoi des données de télémétrie à Datadog. Dans une prochaine version, cette option sera définie par défaut sur true, tel qu’indiqué dans cette rubrique.
Tracing
tracing.analytics.enabledDD_TRACE_ANALYTICS_ENABLEDnilPermet d’activer ou de désactiver l’analyse des traces. Consultez la rubrique Échantillonnage pour en savoir plus.
tracing.distributed_tracing.propagation_extract_styleDD_TRACE_PROPAGATION_STYLE_EXTRACT['Datadog','b3multi','b3']Formats de propagation du tracing distribué à extraire. Remplace l’option DD_TRACE_PROPAGATION_STYLE. Consultez la rubrique Tracing distribué pour en savoir plus.
tracing.distributed_tracing.propagation_inject_styleDD_TRACE_PROPAGATION_STYLE_INJECT['Datadog']Formats de propagation du tracing distribué à injecter. Remplace l’option DD_TRACE_PROPAGATION_STYLE. Consultez la rubrique Tracing distribué pour en savoir plus.
tracing.distributed_tracing.propagation_styleDD_TRACE_PROPAGATION_STYLEnilFormats de propagation du tracing distribué à extraire et injecter. Consultez la rubrique Tracing distribué pour en savoir plus.
tracing.enabledDD_TRACE_ENABLEDtruePermet d’activer ou de désactiver le tracing. Si cette option est définie sur false, l’instrumentation continue à s’exécuter, mais aucune trace n’est envoyée à l’Agent de trace.
tracing.instrument(<nom-intégration>, <options...>)Permet d’activer l’instrumentation d’une bibliothèque spécifique. Consultez la rubrique Instrumenter des intégrations pour en savoir plus.
tracing.log_injectionDD_LOGS_INJECTIONtruePermet d’injecter des informations sur la mise en corrélation des traces dans les logs Rails, le cas échéant. Prend en charge le logger par défaut (ActiveSupport::TaggedLogging), lograge et semantic_logger.
tracing.partial_flush.enabledfalsePermet d’activer ou de désactiver un vidage partiel, afin d’envoyer les parties complètes d’une trace à l’Agent. Cette option est particulièrement utile lorsque le tracing instrumente des tâches longues (p. ex., des jobs) avec de nombreuses spans.
tracing.partial_flush.min_spans_threshold500Nombre de spans qui doivent être finalisées dans une trace avant d’être envoyées via le processus de vidage partiel.
tracing.samplernilUtilisation avancée uniquement. Permet de définir une instance Datadog::Tracing::Sampling::Sampler. Lorsque cette option est définie, le traceur utilise ce service d’échantillonnage pour déterminer quel comportement adopter pour l’échantillonnage. Consultez la rubrique Échantillonnage côté application pour en savoir plus.
tracing.sampling.default_rateDD_TRACE_SAMPLE_RATEnilPermet de définir le taux d’échantillonnage des traces entre 0.0 (0 %) et 1.0 (100 %). Consultez la rubrique Échantillonnage côté application pour en savoir plus.
tracing.sampling.rate_limitDD_TRACE_RATE_LIMIT100 (par seconde)Permet de définir le nombre maximum de traces par seconde à échantillonner. Définissez une limite de débit pour éviter de décupler votre volume d’ingestion en cas de pic de trafic.
tracing.sampling.span_rulesDD_SPAN_SAMPLING_RULES,ENV_SPAN_SAMPLING_RULES_FILEnilPermet de définir des règles pour l’échantillonnage de spans uniques. Ces règles vous permettent de conserver des spans, même après que leurs traces respectives aient été ignorées.
tracing.trace_id_128_bit_generation_enabledDD_TRACE_128_BIT_TRACEID_GENERATION_ENABLEDfalseDéfinissez cette option sur true pour générer un ID de trace de 128 bits ou sur false pour générer un ID de trace de 64 bits.
tracing.report_hostnameDD_TRACE_REPORT_HOSTNAMEfalsePermet d’ajouter le tag de hostname aux traces.
tracing.test_mode.enabledDD_TRACE_TEST_MODE_ENABLEDfalsePermet d’activer ou de désactiver le mode test, afin d’utiliser le tracing dans des collections de tests.
tracing.test_mode.trace_flushnilObjet qui détermine le comportement à adopter pour le vidage des traces.

Logging personnalisé

Par défaut, tous les logs sont traités par le logger Ruby de base. Lorsque vous utilisez Rails, les messages s’affichent dans le fichier de log de votre application.

Les messages de log du client Datadog sont indiqués par [ddtrace]. Vous pouvez donc les isoler des autres messages.

Vous pouvez également utiliser un logger personnalisé à la place du logger par défaut. Pour ce faire, utilisez le paramètre log.

f = File.new("my-custom.log", "w+") # Les messages de code doivent être ajoutés ici
Datadog.configure do |c|
  c.logger.instance = Logger.new(f) # Remplacer le logger par défaut
  c.logger.level = ::Logger::INFO
end

Datadog.logger.info { "Ceci est généralement appelé par le code de tracing" }

Environnement et tags

Par défaut, l’Agent de trace (c’est-à-dire le programme exécuté en arrière-plan pour recueillir les données des différents clients, et non cette bibliothèque) utilise les tags définis dans le fichier de configuration de l’Agent. Vous pouvez configurer l’application de façon à taguer automatiquement vos traces et vos métriques à l’aide des variables d’environnement suivantes :

  • DD_ENV : l’environnement de votre application (p. ex. production, staging, etc.)
  • DD_SERVICE : le nom de service par défaut pour votre application (p. ex. billing-api)
  • DD_VERSION : la version de votre application (p. ex. 2.5, 202003181415, 1.3-alpha, etc.)
  • DD_TAGS : tags personnalisés sous forme de paires de valeurs séparées par des , (p. ex. layer:api,team:intake)
    • Si la variable DD_ENV, DD_SERVICE ou DD_VERSION est définie, tout tag env/service/version correspondant défini dans DD_TAGS sera remplacé.
    • Si la variable DD_ENV, DD_SERVICE ou DD_VERSION n’est pas définie, les tags définis dans DD_TAGS seront utilisés pour env/service/version respectivement.

Ces valeurs peuvent également être remplacées au niveau du traceur :

Datadog.configure do |c|
  c.service = 'billing-api'
  c.env = 'test'
  c.tags = { 'team' => 'qa' }
  c.version = '1.3-alpha'
end

Cela vous permet de définir une valeur différente pour chaque application. De cette façon, il est par exemple possible de recevoir des données à partir de plusieurs applications issues d’environnements différents sur un même host.

Il est également possible d’appliquer directement des tags à des spans spécifiques. En cas de conflit avec les tags définis au niveau de l’application, ces derniers seront remplacés.

Debugging et diagnostic

Vous pouvez générer des diagnostics sur le tracing de deux façons différentes :

Activer le mode debugging

Lorsque vous activez le mode debugging de la bibliothèque, vous bénéficiez de logs détaillés sur les activités de tracing. Ces logs contiennent notamment les erreurs supprimées. Ils peuvent vous aider à identifier les erreurs ou à confirmer la sortie des traces pour l’Agent.

Pour activer le mode debugging, définissez diagnostics.debug = true ou DD_TRACE_DEBUG.

Datadog.configure { |c| c.diagnostics.debug = true }

Datadog recommande de ne PAS utiliser cette fonctionnalité dans des environnements de production ou des environnements confidentiels, car une charge importe peut générer des logs extrêmement détaillés. Le mode debugging est davantage destiné aux environnements dans lesquels vous contrôlez la charge des applications.

Activer les logs de lancement

Les logs de lancement fournissent une synthèse de l’état du tracing lors de la première configuration de l’application. Ils vous permettent de vérifier que la configuration et l’instrumentation ont été correctement activés.

Pour activer les logs de lancement, définissez diagnostics.startup_logs.enabled = true ou DD_TRACE_STARTUP_LOGS.

Datadog.configure { |c| c.diagnostics.startup_logs.enabled = true }

Par défaut, les logs de lancement sont activés lorsque ddtrace détecte que l’application s’exécute dans un environnement autre qu’un environnement de développement.

Échantillonnage

Référez-vous à la section Mécanismes d’ingestion pour consulter la liste de toutes les options d’échantillonnage disponibles.

Échantillonnage prioritaire

L’échantillonnage prioritaire permet de déterminer si une trace doit être conservée ou non en fonction d’un attribut de priorité qui est appliqué aux traces distribuées. La valeur de cet attribut renseigne l’Agent et le backend sur l’importance de la trace.

Le service d’échantillonnage peut définir la priorité sur les valeurs suivantes :

  • Datadog::Tracing::Sampling::Ext::Priority::AUTO_REJECT : le service d’échantillonnage a automatiquement décidé de rejeter la trace.
  • Datadog::Tracing::Sampling::Ext::Priority::AUTO_KEEP : le service d’échantillonnage a automatiquement décidé de conserver la trace.

L’échantillonnage prioritaire est activé par défaut. Cette fonctionnalité vous permet de vous assurer que vos traces distribuées sont échantillonnées de façon exhaustive. Une fois activé, le service d’échantillonnage attribue automatiquement une priorité de 0 ou de 1 aux traces en fonction de leur service et de leur volume.

Vous pouvez également définir manuellement cette priorité pour supprimer une trace non pertinente ou conserver une trace importante. Pour ce faire, définissez TraceOperation#sampling_priority sur :

  • Datadog::Tracing::Sampling::Ext::Priority::USER_REJECT : l’utilisateur a demandé à rejeter la trace.
  • Datadog::Tracing::Sampling::Ext::Priority::USER_KEEP : l’utilisateur a demandé à conserver la trace.

Lorsque vous n’utilisez pas le tracing distribué, vous pouvez modifier la priorité d’une trace à tout moment tant que celle-ci n’est pas finalisée. Cependant, pour que votre changement soit pertinent, vous devez l’effectuer avant toute propagation de contexte (p. ex. avant un fork ou des appels RPC). Dans le cas contraire, les éléments d’une trace distribuée n’auront pas tous la même priorité, et certains éléments seront conservés tandis que d’autres seront rejetés. La trace risquerait alors d’être partiellement stockée et de ne pas être finalisée.

Pour cette raison, si vous modifiez la priorité, il est conseillé de le faire le plus tôt possible.

Pour modifier la priorité de l’échantillonnage, vous pouvez utiliser les méthodes suivantes :

# Rejeter la trace active
Datadog::Tracing.reject!

# Conserver la trace active
Datadog::Tracing.keep!

L’utilisation de Datadog::Tracing.reject! et de Datadog::Tracing.keep! lorsqu’aucune trace n’est active n’entraîne aucune erreur.

Vous pouvez également rejeter une instance de trace spécifique :

# Accéder d'abord à la span active
trace = Datadog::Tracing.active_trace

# Rejeter la trace
trace.reject!

# Conserver la trace
trace.keep!

Échantillonnage de spans uniques

Vous pouvez configurer une règle d’échantillonnage afin de conserver des spans même après que leurs traces respectives ait été ignorées par une règle d’échantillonnage propre aux traces.

Vous pouvez ainsi garder vos spans importantes lorsque les traces sont échantillonnées. Il n’est pas possible d’ignorer des spans à l’aide de cette fonctionnalité.

Pour configurer l’échantillonnage de spans uniques, consultez la section Mécanismes d’ingestion.

Échantillonnage côté application

Bien que l’Agent Datadog puisse échantillonner les traces pour réduire la bande passante utilisée, l’échantillonnage côté application permet quant à lui d’améliorer les performances de l’application hôte.

L’échantillonnage côté application supprime le plus tôt possible les traces. Par conséquent, la page relative aux commandes d’ingestion ne dispose pas de suffisamment d’informations pour calculer avec précision les taux d’échantillonnage. Utilisez donc uniquement l’échantillonnage côté application lorsque vous devez absolument réduire la charge du tracing.

Si vous utilisez cette fonctionnalité, n’hésitez pas à ouvrir un problème sur GitHub pour nous faire part de votre avis à son sujet. Nous serons ainsi plus à même de comprendre vos besoins et de vous aider à les satisfaire.

Vous pouvez configurer l’échantillonnage côté application à l’aide des paramètres suivants :

# Échantillonnage côté application activé : les données de la page Ingestion Controls ne seront pas précises.
sampler = Datadog::Tracing::Sampling::RateSampler.new(0.5) # Échantillonner 50 % des traces

Datadog.configure do |c|
  c.tracing.sampler = sampler
end

Consultez la rubrique Configuration supplémentaire pour en savoir plus sur ces paramètres.

Tracing distribué

Le tracing distribué permet à vos traces d’être propagées sur plusieurs applications instrumentées, de façon à ce qu’une requête forme une trace unique et non une trace séparée pour chaque service.

Pour tracer des requêtes sur plusieurs applications différentes, les données suivantes doivent se propager d’une application à l’autre :

PropriétéTypeDescription
Trace IDNombre entierID de la trace. Cette valeur doit être identique pour toutes les requêtes appartenant à la même trace.
Parent Span IDNombre entierID de la span dans le service à l’origine de la requête. Cette valeur est toujours différente pour chaque requête dans une trace.
Sampling PriorityNombre entierPriorité d’échantillonnage de la trace. Cette valeur doit être identique pour toutes les requêtes appartenant à la même trace.

Cette propagation peut être représentée ainsi :

Service A :
  ID Trace :  100000000000000001
  ID Parent : 0
  ID Span :   100000000000000123
  Priorité :  1

  |
  | Requête Service B :
  |   Métadonnées :
  |     ID Trace :  100000000000000001
  |     ID Parent : 100000000000000123
  |     Priorité :  1
  |
  V

Service B :
  ID Trace :  100000000000000001
  ID Parent : 100000000000000123
  ID Span :   100000000000000456
  Priorité :  1

  |
  | Requête Service C :
  |   Métadonnées :
  |     ID Trace :  100000000000000001
  |     ID Parent : 100000000000000456
  |     Priorité :  1
  |
  V

Service C :
  ID Trace :  100000000000000001
  ID Parent : 100000000000000456
  ID Span :   100000000000000789
  Priorité :  1

Via HTTP

Pour les requêtes HTTP distribuées sur plusieurs applications instrumentées, la propagation des métadonnées des traces se fait à l’aide d’en-têtes de requête HTTP :

PropriétéTypeNom de l’en-tête HTTP
Trace IDNombre entierx-datadog-trace-id
Parent Span IDNombre entierx-datadog-parent-id
Sampling PriorityNombre entierx-datadog-sampling-priority

Ainsi :

Service A :
  ID Trace :  100000000000000001
  ID Parent : 0
  ID Span :   100000000000000123
  Priorité :  1

  |
  | Requête HTTP Service B :
  |   En-têtes :
  |     x-datadog-trace-id :  100000000000000001
  |     x-datadog-parent-id : 100000000000000123
  |     x-datadog-sampling-priority :  1
  |
  V

Service B :
  ID Trace :  100000000000000001
  ID Parent : 100000000000000123
  ID Span :   100000000000000456
  Priorité :  1

  |
  | Requête HTTP Service C :
  |   En-têtes :
  |     x-datadog-trace-id :  100000000000000001
  |     x-datadog-parent-id : 100000000000000456
  |     x-datadog-sampling-priority :  1
  |
  V

Service C :
  ID Trace :  100000000000000001
  ID Parent : 100000000000000456
  ID Span :   100000000000000789
  Priorité :  1

Formats des en-têtes distribués

Le tracing prend en charge les formats de traces distribuées suivants :

Vous pouvez activer ou désactiver l’utilisation de ces formats à l’aide de Datadog.configure :

Datadog.configure do |c|
  # Liste des formats d'en-têtes à extraire
  c.tracing.distributed_tracing.propagation_extract_style = [ 'tracecontext', 'Datadog', 'b3' ]

  # Liste des formats d'en-tête à injecter
  c.tracing.distributed_tracing.propagation_inject_style = [ 'tracecontext', 'Datadog' ]
end

Activer le tracing distribué pour des intégrations

De nombreuses intégrations incluses dans ddtrace prennent en charge le tracing distribué. Le tracing distribué est activé par défaut dans l’Agent v7 et la plupart des versions de l’Agent v6. Si nécessaire, il peut être activé via les paramètres de configuration.

  • Si votre application reçoit des requêtes envoyées par des services pour lesquels le tracing distribué est activé, vous devez activer le tracing distribué pour les intégrations qui gèrent ces requêtes (telles que Rails).
  • Si votre application envoie des requêtes à des services pour lesquels le tracing distribué est activé, vous devez activer le tracing distribué pour les intégrations qui envoient ces requêtes (telles que Faraday).
  • Si votre application envoie et reçoit des requêtes nécessitant un tracing distribué, elle doit activer toutes les intégrations qui gèrent ces requêtes.

Pour découvrir comment activer le tracing distribué pour ces intégrations, consultez leur documentation :

Utiliser le propagateur HTTP

Pour faciliter la propagation de ces métadonnées, vous pouvez utiliser le module Datadog::Tracing::Propagation::HTTP.

Côté client :

Datadog::Tracing.trace('web.call') do |span, trace|
  # Injecter les en-têtes de traces dans les en-têtes de requêtes (`env` doit être un hash)
  Datadog::Tracing::Propagation::HTTP.inject!(trace.to_digest, env)
end

Côté serveur :

trace_digest = Datadog::Tracing::Propagation::HTTP.extract(request.env)

Datadog::Tracing.trace('web.work', continue_from: trace_digest) do |span|
  # Tâche en ligne...
end

Mise en file d’attente des requêtes HTTP

Les traces issues de requêtes HTTP peuvent être configurées de façon à inclure le temps passé par une requête dans la file d’attente d’un serveur Web frontend ou d’un répartiteur de charge avant d’atteindre l’application Ruby.

Cette fonctionnalité est désactivée par défaut. Pour l’activer, vous devez ajouter un en-tête X-Request-Start ou X-Queue-Start depuis votre serveur Web (p. ex., Nginx). Voici un exemple de configuration avec Nginx :

# /etc/nginx/conf.d/ruby_service.conf
server {
    listen 8080;

    location / {
      proxy_set_header X-Request-Start "t=${msec}";
      proxy_pass http://web:3000;
    }
}

Vous devez ensuite activer la fonctionnalité de mise en file d’attente des requêtes. La configuration :request_queuing accepte les options suivantes :

OptionDescription
:include_requestUne span http_server.queue constitue la span racine d’une trace. Elle comprend la durée totale du traitement de la requête et la durée d’attente de la requête avant le début de son traitement. Cette logique s’applique lorsque l’option est définie sur true. Cette configuration est sélectionnée lorsque l’option est true.
:exclude_requestUne span http.proxy.request constitue la span racine d’une trace. La durée de la span enfant http.proxy.queue représente uniquement la durée d’attente de la requête avant le début de son traitement. Il s’agit d’une fonctionnalité expérimentale.

Si votre application est basée sur Rack, consultez la documentation dédiée pour en savoir plus.

Pipeline de traitement

Certaines applications nécessitent que les traces soient modifiées ou filtrées avant d’être envoyées à Datadog. Le pipeline de traitement vous permet de créer des processeurs servant à mettre en place un tel comportement.

Filtrage

Vous pouvez utiliser le processeur Datadog::Tracing::Pipeline::SpanFilter pour supprimer les spans lorsque le bloc renvoie une valeur truthy :

Datadog::Tracing.before_flush(
  # Supprimer les spans associées à une ressource spécifique
  Datadog::Tracing::Pipeline::SpanFilter.new { |span| span.resource =~ /PingController/ },
  # Supprimer les spans acheminées vers localhost
  Datadog::Tracing::Pipeline::SpanFilter.new { |span| span.get_tag('host') == 'localhost' }
)

Traitement

Vous pouvez utiliser le processeur Datadog::Tracing::Pipeline::SpanProcessor pour modifier des spans :

Datadog::Tracing.before_flush(
  # Supprimer le texte correspondant au champ resource
  Datadog::Tracing::Pipeline::SpanProcessor.new { |span| span.resource.gsub!(/password=.*/, '') }
)

Processeur personnalisé

Un processeur peut être n’importe quel objet répondant à un #call et acceptant trace comme argument (qui est un array de Datadog::Spans).

Par exemple, avec une syntaxe de bloc raccourcie :

Datadog::Tracing.before_flush do |trace|
   # Logique de traitement…
   trace
end

Pour une classe de processeur personnalisé :

class MyCustomProcessor
  def call(trace)
    # Logique de traitement…
    trace
  end
end

Datadog::Tracing.before_flush(MyCustomProcessor.new)

Dans les deux cas, la méthode du processeur doit renvoyer l’objet trace. La valeur renvoyée est ensuite passée au processeur suivant dans le pipeline.

Avertissements

  1. Les spans ignorées ne généreront pas de métriques de trace, ce qui impacte les monitors et les dashboards.
  2. La suppression d’une span entraîne également la suppression de toutes les spans enfant associées. Cette approche permet d’éviter toute span orpheline dans le graphique de la trace.
  3. Les logs du mode debugging indiquent l’état des spans avant l’exécution du pipeline de traitement. Ainsi, dans ces logs, les spans modifiées ou supprimées affichent leur état d’origine.

Mise en corrélation des traces

Dans de nombreux cas, par exemple pour le logging, il peut s’avérer utile de mettre en corrélation les ID de trace à d’autres événements ou flux de données afin de comparer ces différentes sources plus facilement.

Logging dans les applications Rails

Configuration automatique

Pour les applications Rails utilisant le logger par défaut (ActiveSupport::TaggedLogging), lograge ou semantic_logger, l’injection des informations de mise en corrélation des traces est activée par défaut.

Pour désactiver l’injection, définissez la variable d’environnement DD_LOGS_INJECTION=false.

Logging dans les applications Ruby

Pour ajouter des ID de corrélation à votre logger, ajoutez un formateur de log qui récupère les ID de corrélation avec Datadog::Tracing.correlation, puis ajoutez les ID au message.

Pour vous assurer que vos logs Datadog sont bien mis en corrélation, vérifiez que les éléments suivants sont inclus dans chaque message de log (l’ordre doit être le même) :

  • dd.env=<ENVIRONNEMENT> : <ENVIRONNEMENT> correspond à Datadog::Tracing.correlation.env. N’incluez pas cet élément si aucun environnement n’est configuré.
  • dd.service=<SERVICE> : <SERVICE> correspond à Datadog::Tracing.correlation.service. N’incluez pas cet élément si aucun nom de service par défaut n’est configuré.
  • dd.version=<VERSION> : <VERSION> correspond à Datadog::Tracing.correlation.version. N’incluez pas cet élément si aucune version de l’application n’est configurée.
  • dd.trace_id=<ID_TRACE> : <ID_TRACE> a pour valeur Datadog::Tracing.correlation.trace_id ou 0 en l’absence de trace active lors de la journalisation.
  • dd.span_id=<ID_SPAN> : <ID_SPAN> a pour valeur Datadog::Tracing.correlation.span_id ou 0 en l’absence de trace active lors de la journalisation.

Datadog::Tracing.log_correlation renvoie dd.env=<ENVIRONNEMENT> dd.service=<SERVICE> dd.version=<VERSION> dd.trace_id=<ID_TRACE> dd.span_id=<ID_SPAN>.

Si aucune trace n’est active et que ni l’environnement ni la version de l’application ne sont configurés, Datadog::Tracing.log_correlation renvoie dd.env= dd.service= dd.version= dd.trace_id=0 dd.span_id=0.

Voici un exemple pour illustrer cela :

require 'ddtrace'
require 'logger'

ENV['DD_ENV'] = 'production'
ENV['DD_SERVICE'] = 'billing-api'
ENV['DD_VERSION'] = '2.5.17'

logger = Logger.new(STDOUT)
logger.progname = 'my_app'
logger.formatter  = proc do |severity, datetime, progname, msg|
  "[#{datetime}][#{progname}][#{severity}][#{Datadog::Tracing.log_correlation}] #{msg}\n"
end

# Lorsqu'aucune trace n'est active
logger.warn('This is an untraced operation.')
# [2019-01-16 18:38:41 +0000][my_app][WARN][dd.env=production dd.service=billing-api dd.version=2.5.17 dd.trace_id=0 dd.span_id=0] This is an untraced operation.

# Lorsqu'une trace est active
Datadog::Tracing.trace('my.operation') { logger.warn('This is a traced operation.') }
# [2019-01-16 18:38:41 +0000][my_app][WARN][dd.env=production dd.service=billing-api dd.version=2.5.17 dd.trace_id=8545847825299552251 dd.span_id=3711755234730770098] This is a traced operation.

Configurer la couche de transport

Par défaut, ddtrace se connecte à l’Agent à l’aide des premiers paramètres disponibles, selon les priorités indiquées :

  1. Via les paramètres de configuration explicitement fournis (hostname, port et transport)
  2. Via le socket de domaine Unix (UDS) situé à l’emplacement /var/run/datadog/apm.socket
  3. À l’aide du protocole HTTP via TCP sur 127.0.0.1:8126

Toutefois, le traceur peut être configuré de façon à envoyer ses données de tracing à d’autres destinations, ou via d’autres protocoles.

Changer le hostname et le port par défaut de l’Agent

Pour modifier le host et le port de l’Agent, définissez DD_AGENT_HOST et DD_TRACE_AGENT_PORT.

Sinon, définissez les paramètres suivants dans un bloc Datadog.configure :

Datadog.configure do |c|
  c.agent.host = '127.0.0.1'
  c.agent.port = 8126
end

Consultez la rubrique Configuration supplémentaire pour en savoir plus.

Utiliser l’adaptateur Net::HTTP

L’adaptateur Net envoie les traces via TCP avec Net::HTTP. Il s’agit de l’adaptateur de transport par défaut.

Datadog.configure do |c|
  c.tracing.transport_options = proc { |t|
    # Hostname, port et options supplémentaires. :timeout est défini en secondes.
    t.adapter :net_http, '127.0.0.1', 8126, timeout: 30
  }
end

Utiliser l’adaptateur de socket de domaine Unix (UDS)

L’adaptateur UnixSocket envoie les traces via un socket Unix avec Net::HTTP.

Pour l’utiliser, commencez par configurer votre Agent de trace de façon à ce qu’il effectue son écoute via un socket Unix. Ensuite, configurez le traceur avec :

Datadog.configure do |c|
  c.tracing.transport_options = proc { |t|
    # Spécifier le chemin local vers le socket Unix de l'Agent de trace
    t.adapter :unix, '/tmp/ddagent/trace.sock'
  }
end

Utiliser l’adaptateur de test de transport

L’adaptateur Test est un système de transport no-op qui vous permet également de définir un buffer pour les requêtes. Il est idéal pour les collections de tests et les environnements hors production.

Datadog.configure do |c|
  c.tracing.transport_options = proc { |t|
    # Mettre le transport en mode no-op. Les traces ne sont pas conservées.
    t.adapter :test

    # Vous pouvez également spécifier un buffer pour examiner les traces générées.
    # Le buffer doit répondre à '<<'.
    t.adapter :test, []
  }
end

Utiliser un adaptateur de transport personnalisé

Les adaptateurs personnalisés peuvent être configurés ainsi :

Datadog.configure do |c|
  c.tracing.transport_options = proc { |t|
    # Initialiser et passer une instance de l'adaptateur
    custom_adapter = CustomAdapter.new
    t.adapter custom_adapter
  }
end

Définir le fournisseur de temps

Par défaut, le tracing se sert d’une horloge monotone pour mesurer la durée des spans, ainsi que pour calculer les timestamps (->{ Time.now }) pour les heures de début et de fin.

Pour vos tests, il peut être utile d’utiliser un autre fournisseur de temps.

Pour modifier la fonction qui fournit les timestamps, configurez ce qui suit :

Datadog.configure do |c|
  # Pour Timecop. Par exemple `->{ Time.now_without_mock_time }` permet au traceur d'utiliser le wall time réel.
  c.time_now_provider = -> { Time.now_without_mock_time }
end

Ce paramètre n’a aucune incidence sur le calcul des durées de spans : ce dernier sera toujours basé sur l’horloge monotone système disponible.

Métriques

Le traceur et ses intégrations peuvent produire des métriques supplémentaires offrant des informations utiles sur les performances de votre application. Ces métriques sont collectées avec dogstatsd-ruby, et peuvent être envoyées au même Agent Datadog que celui auquel vous envoyez vos traces.

Pour configurer la collecte de métriques pour votre application :

  1. Configurez votre Agent Datadog pour StatsD.
  2. Ajoutez gem 'dogstatsd-ruby', '~> 5.3' à votre Gemfile.

Métriques runtime d’application

Si les métriques runtime sont configurées, la bibliothèque de tracing recueille et envoie automatiquement des métriques sur la santé de votre application.

Pour configurer les métriques runtime, ajoutez la configuration suivante :

# config/initializers/datadog.rb
require 'datadog/statsd'
require 'ddtrace'

Datadog.configure do |c|
  # Définir sur `true` pour activer la collecte de métriques runtime. Valeur par défaut : `false`
  # Ce paramètre peut également être défini avec DD_RUNTIME_METRICS_ENABLED=true
  c.runtime_metrics.enabled = true

  # Facultatif : vous pouvez configurer l'instance DogStatsD utilisée pour envoyer les métriques runtime.
  # Statsd est automatiquement configuré avec les paramètres par défaut si `dogstatsd-ruby` est disponible.
  # Vous pouvez utiliser le host et le port de l'Agent Datadog pour la configuration. Valeur par défaut : 'localhost:8125'.
  c.runtime_metrics.statsd = Datadog::Statsd.new
end

Consultez la documentation sur Dogstatsd pour en savoir plus sur la configuration de Datadog::Statsd.

Les statistiques sont spécifiques à la VM et comprennent ce qui suit :

NomTypeDescriptionDisponible sur
runtime.ruby.class_countgaugeNombre de classes dans l’espace mémoire.CRuby
runtime.ruby.gc.*gaugeStatistiques de nettoyage de la mémoire : recueillies à partir de GC.stat.Tous les runtimes
runtime.ruby.thread_countgaugeNombre de threads.Tous les runtimes
runtime.ruby.global_constant_stategaugeGénération de cache constante et globale.CRuby ≤ 3.1
runtime.ruby.global_method_stategaugeGénération de cache globale pour les méthodes.CRuby 2.x
runtime.ruby.constant_cache_invalidationsgaugeInvalidations de cache constantes.CRuby ≥ 3.2
runtime.ruby.constant_cache_missesgaugeMiss du cache constant.CRuby ≥ 3.2

En outre, toutes les métriques comprennent les tags suivants :

NomDescription
languageLangage de programmation tracé. (Ex. : ruby)
serviceListe des services associés à cette métrique.

OpenTracing

Pour en savoir plus sur la configuration de Datadog avec OpenTracing, consultez la rubrique Configurer OpenTracing.

Configurer les paramètres du traceur Datadog

Le traceur Datadog sous-jacent peut être configuré en passant des options (qui correspondent à Datadog::Tracer) lors de la configuration du traceur global :

# Où `options` correspond à un hash d'options spécifiées à Datadog::Tracer
OpenTracing.global_tracer = Datadog::OpenTracer::Tracer.new(**options)

Il peut également être configuré en utilisant Datadog.configure, tel que décrit à la rubrique Configuration supplémentaire.

Activer et configurer des intégrations

Par défaut, la configuration d’OpenTracing avec Datadog n’active aucune instrumentation supplémentaire assurée par Datadog. Vous ne recevrez que les spans et les traces provenant de l’instrumentation OpenTracing intégrée à votre application.

Toutefois, des instrumentations supplémentaires fournies par Datadog peuvent être activées conjointement à OpenTracing via Datadog.configure, afin d’optimiser encore plus votre tracing. Pour ce faire, consultez la section Instrumenter des intégrations pour obtenir plus de détails.

Formats de sérialisation pris en charge

TypePrise en chargeInformations supplémentaires
OpenTracing::FORMAT_TEXT_MAPOui
OpenTracing::FORMAT_RACKOuiNotez qu’en raison de la perte de résolution liée au format Rack, les majuscules dans les noms d’éléments transmis lors de l’aller-retour doivent être remplacées par des minuscules, et le caractère - par le caractère _. Nous vous conseillons d’éviter d’utiliser ces caractères ou de prévoir une étape pour les gérer à la réception.
OpenTracing::FORMAT_BINARYNon

Profiling

ddtrace peut générer des profils afin de mesurer dans vos environnements de production l’utilisation des ressources de votre application au niveau des méthodes. Ces profils vous permettent de mieux comprendre les ressources consacrées au code Ruby en dehors de l’instrumentation existante de traces.

Configuration

Pour commencer à utiliser le profiling, suivez les instructions du guide Activer le profileur Ruby.

Dépannage

Si vous rencontrez des problèmes concernant le profiling, veuillez consulter la section Dépannage du profileur.

Profiling des tâches Resque

Pour effectuer le profiling des tâches Resque, définissez l’option RUN_AT_EXIT_HOOKS=1 tel que décrit dans la documentation Resque (en anglais).

Sans ce flag, les profils des tâches Resque de courte durée ne sont pas disponibles. En effet, Resque élimine les processus des workers avant qu’ils n’aient l’occasion de transmettre ces informations.

Problèmes connus et configurations suggérées

Charge utile trop volumineuse

Par défaut, Datadog limite la taille des charges utiles des traces afin d’empêcher toute surcharge de la mémoire dans les applications instrumentées. Ainsi, il est possible que les traces contenant des milliers d’opérations ne soient pas envoyées à Datadog.

Si vous ne recevez pas certaines traces, activez le mode debugging et vérifiez si des messages contenant "Dropping trace. Payload too large" figurent dans vos logs.

Puisque le mode debugging fournit énormément d’informations, Datadog vous recommande de ne pas l’activer ou de l’activer seulement en production. Désactivez-le après avoir effectué votre vérification. Vous pouvez consulter les logs de l’Agent Datadog pour vérifier s’ils contiennent des messages similaires.

Si vos traces sont bien perdues en raison d’une charge utile trop volumineuse, activez le paramètre partial_flush pour diviser les plus grosses traces en plusieurs petites traces.

Erreur Stack level too deep

Le tracing Datadog recueille des données de tracing en instrumentant une instrumentation à d’autres bibliothèques populaires (comme Rails ou encore Rack). Certaines bibliothèques proposent des API permettant d’ajouter cette instrumentation. Ce n’est toutefois pas le cas de toutes les bibliothèques. Pour ajouter une instrumentation à des bibliothèques qui ne proposent pas d’API d’instrumentation, Datadog a recours à la technique de « monkey patching » pour modifier le code de ces bibliothèques.

Avec la version 1.9.3 et les versions antérieures de Ruby, le monkey patching implique généralement l’utilisation de alias_method, un processus de réécriture des méthodes, pour remplacer de manière destructrice les méthodes Ruby existantes. Toutefois, cette approche génère régulièrement des erreurs et des conflits lorsque deux bibliothèques tentent de « réécrire » la même méthode (p. ex., deux packages APM différents essayant d’instrumenter la même méthode).

La fonctionnalité Module#prepend a été ajoutée avec la version 2.0 de Ruby. Elle permet d’adopter une approche de réécriture non-destructrice, en autorisant plusieurs « monkey patchs » sur la même méthode. Pour cette raison, cette approche de monkey patching est considérée comme la plus sûre et la plus efficace.

L’instrumentation Datadog utilise presque exclusivement la fonctionnalité Module#prepend pour ajouter une instrumentation de manière non-destructrice. Toutefois, certaines autres bibliothèques (généralement celles prenant en charge Ruby < 2.0) continuent d’utiliser alias_method, ce qui peut entraîner des conflits avec l’instrumentation Datadog, et notamment des erreurs SystemStackError ou stack level too deep.

Puisque l’implémentation de alias_method fait partie intégrante de ces bibliothèques, Datadog ne peut généralement pas les corriger. Toutefois, il existe des solutions pour certaines bibliothèques :

Si vous utilisez une bibliothèque pour laquelle aucune solution n’existe, songez à supprimer la bibliothèque à l’aide de alias ou de Module#alias_method, ou répartissez les bibliothèques dans plusieurs environnements distincts afin de les tester.

Si vous avez la moindre question ou souhaitez signaler un problème de ce type, contactez l’assistance Datadog.