Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Seguimiento con OpenTelemetry

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.

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.

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.

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

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:

  • true

  • 1

  • yes

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

La opción tracing acepta los siguientes parámetros:

Parameter
Tipo
Descripción

:enabled

Booleano

Enables or disables OpenTelemetry tracing.

Default: nil

:query_text_max_length

entero

Specifies the maximum length of query text to
include in span attributes. Set to 0 to exclude
query text. The query text appears in the
db.query.text attribute.

Default: nil

:tracer

OpenTelemetry::Trace::Tracer

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

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.

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

find, insert_one, insert_many, update_one, update_many, delete_one, delete_many, find_one_and_update, find_one_and_delete, find_one_and_replace, replace_one, count_documents, estimated_document_count, distinct, aggregate

Operaciones de índice

create_index, create_indexes, drop_index, drop_all_indexes, list_indexes

Operaciones de bases de datos

list_collections, create_collection, drop_collection, list_databases

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.

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:

  • find

  • insert

  • update

  • delete

  • aggregate

  • create

  • drop

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.

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 en mongodb

  • db.namespaceNombre de la base de datos

  • db.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

Los intervalos de comandos incluyen los siguientes atributos de red:

  • server.addressServidor host de MongoDB

  • server.portPuerto del servidor MongoDB

  • network.transport: Protocolo de transporte como tcp

Los spans de comando incluyen los siguientes atributos de conexión:

  • db.mongodb.server_connection_idID de conexión asignado por el servidor

  • db.mongodb.driver_connection_idID de conexión asignado por el controlador

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)

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

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.

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.

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.

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. Configurar query_text_max_length en 0 deshabilita 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.

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

Para obtener más información acerca del rastreo OpenTelemetry con Ruby, consulte el SDK Ruby de OpenTelemetry.

Next

C

En esta página