Esta documentación corresponde a la gema ddtrace v1.x. Si estás utilizando la gema Datadog v2.0 o posterior, consulta la documentación más reciente sobre el rastreo de aplicaciones Ruby.

ddtrace es el cliente de rastreo de Datadog para Ruby. Se utiliza para rastrear solicitudes a medida que circulan a través de servidores web, bases de datos y microservicios, para que los desarrolladores tengan una amplia visibilidad de los cuellos de botella y las solicitudes problemáticas.

Para empezar

Si estás actualizando desde una versión 0.x, consulta nuestra guía de actualización.

Para ver la documentación general de APM, consulta nuestra [documentación de configuración][setup docs].

Para obtener más información sobre el aspecto de APM una vez que la aplicación envía información a Datadog, consulta [Términos y conceptos][visualization docs].

Para ver la documentación de la API de biblioteca, consulta nuestra [documentación de YARD][yard docs].

Para contribuir, consulta las [directrices para contribuciones][contribution docs] y la [guía de desarrollo][development docs].

Requisitos de compatibilidad

Para ver una lista completa de la compatibilidad de Datadog con la biblioteca de Ruby, consulta los requisitos de compatibilidad.

Instalación

Añadir la función de rastreo a tu aplicación Ruby sólo requiere unos pocos pasos:

  1. Configuración del rastreo en el Datadog Agent
  2. Instrumentación de tu solicitud
  3. Conexión de tu aplicación al Datadog Agent

Configuración del rastreo en el Datadog Agent

Antes de instalar ddtrace, instala el Datadog Agent, al que ddtrace enviará datos de rastreo.

Luego, configura el Datadog Agent para aceptar trazas (traces). Para ello:

  • Configura DD_APM_ENABLED=true en el entorno del Agent.

O

Además, en entornos contenedorizados…

  • Configura DD_APM_NON_LOCAL_TRAFFIC=true en el entorno del Agent.

O

Consulta las instrucciones de configuración específicas para Docker, Kubernetes, Amazon ECS o Fargate para asegurarte de que el Agent está configurado para recibir trazas (traces) en un entorno contenedorizado.

Configuración del consumo de datos de rastreo

Por defecto, el Datadog Agent escuchará trazas (traces) vía HTTP en el puerto 8126.

Puedes cambiar el protocolo o el puerto en que el Agent escucha datos de rastreo utilizando lo siguiente:

Para HTTP sobre TCP:

  • Configura DD_APM_RECEIVER_PORT=<port> en el entorno del Agent.

O

Para sockets de dominio Unix (UDS):

  • Configura DD_APM_RECEIVER_SOCKET=<path-to-socket-file>.

O

Instrumentación de tu solicitud

Aplicaciones Rails o Hanami

  1. Añade la gema ddtrace a tu archivo Gemfile:

    source 'https://rubygems.org'
    gem 'ddtrace', require: 'ddtrace/auto_instrument'
    
  2. Instala la gema con bundle install.

  3. Crea un archivo config/initializers/datadog.rb que contenga:

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

    Con este bloque puedes:

Otras aplicaciones Ruby

Si tu aplicación no utiliza las gemas compatibles (Rails o Hanami) anteriores, puedes configurarla de la siguiente manera:

  1. Añade la gema ddtrace a tu archivo Gemfile:

    source 'https://rubygems.org'
    gem 'ddtrace'
    
  2. Instala la gema con bundle install.

  3. require cualquier biblioteca o marco compatible que deba instrumentarse.

  4. Añade require 'ddtrace/auto_instrument' a tu aplicación. Nota: Esto debe hacerse después de requerir cualquier bibliotecas o marco compatible.

    # Example frameworks and libraries
    require 'sinatra'
    require 'faraday'
    require 'redis'
    
    require 'ddtrace/auto_instrument'
    
  5. Añade un bloque de configuración a tu aplicación:

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

    Con este bloque puedes:

Configuración de OpenTracing

  1. Añade la gema ddtrace a tu archivo Gemfile:

    source 'https://rubygems.org'
    gem 'ddtrace'
    
  2. Instala la gema con bundle install.

  3. En tu archivo de configuración de OpenTracing, añade lo siguiente:

    require 'opentracing'
    require 'datadog/tracing'
    require 'datadog/opentracer'
    
    # Activate the Datadog tracer for OpenTracing
    OpenTracing.global_tracer = Datadog::OpenTracer::Tracer.new
    
  4. Añade un bloque de configuración a tu aplicación:

    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
    

    Con este bloque puedes:

Configuración de OpenTelemetry

Puedes enviar trazas de OpenTelemetry directamente al Datadog Agent (sin ddtrace) mediante OTLP. Para obtener más detalles, consulta nuestra documentación sobre consumo de OTLP en el Datadog Agent.

Conexión de tu aplicación al Datadog Agent

Por defecto, ddtrace se conectará al Agent utilizando la primera configuración disponible en la lista de prioridades:

  1. A través de cualquier parámetro de configuración proporcionado explícitamente (nombre de host/puerto/transporte)
  2. A través del socket de dominio Unix (UDS) localizado en /var/run/datadog/apm.socket
  3. A través de HTTP sobre TCP a 127.0.0.1:8126

Si tu Datadog Agent escucha en cualquiera de estas localizaciones, no debería ser necesario realizar ninguna otra configuración.

Si tu Agent se ejecuta en un host o contenedor diferente al de tu aplicación o si quieres enviar trazas (traces) utilizando un protocolo diferente, debes configurar tu aplicación en consecuencia.

Pasos finales de la instalación

Tras la configuración, tus servicios aparecerán en la página de servicios APM en unos minutos. Obtén más información sobre [el uso de la interfaz de usuario APM][visualization docs].

Instrumentación manual

Si no utilizas una instrumentación de marco compatible, es posible que quieras instrumentar tu código manualmente.

Para rastrear cualquier código Ruby, puedes utilizar el método Datadog::Tracing.trace:

Datadog::Tracing.trace(name, **options) do |span, trace|
  # Envuelve el código que quieras instrumentar con este bloque
  # También puedes modificar el tramo (span) aquí.
  # Por ejemplo, cambiar el nombre del recurso, configurar etiquetas (tags), etc...
end

Donde name debe ser una String que describa el tipo genérico de operación que se está realizando (por ejemplo 'web.request' o 'request.parse')

Y options son los siguientes argumentos de palabra clave opcionales:

ClaveTipoDescripciónPredeterminado
autostartBoolSi la medición del tiempo debe iniciarse automáticamente o no. Si esto es false, el usuario debe llamar a span.start.true
continue_fromDatadog::TraceDigestContinúa una traza originada en otro contexto de ejecución. TraceDigest describe el punto de continuación.nil
on_errorProcAnula el comportamiento de gestión de errores, cuando un tramo (span) genera un error. Se proporcionan span y error como argumentos. Por defecto, define el error en el tramo (span).`proc {
resourceStringNombre del recurso o acción en que se está operando. Las trazas con el mismo valor de recurso se agruparán a efectos de métricas (pero seguirán siendo visibles de forma independiente). Suele ser específico de un dominio, como una URL, consulta, solicitud, etc. (por ejemplo, 'Article#submit', http://example.com/articles/list).name del tramo.
serviceStringNombre del servicio al que pertenece este tramo (por ejemplo 'my-web-service')Rastreador default-service, $PROGRAM_NAME o 'ruby'
start_timeTimePunto en el que realmente comienza el tramo. Es útil cuando se rastrean eventos que ya han ocurrido.Time.now
tagsHashEtiquetas adicionales que deben añadirse al tramo.{}
typeStringTipo de tramo (como 'http', 'db', etc.)nil

Se recomienda especialmente configurar service y resource como mínimo. El l Datadog Agent descartará cualquier tramo sin un service o resource como nil.

Ejemplo de instrumentación manual en acción:

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

    # Añade algunas etiquetas de APM
    span.set_tag('http.method', request.request_method)
    span.set_tag('posts.count', @posts.length)

    # Rastrea la representación de la plantilla
    Datadog::Tracing.trace('template.render') do
      erb :index
    end
  end
end

Rastreo asíncrono

Puede que no siempre sea posible envolver un bloque de código con Datadog::Tracing.trace. Es posible que algunas instrumentaciones basadas en eventos o notificaciones sólo te avisen cuando comienza o termina un evento.

Para rastrear estas operaciones, puedes rastrear codificar de forma asíncrona llamando a Datadog::Tracing.trace sin un bloque:

# Algunos marcos de instrumentación llaman después de que termina un evento...
def db_query(start, finish, query)
  span = Datadog::Tracing.trace('database.query', start_time: start)
  span.resource = query
  span.finish(finish)
end

Llamar a Datadog::Tracing.trace sin un bloque hará que la función devuelva uns Datadog::Tracing::SpanOperation que está iniciada, pero no terminada. Puedes modificar este tramo como prefieras y luego cerrarlo finish.

No debes dejar ningún tramo sin terminar. Si queda algún tramo abierto cuando termina el rastreo, se descartará la traza. Puedes activar el modo de depuración para comprobar si existen advertencias, si sospechas que esto podría estar ocurriendo.

Para evitar esta situación al gestionar el inicio/fin de eventos, puedes utilizar Datadog::Tracing.active_span para obtener el tramo activo en ese momento.

# Por ej. ActiveSupport::Llamadas de notificación cuando empieza un evento
def start(name, id, payload)
  # Inicia un tramo
  Datadog::Tracing.trace(name)
end

# Por ej. ActiveSupport::Llamadas de notificación cuando termina un evento
def finish(name, id, payload)
  # Busca el tramo activo en ese momento (thread-safe)
  current_span = Datadog::Tracing.active_span
  unless current_span.nil?
    current_span.resource = payload[:query]
    current_span.finish
  end
end

Enriquecimiento de trazas a partir de métodos anidados

Puedes etiquetar información adicional al tramo activo en ese momento utilizando cualquier método. Ten en cuenta, sin embargo, que si se llama al método y no hay ningún tramo activo en ese momento, el active_span será nulo.

# Por ej. agregando etiquetas al tramo activo

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

También puedes obtener la traza activa en ese momento utilizando el método active_trace. Este método devolverá nil si no hay ninguna traza activa.

# Por ej. accediendo a la traza activa

current_trace = Datadog::Tracing.active_trace

Instrumentación de la integración

Muchas de los bibliotecas y marcos más populares son compatibles desde el primer momento, por lo que pueden instrumentarse de forma automática. Aunque no se activan automáticamente, pueden activarse y configurarse fácilmente a través de la API Datadog.configure:

Datadog.configure do |c|
  # Activa y configura una integración
  c.tracing.instrument :integration_name, **options
end

Las options son argumentos de palabra clave para configuraciones específicas de las integraciones.

Para ver la lista de las integraciones disponibles y sus versiones compatibles, consulta la compatibilidad de la integración con Ruby.

Para ver la lista de las opciones de configuración para las integraciones disponibles, consulta:

CI Visibility

Para Datadog CI Visibility, la instrumentación de bibliotecas puede activarse y configurarse a través de la siguiente API Datadog.configure:

Datadog.configure do |c|
  # Activa y configura una integración
  c.ci.instrument :integration_name, **options
end

Las options son argumentos de palabra clave para configuraciones específicas de las integraciones.

Para ver la lista de las integraciones disponibles y sus versiones compatibles, consulta la compatibilidad de la integración de CI con Ruby.

Action Cable

La integración Action Cable rastrea mensajes emitidos y acciones de canales.

Puedes habilitarlo a través de Datadog.configure:

require 'ddtrace'

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

Action Mailer

La integración Action Mailer proporciona rastreo para las acciones Rails 5 de Action Mailer.

Puedes habilitarlo a través de Datadog.configure:

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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
email_dataAñadir o no metadatos adicionales de carga útil de correo electrónico a tramos action_mailer.deliver. Los campos incluyen ['subject', 'to', 'from', 'bcc', 'cc', 'date', 'perform_deliveries'].false

Action Pack

La mayoría de las veces, Action Pack se configura como parte de Rails, pero puede activarse por separado:

require 'actionpack'
require 'ddtrace'

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

Action View

La mayoría de las veces, Action View se configura como parte de Rails, pero puede activarse por separado:

require 'actionview'
require 'ddtrace'

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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
template_base_pathSe utiliza cuando se analiza el nombre de la plantilla. Si no almacenas tus plantillas en la carpeta views/, es posible que necesites cambiar este valor.'views/'

Active Job

La mayoría de las veces, Active Job se configura como parte de Rails, pero puede activarse por separado:

require 'active_job'
require 'ddtrace'

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

ExampleJob.perform_later

Serializadores de Active Model

La integración de serializadores de Active Model rastrea el evento serialize para la versión 0.9 y superiores y el evento render para la versión 0.10 y superiores.

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

La mayoría de las veces, Active Record se configura como parte de un marco web (Rails, Sinatra…), pero puede configurarse solo:

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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
service_nameSobreescribe el nombre del servicio para la instrumentación de la consulta SQL. La instrumentación de la consulta de la instanciación de Active Record siempre utiliza el nombre del servicio configurado de la aplicación.Nombre del adaptador de base de datos (por ejemplo, 'mysql2')

Configuración de los parámetros de rastreo por base de datos

Puedes configurar parámetros de rastreo por conexión de base de datos utilizando la opción describes:

# Proporciona una opción `:describes` con una clave de conexión.
# Cualquiera de las siguientes claves son aceptables y equivalentes entre sí.
# Si se proporciona un bloque, éste devuelve un objeto Parámetros que
# acepta cualquiera de las opciones de configuración enumeradas anteriormente.

Datadog.configure do |c|
  # Símbolo que coincide con tu conexión de base de datos en config/database.yml
  # Sólo disponible si utilizas Rails con ActiveRecord.
  c.tracing.instrument :active_record, describes: :secondary_database, service_name: 'secondary-db'

  # Patrón de configuración de bloque.
  c.tracing.instrument :active_record, describes: :secondary_database do |second_db|
second_db.service_name = 'secondary-db'
  end

  # Cadena de conexión con los siguientes parámetros de conexión:
  # adaptador, nombre de usuario, host, puerto, base de datos
  # Los demás campos se ignoran.
  c.tracing.instrument :active_record, describes: 'mysql2://root@127.0.0.1:3306/mysql', service_name: 'secondary-db'

  # Hash con los siguientes parámetros de conexión:
  # adaptador, nombre de usuario, host, puerto, base de datos
  # Los demás campos se ignoran.
  c.tracing.instrument :active_record, describes: {
      adapter: 'mysql2',
      host: '127.0.0.1',
      port: '3306',
      database: 'mysql',
      username: 'root
    },
    service_name: 'secondary-db'

  # Si utilizas la gema `makara`, es posible emparejar el `role` de conexión:
  c.tracing.instrument :active_record, describes: { makara_role: 'primary' }, service_name: 'primary-db'
  c.tracing.instrument :active_record, describes: { makara_role: 'replica' }, service_name: 'secondary-db'
end

También puedes crear configuraciones basadas en la coincidencia parcial de los campos de conexión de la base de datos:

Datadog.configure do |c|
  # Coincide con cualquier conexión en el host `127.0.0.1`.
  c.tracing.instrument :active_record, describes: { host:  '127.0.0.1' }, service_name: 'local-db'

  # Coincide con cualquier conexión `mysql2`.
  c.tracing.instrument :active_record, describes: { adapter: 'mysql2'}, service_name: 'mysql-db'

  # Coincide con cualquier conexión `mysql2` con la base de datos `reports`.
  #
  # En caso de varias configuraciones `describe` coincidentes, se aplicará la última.
  # En este caso, se configurará una conexión con `mysql` del adaptador y `reports` de la base de datos
  # `service_name: 'reports-db'`, y no con `service_name: 'mysql-db'`.
  c.tracing.instrument :active_record, describes: { adapter: 'mysql2', database:  'reports'}, service_name: 'reports-db'
end

Cuando varias configuraciones de describes coincidan con una conexión, se aplicará la última regla configurada que coincida.

Si ActiveRecord rastrea un evento que utiliza una conexión que coincide con una clave definida por describes, utilizará los parámetros de rastreo asignados a esa conexión. Si la conexión no coincide con ninguna de las conexiones descritas, utilizará los parámetros predeterminados definidos por c.tracing.instrument :active_record.

Active Support

La mayoría de las veces, Active Support se configura como parte de Rails, pero puede activarse por separado:

require 'activesupport'
require 'ddtrace'

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

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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
cache_serviceNombre de la aplicación que ejecuta la instrumentación de active_support. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalactive_support-cache

AWS

La integración con AWS rastrea cada interacción (por ejemplo, llamadas a la API) a través de servicios AWS (S3, ElastiCache, etc.).

require 'aws-sdk'
require 'ddtrace'

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

# Perform traced call
Aws::S3::Client.new.list_buckets

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_AWS_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de aws. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalaws
peer_serviceDD_TRACE_AWS_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil

Concurrent Ruby

La integración con Concurrent Ruby añade compatibilidad para la propagación de contexto cuando se utiliza ::Concurrent::Future y Concurrent::Async, y asegura que el código rastreado dentro de Future#execute y Concurrent::Async#async tendrá el conjunto de elementos principales correcto.

Para activar tu integración, utiliza el método Datadog.configure:

# Dentro del inicializador Rails initializer o equivalente
Datadog.configure do |c|
  # Corrige mediante parches ::Concurrent::Future para que utilice ExecutorService que propaga el contexto
  c.tracing.instrument :concurrent_ruby
end

# Transfiere contexto al código ejecutado dentro de Concurrent::Future
Datadog::Tracing.trace('outer') do
  Concurrent::Future.execute { Datadog::Tracing.trace('inner') { } }.wait
end

# Transfiere contexto al código ejecutado dentro de Concurrent::Async
class MyClass
  include ConcurrentAsync

  def foo
    Datadog::Tracing.trace('inner') { }
  end
end

Datadog::Tracing.trace('outer') do
  MyClass.new.async.foo
end

Cucumber

La integración con Cucumber rastrea todas las ejecuciones de escenarios y pasos cuando se utiliza el marco cucumber.

Para activar tu integración, utiliza el método Datadog.configure:

require 'cucumber'
require 'ddtrace'

# Configura la integración con Cucumber predeterminada
Datadog.configure do |c|
  c.ci.instrument :cucumber, **options
end

# Ejemplo de cómo adjuntar etiquetas del escenario al tramo activo
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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
enabledDefine si se deben rastrear los tests de Cucumber. Es útil para desactivar temporalmente el rastreo. true o falsetrue
service_nameNombre de servicio utilizado para la instrumentación de cucumber'cucumber'
operation_nameNombre de operación utilizado para la instrumentación de cucumber. Es útil si quieres renombrar métricas de rastreo automáticas, por ejemplo trace.#{operation_name}.errors.'cucumber.test'

Dalli

La integración con Dalli rastreará todas las llamadas a tu servidor memcached:

require 'dalli'
require 'ddtrace'

# Configura el comportamiento de rastreo predeterminado de Dalli
Datadog.configure do |c|
  c.tracing.instrument :dalli, **options
end

# Configura el comportamiento de rastreo de Dalli para un solo cliente
client = Dalli::Client.new('localhost:11211', **options)
client.set('abc', 123)

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
command_enabledDD_TRACE_MEMCACHED_COMMAND_ENABLEDRecopila comandos como la etiqueta memcached.command. Es posible que el comando keys contenga información sensible.false
service_nameDD_TRACE_DALLI_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de dalli. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalmemcached
peer_serviceDD_TRACE_DALLI_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil

DelayedJob

La integración con DelayedJob utiliza ganchos de ciclo de vida para rastrear ejecuciones y colas de tareas.

Puedes activarlo a través de Datadog.configure:

require 'ddtrace'

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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
error_handlerGestor de errores personalizado que se invoca cuando un trabajo genera un error. Se proporcionan span y error como argumentos. Define el error en el tramo por defecto. Es útil para ignorar errores transitorios.proc { |span, error| span.set_error(error) unless span.nil? }

Elasticsearch

La integración con Elasticsearch rastreará cualquier llamada a perform_request en el objeto Client:

require 'elasticsearch/transport'
require 'ddtrace'

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

# Realiza una consulta a Elasticsearch
client = Elasticsearch::Client.new url: 'http://127.0.0.1:9200'
response = client.perform_request 'GET', '_cluster/health'

# En caso de que quieras anular la configuración global de una instancia de cliente determinada
Datadog.configure_onto(client.transport, **options)

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_ELASTICSEARCH_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de elasticsearch. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalelasticsearch
peer_serviceDD_TRACE_ELASTICSEARCH_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
quantizeHash que contiene las opciones de cuantificación. Puede incluir :show con una matriz de claves para no cuantificar (o :all para omitir la cuantificación), o :exclude con una matriz de claves para excluir por completo.{}

Ethon

La integración con ethon rastrea cualquier solicitud HTTP a través de objetos Easy o Multi . Ten en cuenta que este integración también admite bibliotecas Typhoeus, basadas en Ethon.

require 'ddtrace'

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

  # también puedes especificar un nombre de servicio diferente para nombres de hosts que coinciden con una expresión regular (regex)
  c.tracing.instrument :ethon, describes: /user-[^.]+\.example\.com/ do |ethon|
    ethon.service_name = 'user.example.com'
    ethon.split_by_domain = false # Only necessary if split_by_domain is true by default
  end
end

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_ETHON_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de ethon. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalethon
peer_serviceDD_TRACE_ETHON_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
distributed_tracingHabilita el rastreo distribuidotrue
split_by_domainUtiliza el dominio de la solicitud como nombre de servicio cuando se configura como true.false

Excon

La integración de excon está disponible a través del middleware ddtrace:

require 'excon'
require 'ddtrace'

# Configura el comportamiento de rastreo predeterminado de Excon
Datadog.configure do |c|
  c.tracing.instrument :excon, **options

  # también puedes especificar un nombre de servicio diferente para nombres de hosts que coinciden con una expresión regular (regex)
  c.tracing.instrument :excon, describes: /user-[^.]+\.example\.com/ do |excon|
    excon.service_name = 'user.example.com'
    excon.split_by_domain = false # Only necessary if split_by_domain is true by default
  end
end

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

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_EXCON_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de excon. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalexcon
peer_serviceDD_TRACE_EXCON_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
distributed_tracingHabilita el rastreo distribuidotrue
split_by_domainUtiliza el dominio de la solicitud como nombre de servicio cuando se configura como true.false
error_handlerUn Proc que acepta un parámetro response. Si se evalúa con un valor truthy, el tramo del rastreo se marca como error. Por defecto sólo se marcan como errores las respuestas 5XX.nil

Configurar las conexiones para utilizar diferentes configuraciones

Si utilizas varias conexiones con Excon, puedes dar a cada una de ellas diferentes parámetros, configurando sus constructores con middleware:

# Envuelve el stack tecnológico de middleware predeterminado con el middleware de rastreo de Datadog
Excon.new(
  'http://example.com',
  middlewares: Datadog::Tracing::Contrib::Excon::Middleware.with(options).around_default_stack
)

# Inserta el middleware dentro de un stack tecnológico de middleware personalizado.
# NOTA: ¡El middleware de rastreo debe insertarse después del ResponseParser!
Excon.new(
  'http://example.com',
  middlewares: [
    Excon::Middleware::ResponseParser,
    Datadog::Tracing::Contrib::Excon::Middleware.with(options),
    Excon::Middleware::Idempotent
  ]
)

Donde options es un Hash que contiene cualquiera de los parámetros enumerados en la tabla anterior.

Faraday

La integración de faraday está disponible a través del middleware ddtrace:

require 'faraday'
require 'ddtrace'

# Configura el comportamiento de rastreo predeterminado de Faraday
Datadog.configure do |c|
  c.tracing.instrument :faraday, **options

  # también puedes especificar un nombre de servicio diferente para nombres de hosts que coinciden con una expresión regular (regex)
  c.tracing.instrument :faraday, describes: /user-[^.]+\.example\.com/ do |faraday|
    faraday.service_name = 'user.example.com'
    faraday.split_by_domain = false # Only necessary if split_by_domain is true by default
  end
end

# En caso de que quieras anular la configuración global de una instancia de cliente determinada
connection = Faraday.new('https://example.com') do |builder|
  builder.use(:ddtrace, **options)
  builder.adapter Faraday.default_adapter
end

connection.get('/foo')

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_FARADAY_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de faraday. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalfaraday
peer_serviceDD_TRACE_FARADAY_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
distributed_tracingHabilita el rastreo distribuidotrue
split_by_domainUtiliza el dominio de la solicitud como nombre de servicio cuando se configura como true.false
error_handlerUn Proc que acepta un parámetro response. Si se evalúa con un valor truthy, el tramo del rastreo se marca como error. Por defecto sólo se marcan como errores las respuestas 5XX.nil
on_errorGestor de errores personalizado que se invoca cuando una solicitud genera un error. Con span y error como argumentos. Establece un error en el tramo por defecto.proc { |span, error| span.set_error(error) unless span.nil? }

Grape

La integración de Grape añade la instrumentación a los endpoints y filtros de Grape. Esta integración puede funcionar en conjunto con otras integraciones como Rack y Rails.

Para activar tu integración, utiliza el método Datadog.configure antes de definir tu aplicación Grape:

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

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

# Luego, define tu aplicación
class RackTestingAPI < Grape::API
  desc 'main endpoint'
  get :success do
    'Hello world!'
  end
end

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
enabledDD_TRACE_GRAPE_ENABLEDDefine si Grape debe ser rastreado. Es útil para desactivar temporalmente el rastreo. true o falsetrue
error_statusesDefine un código de estado o un rango de códigos de estado que deben marcarse como errores. '404,405,500-599' o [404,405,'500-599']nil

GraphQL

La integración de GraphQL activa la instrumentación para las consultas de GraphQL.

Para activar tu integración, utiliza el método Datadog.configure:

# En el inicializador Rails o equivalente
Datadog.configure do |c|
  c.tracing.instrument :graphql, schemas: [YourSchema], **options
end

# Luego, ejecuta una consulta GraphQL
YourSchema.execute(query, variables: {}, context: {}, operation_name: nil)

El método instrument :graphql acepta los siguientes parámetros. Se pueden sustituir opciones adicionales por options:

ClaveDescripciónPredeterminado
schemasRequerido. Matriz de objetos GraphQL::Schema para rastrear. El rastreo se añadirá a todos los esquemas enumerados, utilizando las opciones proporcionadas para esta configuración. Si no proporcionas ninguna, no se activará el rastreo.[]
service_nameNombre de servicio utilizado parala instrumentación de GraphQL'ruby-graphql'

Configuración manual de esquemas de GraphQL

Si prefieres configurar individualmente los parámetros del rastreador para un esquema (por ejemplo, si tienes varios esquemas con diferentes nombres de servicios), en la definición del esquema, puedes añadir lo siguiente utilizando la API de GraphQL:

# Esquema basado en clases
class YourSchema < GraphQL::Schema
  use(
    GraphQL::Tracing::DataDogTracing,
    service: 'graphql'
  )
end
# Esquema .define-style
YourSchema = GraphQL::Schema.define do
  use(
    GraphQL::Tracing::DataDogTracing,
    service: 'graphql'
  )
end

O puedes modificar un esquema ya definido:

# Esquema basado en clases
YourSchema.use(
    GraphQL::Tracing::DataDogTracing,
    service: 'graphql'
)
# Esquema .define-style
YourSchema.define do
  use(
    GraphQL::Tracing::DataDogTracing,
    service: 'graphql'
  )
end

NO instrument :graphql en Datadog.configure si eliges la configuración manual, para evitar el doble rastreo. Estas dos formas de configurar el rastreo de GraphQL se consideran mutuamente excluyentes.

gRPC

La integración de grpc añade interceptores de cliente y servidor, que se ejecutan como middleware antes de ejecutar la llamada al procedimiento remoto del servicio. Como las aplicaciones gRPC suelen estar distribuidas, la integración comparte información de rastreo entre el cliente y el servidor.

Para configurar tu integración, utiliza el método Datadog.configure de la siguiente manera:

require 'grpc'
require 'ddtrace'

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

# Lado del servidor
server = GRPC::RpcServer.new
server.add_http2_port('localhost:50051', :this_port_is_insecure)
server.handle(Demo)
server.run_till_terminated

# Lado del cliente
client = Demo.rpc_stub_class.new('localhost:50051', :this_channel_is_insecure)
client.my_endpoint(DemoMessage.new(contents: 'hello!'))

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_GRPC_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de grpc. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalgrpc
peer_serviceDD_TRACE_GRPC_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
distributed_tracingHabilita el rastreo distribuidotrue
server_error_handlerGestor de errores personalizado que se invoca cuando se produce un error. Un Proc que acepta los parámetros span y error. Establece el error en el tramo por defecto.proc { |span, error | span.set_error(error) unless span.nil? }
client_error_handlerGestor de errores personalizado que se invoca cuando se produce un error. Un Proc que acepta los parámetros span y error. Establece el error en el tramo por defecto.proc { |span, error | span.set_error(error) unless span.nil? }

Aviso de obsolescencia:

  • error_handler será eliminado. Utiliza server_error_handler en su lugar.

Configurar clientes para que utilicen diferentes parámetros

En situaciones en las que haya varios clientes que llamen a varios servicios distintos, puedes pasar el interceptor de Datadog directamente, de la siguiente manera:

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]
)

La integración se asegurará de que configured_interceptor defina una configuración de rastreo única para esa instancia de cliente.

hanami

La integración de hanami instrumentará el enrutamiento, la acción y la representación de tu aplicación hanami. Para habilitar la instrumentación de hanami, se recomienda instrumentar automáticamente con

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

y crear un archivo inicializador en tu carpeta config/initializers:

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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
service_nameNombre de servicio para la instrumentación de hanami.nil

http.rb

La integración de http.rb rastreará cualquier llamada HTTP a través de la gema http.rb.

require 'http'
require 'ddtrace'
Datadog.configure do |c|
  c.tracing.instrument :httprb, **options
  # también puedes especificar un nombre de servicio diferente para nombres de hosts que coinciden con una expresión regular (regex)
  c.tracing.instrument :httprb, describes: /user-[^.]+\.example\.com/ do |httprb|
    httprb.service_name = 'user.example.com'
    httprb.split_by_domain = false # Only necessary if split_by_domain is true by default
  end
end

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_HTTPRB_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de httprb. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalhttprb
peer_serviceDD_TRACE_HTTPRB_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
distributed_tracingHabilita el rastreo distribuidotrue
split_by_domainUtiliza el dominio de la solicitud como nombre de servicio cuando se configura como true.false
error_status_codesDD_TRACE_HTTPCLIENT_ERROR_STATUS_CODESRango o matriz de códigos de estado HTTP que deben rastrearse como errores.400...600

httpclient

La integración de httpclient rastreará cualquier llamada HTTP a través de la gema httpclient.

require 'httpclient'
require 'ddtrace'
Datadog.configure do |c|
  c.tracing.instrument :httpclient, **options
  # también puedes especificar un nombre de servicio diferente para nombres de hosts que coinciden con una expresión regular (regex)
  c.tracing.instrument :httpclient, describes: /user-[^.]+\.example\.com/ do |httpclient|
    httpclient.service_name = 'user.example.com'
    httpclient.split_by_domain = false # Only necessary if split_by_domain is true by default
  end
end

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_HTTPCLIENT_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de httpclient. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalhttpclient
peer_serviceDD_TRACE_HTTPCLIENT_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
distributed_tracingHabilita el rastreo distribuidotrue
split_by_domainUtiliza el dominio de la solicitud como nombre de servicio cuando se configura como true.false
error_status_codesDD_TRACE_HTTPCLIENT_ERROR_STATUS_CODESRango o matriz de códigos de estado HTTP que deben rastrearse como errores.400...600

httpx

httpx conserva su propia integración con ddtrace:

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

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

  # también puedes especificar un nombre de servicio diferente para nombres de hosts que coinciden con una expresión regular (regex)
  c.tracing.instrument :httpx, describes: /user-[^.]+\.example\.com/ do |http|
    http.service_name = 'user.example.com'
    http.split_by_domain = false # Only necessary if split_by_domain is true by default
  end
end

Kafka

La integración de Kafka proporciona un rastreo de la gema ruby-kafka:

Puedes habilitarla a través de Datadog.configure:

require 'active_support/notifications' # required to enable 'ruby-kafka' instrumentation
require 'kafka'
require 'ddtrace'

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

Minitest

La integración con Minitest rastrea todas las ejecuciones de tests cuando se utiliza el marco para tests minitest.

Para activar tu integración, utiliza el método Datadog.configure:

require 'minitest'
require 'ddtrace'

# Configura la integración predeterminada con Minitest
Datadog.configure do |c|
  c.ci.instrument :minitest, **options
end

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
enabledDefine si los tests de Minitest deben rastrearse. Es útil para deshabilitar temporalmente el rastreo. true o falsetrue
service_nameNombre de servicio utilizado para la instrumentación de minitest'minitest'
operation_nameNombre de operación utilizado para la instrumentación de minitest. Es útil si quieres renombrar métricas de rastreo automáticas, por ejemplo trace.#{operation_name}.errors.'minitest.test'

MongoDB

La integración rastrea cualquier Command que se envía desde el controlador de Ruby MongoDB a un clúster de MongoDB. Por extensión, los Object Document Mappers (ODM) como Mongoid se instrumentan automáticamente si utilizan el controlador oficial de Ruby. Para activar la integración, simplemente:

require 'mongo'
require 'ddtrace'

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

# Crea un cliente MongoDB y utilízalo como de costumbre
client = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'artists')
collection = client[:people]
collection.insert_one({ name: 'Steve' })

# En caso de que quieras anular la configuración global de una instancia de cliente determinada
Datadog.configure_onto(client, **options)

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_MONGO_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de mongo. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalmongodb
peer_serviceDD_TRACE_MONGO_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
quantizeHash que contiene las opciones de cuantificación. Puede incluir :show con una matriz de claves para no cuantificar (o :all para omitir la cuantificación), o :exclude con una matriz de claves para excluir por completo.{ show: [:collection, :database, :operation] }

Configuración de los parámetros de rastreo por conexión

Puedes configurar los parámetros de rastreo por conexión a través de la opción describes:

# Proporciona una opción `:describes` con una clave de conexión.
# Cualquiera de las siguientes claves son aceptables y equivalentes unas con otras.
# Si se proporciona un bloque, genera un objeto Parámetros que
# acepta cualquiera de las opciones de configuración enumeradas anteriormente.

Datadog.configure do |c|
  # Cadena de conexión de red
  c.tracing.instrument :mongo, describes: '127.0.0.1:27017', service_name: 'mongo-primary'

  # Expresión regular de conexión de red
  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' })
# La llamada rastreada pertenecerá al servicio `mongo-primary`

client = Mongo::Client.new([ 'localhost:27017' ], :database => 'artists')
collection = client[:people]
collection.insert_one({ name: 'Steve' })
# La llamada rastreada pertenecerá al servicio `mongo-secondary`

Cuando varias configuraciones de describes coincidan con una conexión, se aplicará la última regla configurada que coincida.

MySQL2

La integración de MySQL2 rastrea cualquier comando SQL enviado a través de la gema 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'")

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_MYSQL2_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de mysql2. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalmysql2
peer_serviceDD_TRACE_MYSQL2_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
comment_propagationDD_DBM_PROPAGATION_MODEModo de propagación de comentarios SQL para la monitorización de bases de datos.
(ejemplo: disabled| service| full).

Importante: Ten en cuenta que al habilitar la propagación de comentarios SQL se almacenan datos potencialmente confidenciales (nombres de servicios) en las bases de datos a las que pueden acceder terceros a quienes se haya concedido acceso a las bases de datos.
'disabled'
on_errorGestor de errores personalizado que se invoca cuando MySQL genera un error. Con span y error como argumentos. Establece el error en el tramo por defecto. Es útil para ignorar errores gestionados a nivel de aplicación.proc { |span, error| span.set_error(error) unless span.nil? }

Net/HTTP

La integración de Net/HTTP rastreará cualquier llamada HTTP utilizando el módulo estándar lib Net::HTTP.

require 'net/http'
require 'ddtrace'

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

  # también puedes especificar un nombre de servicio diferente para nombres de hosts que coinciden con una expresión regular (regex)
  c.tracing.instrument :http, describes: /user-[^.]+\.example\.com/ do |http|
    http.service_name = 'user.example.com'
    http.split_by_domain = false # Only necessary if split_by_domain is true by default
  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'))

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_NET_HTTP_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de net/http. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalnet/http
peer_serviceDD_TRACE_NET_HTTP_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
distributed_tracingHabilita el rastreo distribuidotrue
split_by_domainUtiliza el dominio de la solicitud como nombre de servicio cuando se configura como true.false
error_status_codesDD_TRACE_HTTP_ERROR_STATUS_CODESRango o matriz de códigos de estado HTTP que deben rastrearse como errores.400...600

Si quieres configurar cada objeto de conexión individualmente, puedes utilizar Datadog.configure_onto como se indica a continuación:

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

OpenSearch

La integración de OpenSearch rastreará cualquier llamada a perform_request en el objeto Client:

require 'opensearch'
require 'ddtrace'

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

# Realiza una consulta a OpenSearch
client = OpenSearch::Client.new(
  host: 'https://localhost:9200',
  user: 'user',
  password: 'password',
)
client.cluster.health

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_OPENSEARCH_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de opensearch. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalopensearch
peer_serviceDD_TRACE_OPENSEARCH_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
quantizeHash que contiene las opciones de cuantificación. Puede incluir :show con una matriz de claves para no cuantificar (o :all para omitir la cuantificación), o :exclude con una matriz de claves para excluir por completo.{}

Postgres

La integración de Postgres rastrea cualquier comando SQL enviado a través de la gema pg.

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

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

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
enabledDefine si Postgres debe rastrearse.true
service_nameDD_TRACE_PG_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de pg. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalpg
peer_serviceDD_TRACE_PG_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
comment_propagationDD_DBM_PROPAGATION_MODEModo de propagación de comentarios SQL para la monitorización de bases de datos.
(ejemplo: disabled| service| full).

Importante: Ten en cuenta que al habilitar la propagación de comentarios SQL se almacenan datos potencialmente confidenciales (nombres de servicios) en las bases de datos a las que pueden acceder terceros a quienes se haya concedido acceso a las bases de datos.
'disabled'
error_handlerGestor de errores personalizado que se invoca cuando MySQL genera un error. Con span y error como argumentos. Establece el error en el tramo por defecto. Es útil para ignorar errores gestionados a nivel de aplicación.proc { |span, error| span.set_error(error) unless span.nil? }

Presto

La integración de Presto rastrea cualquier comando SQL enviado a través de la gema 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")

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_PRESTO_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de presto. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalpresto
peer_serviceDD_TRACE_PRESTO_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil

Qless

La integración con Qless utiliza ganchos de ciclo de vida para rastrear ejecuciones de tareas.

Para añadir el rastreo a una tarea Qless:

require 'ddtrace'

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

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
tag_job_dataDD_QLESS_TAG_JOB_DATAHabilita el etiquetado con argumentos de tareas . true para activarlo y false para desactivarlo.false
tag_job_tagsDD_QLESS_TAG_JOB_TAGSHabilita el etiquetado con etiquetas de tareas . true para activarlo y false para desactivarlo.false

Que

La integración de Que es un middleware que rastrea ejecuciones de tareas.

Puedes habilitarla a través de Datadog.configure:

require 'ddtrace'

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

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
enabledDD_TRACE_QUE_ENABLEDDefine si Que debe ser rastreado. Es útil para desactivar temporalmente el rastreo. true o falsetrue
tag_argsDD_TRACE_QUE_TAG_ARGS_ENABLEDHabilita el etiquetado del campo de argumentos de una tarea. true para activarlo y false para desactivarlo.false
tag_dataDD_TRACE_QUE_TAG_DATA_ENABLEDHabilita el etiquetado del campo de datos de una tarea. true para activarlo y false para desactivarlo.false
error_handlerGestor de errores personalizado que se invoca cuando un trabajo genera un error. Se proporcionan span y error como argumentos. Define el error en el tramo por defecto. Es útil para ignorar errores transitorios.proc { |span, error | span.set_error(error) unless span.nil? }

Racecar

La integración con Racecar permite rastrear tareas de Racecar.

Puedes habilitarla a través de Datadog.configure:

require 'ddtrace'

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

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_RACECAR_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de racecar. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalracecar

Rack

La integración de Rack proporciona un middleware que rastrea todas las solicitudes antes de que lleguen al marco o la aplicación subyacente. Responde a la interfaz mínima de Rack, proporcionando valores razonables que pueden recuperarse a nivel de Rack.

Este integración se activa automáticamente con marcos web como Rails. Si utilizas una aplicación Rack sencilla, habilita la integración con tu config.ru:

# Ejemplo 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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
applicationTu aplicación Rack. Necesaria para middleware_names.nil
distributed_tracingHabilita el rastreo distribuido para que la traza de este servicio se conecte con la traza de otro servicio, si se reciben cabeceras de rastreo.true
headersHash de cabeceras de solicitud o respuesta HTTP para añadir como etiquetas a larack.request. Acepta las claves request y response con valores de matriz, por ejemplo ['Last-Modified']. Añade las etiquetas http.request.headers.* y http.response.headers.*, respectivamente. Esta opción anula las DD_TRACE_HEADER_TAGS globales. Para obtener más información, consulta la [aplicación de etiquetas de cabeceras a tramos raíz][header tags].{ response: ['Content-Type', 'X-Request-ID'] }
middleware_namesHabilita esta opción si quieres utilizar la última clase de middleware ejecutada como nombre de recurso para el tramo rack. Si se habilita junto con la instrumentación de rails, rails tiene prioridad al definir el nombre de recurso rack del controlador de rails activo, cuando corresponda. Requiere la opción application para su uso.false
quantizeHash que contiene las opciones de cuantificación. Puede incluir :query o :fragment.{}
quantize.baseDefine el comportamiento de la base de la URL (esquema, host, puerto). Puede ser :show, para conservar la base de la URL en la etiqueta http.url y no definir la etiqueta http.base_url, o nil, para eliminar la base de la URL de la etiqueta http.url por defecto, dejando una ruta y definiendo http.base_url. Esta opción debe estar anidada dentro de la opción quantize.nil
quantize.queryHash que contiene opciones para la parte de consulta de la cuantificación de la URL. Puede incluir :show o :exclude. Consulta las opciones a continuación. La opción debe estar anidada dentro de la opción quantize.{}
quantize.query.showDefine qué valores deben mostrarse siempre. Puede ser una matriz de cadenas, :all, para mostrar todos los valores, o nil, para no mostrar ningún valor. Esta opción debe estar anidada dentro de la opción query.nil
quantize.query.excludeDefine qué valores deben eliminarse por completo. Puede ser una matriz de cadenas, :all, para eliminar la cadena de consulta por completo, o nil, para no excluir nada. Esta opción debe estar anidada dentro de la opción query.nil
quantize.query.obfuscateDefine el comportamiento de redacción de la cadena de consulta. Puede ser un hash de opciones, :internal, para utilizar parámetros de ofuscación interna por defecto, o nil, para deshabilitar la ofuscación. Ten en cuenta que la ofuscación es una operación cadena-valor, no una operación clave-valor. Cuando está habilitada, query.show pasa por defecto a :all, si no se define. Esta opción debe estar anidada dentro de la opción query.nil
quantize.query.obfuscate.withDefine la cadena por la que se sustituirán las coincidencias ofuscadas. Puede ser una cadena. Esta opción debe estar anidada dentro de la opción query.obfuscate.'<redacted>'
quantize.query.obfuscate.regexDefine la expresión regular con la que se redactará la cadena de consulta. Puede ser una expresión regular (Regexp), o :internal, para utilizar la expresión regular (Regexp) interna por defecto, que redacta datos sensibles bien conocidos. Cada coincidencia se redacta por completo sustituyéndola por query.obfuscate.with. Esta opción debe estar anidada dentro de la opción query.obfuscate.:internal
quantize.fragmentDefine el comportamiento de los fragmentos de URL. Puede ser :show, para mostrar fragmentos de URL, o nil, para eliminarlos. Esta opción debe estar anidada dentro de la opción quantize.nil
request_queuingRealiza un seguimiento del tiempo que pasan las solicitudes HTTP en la cola del servidor frontend. Para obtener más información, consulta Cola de solicitudes HTTP.false
web_service_nameNombre de servicio para tramos de cola de solicitudes del servidor frontend. (por ejemplo, 'nginx')'web-server'

Aviso de obsolescencia:

  • quantize.base cambiará por defecto de :exclude a :show en una futura versión. Se recomienda el cambio voluntario a :show.
  • quantize.query.show cambiará su valor por defecto a :all en una versión futura, junto con quantize.query.obfuscate, que cambiará a :internal. Se recomienda el cambio voluntario a estos valores futuros.

Configuración del comportamiento de cuantificación de URL

Datadog.configure do |c|
  # Comportamiento predeterminado: todos los valores se cuantifican, la base se elimina, el fragmento se elimina.
  # 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[]

  # Elimina la base URL (esquema, host, puerto)
  # http://example.com/path?category_id=1&sort_by=asc#featured --> /path?category_id&sort_by#featured
  c.tracing.instrument :rack, quantize: { base: :exclude }

  # Muestra la base 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 }

  # Muestra valores para cualquier parámetro de cadena de consulta que coincida con 'category_id' exactly
  # 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'] } }

  # Muestra todos los valores para cualquier parámetro de cadena de consulta
  # 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 } }

  # Excluye por completo cualquier parámetro de cadena de consulta que coincida con 'sort_by' exactly
  # http://example.com/path?category_id=1&sort_by=asc#featured --> /path?category_id
  c.tracing.instrument :rack, quantize: { query: { exclude: ['sort_by'] } }

  # Excluye por completo la cadena de consulta
  # http://example.com/path?category_id=1&sort_by=asc#featured --> /path
  c.tracing.instrument :rack, quantize: { query: { exclude: :all } }

  # Muestra fragmentos 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 }

  # Ofusca la cadena de consulta, para mostrar todos los valores por defecto
  # http://example.com/path?password=qwerty&sort_by=asc#featured --> /path?<redacted>&sort_by=asc
  c.tracing.instrument :rack, quantize: { query: { obfuscate: {} } }

  # Ofusca la cadena de consulta utilizando la expresión regular (regex) proporcionada, para mostrar todos los valores por defecto
  # 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+/ } } }

  # Ofusca la cadena de consulta utilizando una cadena de redacción personalizada
  # 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

La integración de Rails rastreará solicitudes, llamadas a bases de datos, representación de plantillas y operaciones de lectura/escritura/eliminación de caché. La integración hace uso de la instrumentación de Active Support y escucha a la API de notificación para que cualquier operación instrumentada por la API sea rastreada.

Para habilitar la instrumentación Rails, crea un archivo inicializador en tu carpeta config/initializers:

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

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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
distributed_tracingHabilita el rastreo distribuido para que la traza de este servicio se conecte con la traza de otro servicio, si se reciben cabeceras de rastreo.true
request_queuingRealiza un seguimiento del tiempo que pasan las solicitudes HTTP en la cola del servidor frontend. Para obtener más información, consulta Cola de solicitudes HTTP.false
middlewareAñade el middleware de rastreo a la aplicación Rails. Configúralo como false, si no quieres que se cargue el middleware.true
middleware_namesPermite que cualquier solicitud de middleware en cortocircuito muestre el nombre del middleware como recurso para la traza.false
service_nameNombre de servicio utilizado al rastrear las solicitudes de aplicación (en el nivel de rack)'<app_name>' (deducido del espacio de nombres de tu aplicación Rails)
template_base_pathSe utiliza cuando se analiza el nombre de la plantilla. Si no almacenas tus plantillas en la carpeta views/, es posible que necesites cambiar este valor.'views/'

Versiones compatibles

Versiones de MRIVersiones de JRubyVersiones de 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.0 - 3.26.1

Rake

Puedes añadir la instrumentación en tus tareas de Rake activando la integración de rake y proporcionando una lista de las tareas de Rake que deben instrumentarse.

Evita instrumentar tareas de Rake de ejecución prolongada, ya que estas tareas pueden agregar grandes trazas a la memoria que nunca se vacían hasta que la tarea termina.

Para tareas de ejecución prolongada, utiliza la instrumentación manual con las rutas de código recurrentes.

Para activar el rastreo de tareas de Rake, agrega lo siguiente a su Rakefile:

# En la parte superior de tu Rakefile:
require 'rake'
require 'ddtrace'

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

task :my_task do
  # Haz algunas tareas relacionadas con trabajos aquí...
end

Rake::Task['my_task'].invoke

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
enabledDefine si las tareas de Rake deben rastrearse. Es útil para deshabilitar temporalmente el rastreo. true o falsetrue
quantizeHash que contiene opciones para la cuantificación de los argumentos de la tarea. Consulta más abajo para obtener más detalles y ejemplos.{}
service_nameNombre de servicio utilizado para la instrumentación de rake'rake'
tasksNombres de las tareas de Rake a instrumentar[]

Configuración del comportamiento de la cuantificación de tareas

Datadog.configure do |c|
  # Dada una tarea que acepta :una, :dos, :tres...
  # Invocada con 'foo', 'bar', 'baz'.

  # Comportamiento predeterminado: se cuantifican todos los argumentos.
  # Etiqueta `rake.invoke.args` --> ['?']
  # Etiqueta `rake.execute.args`--> { una: '?', dos: '?', tres: '?' }
  c.tracing.instrument :rake

  # Muestra valores de cualquier argumento coincidente :exactamente dos
  # Etiqueta `rake.invoke.args` --> ['?']
  # Etiqueta `rake.execute.args` --> { una: '?', dos: '?', tres: '?' }
  c.tracing.instrument :rake, quantize: { args: { show: [:two] } }

  # Muestra todos los valores de todos los argumentos.
  # Etiqueta `rake.invoke.args` --> ['foo', 'bar', 'baz']
  # Etiqueta `rake.execute.args` --> { una: 'foo', dos: 'bar', tres: 'baz' }
  c.tracing.instrument :rake, quantize: { args: { show: :all } }

  # Excluye por completo cualquier argumento coincidente :exactamente tres
  # Etiqueta `rake.invoke.args` --> ['?']
  # Etiqueta `rake.execute.args` --> { una: '?', dos: '?' }
  c.tracing.instrument :rake, quantize: { args: { exclude: [:three] } }

  # Elimina los argumentos por completo
  # Etiqueta `rake.invoke.args` --> ['?']
  # Etiqueta `rake.execute.args` --> {}
  c.tracing.instrument :rake, quantize: { args: { exclude: :all } }
end

Redis

La integración de Redis rastrea llamadas simples y también pipelines.

require 'redis'
require 'ddtrace'

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

# Ejecuta comandos de Redis
redis = Redis.new
redis.set 'foo', 'bar'

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_REDIS_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de redis. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalredis
peer_serviceDD_TRACE_REDIS_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
command_argsDD_REDIS_COMMAND_ARGSMuestra los argumentos del comando (por ejemplo, key en GET key) como nombre y etiqueta del recurso. Si es false, sólo se muestra el nombre del comando (por ejemplo, GET).false

Configuración de los parámetros de rastreo por instancia

Con Redis v5 o anterior:

require 'redis'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :redis # Habilitar la instrumentación de la integración sigue siendo un requisito
end

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

# La llamada rastreada pertenecerá al servicio `customer-cache`
customer_cache.get(...)
# La llamada rastreada pertenecerá al servicio `invoice-cache`
invoice_cache.get(...)

Con un RedisClient independiente:

require "redis-client"
require "ddtrace"

redis = RedisClient.config(custom: { datadog: { service_name: "my-custom-redis" } }).new_client

Datadog.configure do |c|
  c.tracing.instrument :redis # Habilitar la instrumentación de la integración sigue siendo un requisito
end

redis.call('PING')

Con Redis v5 o anterior:

require 'redis'
require 'ddtrace'

Datadog.configure do |c|
  c.tracing.instrument :redis # Habilitar la instrumentación de la integración sigue siendo un requisito
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')

# La llamada rastreada pertenecerá al servicio `customer-cache`
customer_cache.get(...)
# La llamada rastreada pertenecerá al servicio `invoice-cache`
invoice_cache.get(...)

Configuración de los parámetros de rastreo por conexión

Puedes configurar los parámetros de rastreo por conexión a través de la opción describes:

# Proporciona una opción `:describes` con una clave de conexión.
# Cualquiera de las siguientes claves son aceptables y equivalentes unas con otras.
# Si se proporciona un bloque, devuelve un objeto Parámetros que
# acepta cualquiera de las opciones de configuración enumeradas anteriormente.

Datadog.configure do |c|
  # Configuración por defecto para cualquier cliente de Redis
  c.tracing.instrument :redis, service_name: 'redis-default'

  # Configuración que coincide con un socket Unix dado.
  c.tracing.instrument :redis, describes: { url: 'unix://path/to/file' }, service_name: 'redis-unix'

  # Para las conexiones de red, sólo se consideran estos campos durante el emparejamiento:
  # esquema, host, puerto, base de datos
  # Se ignoran otros campos.

  # Cadena de conexión de red
  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 de cliente de red
  c.tracing.instrument :redis, describes: { host: 'my-host.com', port: 6379, db: 1, scheme: 'redis' }, service_name: 'redis-connection-hash'
  # Sólo un subconjunto de hashes de conexión
  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

Cuando varias configuraciones de describes coincidan con una conexión, se aplicará la última regla configurada que coincida.

Resque

La integración de Resque utiliza ganchos de Resque que envuelven el método perform.

Para añadir el rastreo a una tarea de Resque:

require 'resque'
require 'ddtrace'

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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
error_handlerGestor de errores personalizado que se invoca cuando una tarea genera un error. Se proporcionan span y error como argumentos. Define el error en el tramo por defecto. Es útil para ignorar errores transitorios.proc { |span, error| span.set_error(error) unless span.nil? }

Rest Client

La integración de rest-client está disponible a través del middleware de ddtrace:

require 'rest_client'
require 'ddtrace'

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

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_REST_CLIENT_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de rest_client. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionalrest_client
peer_serviceDD_TRACE_REST_CLIENT_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil
distributed_tracingHabilita el rastreo distribuidotrue
split_by_domainUtiliza el dominio de solicitud como nombre de servicio cuando se establece en true.false

Roda

La integración de Roda rastrea solicitudes.

La integración de Roda puede habilitarse a través de Datadog.configure. Se recomienda utilizar esta integración con Rack a través de use Datadog::Tracing::Contrib::Rack::TraceMiddleware para el rastreo distribuido.

require "roda"
require "ddtrace"

class SampleApp < Roda
  use Datadog::Tracing::Contrib::Rack::TraceMiddleware

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

  route do |r|
    r.root do
      r.get do
        'Hello World!'
      end
    end
  end
end

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
service_nameNombre de servicio para la instrumentación de roda.'nil'

RSpec

La integración con RSpec rastrea todas las ejecuciones de ejemplos de grupos y de ejemplos cuando se utiliza el marco rspec.

Para activar tu integración, utiliza el método Datadog.configure:

require 'rspec'
require 'ddtrace'

# Configura la integración RSpec por defecto
Datadog.configure do |c|
  c.ci.instrument :rspec, **options
end

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
enabledDefine si los tests de RSpec deben rastrearse. Es útil para deshabilitar temporalmente el rastreo. true o falsetrue
service_nameNombre de servicio utilizado para la instrumentación de rspec'rspec'
operation_nameNombre de operación utilizado para la instrumentación de rspec. Es útil si quieres renombrar métricas de rastreo automáticas, por ejemplo trace.#{operation_name}.errors.'rspec.example'

Sequel

La integración de Sequel rastrea consultas realizadas a tu base de datos.

require 'sequel'
require 'ddtrace'

# Conéctate a la base de datos
database = Sequel.sqlite

# Crea una tabla
database.create_table :articles do
  primary_key :id
  String :name
end

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

# Realiza una consulta
articles = database[:articles]
articles.all

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
service_nameNombre de servicio para la instrumentación de sequel.Nombre del adaptador de base de datos (por ejemplo, 'mysql2')

Configuración de las bases de datos para utilizar diferentes parámetros

Si utilizas varias bases de datos con Sequel, puedes dar a cada una de ellas una configuración diferente al establecer sus respectivos objetos Sequel::Database:

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

# Configura cada base de datos con diferentes nombres de servicios
Datadog.configure_onto(sqlite_database, service_name: 'my-sqlite-db')
Datadog.configure_onto(postgres_database, service_name: 'my-postgres-db')

Shoryuken

La integración de Shoryuken es un middleware que rastrea ejecuciones de tareas.

Puedes habilitarla a través de Datadog.configure:

require 'ddtrace'

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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
tag_bodyEtiqueta tramos con el cuerpo del mensaje SQS true o falsefalse
error_handlerGestor de errores personalizado que se invoca cuando una tarea genera un error. Se proporcionan span y error como argumentos. Define el error en el tramo por defecto. Es útil para ignorar errores transitorios.proc { |span, error| span.set_error(error) unless span.nil? }

Sidekiq

La integración de Sidekiq es un middleware del lado del cliente y del lado del servidor que rastrea la cola de tareas y ejecuciones, respectivamente.

Puedes habilitarla a través de Datadog.configure:

require 'ddtrace'

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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
distributed_tracingAl activar el rastreo distribuido se crea una relación primario-secundario entre el tramo sidekiq.push y el tramo sidekiq.job.

Importante: Habilitar el rastreo_distribuido para el procesamiento asíncrono puede dar lugar a cambios drásticos en tu gráfico de trazas. Tales casos incluyen trabajos de duración prolongada, trabajos reintentados y trabajos programados en un futuro lejano. Asegúrate de inspeccionar tus trazas después de habilitar esta característica.*
false
tag_argsHabilita el etiquetado con argumentos de tareas . true para activarlo y false para desactivarlo.false
error_handlerGestor de errores personalizado que se invoca cuando una tarea genera un error. Se proporcionan span y error como argumentos. Define el error en el tramo por defecto. Es útil para ignorar errores transitorios.proc { |span, error| span.set_error(error) unless span.nil? }
quantizeHash que contiene las opciones para la cuantificación de los argumentos de la tarea.{}

Sinatra

La integración de Sinatra rastrea solicitudes y la representación de plantillas.

Para empezar a utilizar el cliente de rastreo, asegúrate de importar ddtrace y instrument :sinatra después de sinatra o sinatra/base, y antes de definir tu aplicación/rutas:

Aplicación clásica

require 'sinatra'
require 'ddtrace'

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

get '/' do
  'Hello world!'
end

Aplicación modular

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

Opciones de instrumentación

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
distributed_tracingHabilita el rastreo distribuido para que la traza de este servicio se conecte con la traza de otro servicio, si se reciben cabeceras de rastreo.true
headersHash de cabeceras de solicitud o respuesta HTTP para añadir como etiquetas a larack.request. Acepta las claves request y response con valores de matriz, por ejemplo ['Last-Modified']. Añade las etiquetas http.request.headers.* y http.response.headers.*, respectivamente. Esta opción anula las DD_TRACE_HEADER_TAGS globales. Para obtener más información, consulta la [aplicación de etiquetas de cabeceras a tramos raíz][header tags].{ response: ['Content-Type', 'X-Request-ID'] }
resource_script_namesAnteponer el nombre del script al nombre del recursofalse

Sneakers

La integración de Sneakers es un middleware que rastrea ejecuciones de tareas.

Puedes habilitarla a través de Datadog.configure:

require 'ddtrace'

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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
enabledDefine si Sneakers debe rastrearse. Es útil para deshabilitar temporalmente el rastreo. true o falsetrue
tag_bodyHabilita el etiquetado de mensajes de tareas . true para activarlo y false para desactivarlo.false
error_handlerGestor de errores personalizado que se invoca cuando una tarea genera un error. Se proporcionan span y error como argumentos. Define el error en el tramo por defecto. Es útil para ignorar errores transitorios.proc { |span, error| span.set_error(error) unless span.nil? }

Stripe

La integración de Stripe rastrea solicitudes de la API de Stripe.

Puedes habilitarla a través de Datadog.configure:

require 'ddtrace'

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

Las options son los siguientes argumentos de palabra clave:

ClaveDescripciónPredeterminado
enabledDefine si Stripe debe rastrearse. Es útil para deshabilitar temporalmente el rastreo. true o falsetrue

Sucker Punch

La integración de sucker_punch rastrea todas las tareas programadas:

require 'ddtrace'

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

# Se rastrea la ejecución de esta tarea
LogJob.perform_async('login')

Trilogy

La integración de Trilogy rastrea cualquier comando SQL enviado a través de la gems trilogy.

require 'trilogy'
require 'ddtrace'

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

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

Las options son los siguientes argumentos de palabra clave:

ClaveVar entDescripciónPredeterminado
service_nameDD_TRACE_TRILOGY_SERVICE_NAMENombre de la aplicación que ejecuta la instrumentación de trilogy. Puede ser anulado por global_default_service_name. Para obtener más detalles, consulta Configuración adicionaltrilogy
peer_serviceDD_TRACE_TRILOGY_PEER_SERVICENombre del servicio externo al que se conecta la aplicaciónnil

Configuración adicional

Para cambiar el comportamiento por defecto de ddtrace, por orden de prioridad (siendo 1 la prioridad más alta), puedes utilizar lo siguiente:

  1. Configuración remota.
  2. Opciones definidas dentro de un bloque Datadog.configure, por ejemplo:
    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
    
  3. Variables de entorno.

Si se define un valor de prioridad superior para una opción, configurar esa opción con un valor de prioridad inferior no cambiará su valor efectivo.

Por ejemplo, si tracing.sampling.default_rate está configurado mediante configuración remota, cambiar su valor a través del bloque Datadog.configure no tendrá ningún efecto.

Opciones de configuración disponibles:

ParámetroVar entPredeterminadoDescripción
Global
agent.hostDD_AGENT_HOST127.0.0.1Nombre de host del Agent al que se enviarán los datos de traza.
agent.portDD_TRACE_AGENT_PORT8126Puerto de host del Agent al que se enviarán los datos de traza. Si la configuración del Agent configura receiver_port o DD_APM_RECEIVER_PORT con un valor distinto del valor predeterminado 8126, entonces DD_TRACE_AGENT_PORT o DD_TRACE_AGENT_URL deben coincidir con él.
DD_TRACE_AGENT_URLnilConfigura el endpoint de la URL donde se envían las trazas. Tiene prioridad sobre agent.host y agent.port. Si la configuración del Agent configura receiver_port o DD_APM_RECEIVER_PORT con un valor distinto del valor predeterminado 8126, entonces DD_TRACE_AGENT_PORT o DD_TRACE_AGENT_URL deben coincidir con él.
diagnostics.debugDD_TRACE_DEBUGfalseHabilita o deshabilita el modo de depuración. Imprime logs con información detallada. NO recomendado para entornos de producción u otros entornos confidenciales. Para obtener más detalles, consulta Depuración y diagnóstico.
diagnostics.startup_logs.enabledDD_TRACE_STARTUP_LOGSnilImprime la configuración de inicio y los diagnósticos para registrar. Para evaluar el estado del rastreo al inicio de la aplicación y obtener más detalles, consulta Depuración y diagnóstico.
envDD_ENVnilTu entorno de aplicación. (Por ejemplo, production, staging, etc.) Este valor se drfine como una etiqueta en todas las trazas.
serviceDD_SERVICENombre de archivo de RubyEl nombre de servicio por defecto de tu aplicación. (Por ejemplo, billing-api). Este valor se establece como una etiqueta en todas las trazas.
tagsDD_TAGSnilEtiquetas personalizadas en pares de valores separados por , (por ejemplo, layer:api,team:intake). Estas etiquetas se configuran en todas las trazas. Para más detalles, consulta Entorno y etiquetas.
time_now_provider->{ Time.now }Cambia cómo se recupera la hora. Para obtener más detalles, consulta Configuración del proveedor de tiempo.
versionDD_VERSIONnilLa versión de tu aplicación (por ejemplo, 2.5, 202003181415, 1.3-alpha, etc.). Este valor se establece como una etiqueta en todas las trazas.
telemetry.enabledDD_INSTRUMENTATION_TELEMETRY_ENABLEDtruePermite habilitar el envío de datos de telemetría a Datadog. Puede deshabilitarse, como se documenta aquí.
Rastreo
tracing.contrib.peer_service_mappingDD_TRACE_PEER_SERVICE_MAPPINGnilDefine la reasignación de la etiqueta peer.service a través de toda la instrumentación. Proporciona una lista de old_value1:new_value1, old_value2:new_value2, ...
tracing.contrib.global_default_service_name.enabledDD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLEDfalseCambia el valor por defecto de service_name al nombre de servicio de la aplicación en toda la instrumentación. Se utiliza con servicios Beta inferidos
tracing.distributed_tracing.propagation_extract_firstDD_TRACE_PROPAGATION_EXTRACT_FIRSTfalseSal inmediatamente en el primer formato de propagación válido detectado. Para obtener más detalles, consulta Rastreo distribuido.
tracing.distributed_tracing.propagation_extract_styleDD_TRACE_PROPAGATION_STYLE_EXTRACT['Datadog','tracecontext']Formatos de propagación de rastreo distribuido para extraer. Anula DD_TRACE_PROPAGATION_STYLE. Para obtener más detalles, consulta Rastreo distribuido.
tracing.distributed_tracing.propagation_inject_styleDD_TRACE_PROPAGATION_STYLE_INJECT['Datadog','tracecontext']Formatos de propagación de rastreo distribuido para inyectar. Anula DD_TRACE_PROPAGATION_STYLE. Para obtener más detalles, consulta Rastreo distribuido.
tracing.distributed_tracing.propagation_styleDD_TRACE_PROPAGATION_STYLEnilFormatos de propagación de rastreo distribuido para extraer e inyectar. Para obtener más detalles, consulta Rastreo distribuido.
tracing.enabledDD_TRACE_ENABLEDtrueHabilita o deshabilita el rastreo. Si se configura como false, la instrumentación seguirá ejecutándose, pero no se enviará ninguna traza al Trace Agent.
tracing.header_tagsDD_TRACE_HEADER_TAGSnilRegistra las cabeceras HTTP como etiquetas de tramo. Para obtener más información, consulta [Aplicar etiquetas de cabeceras en tramos raíz][header tags].
tracing.instrument(<integration-name>, <options...>)Activa la instrumentación para una biblioteca específica. Para obtener más detalles, consulta Instrumentación de la integración.
tracing.log_injectionDD_LOGS_INJECTIONtrueInyecta información de correlación de trazas en logs de Rails, si está presente. Admite el generador de logs por defecto (ActiveSupport::TaggedLogging), lograge y semantic_logger.
tracing.partial_flush.enabledfalseHabilita o deshabilita la descarga parcial. La descarga parcial envía las partes completadas de una traza al Agent. Se utiliza cuando se rastrean instrumentos de tareas de duración prolongada (por ejemplo, tareas) con muchos tramos.
tracing.partial_flush.min_spans_threshold500El número de tramos que deben completarse en una traza antes de que la descarga parcial envíe esos tramos completados.
tracing.samplernilSólo para uso avanzado. Define una instancia personalizada de Datadog::Tracing::Sampling::Sampler. Si se proporciona, el rastreador utilizará este muestreador para determinar el comportamiento del muestreo. Para obtener más detalles, consulta Muestreo personalizado.
tracing.sampling.default_rateDD_TRACE_SAMPLE_RATEnilConfigura la frecuencia de muestreo del rastreo entre 0.0 (0%) y 1.0 (100%). Para obtener más detalles, consulta Muestreo del lado de la aplicación.
tracing.sampling.rate_limitDD_TRACE_RATE_LIMIT100 (por segundo)Establece un número máximo de trazas por segundo a muestrear. Establece un límite de frecuencia para evitar los excesos de volumen de consumo en caso de picos de tráfico.
tracing.sampling.rulesDD_TRACE_SAMPLING_RULESnilDefine reglas de muestreo a nivel de traza, comparándolas con el tramo raíz local. El formato es una String con JSON, que contiene una matriz de objetos. Cada objeto debe tener un atributo flotante sample_rate (entre 0,0 y 1,0, inclusive) y, opcionalmente, atributos de cadena name, service, resource y tags. name, service, resource y tags controlan a qué trazas se aplica esta regla de muestreo; si todos ellos están ausentes, esta regla se aplica a todas las trazas. Las reglas se evalúan por orden de declaración en la matriz; sólo se aplica la primera regla que coincida. Si no se aplica ninguna, se aplica tracing.sampling.default_rate.
tracing.sampling.span_rulesDD_SPAN_SAMPLING_RULES,ENV_SPAN_SAMPLING_RULES_FILEnilEstablece reglas de muestreo de tramo único. Estas reglas te permiten conservar tramos incluso cuando sus respectivas trazas se eliminan.
tracing.trace_id_128_bit_generation_enabledDD_TRACE_128_BIT_TRACEID_GENERATION_ENABLEDtruetrue para generar ID de trazas de 128 bits y false para generar ID de trazas de 64 bits
tracing.report_hostnameDD_TRACE_REPORT_HOSTNAMEfalseAñade etiquetas de nombres de host a trazas.
tracing.test_mode.enabledDD_TRACE_TEST_MODE_ENABLEDfalseHabilita o deshabilita el modo de test, para utilizar el rastreo en conjuntos de tests.
tracing.test_mode.trace_flushnilObjeto que determina el comportamiento de descarga de trazas.

Generación de logs personalizada

Por defecto, todos los logs son procesados por el generador de logs de Ruby por defecto. Cuando utilices Rails, deberías ver los mensajes en tu archivo del log de aplicación.

Los mensajes de logs de clientes de Datadog están marcados con [ddtrace], por lo que deberías poder aislarlos de otros mensajes.

Además, es posible anular el generador de logs predeterminado y sustituirlo por uno personalizado. Para ello, utiliza la configuración log.

f = File.new("my-custom.log", "w+") # Log messages should go there
Datadog.configure do |c|
  c.logger.instance = Logger.new(f) # Overriding the default logger
  c.logger.level = ::Logger::INFO
end

Datadog.logger.info { "this is typically called by tracing code" }

Entorno y etiquetas

Por defecto, el Trace Agent (no esta biblioteca, sino el programa que se ejecuta en segundo plano recopilando datos de varios clientes) utiliza las etiquetas establecidas en el archivo de configuración del Agent. Puedes configurar la aplicación para que etiquete automáticamente tus trazas y métricas, con las siguientes variables de entorno:

  • DD_ENV: Tu entorno de aplicación (por ejemplo production, staging, etc.)
  • DD_SERVICE: El nombre de servicio por defecto de tu aplicación (por ejemplo billing-api)
  • DD_VERSION: La versión de tu aplicación (por ejemplo, 2.5, 202003181415, 1.3-alpha, etc.)
  • DD_TAGS: Etiquetas personalizadas en pares de valores separados por , (por ejemplo layer:api,team:intake)
    • Si DD_ENV, DD_SERVICE o DD_VERSION están definidos, anularán cualquier etiqueta env/service/version respectiva definida en DD_TAGS.
    • Si DD_ENV, DD_SERVICE o DD_VERSION NO están definidos, se utilizarán etiquetas definidas en DD_TAGS para rellenar env/service/version respectivamente.

Estos valores también pueden anularse a nivel del rastreador:

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

Esto te permite definir este valor por aplicación, por lo que puedes tener, por ejemplo, varias aplicaciones que informen sobre diferentes entornos en el mismo host.

Las etiquetas también pueden establecerse directamente en tramos individuales, lo que sustituirá a cualquier etiqueta conflictiva definida a nivel de aplicación.

Depuración y diagnóstico

Se sugieren dos medios diferentes de generación de diagnósticos para el rastreo:

Habilitación del modo de depuración

Si se cambia la biblioteca al modo de depuración, se obtendrán logs detallados y completos sobre la actividad de rastreo, incluidos los errores eliminados. Este resultado puede ser útil para identificar errores o confirmar el envío de trazas al Agent.

Puede habilitarlo a través de diagnostics.debug = true o DD_TRACE_DEBUG.

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

NO recomendamos el uso de esta función en producción u otros entornos sensibles, ya que puede ser muy verboso bajo carga. Es mejor utilizarla en un entorno controlado donde se pueda controlar la carga de la aplicación.

Habilitación de logs de inicio

Los logs de inicio generan un informe del estado de rastreo cuando la aplicación se configura inicialmente. Esto puede ser útil para confirmar que la configuración y la instrumentación se han habilitado correctamente.

Puede habilitarlo a través de diagnostics.startup_logs.enabled = true o DD_TRACE_STARTUP_LOGS.

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

Por defecto, se habilitará siempre que ddtrace detecte que la aplicación se está ejecutando en un entorno que no es un entorno de desarrollo.

Muestreo

Consulta Mecanismos de consumo para ver la lista de todas las opciones de muestreo disponibles.

Muestreo prioritario

El muestreo prioritario decide si se mantiene una traza utilizando un atributo de prioridad propagado para trazas distribuidas. Su valor indica al Agent y al backend lo importante que es la traza.

El muestreador puede establecer la prioridad en los siguientes valores:

  • Datadog::Tracing::Sampling::Ext::Priority::AUTO_REJECT: El muestreador decidió automáticamente rechazar la traza.
  • Datadog::Tracing::Sampling::Ext::Priority::AUTO_KEEP: El muestreador decidió automáticamente conservar la traza.

El muestreo prioritario está habilitado por defecto. Habilitarlo garantiza que las trazas muestreadas distribuida serán completas. Una vez habilitado, el muestreador asignará automáticamente una prioridad de 0 o 1 a las trazas, dependiendo de su servicio y volumen.

También puedes establecer esta prioridad manualmente para descartar una traza que no te interese o conservar una importante. Para ello, configura la TraceOperation#sampling_priority como:

  • Datadog::Tracing::Sampling::Ext::Priority::USER_REJECT: Se pide al usuario que rechace la traza.
  • Datadog::Tracing::Sampling::Ext::Priority::USER_KEEP: El usuario ha solicitado conservar la traza.

Cuando no se utiliza el rastreo distribuido, se puede cambiar la prioridad en cualquier momento, siempre que la traza esté incompleta. Pero tiene que hacerse antes de cualquier propagación de contexto (fork, llamadas RPC) para que sea útil en un contexto distribuido. Cambiar la prioridad después de que el contexto se haya propagado hace que diferentes partes de una traza distribuida utilicen diferentes prioridades. Algunas partes podrían conservarse, otras podrían rechazarse, y esto puede causar que la traza se almacene parcialmente y permanezca incompleta.

Por esta razón, si cambia la prioridad, te recomendamos que lo hagas lo antes posible.

Para cambiar la prioridad de muestreo, puedes utilizar los siguientes métodos:

# Rechaza la traza activa
Datadog::Tracing.reject!

# Conserva la traza activa
Datadog::Tracing.keep!

Es seguro utilizar Datadog::Tracing.reject! y Datadog::Tracing.keep! cuando no hay trazas activas.

También puedes rechazar una instancia de traza específica:

# First, grab the active trace
trace = Datadog::Tracing.active_trace

# Rechaza la traza
trace.reject!

# Conserva la traza
trace.keep!

Muestreo de tramo único

Puedes configurar la regla de muestreo que te permita conservar tramos a pesar de que sus trazas respectivas hayan sido descartadas por una regla de muestreo a nivel de traza.

Esto permite conservar tramos importantes cuando se aplica el muestreo a nivel de la traza. No es posible eliminar tramos utilizando el muestreo de tramo único.

Para configurarlo, consulta la documentación sobre mecanismos de consumo.

Muestreo del lado de la aplicación

Mientras que el Datadog Agent puede muestrear trazas para reducir el uso del ancho de banda, el muestreo del lado de la aplicación reduce la sobrecarga de rendimiento en la aplicación host.

El muestreo del lado de la aplicación elimina trazas lo antes posible. Esto hace que la página Controles de consumo no reciba suficientes datos para informar sobre frecuencias de muestreo precisas. Utilízalo sólo cuando sea primordial reducir la sobrecarga de rastreo.

Si utilizas esta función, indícanoslo abriendo una incidencia en GitHub, para que podamos comprender mejor tu caso de uso y ofrecerte asistencia.

Puedes configurar el muestreo del lado de la aplicación con los siguientes parámetros:

# Muestreo del lado de la aplicación habilitado: La página Controles de consumo no será precisa.
sampler = Datadog::Tracing::Sampling::RateSampler.new(0.5) # muestreo del 50% de las trazas

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

Para obtener más información sobre estos parámetros, consulta Configuración adicional.

Rastreo distribuido

El rastreo distribuido permite propagar trazas a través de múltiples aplicaciones instrumentadas, de modo que una solicitud puede presentarse como una traza única, en lugar de una traza independiente por servicio.

Para rastrear solicitudes a través de los límites de la aplicación, lo siguiente debe propagarse entre cada aplicación:

PropiedadTipoDescripción
ID de rastreoEnteroID de rastreo. Este valor debe ser el mismo en todas las solicitudes que pertenezcan a la misma traza.
ID de tramo principalEnteroID del tramo en el servicio que origina la solicitud. Este valor siempre será diferente para cada solicitud dentro de una traza.
Prioridad de muestreoEnteroNivel de prioridad de muestreo para la traza. Este valor debe ser el mismo para todas las solicitudes que pertenezcan a la misma traza.

Dicha propagación puede visualizarse como:

Service A:
  Trace ID:  100000000000000001
  Parent ID: 0
  Span ID:   100000000000000123
  Priority:  1

  |
  | Service B Request:
  |   Metadata:
  |     Trace ID:  100000000000000001
  |     Parent ID: 100000000000000123
  |     Priority:  1
  |
  V

Service B:
  Trace ID:  100000000000000001
  Parent ID: 100000000000000123
  Span ID:   100000000000000456
  Priority:  1

  |
  | Service C Request:
  |   Metadata:
  |     Trace ID:  100000000000000001
  |     Parent ID: 100000000000000456
  |     Priority:  1
  |
  V

Service C:
  Trace ID:  100000000000000001
  Parent ID: 100000000000000456
  Span ID:   100000000000000789
  Priority:  1

Via HTTP

Para las solicitudes HTTP entre aplicaciones instrumentadas, estos metadatos de rastreo se propagan mediante el uso de cabeceras de solicitudes HTTP:

PropiedadTipoNombre de la cabecera HTTP
ID de rastreoEnterox-datadog-trace-id
ID de tramo principalEnterox-datadog-parent-id
Prioridad de muestreoEnterox-datadog-sampling-priority

Tal que:

Service A:
  Trace ID:  100000000000000001
  Parent ID: 0
  Span ID:   100000000000000123
  Priority:  1

  |
  | Service B HTTP Request:
  |   Headers:
  |     x-datadog-trace-id:          100000000000000001
  |     x-datadog-parent-id:         100000000000000123
  |     x-datadog-sampling-priority: 1
  |
  V

Service B:
  Trace ID:  100000000000000001
  Parent ID: 100000000000000123
  Span ID:   100000000000000456
  Priority:  1

  |
  | Service C HTTP Request:
  |   Headers:
  |     x-datadog-trace-id:          100000000000000001
  |     x-datadog-parent-id:         100000000000000456
  |     x-datadog-sampling-priority: 1
  |
  V

Service C:
  Trace ID:  100000000000000001
  Parent ID: 100000000000000456
  Span ID:   100000000000000789
  Priority:  1

Formatos de cabeceras distribuidas

El rastreo es compatible con los siguientes formatos de trazas distribuidas:

Puedes habilitar/deshabilitar el uso de estos formatos a través de Datadog.configure:

Datadog.configure do |c|
  # Lista de formatos de cabeceras que se deben extraer
  c.tracing.distributed_tracing.propagation_extract_style = [ 'tracecontext', 'Datadog', 'b3' ]

  # Lista de formatos de cabeceras que se deben inyectar
  c.tracing.distributed_tracing.propagation_inject_style = [ 'tracecontext', 'Datadog' ]
end

Activación del rastreo distribuido para integraciones

Muchas integraciones incluidas en ddtrace admiten el rastreo distribuido. El rastreo distribuido está habilitado por defecto en el Agent v7 y en la mayoría de las versiones del Agent v6. Si es necesario, puedes habilitar el rastreo distribuido con los parámetros de configuración.

  • Si tu aplicación recibe solicitudes de servicios con el rastreo distribuido activado, debes activar el rastreo distribuido en las integraciones que gestiona estas solicitudes (por ejemplo, Rails)
  • Si tu aplicación envía solicitudes a servicios con el rastreo distribuido activado, debes activar el rastreo distribuido en las integraciones que envían estas solicitudes (por ejemplo, Faraday)
  • Si tu aplicación envía y recibe solicitudes al desplegar el rastreo distribuido, debe activar todas las integraciones que gestionan estas solicitudes.

Para obtener más detalles sobre cómo activar el rastreo distribuido para integraciones, consulta su documentación:

Utilizando el propagador HTTP

Para facilitar la propagación de estos metadatos, puedes utilizar el módulo Datadog::Tracing::Propagation::HTTP.

En el cliente:

Datadog::Tracing.trace('web.call') do |span, trace|
  # Inyecta cabeceras de trazas en cabeceras de solicitudes (`env` debe ser un Hash)
  Datadog::Tracing::Propagation::HTTP.inject!(trace.to_digest, env)
end

En el servidor:

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

Datadog::Tracing.trace('web.work', continue_from: trace_digest) do |span|
  # Haz algo de trabajo web...
end

Cola de solicitudes HTTP

Las trazas que se originan en solicitudes HTTP pueden configurarse para incluir el tiempo que pasan en la cola de un servidor web de frontend o de equilibrador de carga antes de que la solicitud llegue a la aplicación de Ruby.

Esta función está deshabilitada por defecto. Para activarla, debes añadir una cabecera X-Request-Start o X-Queue-Start desde tu servidor web (es decir, Nginx) antes de activar la función de cola de solicitudes. A continuación, se muestra un ejemplo de configuración de 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;
    }
}

A continuación, debes habilitar la función de cola de solicitudes. Las siguientes opciones están disponibles para la configuración de :request_queuing:

OpciónDescripción
:include_requestUn tramo http_server.queue será el tramo raíz de una traza, incluyendo el tiempo total empleado para procesar la solicitud, además del tiempo empleado para esperar a que la solicitud comience a procesarse. Este es el comportamiento cuando la configuración se define como true. Esta es la configuración seleccionada cuando se define como true.
:exclude_requestUn tramo http.proxy.request será el tramo raíz de una traza, con la duración http.proxy.queue del tramo secundario representando sólo el tiempo de espera para que la solicitud comience a procesarse. Se trata de una función experimental.

Para aplicaciones basadas en Rack, consulta la documentación para obtener más detalles.

Pipelines de procesamiento

Algunas aplicaciones pueden requerir que las trazas se modifiquen o filtren antes de ser enviadas a Datadog. El pipeline de procesamiento permite crear procesadores para definir dicho comportamiento.

Filtrado

Puedes utilizar el procesador Datadog::Tracing::Pipeline::SpanFilter para eliminar tramos, cuando el bloque se evalúa como verdadero:

Datadog::Tracing.before_flush(
  # Elimina tramos que coincidan con un recurso en particular
 Datadog::Tracing::Pipeline::SpanFilter.new { |span| span.resource =~ /PingController/ },
  # Elimina tramos que son transferidos al host local
 Datadog::Tracing::Pipeline::SpanFilter.new { |span| span.get_tag('host') == 'localhost' }
)

Procesamiento

Puedes utilizar el procesador Datadog::Tracing::Pipeline::SpanProcessor para modificar tramos:

Datadog::Tracing.before_flush(
  # Elimina el texto coincidente del campo de recursos
  Datadog::Tracing::Pipeline::SpanProcessor.new { |span| span.resource.gsub!(/password=.*/, '') }
)

Procesador personalizado

Los procesadores pueden ser cualquier objeto que responda a #call aceptando trace como argumento (que es una Array de los Datadog::Span).

Por ejemplo, utilizando la sintaxis abreviada de bloque:

Datadog::Tracing.before_flush do |trace|
   # Lógica de procesamiento...
   trace
end

Para una clase de procesador personalizada:

class MyCustomProcessor
  def call(trace)
    # Lógica de procesamiento...
    trace
  end
end

Datadog::Tracing.before_flush(MyCustomProcessor.new)

En ambos casos, el método del procesador debe devolver el objeto trace; este valor devuelto se pasará al siguiente procesador en el pipeline.

Advertencias

  1. Si se eliminan tramos, no se generarán métricas de rastreo, lo que afectará a monitores y dashboards.
  2. Al eliminar un tramo, también se eliminan todos los tramos secundarios del tramo eliminado. De este modo, se evitan los tramos huérfanos en el gráfico de trazas.
  3. Los logs en modo de depuración informan del estado de tramos antes de que se ejecute el pipeline de procesamiento: los tramos modificados o eliminados mostrarán su estado original en logs en modo de depuración.

Correlación del rastreo

En muchos casos, como el de la generación de logs, puede ser útil correlacionar los ID de rastreo con otros eventos o flujos de datos, para facilitar las referencias cruzadas.

Para la gestión de logs en aplicaciones Rails

Automática

Para las aplicaciones de Rails que utilizan el gestor de logs por defecto (ActiveSupport::TaggedLogging), lograge o semantic_logger, la inyección de correlación de rastreo está habilitada por defecto.

Puede deshabilitarse configurando la variable de entorno DD_LOGS_INJECTION=false.

Para la gestión de logs en aplicaciones Ruby

Para añadir ID de correlación a tu gestor de logs, añade un formateador de logs que recupere los ID de correlación con Datadog::Tracing.correlation, y luego añádelos al mensaje.

Para una correcta correlación con la gestión de logs de Datadog, asegúrate de que lo siguiente está presente en el mensaje del log, en el orden en que aparece:

  • dd.env=<ENV>: Donde <ENV> es igual a Datadog::Tracing.correlation.env. Omítelo si no se ha configurado un entorno.
  • dd.service=<SERVICE>: Donde <SERVICE> es igual a Datadog::Tracing.correlation.service. Omítelo si no se ha configurado ningún nombre servicio por defecto.
  • dd.version=<VERSION>: Donde <VERSION> es igual a Datadog::Tracing.correlation.version. Omítelo si no se ha configurado ninguna versión de la aplicación.
  • dd.trace_id=<TRACE_ID>: Donde <TRACE_ID> es igual a Datadog::Tracing.correlation.trace_id o 0 si no hay ninguna traza activa durante la gestión de logs.
  • dd.span_id=<SPAN_ID>: Donde <SPAN_ID> es igual a Datadog::Tracing.correlation.span_id o 0 si no hay ninguna traza activa durante la gestión de logs.

Datadog::Tracing.log_correlation devolverá dd.env=<ENV> dd.service=<SERVICE> dd.version=<VERSION> dd.trace_id=<TRACE_ID> dd.span_id=<SPAN_ID>.

Si una traza no está activa y el entorno y la versión de la aplicación no están configurados, devolverá dd.env= dd.service= dd.version= dd.trace_id=0 dd.span_id=0.

Ejemplo práctico:

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

# Cuando no hay ninguna traza activa
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] Esta no es una operación rastreada.

# Cuando hay una traza activa
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] Esta es una operación rastreada.

Configuración de la capa de transporte

Por defecto, ddtrace se conectará al Agent utilizando los primeros parámetros disponibles en la lista de prioridades:

  1. A través de cualquier parámetro de configuración proporcionado explícitamente (nombre de host/puerto/transporte)
  2. A través del socket de dominio Unix (UDS) localizado en /var/run/datadog/apm.socket
  3. A través de HTTP sobre TCP a 127.0.0.1:8126

Sin embargo, el rastreador puede configurarse para enviar sus datos de rastreo a destinos alternativos, o mediante protocolos alternativos.

Cambio del nombre de host y del puerto por defecto del Agent

Para cambiar el host o puerto del Agent, proporciona DD_AGENT_HOST y DD_TRACE_AGENT_PORT.

O dentro de un bloque Datadog.configure, proporciona los siguientes parámetros:

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

Para obtener más información, consulta Configuración adicional.

Uso del adaptador Net::HTTP

El adaptador Net envía trazas utilizando Net::HTTP a través de TCP. Es el adaptador de transporte por defecto.

Datadog.configure do |c|
  c.tracing.transport_options = proc { |t|
    # Nombre de host, puerto y opciones adicionales. :el tiempo de inactividad se mide en segundos.
    t.adapter :net_http, '127.0.0.1', 8126, timeout: 30
  }
end

Uso del adaptador de socket de dominio Unix (UDS)

El adaptador UnixSocket envía trazas utilizando Net::HTTP a través del socket Unix.

Para utilizarlo, primero configura tu Trace Agent para escuchar por cada socket Unix, luego configura el rastreador con:

Datadog.configure do |c|
  c.tracing.transport_options = proc { |t|
    # Proporciona una ruta local para el rastreo del socket de dominio Unix
    t.adapter :unix, '/tmp/ddagent/trace.sock'
  }
end

Uso del adaptador de test de transporte

El adaptador Test es un transporte no operativo que puede opcionalmente almacenar solicitudes en buffer y se utiliza en conjuntos de tests u otros entornos que no sean de producción.

Datadog.configure do |c|
  c.tracing.transport_options = proc { |t|
    # Configura el transporte en modo no perativo. No se conservan trazas.
    t.adapter :test

    # También puedes proporcionar un buffer para examinar la salida de trazas.
    # El buffer debe responder a '<<'.
    t.adapter :test, []
  }
end

Uso de un adaptador de transporte personalizado

Los adaptadores personalizados se pueden configurar con:

Datadog.configure do |c|
  c.tracing.transport_options = proc { |t|
    # Inicializa y transfiere una instancia del adaptador
    custom_adapter = CustomAdapter.new
    t.adapter custom_adapter
  }
end

Configuración del proveedor de tiempo

Por defecto, el rastreo utiliza un reloj monotónico para medir la duración de tramos y marcas de tiempo (->{ Time.now }) para la hora de inicio y fin.

A la hora de hacer tests, puede ser útil un proveedor de tiempo diferente.

Para cambiar la función que proporciona marcas de tiempo, configura lo siguiente:

Datadog.configure do |c|
  # Para Timecop, por ejemplo, `->{ Time.now_without_mock_time }` permite al rastreador utilizar el tiempo transcurrido real.
  c.time_now_provider = -> { Time.now_without_mock_time }
end

El cálculo de la duración de tramos seguirá utilizando el reloj monotónico del sistema cuando esté disponible, por lo que no se verá afectado por esta configuración.

Métricas

El rastreador y sus integraciones pueden producir algunas métricas adicionales que pueden proporcionar información útil sobre el rendimiento de tu aplicación. Estas métricas se recopilan con dogstatsd-ruby y pueden enviarse al mismo Datadog Agent al que envías tus trazas.

Configuración de tu aplicación para la recopilación de métricas:

  1. Configura tu Datadog Agent para StatsD
  2. Añadir gem 'dogstatsd-ruby', '~> 5.3' a tu Gemfile

Para el tiempo de ejecución de la aplicación

Si se configuran métricas de tiempo de ejecución, la biblioteca de rastreo recopila y envía automáticamente métricas sobre el estado de tu aplicación.

Para configurar métricas de tiempo de ejecución, añade la siguiente configuración:

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

Datadog.configure do |c|
  # Para habilitar la recopilación de métricas de tiempo de ejecución, configura `true`. Por defecto `false`
  # También puedes definir DD_RUNTIME_METRICS_ENABLED=true para esta configuración.
  c.runtime_metrics.enabled = true

  # También puedes configurar la instancia de Statsd utilizada para enviar métricas de tiempo de ejecución.
  # Statsd se configura automáticamente con los parámetros por defecto si `dogstatsd-ruby` está disponible.
  # Puedes configurar con el host y el puerto del Datadog Agent ; por defecto es 'localhost:8125'.
  c.runtime_metrics.statsd = Datadog::Statsd.new
end

Para obtener más detalles sobre la configuración de Datadog::Statsd, consulta la documentación deDogStatsD.

Las estadísticas son específicas de máquinas virtuales e incluyen:

NombreTipoDescripciónDisponible en
runtime.ruby.class_countgaugeNúmero de clases en el espacio de memoria.CRuby
runtime.ruby.gc.*gaugeEstadísticas de recopilación de residuos: recopiladas en GC.stat.Todos los tiempos de ejecución
runtime.ruby.yjit.*gaugeEstadísticas YJIT recopiladas en RubyVM::YJIT.runtime_stats.CRuby (si está habilitado)
runtime.ruby.thread_countgaugeNúmero de threads.Todos los tiempos de ejecución
runtime.ruby.global_constant_stategaugeGeneración de caché global constante.CRuby 3.1 o posterior
runtime.ruby.global_method_stategaugeGeneración de caché global de métodosCRuby 2.x
runtime.ruby.constant_cache_invalidationsgaugeInvalidaciones de caché constantes.CRuby 3.2 o anterior
runtime.ruby.constant_cache_missesgaugeFallos de caché constantes.CRuby 3.2 o anterior

Además, todas las métricas incluyen las siguientes etiquetas:

NombreDescripción
languageLenguaje de programación rastreado. (por ejemplo, ruby)
serviceLista de servicios asociados a esta métrica.

OpenTracing

Para configurar Datadog con OpenTracing, consulta nuestra sección Configuración de OpenTracing para ver más detalles.

Configuración de los parámetros del rastreador Datadog

El rastreador subyacente de Datadog puede configurarse pasando opciones (que coinciden con Datadog::Tracer) al configurar el rastreador global:

# Donde `options` es un Hash de opciones proporcionadas a Datadog::Tracer
OpenTracing.global_tracer = Datadog::OpenTracer::Tracer.new(**options)

También puede configurarse utilizando Datadog.configure, proceso descrito en la sección Configuración adicional.

Activación y configuración de integraciones

Por defecto, la configuración de OpenTracing con Datadog no activa automáticamente ninguna instrumentación adicional proporcionada por Datadog. Solo recibirás tramos y trazas de la instrumentación de OpenTracing que tengas en tu aplicación.

Sin embargo, la instrumentación adicional proporcionada por Datadog se puede activar junto con OpenTracing utilizando Datadog.configure, que puede utilizarse para mejorar aún más tu rastreo. Para activarlo, consulta Instrumentación de integraciones para obtener más detalles.

Formatos de serialización compatibles

Tipo¿Es compatible?Información adicional
OpenTracing::FORMAT_TEXT_MAP
OpenTracing::FORMAT_RACKDebido a la pérdida de resolución en el formato Rack, ten en cuenta que las piezas de equipaje con nombres que contengan caracteres en mayúsculas o - se pasarán a caracteres en minúsculas _ en un viaje de ida y vuelta respectivamente. Recomendamos evitar estos caracteres o acomodar en consecuencia en el extremo receptor.
OpenTracing::FORMAT_BINARYNo

Generación de perfiles

ddtrace puede producir perfiles que midan el uso de recursos de la aplicación a nivel de método en entornos de producción. Estos perfiles pueden dar una idea de los recursos que se gastan en el código Ruby fuera de la instrumentación de rastreo existente.

Configuración

Para empezar con la generación de perfiles, sigue la guía Habilitar el generador de perfiles Ruby.

Solucionar problemas

Si tienes problemas con la generación de perfiles, consulta la guía para solucionar problemas del generador de perfiles.

Perfiles de tareas Resque

Al crear perfiles de tareas Resque, debes configurar la opción RUN_AT_EXIT_HOOKS=1 descrita en la documentación de Resque.

Sin esta marca, los perfiles de tareas de Resque de corta duración no estarán disponibles, ya que Resque elimina los procesos worker antes de que tengan la oportunidad de enviar esta información.

Problemas conocidos y configuraciones sugeridas

Carga útil demasiado grande

Por defecto, Datadog limita el tamaño de las cargas útiles de rastreo para evitar sobrecargas de memoria en las aplicaciones instrumentadas. Como resultado, es posible que las trazas que contienen miles de operaciones no se envíen a Datadog.

Si faltan trazas, habilita el modo de depuración para comprobar si se registran mensajes que contienen "Dropping trace. Payload too large".

Dado que el modo de depuración tiene mucha información, Datadog no recomienda dejar esto habilitado o habilitarlo durante la producción. Deshabilítalo después de confirmar. Puedes inspeccionar los logs del Datadog Agent para buscar mensajes similares.

Si has comprobado que se eliminan trazas debido a grandes cargas útiles, habilita el parámetro partial_flush para dividir trazas en porciones más pequeñas.

Nivel de stack tecnológico demasiado profundo

El rastreo de Datadog recopila datos de rastreo añadiendo instrumentación en otras bibliotecas comunes (por ejemplo, Rails, Rack, etc.) Algunas bibliotecas proporcionan API para añadir esta instrumentación, pero otras no. Para añadir instrumentación en bibliotecas en las que falta la API de instrumentación, Datadog utiliza una técnica llamada “monkey-patching” para modificar el código de esa biblioteca.

En Ruby versión 1.9.3 y anteriores, la estrategia del “parche de mono” a menudo implicaba el uso de alias_method, también conocido como reescritura de método, para reemplazar destructivamente métodos de Ruby existentes. Sin embargo, esta práctica crearía frecuentes conflictos y errores si dos bibliotecas intentan “reescribir” el mismo método. (por ejemplo, dos paquetes APM diferentes intentando Instrumentar el mismo método).

En Ruby 2.0, se introdujo la función Module#prepend. Esta función evita la reescritura destructiva de métodos y permite múltiples “parches de mono” en el mismo método. Por ello se ha convertido en el medio más seguro y preferido para aplicar “parches de mono” al código.

La instrumentación Datadog utiliza casi exclusivamente la función Module#prepend para añadir instrumentación de forma no destructiva. Sin embargo, algunas otras bibliotecas (típicamente las que son compatibles con Ruby 2.0 o anterior) todavía utilizan alias_method, lo que puede crear conflictos con la instrumentación Datadog, a menudo generando errores SystemStackError o stack level too deep.

Como la implementación de alias_method existe dentro de esas bibliotecas, Datadog generalmente no puede corregirlas. Sin embargo, existen soluciones alternativas conocidas para algunas bibliotecas:

Para bibliotecas sin una solución alternativa conocida, considera eliminar la biblioteca utilizando alias o Module#alias_method, o separando las bibliotecas en diferentes entornos para realizar tests.

Si tienes alguna pregunta o quieres informar un problema de este tipo, ponte en contacto con el servicio de asistencia de Datadog.

Los workers de Resque se cuelgan al salir

La bifurcación predeterminada de Resque de un proceso por cada tarea puede, en raras situaciones, dar lugar a que los procesos de resque se cuelguen al salir cuando se instrumentan con ddtrace.

Como solución, recomendamos configurar la variable de entorno FORK_PER_JOB como false para deshabilitar este comportamiento.

Para realizar un análisis, consulta este problema.