Overview
En esta guía, aprenderás a utilizar el trazado de OpenTelemetry con el controlador Ruby. OpenTelemetry es un framework de observación de código abierto que proporciona una forma estandarizada de instrumentar, generar, recopilar y exportar datos de telemetría.
El controlador Ruby admite la trazabilidad OpenTelemetry para ayudarle a comprender el rendimiento y el comportamiento de tus operaciones MongoDB. Cuando activas el rastreo, el controlador crea segmentos porque representan operaciones como consultas, actualizaciones y transacciones. Estos tramos incluyen atributos que siguen las convenciones semánticas de MongoDB.
Dependencias requeridas
Para utilizar el seguimiento de OpenTelemetry, debe instalar el OpenTelemetry Ruby SDK y un exportador. Para instalarlos en la aplicación, se debe añadir las siguientes gemas a tu Gemfile:
gem 'opentelemetry-sdk' gem 'opentelemetry-exporter-otlp' # or your preferred exporter
Si habilitas el seguimiento pero la librería OpenTelemetry no está cargada, el driver registra una advertencia y desactiva automáticamente el seguimiento.
Habilitar seguimiento de OpenTelemetry
Puede habilitar el rastreo de OpenTelemetry especificando la opción tracing al crear un cliente o configurando una variable de entorno.
Nota
Si no configuras el rastreo en la configuración del cliente o utilizando la variable de entorno, el rastreo se desactiva por defecto.
Habilita el rastreo en la configuración del cliente
Para habilitar el rastreo al crear un cliente, pasa la opción tracing con enabled establecido en true, como se muestra en el siguiente ejemplo:
client = Mongo::Client.new(['localhost:27017'], database: 'my_database', tracing: { enabled: true } )
Habilitar el rastreo con una variable de entorno
Para habilitar el rastreo usando una variable de entorno, configure la variable de entorno OTEL_RUBY_INSTRUMENTATION_MONGODB_ENABLED antes de crear un cliente, como se muestra en el siguiente ejemplo:
export OTEL_RUBY_INSTRUMENTATION_MONGODB_ENABLED=true
Puede usar cualquiera de los siguientes valores en la variable de entorno para habilitar el seguimiento:
true1yes
Después de establecer la variable, crea el cliente, como se muestra en el siguiente ejemplo:
client = Mongo::Client.new(['localhost:27017'], database: 'my_database')
Opciones de configuración
La opción tracing acepta los siguientes parámetros:
Parameter | Tipo | Descripción |
|---|---|---|
| Booleano | Enables or disables OpenTelemetry tracing. Default: nil |
| entero | Specifies the maximum length of query text to include in span attributes. Set to 0 to excludequery text. The query text appears in the db.query.text attribute.Default: nil |
|
| Specifies a custom OpenTelemetry tracer instance. Default: Uses the default tracer from the global tracer provider |
El siguiente ejemplo muestra cómo configurar todas las opciones de seguimiento disponibles:
client = Mongo::Client.new(['localhost:27017'], database: 'my_database', tracing: { enabled: true, query_text_max_length: 1024, tracer: my_custom_tracer } )
Rastreo de operaciones
El driver Ruby crea spans de OpenTelemetry tanto para las operaciones de alto nivel como para los comandos de bajo nivel. Las siguientes secciones describen los intervalos creados y los atributos incluidos.
Operaciones de alto nivel
Las operaciones de alto nivel son los métodos que llamas directamente en colecciones y bases de datos. El driver crea spans para las siguientes operaciones:
Tipo de operación | Operaciones |
|---|---|
Operaciones de colección |
|
Operaciones de índice |
|
Operaciones de bases de datos |
|
Los nombres de los span para operaciones de alto nivel utilizan el formato {operation_name}.{collection_name}. Por ejemplo, find.users, insertOne.orders o aggregate.products.
Comandos de bajo nivel
Los comandos de bajo nivel son los comandos reales que se envían al servidor MongoDB a través del protocolo de conexión. A continuación se enumeran algunos ejemplos de comandos de bajo nivel para los cuales el driver crea spans:
findinsertupdatedeleteaggregatecreatedrop
Los nombres de span para comandos de bajo nivel utilizan el formato {command_name}. Por ejemplo, find, insert o update.
Los intervalos de comando están anidados bajo sus intervalos de operación correspondientes.
Atributos Span
El driver sigue las convenciones semánticas de MongoDB e incluye atributos de segmentos que proporcionan contexto sobre cada operación.
Todos los spans incluyen los siguientes atributos:
db.system.nameSiempre configurado enmongodbdb.namespaceNombre de la base de datosdb.collection.name: El nombre de la colección (cuando sea aplicable)db.command.name. Nombre del comando MongoDB (solo spans de comando)db.query.summaryUn resumen de alto nivel de la estructura de la consulta
Atributos de red
Los intervalos de comandos incluyen los siguientes atributos de red:
server.addressServidor host de MongoDBserver.portPuerto del servidor MongoDBnetwork.transport: Protocolo de transporte comotcp
Atributos de conexión
Los spans de comando incluyen los siguientes atributos de conexión:
db.mongodb.server_connection_idID de conexión asignado por el servidordb.mongodb.driver_connection_idID de conexión asignado por el controlador
Atributos de sesión y transacción
Cuando utilizas sesiones o transacciones, los spans incluyen los siguientes atributos:
db.mongodb.lsid: ID de sesión lógica (cuando se usan sesiones)db.mongodb.txn_number: Número de transacción (cuando esté en una transacción)db.mongodb.cursor_idID del cursor (para operaciones que devuelven cursores)
Atributos de query
Cuando configuras query_text_max_length con un valor mayor que 0, los spans incluyen el siguiente atributo:
db.query.text: El texto completo de la query, truncado a la longitud máxima especificada
Atributos de error
Cuando las operaciones fallan, el driver registra los detalles de la excepción con el mecanismo de registro de excepciones de OpenTelemetry y establece el estado del span en ERROR. Para los fallos de operación de MongoDB, el atributo db.response.status_code contiene el código de error.
Rastreo de transacciones
El controlador crea un intervalo de transacción especial que abarca todas las operaciones dentro de una transacción explícita. El siguiente ejemplo demuestra el seguimiento de transacciones:
session = client.start_session session.with_transaction do collection.insert_one({ name: 'Alice' }, session: session) collection.update_one( { name: 'Bob' }, { '$set' => { age: 30 } }, session: session ) end
El ejemplo anterior genera una jerarquía de span, similar a la siguiente estructura:
transaction └── insertOne.users └── insert (command) └── updateOne.users └── update (command)
Nota
Las sesiones implícitas no crean tramos de transacción.
Error Handling
Cuando las operaciones fallan, el controlador registra las excepciones en el lapso utilizando el mecanismo de registro de excepciones de OpenTelemetry. El estado del lapso se establece en ERROR.
Para los fallos de operación de MongoDB, el atributo db.response.status_code contiene el código de error.
Los errores no impiden que el controlador lance la excepción a su aplicación.
Consideraciones sobre el rendimiento
Tenga en cuenta las siguientes implicaciones de rendimiento cuando utilice la trazabilidad de OpenTelemetry:
Cuando habilitas el seguimiento, el driver incurre en una sobrecarga mínima para la creación de spans y la colección de atributos.
La captura de texto de query (
db.query.text) tiene una sobrecarga adicional y debería usarse cuidadosamente en producción. Configurarquery_text_max_lengthen0deshabilita la captura de texto de consultas para un mejor rendimiento.Cuando desactivas el rastreo, no hay impacto en el rendimiento porque la funcionalidad se omite completamente.
Ejemplo
El siguiente ejemplo muestra cómo configurar el rastreo de OpenTelemetry para una aplicación MongoDB:
require 'mongo' require 'opentelemetry/sdk' # Configure OpenTelemetry OpenTelemetry::SDK.configure do |c| c.service_name = 'my-app' end # Create MongoDB client with tracing enabled client = Mongo::Client.new(['localhost:27017'], database: 'test', tracing: { enabled: true, query_text_max_length: 1024 } ) # Use the client normally - operations are traced collection = client[:users] collection.insert_one({ name: 'Alice', age: 30 }) collection.find({ age: { '$gte': 25 } }).to_a
Información Adicional
Para obtener más información acerca del rastreo OpenTelemetry con Ruby, consulte el SDK Ruby de OpenTelemetry.